@allbridge/bridge-core-sdk 3.26.0-alpha.3 → 3.26.0-alpha.4

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/esm/index.js CHANGED
@@ -1,7 +1,7 @@
1
- var Oo=Object.create;var ca=Object.defineProperty;var Qo=Object.getOwnPropertyDescriptor;var Ko=Object.getOwnPropertyNames;var Do=Object.getPrototypeOf,Uo=Object.prototype.hasOwnProperty;var Eo=(r,i)=>()=>(r&&(i=r(r=0)),i);var Zi=(r,i)=>()=>(i||r((i={exports:{}}).exports,i),i.exports);var _o=(r,i,a,o)=>{if(i&&typeof i=="object"||typeof i=="function")for(let s of Ko(i))!Uo.call(r,s)&&s!==a&&ca(r,s,{get:()=>i[s],enumerable:!(o=Qo(i,s))||o.enumerable});return r};var Ne=(r,i,a)=>(a=r!=null?Oo(Do(r)):{},_o(i||!r||!r.__esModule?ca(a,"default",{value:r,enumerable:!0}):a,r));import{bcs as me}from"@mysten/sui/bcs";function Sr(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=Sr(r.slice(o+1,r.length-s-1),[i,a]);return{typeName:d,typeArgs:A}}function $a(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 $a(i)?i:r.object(i)}function We(r,i,a){if($a(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:[We(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 Mr(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 F(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<${F(a[0])}>`;default:{let o=i.split("::");o[0]=Mr(o[0]);let s=o.join("::");return a.length>0?`${s}<${a.map(d=>F(d)).join(",")}>`:s}}}function j(r,...i){return i.length>0?`${r}<${i.join(", ")}>`:r}var ne=Eo(()=>{"use strict"});var nt=Zi((rl,qa)=>{"use strict";ne();var zi=class r{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return F(r.$PACKAGE_ID)}get PUBLISHED_AT(){return F(r.$PUBLISHED_AT)}get PKG_V1(){return F(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}},Lr=new zi;qa.exports=Lr});var Ki=Zi((gl,ro)=>{"use strict";ne();var Qi=class r{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return F(r.$PACKAGE_ID)}get PUBLISHED_AT(){return F(r.$PUBLISHED_AT)}get PKG_V1(){return F(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}},Hr=new Qi;ro.exports=Hr});var Ei=Zi((ml,Ao)=>{"use strict";ne();var Ui=class r{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return F(r.$PACKAGE_ID)}get PUBLISHED_AT(){return F(r.$PUBLISHED_AT)}get PKG_V1(){return F(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}},Pr=new Ui;Ao.exports=Pr});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},yd={solanaRpcUrl:"https://api.mainnet-beta.solana.com",tronRpcUrl:"https://api.trongrid.io"},hd={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 Io}from"@algorandfoundation/algokit-utils";import{TronWeb as _r}from"tronweb";import{Web3 as $r}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)}},Ke=class extends K{constructor(i){super("InvalidAmountError",i)}},It=class extends K{constructor(i){super("AmountNotEnoughError",i)}},De=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)}},Rn=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")}},$o=(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))($o||{});var Ie=(R=>(R.BSC="BSC",R.ETH="ETH",R.BAS="BAS",R.SOL="SOL",R.TRX="TRX",R.POL="POL",R.ARB="ARB",R.CEL="CEL",R.AVA="AVA",R.SRB="SRB",R.STLR="STLR",R.OPT="OPT",R.SUI="SUI",R.SNC="SNC",R.UNI="UNI",R.ALG="ALG",R))(Ie||{}),z=(A=>(A.EVM="EVM",A.SOLANA="SOLANA",A.TRX="TRX",A.SRB="SRB",A.SUI="SUI",A.ALG="ALG",A))(z||{});var qo={EVM:18,SOLANA:9,TRX:6,SRB:7,SUI:9,ALG:6},er={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"}},V=(()=>{let r={...er};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 qo[i]}}})();var fi=(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))(fi||{});var Re=(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))(Re||{});import{Big as la}from"big.js";async function $(r,i){return await r.getPoolInfoByKey({chainSymbol:i.chainSymbol,poolAddress:i.poolAddress})}function X(r){if(la(r).lte(0))throw new Ke("Amount must be greater than zero")}function L(r,i,a){let o=la(i).toFixed(),[s,d]=o.split(".");if(d&&d.length>a)throw new yn(r,d.length,a)}async function Yn(r,i,a){return await Promise.race([r,new Promise((o,s)=>{setTimeout(()=>s(new zt(i)),a)})])}async function Ni(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 Yn(r(),i,o)}catch{if(++s>=a)throw new zt(i)}}async function ua(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 ur}from"@algorandfoundation/algokit-utils/types/amount";import Wa,{Address as Ga}from"algosdk";import{getArc56ReturnValue as tr}from"@algorandfoundation/algokit-utils/types/app-arc56";import{AppClient as Bn}from"@algorandfoundation/algokit-utils/types/app-client";import{AppFactory as Ud}from"@algorandfoundation/algokit-utils/types/app-factory";var Wn={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:"fee"}]},{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:[1366,1844,2135,2221,2315,2357],errorMessage:"Box must have value"},{pc:[1122],errorMessage:"Bridge: amount too low for fee"},{pc:[1130],errorMessage:"Bridge: bridge to the zero address"},{pc:[1504],errorMessage:"Bridge: message processed"},{pc:[1547],errorMessage:"Bridge: no message"},{pc:[1327,1455],errorMessage:"Bridge: not enough fee"},{pc:[1446],errorMessage:"Bridge: source not registered"},{pc:[1217],errorMessage:"Bridge: tokens already sent"},{pc:[1180],errorMessage:"Bridge: unknown chain or token"},{pc:[1167],errorMessage:"Bridge: wrong destination chain"},{pc:[1258,1412,1544,1783,1830,2199,2300,2401],errorMessage:"Bytes has valid prefix"},{pc:[927],errorMessage:"CloseTo not allowed"},{pc:[1223],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:[2411],errorMessage:"Only owner"},{pc:[920],errorMessage:"Rekey not allowed"},{pc:[2080],errorMessage:"Router: is not stopAuthority"},{pc:[2216],errorMessage:"Router: no pool"},{pc:[2130],errorMessage:"Router: no receive pool"},{pc:[1112,1436,1933],errorMessage:"Router: swap prohibited"},{pc:[913],errorMessage:"Wrong asset"},{pc:[1710],errorMessage:"account opted into asset"},{pc:[1266,2226],errorMessage:"application exists"},{pc:[2021],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,1163,1185,1230,1263,1270,1375,1380,1435,1460,1512,1678,1718,1753,1790,1932,2078,2147,2252,2363,2409],errorMessage:"check GlobalState exists"},{pc:[1896],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+KHsgaW5pdGlhbFZhbHVlOiBuZXcgQWRkcmVzcyhiemVybygwKSkgfSk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ6ZXJvCiAgICBieXRlYyA2IC8vICJyZWJhbGFuY2VyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NTAKICAgIC8vIGNhblN3YXAgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUAzNgogICAgcHVzaGJ5dGVzcyAweGZmZjgyODQxIDB4NjVmNzA1NzMgMHhlODNhODdhYiAweDJjOWY2ODQ3IDB4MzE5MTliMjggMHg0ZWJhMDcyMSAweGM2MTdlZDczIDB4NTc1MzE1NjAgMHg2MzgwODI3OCAweDA2NTA3YzZhIDB4ZjVmOTZlYjMgMHg0YjA2MmNhMCAweGMzY2RkOTJhIC8vIG1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oYWRkcmVzcyxieXRlLGFwcGxpY2F0aW9uLGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgIm9wdEluQXNzZXQodWludDY0KXZvaWQiLCBtZXRob2QgIm5vb3AoKXZvaWQiLCBtZXRob2QgInN3YXBBbmRCcmlkZ2UodWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0sYnl0ZVszMl0sdWludDY0KXZvaWQiLCBtZXRob2QgInJlY2VpdmVUb2tlbnModWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0sYnl0ZVszMl0sdWludDY0KXZvaWQiLCBtZXRob2QgInJlZ2lzdGVyQnJpZGdlKGJ5dGUsYnl0ZVszMl0pdm9pZCIsIG1ldGhvZCAiYWRkQnJpZGdlVG9rZW4oYnl0ZSxieXRlWzMyXSl2b2lkIiwgbWV0aG9kICJyZW1vdmVCcmlkZ2VUb2tlbihieXRlLGJ5dGVbMzJdKXZvaWQiLCBtZXRob2QgIndpdGhkcmF3R2FzVG9rZW5zKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnModWludDY0KXZvaWQiLCBtZXRob2QgImdldEJyaWRnaW5nQ29zdEluVG9rZW5zKGJ5dGUsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiaGFzaE1lc3NhZ2UodWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZSxieXRlWzMyXSxieXRlWzMyXSlieXRlWzMyXSIsIG1ldGhvZCAiaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkKGJ5dGUsYnl0ZVszMl0pYm9vbCIKICAgIGJ5dGVjIDEzIC8vIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25Db3N0KGJ5dGUpdWludDY0IgogICAgcHVzaGJ5dGVzcyAweDA3ZGY4NDI5IDB4ODBjNWM3MGYgMHhmYWIxMTFhMiAweGVmMTVmODU1IDB4NmIxZWUyMjMgMHgxODcwYTQ5MiAweDM1NTczMjRkIDB4MDRiMTYxZjEgMHhkMmIzNTdlYiAvLyBtZXRob2QgImdldFJlY2VpdmVUb2tlbnNDb3N0KCl1aW50NjQiLCBtZXRob2QgImdldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0KCl1aW50NjQiLCBtZXRob2QgInN3YXAodWludDY0LHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJhZGRQb29sKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAicmVtb3ZlUG9vbCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic3RvcFN3YXAoKXZvaWQiLCBtZXRob2QgInN0YXJ0U3dhcCgpdm9pZCIsIG1ldGhvZCAic2V0U3RvcEF1dGhvcml0eShhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldFJlYmFsYW5jZXIoYWRkcmVzcyl2b2lkIgogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJnZXRHYXNVc2FnZShieXRlKXVpbnQ2NCIKICAgIHB1c2hieXRlc3MgMHgwY2E1YWU3YSAweDM5N2I5MThiIDB4Y2JmYzZkMDIgMHhlMTdiYWZiNCAvLyBtZXRob2QgInNldEdhc1VzYWdlKGJ5dGUsdWludDY0KXZvaWQiLCBtZXRob2QgInNldEdhc09yYWNsZShhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJnZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGJ5dGUpdWludDY0IiwgbWV0aG9kICJ0cmFuc2Zlck93bmVyc2hpcChhZGRyZXNzKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NyZWF0ZUFwcGxpY2F0aW9uX3JvdXRlQDUgbWFpbl9vcHRJbkFzc2V0X3JvdXRlQDYgbWFpbl9ub29wX3JvdXRlQDcgbWFpbl9zd2FwQW5kQnJpZGdlX3JvdXRlQDggbWFpbl9yZWNlaXZlVG9rZW5zX3JvdXRlQDkgbWFpbl9yZWdpc3RlckJyaWRnZV9yb3V0ZUAxMCBtYWluX2FkZEJyaWRnZVRva2VuX3JvdXRlQDExIG1haW5fcmVtb3ZlQnJpZGdlVG9rZW5fcm91dGVAMTIgbWFpbl93aXRoZHJhd0dhc1Rva2Vuc19yb3V0ZUAxMyBtYWluX3dpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19yb3V0ZUAxNCBtYWluX2dldEJyaWRnaW5nQ29zdEluVG9rZW5zX3JvdXRlQDE1IG1haW5faGFzaE1lc3NhZ2Vfcm91dGVAMTYgbWFpbl9pc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWRfcm91dGVAMTcgbWFpbl9nZXRUcmFuc2FjdGlvbkNvc3Rfcm91dGVAMTggbWFpbl9nZXRSZWNlaXZlVG9rZW5zQ29zdF9yb3V0ZUAxOSBtYWluX2dldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0X3JvdXRlQDIwIG1haW5fc3dhcF9yb3V0ZUAyMSBtYWluX2FkZFBvb2xfcm91dGVAMjIgbWFpbl9yZW1vdmVQb29sX3JvdXRlQDIzIG1haW5fc3RvcFN3YXBfcm91dGVAMjQgbWFpbl9zdGFydFN3YXBfcm91dGVAMjUgbWFpbl9zZXRTdG9wQXV0aG9yaXR5X3JvdXRlQDI2IG1haW5fc2V0UmViYWxhbmNlcl9yb3V0ZUAyNyBtYWluX2dldEdhc1VzYWdlX3JvdXRlQDI4IG1haW5fc2V0R2FzVXNhZ2Vfcm91dGVAMjkgbWFpbl9zZXRHYXNPcmFjbGVfcm91dGVAMzAgbWFpbl9nZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0X3JvdXRlQDMxIG1haW5fdHJhbnNmZXJPd25lcnNoaXBfcm91dGVAMzIKCm1haW5fYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fdHJhbnNmZXJPd25lcnNoaXBfcm91dGVAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdHJhbnNmZXJPd25lcnNoaXAKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdF9yb3V0ZUAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjM0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRHYXNPcmFjbGVfcm91dGVAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0R2FzT3JhY2xlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldEdhc1VzYWdlX3JvdXRlQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoyMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjIKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRHYXNVc2FnZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRHYXNVc2FnZV9yb3V0ZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjE3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0R2FzVXNhZ2UKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0UmViYWxhbmNlcl9yb3V0ZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTQ2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRSZWJhbGFuY2VyCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldFN0b3BBdXRob3JpdHlfcm91dGVAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0U3RvcEF1dGhvcml0eQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zdGFydFN3YXBfcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgc3RhcnRTd2FwCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3N0b3BTd2FwX3JvdXRlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHN0b3BTd2FwCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZVBvb2xfcm91dGVAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTEwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlUG9vbAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRQb29sX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZFBvb2wKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3dhcF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NzgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjc4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRTZW5kVHJhbnNhY3Rpb25TdG9yYWdlQ29zdF9yb3V0ZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzIzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYnl0ZWMgMTUgLy8gMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDNkNTQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRSZWNlaXZlVG9rZW5zQ29zdF9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzE2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYnl0ZWMgMTUgLy8gMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDNkNTQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRUcmFuc2FjdGlvbkNvc3Rfcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMxMQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzExCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0VHJhbnNhY3Rpb25Db3N0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2lzT3RoZXJCcmlkZ2VUb2tlblN1cHBvcnRlZF9yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzA2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMDYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBpc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWQKICAgIGJ5dGVjIDkgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2hhc2hNZXNzYWdlX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3OQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGhhc2hNZXNzYWdlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldEJyaWRnaW5nQ29zdEluVG9rZW5zX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNjIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI2MgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGdldEJyaWRnaW5nQ29zdEluVG9rZW5zCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3dpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQ2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNDYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiB3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fd2l0aGRyYXdHYXNUb2tlbnNfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0MAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgd2l0aGRyYXdHYXNUb2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlQnJpZGdlVG9rZW5fcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIzNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjM0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlQnJpZGdlVG9rZW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkQnJpZGdlVG9rZW5fcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjI4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkQnJpZGdlVG9rZW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVnaXN0ZXJCcmlkZ2Vfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjIyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVnaXN0ZXJCcmlkZ2UKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVjZWl2ZVRva2Vuc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNzQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlY2VpdmVUb2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3dhcEFuZEJyaWRnZV9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo5My05NwogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo5My05NwogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIGNhbGxzdWIgc3dhcEFuZEJyaWRnZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9ub29wX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcHRJbkFzc2V0X3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc0CiAgICAvLyBvcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc0CiAgICAvLyBvcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgY2FsbHN1YiBvcHRJbkFzc2V0CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZUFwcGxpY2F0aW9uX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo6Z2V0UHJldkFzc2V0UGF5KGFzc2V0SWQ6IHVpbnQ2NCkgLT4gdWludDY0OgpnZXRQcmV2QXNzZXRQYXk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRQcmV2QXNzZXRQYXkoYXNzZXRJZDogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjM2CiAgICAvLyBhc3NlcnQoVHhuLmdyb3VwSW5kZXggPiAwLCBgQXNzZXQgdHhuIG1pc3NpbmdgKTsKICAgIHR4biBHcm91cEluZGV4CiAgICBhc3NlcnQgLy8gQXNzZXQgdHhuIG1pc3NpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czozOQogICAgLy8gY29uc3QgcHJldklkeDogdWludDY0ID0gVHhuLmdyb3VwSW5kZXggLSAxOwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDEKICAgIC8vIGNvbnN0IHBheSA9IGd0eG4uQXNzZXRUcmFuc2ZlclR4bihwcmV2SWR4KTsKICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDQKICAgIC8vIGFzc2VydChwYXkuYXNzZXRSZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIGBBc3NldCBtdXN0IGdvIHRvIGFwcGApOwogICAgZHVwCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBBc3NldCBtdXN0IGdvIHRvIGFwcAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjQ1CiAgICAvLyBhc3NlcnQocGF5LnhmZXJBc3NldC5pZCA9PT0gYXNzZXRJZCwgYFdyb25nIGFzc2V0YCk7CiAgICBkdXAKICAgIGd0eG5zIFhmZXJBc3NldAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDgKICAgIC8vIGFzc2VydChwYXkucmVrZXlUbyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLCBgUmVrZXkgbm90IGFsbG93ZWRgKTsKICAgIGR1cAogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIFJla2V5IG5vdCBhbGxvd2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDkKICAgIC8vIGFzc2VydChwYXkuYXNzZXRDbG9zZVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsIGBDbG9zZVRvIG5vdCBhbGxvd2VkYCk7CiAgICBkdXAKICAgIGd0eG5zIEFzc2V0Q2xvc2VUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIENsb3NlVG8gbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo1MAogICAgLy8gcmV0dXJuIHBheS5hc3NldEFtb3VudDsKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6OmdldFByZXZQYXkocmVsVHhJbmRleDogdWludDY0KSAtPiB1aW50NjQ6CmdldFByZXZQYXk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTMKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRQcmV2UGF5KHJlbFR4SW5kZXg6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTQKICAgIC8vIGlmIChUeG4uZ3JvdXBJbmRleCA8IHJlbFR4SW5kZXgpIHJldHVybiAwOwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYnogZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDIKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTYKICAgIC8vIGNvbnN0IHR4SWR4OiB1aW50NjQgPSBUeG4uZ3JvdXBJbmRleCAtIHJlbFR4SW5kZXg7CiAgICB0eG4gR3JvdXBJbmRleAogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjU4CiAgICAvLyBpZiAoZ3R4bi5UcmFuc2FjdGlvbih0eElkeCkudHlwZSAhPT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpIHJldHVybiAwOwogICAgZ3R4bnMgVHlwZUVudW0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA0CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjU5CiAgICAvLyBjb25zdCBwYXkgPSBndHhuLlBheW1lbnRUeG4odHhJZHgpOwogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo2MQogICAgLy8gaWYgKHBheS5yZWNlaXZlciAhPT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpIHJldHVybiAwOwogICAgZnJhbWVfZGlnIDEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgIT0KICAgIGJ6IGdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA2CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjYzCiAgICAvLyBpZiAocGF5LnJla2V5VG8gIT09IEdsb2JhbC56ZXJvQWRkcmVzcykgcmV0dXJuIDA7CiAgICBmcmFtZV9kaWcgMQogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDgKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NjQKICAgIC8vIGlmIChwYXkuY2xvc2VSZW1haW5kZXJUbyAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSByZXR1cm4gMDsKICAgIGZyYW1lX2RpZyAxCiAgICBndHhucyBDbG9zZVJlbWFpbmRlclRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBnZXRQcmV2UGF5X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjY2CiAgICAvLyByZXR1cm4gcGF5LmFtb3VudDsKICAgIGZyYW1lX2RpZyAxCiAgICBndHhucyBBbW91bnQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLmNyZWF0ZUFwcGxpY2F0aW9uKG93bmVyOiBieXRlcywgY2hhaW5JZDogYnl0ZXMsIG1lc3NlbmdlcjogdWludDY0LCBnYXNPcmFjbGU6IHVpbnQ2NCkgLT4gdm9pZDoKY3JlYXRlQXBwbGljYXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgcHJvdG8gNCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgYnl0ZWNfMyAvLyAib3duZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo5CiAgICAvLyB0aGlzLm93bmVyLnZhbHVlID0gb3duZXI7CiAgICBmcmFtZV9kaWcgLTQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjkKICAgIC8vIGdhc09yYWNsZSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgYnl0ZWMgNCAvLyAiZ2FzT3JhY2xlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxNAogICAgLy8gdGhpcy5nYXNPcmFjbGUudmFsdWUgPSBnYXNPcmFjbGU7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjM5CiAgICAvLyBwcml2YXRlIHN0b3BBdXRob3JpdHkgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGJ5dGVjIDEwIC8vICJzdG9wQXV0aG9yaXR5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1NAogICAgLy8gdGhpcy5zdG9wQXV0aG9yaXR5LnZhbHVlID0gb3duZXI7CiAgICBmcmFtZV9kaWcgLTQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBjaGFpbklkID0gR2xvYmFsU3RhdGU8Qnl0ZT4oKTsKICAgIGJ5dGVjIDUgLy8gImNoYWluSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjcwCiAgICAvLyB0aGlzLmNoYWluSWQudmFsdWUgPSBjaGFpbklkOwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyB0aGlzLm1lc3Nlbmdlci52YWx1ZSA9IG1lc3NlbmdlcjsKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5vcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCkgLT4gdm9pZDoKb3B0SW5Bc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NzQKICAgIC8vIG9wdEluQXNzZXQoYXNzZXRJZDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NzUKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo3OC04NAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBBc3NldChhc3NldElkKSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo4MgogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjgxCiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc4LTgzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IEFzc2V0KGFzc2V0SWQpLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo3OC04NAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBBc3NldChhc3NldElkKSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6ODYKICAgIC8vIGxvZygnQnJpZGdlOiBvcHQtaW4gY29tcGxldGVkJyk7CiAgICBwdXNoYnl0ZXMgIkJyaWRnZTogb3B0LWluIGNvbXBsZXRlZCIKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLnN3YXBBbmRCcmlkZ2UodG9rZW5JZDogdWludDY0LCByZWNpcGllbnQ6IGJ5dGVzLCBkZXN0aW5hdGlvbkNoYWluSWQ6IGJ5dGVzLCByZWNlaXZlVG9rZW46IGJ5dGVzLCBub25jZTogYnl0ZXMsIGZlZVRva2VuQW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CnN3YXBBbmRCcmlkZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjkzLTEwNQogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIC8vIHN3YXBBbmRCcmlkZ2UoCiAgICAvLyAgIHRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIGRlc3RpbmF0aW9uQ2hhaW5JZDogQnl0ZSwKICAgIC8vICAgcmVjZWl2ZVRva2VuOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIG5vbmNlOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIGZlZVRva2VuQW1vdW50OiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDYgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MAogICAgLy8gY2FuU3dhcCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2MQogICAgLy8gYXNzZXJ0KHRoaXMuY2FuU3dhcC52YWx1ZSwgJ1JvdXRlcjogc3dhcCBwcm9oaWJpdGVkJyk7CiAgICBhc3NlcnQgLy8gUm91dGVyOiBzd2FwIHByb2hpYml0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyBjb25zdCBhbW91bnQgPSBnZXRQcmV2QXNzZXRQYXkodG9rZW5JZCk7CiAgICBmcmFtZV9kaWcgLTYKICAgIGNhbGxzdWIgZ2V0UHJldkFzc2V0UGF5CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTA4CiAgICAvLyBhc3NlcnQoYW1vdW50ID4gZmVlVG9rZW5BbW91bnQsICdCcmlkZ2U6IGFtb3VudCB0b28gbG93IGZvciBmZWUnKTsKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEJyaWRnZTogYW1vdW50IHRvbyBsb3cgZm9yIGZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMDkKICAgIC8vIGFzc2VydCghcmVjaXBpZW50LmJ5dGVzLmVxdWFscyhiemVybygzMikpLCAnQnJpZGdlOiBicmlkZ2UgdG8gdGhlIHplcm8gYWRkcmVzcycpOwogICAgcHVzaGludCAzMiAvLyAzMgogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtNQogICAgPT0KICAgICEKICAgIGFzc2VydCAvLyBCcmlkZ2U6IGJyaWRnZSB0byB0aGUgemVybyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gY29uc3QgYnJpZGdpbmdGZWU6IHVpbnQ2NCA9IGdldFByZXZQYXkoMikgKyB0aGlzLl9jb252ZXJ0QnJpZGdpbmdGZWVJblRva2Vuc1RvTmF0aXZlVG9rZW4odG9rZW5JZCwgZmVlVG9rZW5BbW91bnQpOwogICAgcHVzaGludCAyIC8vIDIKICAgIGNhbGxzdWIgZ2V0UHJldlBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMzcKICAgIC8vIGlmIChmZWVUb2tlbkFtb3VudCA9PT0gMCkgcmV0dXJuIDA7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBzd2FwQW5kQnJpZGdlX2FmdGVyX2lmX2Vsc2VAMwogICAgaW50Y18wIC8vIDAKCnN3YXBBbmRCcmlkZ2VfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuX2NvbnZlcnRCcmlkZ2luZ0ZlZUluVG9rZW5zVG9OYXRpdmVUb2tlbkA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMTEKICAgIC8vIGNvbnN0IGJyaWRnaW5nRmVlOiB1aW50NjQgPSBnZXRQcmV2UGF5KDIpICsgdGhpcy5fY29udmVydEJyaWRnaW5nRmVlSW5Ub2tlbnNUb05hdGl2ZVRva2VuKHRva2VuSWQsIGZlZVRva2VuQW1vdW50KTsKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExMgogICAgLy8gY29uc3QgYW1vdW50QWZ0ZXJGZWU6IHVpbnQ2NCA9IGFtb3VudCAtIGZlZVRva2VuQW1vdW50OwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIGNvbnN0IHZVc2RBbW91bnQgPSB0aGlzLnNlbmRBbmRTd2FwVG9WVXNkKHRva2VuSWQsIHNlbmRlciwgYW1vdW50QWZ0ZXJGZWUpOwogICAgZnJhbWVfZGlnIC02CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExMwogICAgLy8gY29uc3Qgc2VuZGVyID0gbmV3IEFkZHJlc3MoVHhuLnNlbmRlcik7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExNAogICAgLy8gY29uc3QgdlVzZEFtb3VudCA9IHRoaXMuc2VuZEFuZFN3YXBUb1ZVc2QodG9rZW5JZCwgc2VuZGVyLCBhbW91bnRBZnRlckZlZSk7CiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgc2VuZEFuZFN3YXBUb1ZVc2QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIGNoYWluSWQgPSBHbG9iYWxTdGF0ZTxCeXRlPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNoYWluSWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIGFzc2VydChkZXN0aW5hdGlvbkNoYWluSWQgIT09IHRoaXMuY2hhaW5JZC52YWx1ZSwgJ0JyaWRnZTogd3JvbmcgZGVzdGluYXRpb24gY2hhaW4nKTsKICAgIGZyYW1lX2RpZyAtNAogICAgIT0KICAgIGFzc2VydCAvLyBCcmlkZ2U6IHdyb25nIGRlc3RpbmF0aW9uIGNoYWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMzMwogICAgLy8gcmV0dXJuIGNoYWluSWQuYnl0ZXMuY29uY2F0KHRva2VuLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NjYKICAgIC8vIG90aGVyQnJpZGdlVG9rZW5zID0gQm94TWFwPGJ5dGVzLCBTdGF0aWNCeXRlcz4oeyBrZXlQcmVmaXg6ICd0JyB9KTsKICAgIGJ5dGVjIDcgLy8gInQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTI3CiAgICAvLyBhc3NlcnQodGhpcy5vdGhlckJyaWRnZVRva2Vucyh0aGlzLl9nZXRPdGhlckJyaWRnZVRva2Vuc0tleShkZXN0aW5hdGlvbkNoYWluSWQsIHJlY2VpdmVUb2tlbikpLmV4aXN0cywgJ0JyaWRnZTogdW5rbm93biBjaGFpbiBvciB0b2tlbicpOwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQnJpZGdlOiB1bmtub3duIGNoYWluIG9yIHRva2VuCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBjaGFpbklkID0gR2xvYmFsU3RhdGU8Qnl0ZT4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjaGFpbklkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTI5CiAgICAvLyBjb25zdCBtZXNzYWdlID0gdGhpcy5oYXNoTWVzc2FnZShhbW91bnQsIHJlY2lwaWVudCwgdGhpcy5jaGFpbklkLnZhbHVlLCBkZXN0aW5hdGlvbkNoYWluSWQsIHJlY2VpdmVUb2tlbiwgbm9uY2UpOwogICAgZGlnIDEKICAgIGZyYW1lX2RpZyAtNQogICAgdW5jb3ZlciAyCiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGhhc2hNZXNzYWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gY29uc3QgYnJpZGdlVHJhbnNhY3Rpb25Db3N0ID0gdGhpcy5nZXRUcmFuc2FjdGlvbkNvc3QoZGVzdGluYXRpb25DaGFpbklkKTsKICAgIGZyYW1lX2RpZyAtNAogICAgY2FsbHN1YiBnZXRUcmFuc2FjdGlvbkNvc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NjEKICAgIC8vIHNlbnRNZXNzYWdlcyA9IEJveE1hcDxTdGF0aWNCeXRlczwzMj4sIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ3MnIH0pOwogICAgcHVzaGJ5dGVzICJzIgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNDgKICAgIC8vIGFzc2VydCghdGhpcy5zZW50TWVzc2FnZXMobWVzc2FnZSkuZXhpc3RzLCAnQnJpZGdlOiB0b2tlbnMgYWxyZWFkeSBzZW50Jyk7CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEJyaWRnZTogdG9rZW5zIGFscmVhZHkgc2VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTAKICAgIC8vIHRoaXMuc2VudE1lc3NhZ2VzKG1lc3NhZ2UpLnZhbHVlID0gbmV3IFN0YXRpY0J5dGVzKCk7CiAgICBwdXNoYnl0ZXMgMHgKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTUyCiAgICAvLyBjb25zdCBkZXN0aW5hdGlvbkNoYWluSWQgPSBtZXNzYWdlLmF0KDEpOwogICAgZGlnIDEKICAgIGV4dHJhY3QgMSAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTMtMTU2CiAgICAvLyBjb25zdCBtZXNzYWdlQ29zdCA9IGFiaUNhbGwoTWVzc2VuZ2VyLnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbkNvc3QsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibWVzc2VuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTUzLTE1NgogICAgLy8gY29uc3QgbWVzc2FnZUNvc3QgPSBhYmlDYWxsKE1lc3Nlbmdlci5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25Db3N0LCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2Rlc3RpbmF0aW9uQ2hhaW5JZF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIGJ5dGVjIDEzIC8vIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25Db3N0KGJ5dGUpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibWVzc2VuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTYwCiAgICAvLyByZWNlaXZlcjogdGhpcy5tZXNzZW5nZXIudmFsdWUuYWRkcmVzcywKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTcKICAgIC8vIG1lc3NlbmdlciA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gIm1lc3NlbmdlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gaXR4bi5zdWJtaXRHcm91cChwYXltZW50UGFyYW1zLCBhcHBDYWxsUGFyYW1zKTsKICAgIGl0eG5fYmVnaW4KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTgtMTYxCiAgICAvLyBjb25zdCBwYXltZW50UGFyYW1zID0gaXR4bi5wYXltZW50KHsKICAgIC8vICAgYW1vdW50OiBtZXNzYWdlQ29zdCwKICAgIC8vICAgcmVjZWl2ZXI6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmFkZHJlc3MsCiAgICAvLyB9KTsKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKHBheW1lbnRQYXJhbXMsIGFwcENhbGxQYXJhbXMpOwogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE2NgogICAgLy8gYXJjNC5tZXRob2RTZWxlY3Rvcignc2VuZE1lc3NhZ2UoYnl0ZVszMl0pdm9pZCcpLAogICAgcHVzaGJ5dGVzIDB4YTMyNDk5ODkgLy8gbWV0aG9kICJzZW5kTWVzc2FnZShieXRlWzMyXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNjMtMTY5CiAgICAvLyBjb25zdCBhcHBDYWxsUGFyYW1zID0gaXR4bi5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICAvLyAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICBhcmM0Lm1ldGhvZFNlbGVjdG9yKCdzZW5kTWVzc2FnZShieXRlWzMyXSl2b2lkJyksCiAgICAvLyAgICAgbWVzc2FnZSwKICAgIC8vICAgXSwKICAgIC8vIH0pOwogICAgaW50Y18yIC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNzAKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAocGF5bWVudFBhcmFtcywgYXBwQ2FsbFBhcmFtcyk7CiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzIKICAgIC8vIGVtaXQ8UmVjZWl2ZUZlZT4oeyBicmlkZ2VUcmFuc2FjdGlvbkNvc3QsIG1lc3NhZ2VUcmFuc2FjdGlvbkNvc3QgfSk7CiAgICBkaWcgMQogICAgaXRvYgogICAgZGlnIDEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4NGI1NTQxOWIgLy8gbWV0aG9kICJSZWNlaXZlRmVlKHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTMzCiAgICAvLyBhc3NlcnQoYnJpZGdpbmdGZWUgPj0gYnJpZGdlVHJhbnNhY3Rpb25Db3N0ICsgbWVzc2FnZVRyYW5zYWN0aW9uQ29zdCwgJ0JyaWRnZTogbm90IGVub3VnaCBmZWUnKTsKICAgICsKICAgIHVuY292ZXIgMgogICAgPD0KICAgIGFzc2VydCAvLyBCcmlkZ2U6IG5vdCBlbm91Z2ggZmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzNQogICAgLy8gYW1vdW50LAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzQtMTQxCiAgICAvLyBlbWl0PFRva2Vuc1NlbnQ+KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGRlc3RpbmF0aW9uQ2hhaW5JZCwKICAgIC8vICAgICByZWNlaXZlVG9rZW4sCiAgICAvLyAgICAgbm9uY2UsCiAgICAvLyAgICAgbWVzc2VuZ2VyOiBBTExCUklER0VfTUVTU0VOR0VSLAogICAgLy8gICB9LAogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIGNvbnN0IEFMTEJSSURHRV9NRVNTRU5HRVIgPSBuZXcgQnl0ZSgxKTsKICAgIGJ5dGVjIDExIC8vIDB4MDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTM0LTE0MQogICAgLy8gZW1pdDxUb2tlbnNTZW50Pih7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2lwaWVudCwKICAgIC8vICAgICBkZXN0aW5hdGlvbkNoYWluSWQsCiAgICAvLyAgICAgcmVjZWl2ZVRva2VuLAogICAgLy8gICAgIG5vbmNlLAogICAgLy8gICAgIG1lc3NlbmdlcjogQUxMQlJJREdFX01FU1NFTkdFUiwKICAgIC8vICAgfSwKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzQtMTQyCiAgICAvLyBlbWl0PFRva2Vuc1NlbnQ+KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGRlc3RpbmF0aW9uQ2hhaW5JZCwKICAgIC8vICAgICByZWNlaXZlVG9rZW4sCiAgICAvLyAgICAgbm9uY2UsCiAgICAvLyAgICAgbWVzc2VuZ2VyOiBBTExCUklER0VfTUVTU0VOR0VSLAogICAgLy8gICB9LAogICAgLy8gKTsKICAgIHB1c2hieXRlcyAweDIyOWZiYWVjIC8vIG1ldGhvZCAiVG9rZW5zU2VudCh1aW50NjQsYnl0ZVszMl0sYnl0ZSxieXRlWzMyXSxieXRlWzMyXSxieXRlKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCnN3YXBBbmRCcmlkZ2VfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMzkKICAgIC8vIGNvbnN0IGZlZTogdWludDY0ID0gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlICogZmVlVG9rZW5BbW91bnQgLyBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0UHJpY2UsIHsKICAgIGZyYW1lX2RpZyAtNgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozNgogICAgLy8gcHJvdGVjdGVkIGJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZicgfSk7CiAgICBwdXNoYnl0ZXMgImYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzM5CiAgICAvLyBjb25zdCBmZWU6IHVpbnQ2NCA9IHRoaXMuYnJpZGdpbmdGZWVDb252ZXJzaW9uU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZSAqIGZlZVRva2VuQW1vdW50IC8gYWJpQ2FsbChHYXNPcmFjbGUucHJvdG90eXBlLmdldFByaWNlLCB7CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMzOS0zNDIKICAgIC8vIGNvbnN0IGZlZTogdWludDY0ID0gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlICogZmVlVG9rZW5BbW91bnQgLyBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0UHJpY2UsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuZ2FzT3JhY2xlLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbdGhpcy5jaGFpbklkLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo5CiAgICAvLyBnYXNPcmFjbGUgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJnYXNPcmFjbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NgogICAgLy8gY2hhaW5JZCA9IEdsb2JhbFN0YXRlPEJ5dGU+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiY2hhaW5JZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMzOS0zNDIKICAgIC8vIGNvbnN0IGZlZTogdWludDY0ID0gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlICogZmVlVG9rZW5BbW91bnQgLyBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0UHJpY2UsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuZ2FzT3JhY2xlLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbdGhpcy5jaGFpbklkLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgcHVzaGJ5dGVzIDB4MWRiNzBjZGQgLy8gbWV0aG9kICJnZXRQcmljZShieXRlKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGJ0b2kKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzQ0CiAgICAvLyBlbWl0PEJyaWRnaW5nRmVlRnJvbVRva2Vucz4oeyBmZWUgfSk7CiAgICBkdXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweGUwN2Y2YjM2IC8vIG1ldGhvZCAiQnJpZGdpbmdGZWVGcm9tVG9rZW5zKHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMTEKICAgIC8vIGNvbnN0IGJyaWRnaW5nRmVlOiB1aW50NjQgPSBnZXRQcmV2UGF5KDIpICsgdGhpcy5fY29udmVydEJyaWRnaW5nRmVlSW5Ub2tlbnNUb05hdGl2ZVRva2VuKHRva2VuSWQsIGZlZVRva2VuQW1vdW50KTsKICAgIGIgc3dhcEFuZEJyaWRnZV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5fY29udmVydEJyaWRnaW5nRmVlSW5Ub2tlbnNUb05hdGl2ZVRva2VuQDUKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UucmVjZWl2ZVRva2VucyhhbW91bnQ6IHVpbnQ2NCwgcmVjaXBpZW50OiBieXRlcywgc291cmNlQ2hhaW5JZDogYnl0ZXMsIHJlY2VpdmVUb2tlbjogYnl0ZXMsIG5vbmNlOiBieXRlcywgcmVjZWl2ZUFtb3VudE1pbjogdWludDY0KSAtPiB2b2lkOgpyZWNlaXZlVG9rZW5zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNzQtMTgyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHJlY2VpdmVUb2tlbnMoCiAgICAvLyAgIGFtb3VudDogdWludDY0LAogICAgLy8gICByZWNpcGllbnQ6IFN0YXRpY0J5dGVzPDMyPiwKICAgIC8vICAgc291cmNlQ2hhaW5JZDogQnl0ZSwKICAgIC8vICAgcmVjZWl2ZVRva2VuOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIG5vbmNlOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICk6IHZvaWQgewogICAgcHJvdG8gNiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjUwCiAgICAvLyBjYW5Td2FwID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2FuU3dhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjYxCiAgICAvLyBhc3NlcnQodGhpcy5jYW5Td2FwLnZhbHVlLCAnUm91dGVyOiBzd2FwIHByb2hpYml0ZWQnKTsKICAgIGFzc2VydCAvLyBSb3V0ZXI6IHN3YXAgcHJvaGliaXRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2MwogICAgLy8gb3RoZXJCcmlkZ2VzID0gQm94TWFwPEJ5dGUsIFN0YXRpY0J5dGVzPDMyPj4oeyBrZXlQcmVmaXg6ICdiJyB9KTsKICAgIHB1c2hieXRlcyAiYiIKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE4NAogICAgLy8gYXNzZXJ0KHRoaXMub3RoZXJCcmlkZ2VzKHNvdXJjZUNoYWluSWQpLmV4aXN0cywgJ0JyaWRnZTogc291cmNlIG5vdCByZWdpc3RlcmVkJyk7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBCcmlkZ2U6IHNvdXJjZSBub3QgcmVnaXN0ZXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxODUKICAgIC8vIGNvbnN0IHZhbHVlOiB1aW50NjQgPSBnZXRQcmV2UGF5KDEpOwogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgZ2V0UHJldlBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxODcKICAgIC8vIGFzc2VydCh2YWx1ZSA+PSBzdG9yYWdlRmVlLCAnQnJpZGdlOiBub3QgZW5vdWdoIGZlZScpOwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMyMAogICAgLy8gcmV0dXJuIDE1NzAwOwogICAgaW50YyA0IC8vIDE1NzAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE4NwogICAgLy8gYXNzZXJ0KHZhbHVlID49IHN0b3JhZ2VGZWUsICdCcmlkZ2U6IG5vdCBlbm91Z2ggZmVlJyk7CiAgICA+PQogICAgYXNzZXJ0IC8vIEJyaWRnZTogbm90IGVub3VnaCBmZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIGNoYWluSWQgPSBHbG9iYWxTdGF0ZTxCeXRlPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNoYWluSWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxODkKICAgIC8vIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmhhc2hNZXNzYWdlKGFtb3VudCwgcmVjaXBpZW50LCBzb3VyY2VDaGFpbklkLCB0aGlzLmNoYWluSWQudmFsdWUsIHJlY2VpdmVUb2tlbiwgbm9uY2UpOwogICAgZnJhbWVfZGlnIC02CiAgICBmcmFtZV9kaWcgLTUKICAgIGZyYW1lX2RpZyAtNAogICAgdW5jb3ZlciAzCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBoYXNoTWVzc2FnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjgwCiAgICAvLyBjb25zdCBoOiBieXRlcyA9IG9wLmtlY2NhazI1NihvcC5jb25jYXQobWVzc2FnZS5ieXRlcywgc2VuZGVyQWRkcmVzcykpOwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gY29uc3QgbWVzc2FnZVdpdGhTZW5kZXIgPSBoYXNoV2l0aFNlbmRlckFkZHJlc3MobWVzc2FnZSwgVHhuLnNlbmRlci5ieXRlcyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6ODAKICAgIC8vIGNvbnN0IGg6IGJ5dGVzID0gb3Aua2VjY2FrMjU2KG9wLmNvbmNhdChtZXNzYWdlLmJ5dGVzLCBzZW5kZXJBZGRyZXNzKSk7CiAgICBjb25jYXQKICAgIGtlY2NhazI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjgzCiAgICAvLyBjb25zdCBmaXJzdDIgPSBvcC5zdWJzdHJpbmcobWVzc2FnZS5ieXRlcywgMCwgMik7CiAgICBzd2FwCiAgICBzdWJzdHJpbmcgMCAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6ODUKICAgIC8vIGNvbnN0IGxhc3QzMCA9IG9wLnN1YnN0cmluZyhoLCAyLCAzMik7CiAgICBzd2FwCiAgICBzdWJzdHJpbmcgMiAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gbmV3IFN0YXRpY0J5dGVzPDMyPihvcC5jb25jYXQoZmlyc3QyLCBsYXN0MzApKTsKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU5CiAgICAvLyBwcm9jZXNzZWRNZXNzYWdlcyA9IEJveE1hcDxTdGF0aWNCeXRlczwzMj4sIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ20nIH0pOwogICAgcHVzaGJ5dGVzICJtIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxOTIKICAgIC8vIGFzc2VydCghdGhpcy5wcm9jZXNzZWRNZXNzYWdlcyhtZXNzYWdlV2l0aFNlbmRlcikuZXhpc3RzLCAnQnJpZGdlOiBtZXNzYWdlIHByb2Nlc3NlZCcpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBCcmlkZ2U6IG1lc3NhZ2UgcHJvY2Vzc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE5NAogICAgLy8gdGhpcy5wcm9jZXNzZWRNZXNzYWdlcyhtZXNzYWdlV2l0aFNlbmRlcikudmFsdWUgPSBuZXcgU3RhdGljQnl0ZXMoKTsKICAgIHB1c2hieXRlcyAweAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxOTctMjAwCiAgICAvLyBhc3NlcnQoYWJpQ2FsbChNZXNzZW5nZXIucHJvdG90eXBlLnJlY2VpdmVkTWVzc2FnZXMsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbbWVzc2FnZVdpdGhTZW5kZXJdLAogICAgLy8gfSkucmV0dXJuVmFsdWUsICdCcmlkZ2U6IG5vIG1lc3NhZ2UnKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTcKICAgIC8vIG1lc3NlbmdlciA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gIm1lc3NlbmdlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE5Ny0yMDAKICAgIC8vIGFzc2VydChhYmlDYWxsKE1lc3Nlbmdlci5wcm90b3R5cGUucmVjZWl2ZWRNZXNzYWdlcywgewogICAgLy8gICBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFttZXNzYWdlV2l0aFNlbmRlcl0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZSwgJ0JyaWRnZTogbm8gbWVzc2FnZScpOwogICAgcHVzaGJ5dGVzIDB4MzNlMTQ3YWEgLy8gbWV0aG9kICJyZWNlaXZlZE1lc3NhZ2VzKGJ5dGVbMzJdKWJvb2wiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBhc3NlcnQgLy8gQnJpZGdlOiBubyBtZXNzYWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIwMgogICAgLy8gY29uc3QgdG9rZW5JZDogdWludDY0ID0gb3AuZXh0cmFjdFVpbnQ2NChyZWNlaXZlVG9rZW4uYnl0ZXMsIDI0KTsKICAgIGZyYW1lX2RpZyAtMwogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjA0LTIwOQogICAgLy8gY29uc3QgcmVjZWl2ZUFtb3VudCA9IHRoaXMucmVjZWl2ZUFuZFN3YXBGcm9tVlVzZCgKICAgIC8vICAgdG9rZW5JZCwKICAgIC8vICAgcmVjaXBpZW50QWRkcmVzcywKICAgIC8vICAgYW1vdW50LAogICAgLy8gICByZWNlaXZlQW1vdW50TWluLAogICAgLy8gKTsKICAgIGZyYW1lX2RpZyAtNQogICAgZnJhbWVfZGlnIC02CiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgcmVjZWl2ZUFuZFN3YXBGcm9tVlVzZAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMTIKICAgIC8vIGNvbnN0IGV4dHJhR2FzOiB1aW50NjQgPSB2YWx1ZSAtIHN0b3JhZ2VGZWU7CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzIwCiAgICAvLyByZXR1cm4gMTU3MDA7CiAgICBpbnRjIDQgLy8gMTU3MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjEyCiAgICAvLyBjb25zdCBleHRyYUdhczogdWludDY0ID0gdmFsdWUgLSBzdG9yYWdlRmVlOwogICAgLQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMjAKICAgIC8vIHJldHVybiAxNTcwMDsKICAgIGludGMgNCAvLyAxNTcwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMTMKICAgIC8vIGlmICh2YWx1ZSA+IHN0b3JhZ2VGZWUpIHsKICAgID4KICAgIGJ6IHJlY2VpdmVUb2tlbnNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIxNC0yMTcKICAgIC8vIHBheW1lbnQoewogICAgLy8gICBhbW91bnQ6IGV4dHJhR2FzLAogICAgLy8gICByZWNlaXZlcjogcmVjaXBpZW50QWRkcmVzcy5ieXRlcywKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC01CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgMgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CgpyZWNlaXZlVG9rZW5zX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjE5CiAgICAvLyBlbWl0PFRva2Vuc1JlY2VpdmVkPih7IHJlY2VpdmVBbW91bnQsIHJlY2lwaWVudDogcmVjaXBpZW50QWRkcmVzcywgbm9uY2UsIG1lc3NlbmdlcjogQUxMQlJJREdFX01FU1NFTkdFUiwgbWVzc2FnZTogbWVzc2FnZVdpdGhTZW5kZXIgfSk7CiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyBjb25zdCBBTExCUklER0VfTUVTU0VOR0VSID0gbmV3IEJ5dGUoMSk7CiAgICBieXRlYyAxMSAvLyAweDAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIxOQogICAgLy8gZW1pdDxUb2tlbnNSZWNlaXZlZD4oeyByZWNlaXZlQW1vdW50LCByZWNpcGllbnQ6IHJlY2lwaWVudEFkZHJlc3MsIG5vbmNlLCBtZXNzZW5nZXI6IEFMTEJSSURHRV9NRVNTRU5HRVIsIG1lc3NhZ2U6IG1lc3NhZ2VXaXRoU2VuZGVyIH0pOwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg0NTgzNmFkNiAvLyBtZXRob2QgIlRva2Vuc1JlY2VpdmVkKHVpbnQ2NCxhZGRyZXNzLGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0pIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5yZWdpc3RlckJyaWRnZShjaGFpbklkOiBieXRlcywgYnJpZGdlQWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6CnJlZ2lzdGVyQnJpZGdlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMjItMjIzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHJlZ2lzdGVyQnJpZGdlKGNoYWluSWQ6IEJ5dGUsIGJyaWRnZUFkZHJlc3M6IFN0YXRpY0J5dGVzPDMyPik6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyNAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjYzCiAgICAvLyBvdGhlckJyaWRnZXMgPSBCb3hNYXA8Qnl0ZSwgU3RhdGljQnl0ZXM8MzI+Pih7IGtleVByZWZpeDogJ2InIH0pOwogICAgcHVzaGJ5dGVzICJiIgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjI1CiAgICAvLyB0aGlzLm90aGVyQnJpZGdlcyhjaGFpbklkKS52YWx1ZSA9IGJyaWRnZUFkZHJlc3M7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5hZGRCcmlkZ2VUb2tlbihjaGFpbklkOiBieXRlcywgdG9rZW5BZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKYWRkQnJpZGdlVG9rZW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyOC0yMjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gYWRkQnJpZGdlVG9rZW4oY2hhaW5JZDogQnl0ZSwgdG9rZW5BZGRyZXNzOiBTdGF0aWNCeXRlczwzMj4pOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMzAKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMzMKICAgIC8vIHJldHVybiBjaGFpbklkLmJ5dGVzLmNvbmNhdCh0b2tlbi5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY2CiAgICAvLyBvdGhlckJyaWRnZVRva2VucyA9IEJveE1hcDxieXRlcywgU3RhdGljQnl0ZXM+KHsga2V5UHJlZml4OiAndCcgfSk7CiAgICBieXRlYyA3IC8vICJ0IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gdGhpcy5vdGhlckJyaWRnZVRva2Vucyh0aGlzLl9nZXRPdGhlckJyaWRnZVRva2Vuc0tleShjaGFpbklkLCB0b2tlbkFkZHJlc3MpKS52YWx1ZSA9IG5ldyBTdGF0aWNCeXRlcygpOwogICAgcHVzaGJ5dGVzIDB4CiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UucmVtb3ZlQnJpZGdlVG9rZW4oY2hhaW5JZDogYnl0ZXMsIHRva2VuQWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZUJyaWRnZVRva2VuOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMzQtMjM1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHJlbW92ZUJyaWRnZVRva2VuKGNoYWluSWQ6IEJ5dGUsIHRva2VuQWRkcmVzczogU3RhdGljQnl0ZXM8MzI+KTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjM2CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzMzCiAgICAvLyByZXR1cm4gY2hhaW5JZC5ieXRlcy5jb25jYXQodG9rZW4uYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2NgogICAgLy8gb3RoZXJCcmlkZ2VUb2tlbnMgPSBCb3hNYXA8Ynl0ZXMsIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ3QnIH0pOwogICAgYnl0ZWMgNyAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMzcKICAgIC8vIHRoaXMub3RoZXJCcmlkZ2VUb2tlbnModGhpcy5fZ2V0T3RoZXJCcmlkZ2VUb2tlbnNLZXkoY2hhaW5JZCwgdG9rZW5BZGRyZXNzKSkuZGVsZXRlKCk7CiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS53aXRoZHJhd0dhc1Rva2VucyhhbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKd2l0aGRyYXdHYXNUb2tlbnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0MC0yNDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gd2l0aGRyYXdHYXNUb2tlbnMoYW1vdW50OiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNDIKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNDMKICAgIC8vIHBheW1lbnQoeyBhbW91bnQ6IGFtb3VudCwgcmVjZWl2ZXI6IHRoaXMub3duZXIudmFsdWUuYnl0ZXMgfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm93bmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQzCiAgICAvLyBwYXltZW50KHsgYW1vdW50OiBhbW91bnQsIHJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzIH0pLnN1Ym1pdCgpOwogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS53aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnMoYXNzZXRJZDogdWludDY0KSAtPiB2b2lkOgp3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0Ni0yNDcKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gd2l0aGRyYXdCcmlkZ2luZ0ZlZUluVG9rZW5zKGFzc2V0SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0OAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI1MAogICAgLy8gY29uc3QgYXBwQWNjdDogQWNjb3VudCA9IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzOwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTEKICAgIC8vIGNvbnN0IGJhbGFuY2UgPSBhc3NldC5iYWxhbmNlKGFwcEFjY3QpOwogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI1MgogICAgLy8gaWYgKGJhbGFuY2UgPiBVaW50NjQoMCkpIHsKICAgIGJ6IHdpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjUzLTI1OAogICAgLy8gYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHNlbmRlcjogYXBwQWNjdCwKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGJhbGFuY2UsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMub3duZXIudmFsdWUuYnl0ZXMKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAxCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBmcmFtZV9kaWcgMAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjUzLTI1OAogICAgLy8gYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHNlbmRlcjogYXBwQWNjdCwKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGJhbGFuY2UsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMub3duZXIudmFsdWUuYnl0ZXMKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKCndpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuZ2V0QnJpZGdpbmdDb3N0SW5Ub2tlbnMoZGVzdGluYXRpb25DaGFpbklkOiBieXRlcywgdG9rZW5JZDogdWludDY0KSAtPiB1aW50NjQ6CmdldEJyaWRnaW5nQ29zdEluVG9rZW5zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNjItMjY2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGdldEJyaWRnaW5nQ29zdEluVG9rZW5zKAogICAgLy8gICBkZXN0aW5hdGlvbkNoYWluSWQ6IEJ5dGUsCiAgICAvLyAgIHRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjY3CiAgICAvLyBjb25zdCBicmlkZ2VHYXNBbW91bnQ6IHVpbnQ2NCA9IHRoaXMuZ2V0R2FzVXNhZ2UoZGVzdGluYXRpb25DaGFpbklkKTsKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBnZXRHYXNVc2FnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNjgtMjcxCiAgICAvLyBjb25zdCBtZXNzZW5nZXJHYXNBbW91bnQ6IHVpbnQ2NCA9IGFiaUNhbGwoTWVzc2VuZ2VyLnByb3RvdHlwZS5nZXRHYXNVc2FnZSwgewogICAgLy8gICBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU3CiAgICAvLyBtZXNzZW5nZXIgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNjgtMjcxCiAgICAvLyBjb25zdCBtZXNzZW5nZXJHYXNBbW91bnQ6IHVpbnQ2NCA9IGFiaUNhbGwoTWVzc2VuZ2VyLnByb3RvdHlwZS5nZXRHYXNVc2FnZSwgewogICAgLy8gICBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBieXRlYyAxNCAvLyBtZXRob2QgImdldEdhc1VzYWdlKGJ5dGUpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3My0yNzYKICAgIC8vIHJldHVybiBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5VU0QsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuZ2FzT3JhY2xlLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkLCBicmlkZ2VHYXNBbW91bnQgKyBtZXNzZW5nZXJHYXNBbW91bnRdLAogICAgLy8gfSkucmV0dXJuVmFsdWUgLyB0aGlzLmZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo5CiAgICAvLyBnYXNPcmFjbGUgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJnYXNPcmFjbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzUKICAgIC8vIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWQsIGJyaWRnZUdhc0Ftb3VudCArIG1lc3Nlbmdlckdhc0Ftb3VudF0sCiAgICBjb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3My0yNzYKICAgIC8vIHJldHVybiBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5VU0QsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuZ2FzT3JhY2xlLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkLCBicmlkZ2VHYXNBbW91bnQgKyBtZXNzZW5nZXJHYXNBbW91bnRdLAogICAgLy8gfSkucmV0dXJuVmFsdWUgLyB0aGlzLmZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlOwogICAgcHVzaGJ5dGVzIDB4N2JmN2Q1MGMgLy8gbWV0aG9kICJnZXRUcmFuc2FjdGlvbkdhc0Nvc3RJblVTRChieXRlLHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3NgogICAgLy8gfSkucmV0dXJuVmFsdWUgLyB0aGlzLmZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjMzCiAgICAvLyBwcm90ZWN0ZWQgZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZScgfSk7CiAgICBwdXNoYnl0ZXMgImUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyB9KS5yZXR1cm5WYWx1ZSAvIHRoaXMuZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWU7CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzMtMjc2CiAgICAvLyByZXR1cm4gYWJpQ2FsbChHYXNPcmFjbGUucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uR2FzQ29zdEluVVNELCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2Rlc3RpbmF0aW9uQ2hhaW5JZCwgYnJpZGdlR2FzQW1vdW50ICsgbWVzc2VuZ2VyR2FzQW1vdW50XSwKICAgIC8vIH0pLnJldHVyblZhbHVlIC8gdGhpcy5mcm9tR2FzT3JhY2xlU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZTsKICAgIC8KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5oYXNoTWVzc2FnZShhbW91bnQ6IHVpbnQ2NCwgcmVjaXBpZW50OiBieXRlcywgc291cmNlQ2hhaW5JZDogYnl0ZXMsIGRlc3RpbmF0aW9uQ2hhaW5JZDogYnl0ZXMsIHJlY2VpdmVUb2tlbjogYnl0ZXMsIG5vbmNlOiBieXRlcykgLT4gYnl0ZXM6Cmhhc2hNZXNzYWdlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzktMjg3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGhhc2hNZXNzYWdlKAogICAgLy8gICBhbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIHNvdXJjZUNoYWluSWQ6IEJ5dGUsCiAgICAvLyAgIGRlc3RpbmF0aW9uQ2hhaW5JZDogQnl0ZSwKICAgIC8vICAgcmVjZWl2ZVRva2VuOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIG5vbmNlOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyApOiBTdGF0aWNCeXRlczwzMj4gewogICAgcHJvdG8gNiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI4OAogICAgLy8gY29uc3QgYW1vdW50MzIgPSBiemVybygyNCkuY29uY2F0KG9wLml0b2IoYW1vdW50KSk7CiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBiemVybwogICAgZnJhbWVfZGlnIC02CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6Mjg5CiAgICAvLyBjb25zdCBzb3VyY2VDaGFpbklkMzIgPSBiemVybygzMSkuY29uY2F0KHNvdXJjZUNoYWluSWQuYnl0ZXMpOwogICAgcHVzaGludCAzMSAvLyAzMQogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI5MC0yOTEKICAgIC8vIGNvbnN0IHBhY2tlZCA9IGFtb3VudDMyCiAgICAvLyAgIC5jb25jYXQocmVjaXBpZW50LmJ5dGVzKQogICAgc3dhcAogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjkwLTI5MgogICAgLy8gY29uc3QgcGFja2VkID0gYW1vdW50MzIKICAgIC8vICAgLmNvbmNhdChyZWNpcGllbnQuYnl0ZXMpCiAgICAvLyAgIC5jb25jYXQoc291cmNlQ2hhaW5JZDMyKQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI5MC0yOTMKICAgIC8vIGNvbnN0IHBhY2tlZCA9IGFtb3VudDMyCiAgICAvLyAgIC5jb25jYXQocmVjaXBpZW50LmJ5dGVzKQogICAgLy8gICAuY29uY2F0KHNvdXJjZUNoYWluSWQzMikKICAgIC8vICAgLmNvbmNhdChyZWNlaXZlVG9rZW4uYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyOTAtMjk0CiAgICAvLyBjb25zdCBwYWNrZWQgPSBhbW91bnQzMgogICAgLy8gICAuY29uY2F0KHJlY2lwaWVudC5ieXRlcykKICAgIC8vICAgLmNvbmNhdChzb3VyY2VDaGFpbklkMzIpCiAgICAvLyAgIC5jb25jYXQocmVjZWl2ZVRva2VuLmJ5dGVzKQogICAgLy8gICAuY29uY2F0KG5vbmNlLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIGNvbnN0IEFMTEJSSURHRV9NRVNTRU5HRVIgPSBuZXcgQnl0ZSgxKTsKICAgIGJ5dGVjIDExIC8vIDB4MDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjkwLTI5NQogICAgLy8gY29uc3QgcGFja2VkID0gYW1vdW50MzIKICAgIC8vICAgLmNvbmNhdChyZWNpcGllbnQuYnl0ZXMpCiAgICAvLyAgIC5jb25jYXQoc291cmNlQ2hhaW5JZDMyKQogICAgLy8gICAuY29uY2F0KHJlY2VpdmVUb2tlbi5ieXRlcykKICAgIC8vICAgLmNvbmNhdChub25jZS5ieXRlcykKICAgIC8vICAgLmNvbmNhdChBTExCUklER0VfTUVTU0VOR0VSLmJ5dGVzKTsKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyOTcKICAgIC8vIGNvbnN0IGhhc2ggPSBvcC5rZWNjYWsyNTYocGFja2VkKTsgLy8gMzIgYnl0ZXMKICAgIGtlY2NhazI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMDAKICAgIC8vIGNvbnN0IHdpdGhTcmMgPSBvcC5zZXRCeXRlKGhhc2gsIDAsIG9wLmJ0b2koc291cmNlQ2hhaW5JZC5ieXRlcykpOwogICAgZnJhbWVfZGlnIC00CiAgICBidG9pCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgc2V0Ynl0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMDEKICAgIC8vIGNvbnN0IHdpdGhEc3QgPSBvcC5zZXRCeXRlKHdpdGhTcmMsIDEsIG9wLmJ0b2koZGVzdGluYXRpb25DaGFpbklkLmJ5dGVzKSk7CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ0b2kKICAgIGludGNfMSAvLyAxCiAgICBzd2FwCiAgICBzZXRieXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMwMwogICAgLy8gcmV0dXJuIG5ldyBTdGF0aWNCeXRlczwzMj4od2l0aERzdCk7CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHNpemUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5pc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWQoY2hhaW5JZDogYnl0ZXMsIHRva2VuOiBieXRlcykgLT4gdWludDY0Ogppc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMwNi0zMDcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkKGNoYWluSWQ6IEJ5dGUsIHRva2VuOiBTdGF0aWNCeXRlczwzMj4pOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMzMKICAgIC8vIHJldHVybiBjaGFpbklkLmJ5dGVzLmNvbmNhdCh0b2tlbi5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY2CiAgICAvLyBvdGhlckJyaWRnZVRva2VucyA9IEJveE1hcDxieXRlcywgU3RhdGljQnl0ZXM+KHsga2V5UHJlZml4OiAndCcgfSk7CiAgICBieXRlYyA3IC8vICJ0IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMwOAogICAgLy8gcmV0dXJuIHRoaXMub3RoZXJCcmlkZ2VUb2tlbnModGhpcy5fZ2V0T3RoZXJCcmlkZ2VUb2tlbnNLZXkoY2hhaW5JZCwgdG9rZW4pKS5leGlzdHM7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5nZXRUcmFuc2FjdGlvbkNvc3QoY2hhaW5JZDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0VHJhbnNhY3Rpb25Db3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTEtMzEyCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGdldFRyYW5zYWN0aW9uQ29zdChjaGFpbklkOiBCeXRlKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTMKICAgIC8vIHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uUmVsYXllckNvc3QoY2hhaW5JZCkgKyB0aGlzLmdldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0KCk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMjcKICAgIC8vIHJldHVybiAxNTcwMDsKICAgIGludGMgNCAvLyAxNTcwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTMKICAgIC8vIHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uUmVsYXllckNvc3QoY2hhaW5JZCkgKyB0aGlzLmdldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0KCk7CiAgICArCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIuc3dhcCh0b2tlbklkOiB1aW50NjQsIHJlY2VpdmVUb2tlbklkOiB1aW50NjQsIHJlY2lwaWVudDogYnl0ZXMsIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCkgLT4gdm9pZDoKc3dhcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NzgtODQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gc3dhcCgKICAgIC8vICAgdG9rZW5JZDogdWludDY0LAogICAgLy8gICByZWNlaXZlVG9rZW5JZDogdWludDY0LAogICAgLy8gICByZWNpcGllbnQ6IEFkZHJlc3MsCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICk6IHZvaWQgewogICAgcHJvdG8gNCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjUwCiAgICAvLyBjYW5Td2FwID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2FuU3dhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjYxCiAgICAvLyBhc3NlcnQodGhpcy5jYW5Td2FwLnZhbHVlLCAnUm91dGVyOiBzd2FwIHByb2hpYml0ZWQnKTsKICAgIGFzc2VydCAvLyBSb3V0ZXI6IHN3YXAgcHJvaGliaXRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo4NgogICAgLy8gY29uc3Qgc2VuZGVyID0gbmV3IEFkZHJlc3MoVHhuLnNlbmRlcik7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjg3CiAgICAvLyBjb25zdCBhbW91bnQgPSBnZXRQcmV2QXNzZXRQYXkodG9rZW5JZCk7CiAgICBmcmFtZV9kaWcgLTQKICAgIGNhbGxzdWIgZ2V0UHJldkFzc2V0UGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjg4CiAgICAvLyBjb25zdCB2VXNkQW1vdW50ID0gdGhpcy5zZW5kQW5kU3dhcFRvVlVzZCh0b2tlbklkLCBzZW5kZXIsIGFtb3VudCk7CiAgICBmcmFtZV9kaWcgLTQKICAgIGRpZyAyCiAgICBkaWcgMgogICAgY2FsbHN1YiBzZW5kQW5kU3dhcFRvVlVzZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo4OQogICAgLy8gY29uc3QgcmVjZWl2ZWRBbW91bnQgPSB0aGlzLnJlY2VpdmVBbmRTd2FwRnJvbVZVc2QocmVjZWl2ZVRva2VuSWQsIHJlY2lwaWVudCwgdlVzZEFtb3VudCwgcmVjZWl2ZUFtb3VudE1pbik7CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgdW5jb3ZlciAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgcmVjZWl2ZUFuZFN3YXBGcm9tVlVzZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo5MAogICAgLy8gZW1pdDxTd2FwcGVkPih7IHNlbmRlciwgcmVjaXBpZW50LCB0b2tlbklkLCByZWNlaXZlVG9rZW5JZCwgYW1vdW50LCByZWNlaXZlZEFtb3VudCB9KTsKICAgIGZyYW1lX2RpZyAtNAogICAgaXRvYgogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgdW5jb3ZlciA0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTQwNDRiMyAvLyBtZXRob2QgIlN3YXBwZWQoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLmFkZFBvb2wocG9vbElkOiB1aW50NjQsIHRva2VuSWQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkUG9vbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTAwLTEwMQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBhZGRQb29sKHBvb2xJZDogdWludDY0LCB0b2tlbklkOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDIKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDMKICAgIC8vIHRoaXMucG9vbHModG9rZW5JZCkudmFsdWUgPSBwb29sSWQ7CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzEKICAgIC8vIHBvb2xzID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ3AnIH0pOwogICAgYnl0ZWMgOCAvLyAicCIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTAzCiAgICAvLyB0aGlzLnBvb2xzKHRva2VuSWQpLnZhbHVlID0gcG9vbElkOwogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwNQogICAgLy8gY29uc3QgdG9rZW5EZWNpbWFscyA9IGFzc2V0LmRlY2ltYWxzOwogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLW9yYWNsZS5jb250cmFjdC5hbGdvLnRzOjgKICAgIC8vIGV4cG9ydCBjb25zdCBPUkFDTEVfUFJJQ0VfUFJFQ0lTSU9OOiB1aW50NjQgPSA5OwogICAgcHVzaGludCA5IC8vIDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTA2CiAgICAvLyB0aGlzLmJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgPSAxMCAqKiAoT1JBQ0xFX1BSSUNFX1BSRUNJU0lPTiAtIHRva2VuRGVjaW1hbHMgKyBDSEFJTl9QUkVDSVNJT04pOwogICAgc3dhcAogICAgLQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy1vcmFjbGUuY29udHJhY3QuYWxnby50czo3CiAgICAvLyBleHBvcnQgY29uc3QgQ0hBSU5fUFJFQ0lTSU9OOiB1aW50NjQgPSA2OwogICAgaW50Y18yIC8vIDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTA2CiAgICAvLyB0aGlzLmJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgPSAxMCAqKiAoT1JBQ0xFX1BSSUNFX1BSRUNJU0lPTiAtIHRva2VuRGVjaW1hbHMgKyBDSEFJTl9QUkVDSVNJT04pOwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozNgogICAgLy8gcHJvdGVjdGVkIGJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZicgfSk7CiAgICBwdXNoYnl0ZXMgImYiCiAgICBkaWcgMwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwNgogICAgLy8gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlID0gMTAgKiogKE9SQUNMRV9QUklDRV9QUkVDSVNJT04gLSB0b2tlbkRlY2ltYWxzICsgQ0hBSU5fUFJFQ0lTSU9OKTsKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIHVuY292ZXIgMgogICAgZXhwCiAgICBpdG9iCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjMzCiAgICAvLyBwcm90ZWN0ZWQgZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZScgfSk7CiAgICBwdXNoYnl0ZXMgImUiCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDcKICAgIC8vIHRoaXMuZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgPSAxMCAqKiAoT1JBQ0xFX1BSSUNFX1BSRUNJU0lPTiAtIHRva2VuRGVjaW1hbHMpOwogICAgcHVzaGludCAxMCAvLyAxMAogICAgdW5jb3ZlciAyCiAgICBleHAKICAgIGl0b2IKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5yZW1vdmVQb29sKHRva2VuSWQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlUG9vbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTEwLTExMQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyByZW1vdmVQb29sKHRva2VuSWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMgogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMwogICAgLy8gdGhpcy5wb29scyh0b2tlbklkKS5kZWxldGUoKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozMQogICAgLy8gcG9vbHMgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAncCcgfSk7CiAgICBieXRlYyA4IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMwogICAgLy8gdGhpcy5wb29scyh0b2tlbklkKS5kZWxldGUoKTsKICAgIGJveF9kZWwKICAgIHBvcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnN0b3BTd2FwKCkgLT4gdm9pZDoKc3RvcFN3YXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjY4CiAgICAvLyBhc3NlcnQob3AuVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5zdG9wQXV0aG9yaXR5LnZhbHVlLmJ5dGVzLCAnUm91dGVyOiBpcyBub3Qgc3RvcEF1dGhvcml0eScpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozOQogICAgLy8gcHJpdmF0ZSBzdG9wQXV0aG9yaXR5ID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBjYW4gcmVzdHJpY3QgZGVwb3NpdCBvciB3aXRoZHJhdyBvcGVyYXRpb25zCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInN0b3BBdXRob3JpdHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2OAogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZS5ieXRlcywgJ1JvdXRlcjogaXMgbm90IHN0b3BBdXRob3JpdHknKTsKICAgID09CiAgICBhc3NlcnQgLy8gUm91dGVyOiBpcyBub3Qgc3RvcEF1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MAogICAgLy8gY2FuU3dhcCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOwogICAgYnl0ZWNfMSAvLyAiY2FuU3dhcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTIyCiAgICAvLyB0aGlzLmNhblN3YXAudmFsdWUgPSBmYWxzZTsKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnN0YXJ0U3dhcCgpIC0+IHZvaWQ6CnN0YXJ0U3dhcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTMwCiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NTAKICAgIC8vIGNhblN3YXAgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzMQogICAgLy8gdGhpcy5jYW5Td2FwLnZhbHVlID0gdHJ1ZTsKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnNldFN0b3BBdXRob3JpdHkoc3RvcEF1dGhvcml0eTogYnl0ZXMpIC0+IHZvaWQ6CnNldFN0b3BBdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzNy0xMzgKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gc2V0U3RvcEF1dGhvcml0eShzdG9wQXV0aG9yaXR5OiBBZGRyZXNzKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTM5CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzkKICAgIC8vIHByaXZhdGUgc3RvcEF1dGhvcml0eSA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgYnl0ZWMgMTAgLy8gInN0b3BBdXRob3JpdHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE0MAogICAgLy8gdGhpcy5zdG9wQXV0aG9yaXR5LnZhbHVlID0gc3RvcEF1dGhvcml0eTsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5zZXRSZWJhbGFuY2VyKHJlYmFsYW5jZXI6IGJ5dGVzKSAtPiB2b2lkOgpzZXRSZWJhbGFuY2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDYtMTQ3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHNldFJlYmFsYW5jZXIocmViYWxhbmNlcjogQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE0OAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjQ5CiAgICAvLyBwcml2YXRlIHJlYmFsYW5jZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPih7IGluaXRpYWxWYWx1ZTogbmV3IEFkZHJlc3MoYnplcm8oMCkpIH0pOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGJ5dGVjIDYgLy8gInJlYmFsYW5jZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE0OQogICAgLy8gdGhpcy5yZWJhbGFuY2VyLnZhbHVlID0gcmViYWxhbmNlcjsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5yZWNlaXZlQW5kU3dhcEZyb21WVXNkKHRva2VuSWQ6IHVpbnQ2NCwgcmVjaXBpZW50OiBieXRlcywgdlVzZEFtb3VudDogdWludDY0LCByZWNlaXZlQW1vdW50TWluOiB1aW50NjQpIC0+IHVpbnQ2NDoKcmVjZWl2ZUFuZFN3YXBGcm9tVlVzZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTUyLTE1NwogICAgLy8gcHJvdGVjdGVkIHJlY2VpdmVBbmRTd2FwRnJvbVZVc2QoCiAgICAvLyAgIHRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBBZGRyZXNzLAogICAgLy8gICB2VXNkQW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBwcm90byA0IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTU4CiAgICAvLyBhc3NlcnQodGhpcy5wb29scyh0b2tlbklkKS5leGlzdHMsICdSb3V0ZXI6IG5vIHJlY2VpdmUgcG9vbCcpOwogICAgZnJhbWVfZGlnIC00CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjMxCiAgICAvLyBwb29scyA9IEJveE1hcDx1aW50NjQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdwJyB9KTsKICAgIGJ5dGVjIDggLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTU4CiAgICAvLyBhc3NlcnQodGhpcy5wb29scyh0b2tlbklkKS5leGlzdHMsICdSb3V0ZXI6IG5vIHJlY2VpdmUgcG9vbCcpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBSb3V0ZXI6IG5vIHJlY2VpdmUgcG9vbAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNTkKICAgIC8vIGNvbnN0IHBvb2xJZCA9IHRoaXMucG9vbHModG9rZW5JZCkudmFsdWU7CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjAtMTYzCiAgICAvLyByZXR1cm4gYWJpQ2FsbChQb29sLnByb3RvdHlwZS5zd2FwRnJvbVZVc2QsIHsKICAgIC8vICAgYXBwSWQ6IHBvb2xJZCwKICAgIC8vICAgYXJnczogW3JlY2lwaWVudCwgdlVzZEFtb3VudCwgcmVjZWl2ZUFtb3VudE1pbiwgcmVjaXBpZW50ID09PSB0aGlzLnJlYmFsYW5jZXIudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE2MgogICAgLy8gYXJnczogW3JlY2lwaWVudCwgdlVzZEFtb3VudCwgcmVjZWl2ZUFtb3VudE1pbiwgcmVjaXBpZW50ID09PSB0aGlzLnJlYmFsYW5jZXIudmFsdWVdLAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NDkKICAgIC8vIHByaXZhdGUgcmViYWxhbmNlciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KHsgaW5pdGlhbFZhbHVlOiBuZXcgQWRkcmVzcyhiemVybygwKSkgfSk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInJlYmFsYW5jZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjIKICAgIC8vIGFyZ3M6IFtyZWNpcGllbnQsIHZVc2RBbW91bnQsIHJlY2VpdmVBbW91bnRNaW4sIHJlY2lwaWVudCA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGJ5dGVjIDkgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE2MC0xNjMKICAgIC8vIHJldHVybiBhYmlDYWxsKFBvb2wucHJvdG90eXBlLnN3YXBGcm9tVlVzZCwgewogICAgLy8gICBhcHBJZDogcG9vbElkLAogICAgLy8gICBhcmdzOiBbcmVjaXBpZW50LCB2VXNkQW1vdW50LCByZWNlaXZlQW1vdW50TWluLCByZWNpcGllbnQgPT09IHRoaXMucmViYWxhbmNlci52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIHB1c2hieXRlcyAweDBkMWI0YzA2IC8vIG1ldGhvZCAic3dhcEZyb21WVXNkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIuc2VuZEFuZFN3YXBUb1ZVc2QodG9rZW5JZDogdWludDY0LCB1c2VyOiBieXRlcywgYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKc2VuZEFuZFN3YXBUb1ZVc2Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE2NwogICAgLy8gcHJvdGVjdGVkIHNlbmRBbmRTd2FwVG9WVXNkKHRva2VuSWQ6IHVpbnQ2NCwgdXNlcjogQWRkcmVzcywgYW1vdW50OiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE2OAogICAgLy8gYXNzZXJ0KHRoaXMucG9vbHModG9rZW5JZCkuZXhpc3RzLCAnUm91dGVyOiBubyBwb29sJyk7CiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzEKICAgIC8vIHBvb2xzID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ3AnIH0pOwogICAgYnl0ZWMgOCAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjgKICAgIC8vIGFzc2VydCh0aGlzLnBvb2xzKHRva2VuSWQpLmV4aXN0cywgJ1JvdXRlcjogbm8gcG9vbCcpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBSb3V0ZXI6IG5vIHBvb2wKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTY5CiAgICAvLyBjb25zdCBwb29sSWQgPSB0aGlzLnBvb2xzKHRva2VuSWQpLnZhbHVlOwogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgc3dhcAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTcxLTE3NgogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgeGZlckFzc2V0OiB0b2tlbklkLAogICAgLy8gICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBBcHBsaWNhdGlvbihwb29sSWQpLmFkZHJlc3MsCiAgICAvLyB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE3NAogICAgLy8gYXNzZXRSZWNlaXZlcjogQXBwbGljYXRpb24ocG9vbElkKS5hZGRyZXNzLAogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNzEtMTc1CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRva2VuSWQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHBvb2xJZCkuYWRkcmVzcywKICAgIC8vIH0pCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE3MS0xNzYKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogdG9rZW5JZCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogQXBwbGljYXRpb24ocG9vbElkKS5hZGRyZXNzLAogICAgLy8gfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTc4LTE4MQogICAgLy8gcmV0dXJuIGFiaUNhbGwoUG9vbC5wcm90b3R5cGUuc3dhcFRvVlVzZCwgewogICAgLy8gICBhcHBJZDogcG9vbElkLAogICAgLy8gICBhcmdzOiBbdXNlciwgYW1vdW50LCB1c2VyID09PSB0aGlzLnJlYmFsYW5jZXIudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE4MAogICAgLy8gYXJnczogW3VzZXIsIGFtb3VudCwgdXNlciA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo0OQogICAgLy8gcHJpdmF0ZSByZWJhbGFuY2VyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oeyBpbml0aWFsVmFsdWU6IG5ldyBBZGRyZXNzKGJ6ZXJvKDApKSB9KTsvLyBjYW4gcmVzdHJpY3QgZGVwb3NpdCBvciB3aXRoZHJhdyBvcGVyYXRpb25zCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAicmViYWxhbmNlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE4MAogICAgLy8gYXJnczogW3VzZXIsIGFtb3VudCwgdXNlciA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ5dGVjIDkgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE3OC0xODEKICAgIC8vIHJldHVybiBhYmlDYWxsKFBvb2wucHJvdG90eXBlLnN3YXBUb1ZVc2QsIHsKICAgIC8vICAgYXBwSWQ6IHBvb2xJZCwKICAgIC8vICAgYXJnczogW3VzZXIsIGFtb3VudCwgdXNlciA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgcHVzaGJ5dGVzIDB4ZDk3OGFkMTQgLy8gbWV0aG9kICJzd2FwVG9WVXNkKGFkZHJlc3MsdWludDY0LGJvb2wpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGJ0b2kKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6Okdhc1VzYWdlLmdldEdhc1VzYWdlKGNoYWluSWQ6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldEdhc1VzYWdlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxNy0xOAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBnZXRHYXNVc2FnZShjaGFpbklkOiBCeXRlKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxMAogICAgLy8gZ2FzVXNhZ2UgPSBCb3hNYXA8Qnl0ZSwgdWludDY0Pih7IGtleVByZWZpeDogJ2cnIH0pOwogICAgYnl0ZWMgMTIgLy8gImciCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxOQogICAgLy8gcmV0dXJuIHRoaXMuZ2FzVXNhZ2UoY2hhaW5JZCkudmFsdWU7CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo6R2FzVXNhZ2Uuc2V0R2FzVXNhZ2UoY2hhaW5JZDogYnl0ZXMsIGdhc0Ftb3VudDogdWludDY0KSAtPiB2b2lkOgpzZXRHYXNVc2FnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjItMjMKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gc2V0R2FzVXNhZ2UoY2hhaW5JZDogQnl0ZSwgZ2FzQW1vdW50OiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoyNAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjEwCiAgICAvLyBnYXNVc2FnZSA9IEJveE1hcDxCeXRlLCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZycgfSk7CiAgICBieXRlYyAxMiAvLyAiZyIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI1CiAgICAvLyB0aGlzLmdhc1VzYWdlKGNoYWluSWQpLnZhbHVlID0gZ2FzQW1vdW50OwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjpHYXNVc2FnZS5zZXRHYXNPcmFjbGUoZ2FzT3JhY2xlOiB1aW50NjQpIC0+IHZvaWQ6CnNldEdhc09yYWNsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjgtMjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gc2V0R2FzT3JhY2xlKGdhc09yYWNsZTogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czozMAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjkKICAgIC8vIGdhc09yYWNsZSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgYnl0ZWMgNCAvLyAiZ2FzT3JhY2xlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czozMQogICAgLy8gdGhpcy5nYXNPcmFjbGUudmFsdWUgPSBnYXNPcmFjbGU7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjpHYXNVc2FnZS5nZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGNoYWluSWQ6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldFRyYW5zYWN0aW9uUmVsYXllckNvc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjM0LTM1CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGdldFRyYW5zYWN0aW9uUmVsYXllckNvc3QoY2hhaW5JZDogQnl0ZSk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTAKICAgIC8vIGdhc1VzYWdlID0gQm94TWFwPEJ5dGUsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdnJyB9KTsKICAgIGJ5dGVjIDEyIC8vICJnIgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzYKICAgIC8vIGNvbnN0IGdhc0Ftb3VudCA9IHRoaXMuZ2FzVXNhZ2UoY2hhaW5JZCkudmFsdWU7CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czozNy00MAogICAgLy8gcmV0dXJuIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbkdhc0Nvc3RJbk5hdGl2ZVRva2VuLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2NoYWluSWQsIGdhc0Ftb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6OQogICAgLy8gZ2FzT3JhY2xlID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiZ2FzT3JhY2xlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzkKICAgIC8vIGFyZ3M6IFtjaGFpbklkLCBnYXNBbW91bnRdLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czozNy00MAogICAgLy8gcmV0dXJuIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbkdhc0Nvc3RJbk5hdGl2ZVRva2VuLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2NoYWluSWQsIGdhc0Ftb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIHB1c2hieXRlcyAweGMyYWZjY2QxIC8vIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5OYXRpdmVUb2tlbihieXRlLHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo6T3duYWJsZS5vbmx5T3duZXIoKSAtPiB2b2lkOgpvbmx5T3duZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxMwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsICdPbmx5IG93bmVyJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm93bmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjEzCiAgICAvLyBhc3NlcnQob3AuVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5vd25lci52YWx1ZS5ieXRlcywgJ09ubHkgb3duZXInKTsKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBvd25lcgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6Ok93bmFibGUudHJhbnNmZXJPd25lcnNoaXAobmV3T3duZXI6IGJ5dGVzKSAtPiB2b2lkOgp0cmFuc2Zlck93bmVyc2hpcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE2LTE3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB0cmFuc2Zlck93bmVyc2hpcChuZXdPd25lcjogQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxOAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgYnl0ZWNfMyAvLyAib3duZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxOQogICAgLy8gdGhpcy5vd25lci52YWx1ZSA9IG5ld093bmVyOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCg==",clear:"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="},byteCode:{approval:"CiAFAAEGBNR6JhAEFR98dQdjYW5Td2FwCW1lc3NlbmdlcgVvd25lcglnYXNPcmFjbGUHY2hhaW5JZApyZWJhbGFuY2VyAXQBcAEADXN0b3BBdXRob3JpdHkBAQFnBENBeqME90dbggwVH3x1AAAAAAAAPVQxGEAACSKvJwZMZykjZzEbQQDJgg0E//goQQRl9wVzBOg6h6sELJ9oRwQxkZsoBE66ByEExhftcwRXUxVgBGOAgngEBlB8agT1+W6zBEsGLKAEw83ZKicNggkEB9+EKQSAxccPBPqxEaIE7xX4VQRrHuIjBBhwpJIENVcyTQQEsWHxBNKzV+snDoIEBAylrnoEOXuRiwTL/G0CBOF7r7Q2GgCOHAIFAfUB7AHMAawBmgGIAXYBZgFWAT4BGwD/AOsA3wDTALgApACUAIgAfABtAF4ASgA3ACUAEQACIkMxGRREMRhENhoBiAgOI0MxGRREMRhENhoBiAe7FihMULAjQzEZFEQxGEQ2GgEXwDKIB5gjQzEZFEQxGEQ2GgE2GgIXiAd1I0MxGRREMRhENhoBiAdYFihMULAjQzEZFEQxGEQ2GgGIBn0jQzEZFEQxGEQ2GgGIBmIjQzEZFEQxGESIBk8jQzEZFEQxGESIBjYjQzEZFEQxGEQ2GgEXiAYWI0MxGRREMRhENhoBFzYaAheIBckjQzEZFEQxGEQ2GgEXNhoCFzYaAzYaBBeIBWUjQzEZFEQxGEQnD7AjQzEZFEQxGEQnD7AjQzEZFEQxGEQ2GgGIBTIWKExQsCNDMRkURDEYRDYaATYaAogFCycJIk8CVChMULAjQzEZFEQxGEQ2GgEXNhoCNhoDNhoENhoFNhoGiASvKExQsCNDMRkURDEYRDYaATYaAheIBC4WKExQsCNDMRkURDEYRDYaAReIA+kjQzEZFEQxGEQ2GgEXiAPAI0MxGRREMRhENhoBNhoCiAOcI0MxGRREMRhENhoBNhoCiAN3I0MxGRREMRhENhoBNhoCiANVI0MxGRREMRhENhoBFzYaAjYaAzYaBDYaBTYaBheIAnsjQzEZFEQxGEQ2GgEXNhoCNhoDNhoENhoFNhoGF4gBFyNDMRkURDEYRCNDMRkURDEYRDYaAReIAMkjQzEZFEQxGBRENhoBNhoCNhoDF8AyNhoEF8AyiACPI0OKAQExFkQxFiMJSTgQJRJESTgUMgoSREk4EYv/EkRJOCAyAxJESTgVMgMSRDgSiYoBAYAASTEWi/8MQQAEIowAiTEWi/8JSYwBOBBJjAAjE0EABCKMAImLACMSRIsBOAcyChNBAAQijACJiwE4IDIDE0EABCKMAImLATgJMgMTQQAEIowAiYsBOAiMAImKBAAri/xnJwSL/2cnCov8ZycFi/1nKov+Z4mKAQCIBUKxMgqyFCKyEov/shElshAisgGzgBhCcmlkZ2U6IG9wdC1pbiBjb21wbGV0ZWSwiYoGACIpZUREi/qI/xZJi/8NRIEgr4v7EhREgQKI/zOL/0AA1SKLAQiLAIv/CYv6MQBPAogEEyInBWVEi/wTRIv8i/1QJwdMUL1FAUQiJwVlREsBi/tPAov8i/2L/ogChov8iALEgAFzSwJQSb1FARREgAC/SwFXAQGxIiplRCcNshqyGLIaJLIQIrIBs7Q+SVcEAExXAAQoEkQXIiplRHIIRCIqZUSxTLIHSwGyCCOyECKyAbaABKMkmYmyGk8DshqyGCSyECKyAbNLARZLARZQgARLVUGbTFCwCE8CDkQWi/tQi/xQi/1Qi/5QJwtQgAQin7rsTFCwiYv6FoABZkxQvkwXTESL/wuxIicEZUQiJwVlRIAEHbcM3bIashqyGCSyECKyAbO0PklXBABMVwAEKBJEFwpJFoAE4H9rNkxQsEL+4YoGACIpZUREgAFii/xQvUUBRCOI/fhJIQQPRCInBWVEi/qL+4v8TwOL/Yv+iAFzSTEAUAJMUQACTFECIFBJTgKAAW1LAVBJvUUBFESAAL+xIiplRIAEM+FHqrIashiyGiSyECKyAbO0PklXBABMVwAEKBJEIlNEi/2BGFuL+4v6i/+IAipMSSEECUwhBA1BABCxi/uyB4sCsggjshAisgGziwEWi/tQi/5QJwtQiwBQgARFg2rWTFCwiYoCAIgDD4ABYov+UIv/v4mKAgCIAv+L/ov/UCcHTFCAAL+JigIAiALsi/6L/1AnB0xQvEiJigEAiALasSIrZUSyB4v/sggjshAisgGziYoBAIgCwTIKSYv/cABMSU8CREEAGrEiK2VEshSLAbISi/+yEYsAsgAlshAisgGziYoCAYv+iAIqsSIqZUQnDrIai/6yGrIYJLIQIrIBs7Q+SVcEAExXAAQoEkQXsSInBGVETgIIFoAEe/fVDLIai/6yGrIashgkshAisgGztD5JVwQATFcABCgSRBeL/xaAAWVMUL5MF0xEComKBgGBGK+L+hZQgR+vi/xQTIv7UExQi/5Qi/9QJwtQAov8FyJMVov9FyNMVkkVgSASRImKAgGL/ov/UCcHTFC9RQGJigEBi/+IAachBAiJigQAIillREQxAIv8iPvfi/xLAksCiAD8i/2L/k8Ci/+IAJuL/BaL/RZPAxZPAxZPBIv+UE8EUE8DUE8CUExQgAQVQESzTFCwiYoCAIgBj4v/FicISwFQi/4Wv4v/cQFEgQlMCUkkCIABZksDUIEKTwKUFr+AAWVPAlCBCk8ClBa/iYoBAIgBVov/FicITFC8SIkxACInCmVEEkQpImeJiAE8KSNniYoBAIgBMicKi/9niYoBAIgBJicGi/9niYoEAYv8FicITFBJvUUBRL5MF0xEsYv+Fov/FiInBmVEi/0SJwkiTwJUgAQNG0wGshqL/bIaTwKyGkyyGrIashgkshAisgGztD5JVwQATFcABCgSRBeJigMBi/0WJwhMUEm9RQFEvkwXTESxSXIIRLIUi/+yEov9shElshAisgGzsYv/FiInBmVEi/4SJwkiTwJUgATZeK0UshqL/rIaTLIashqyGCSyECKyAbO0PklXBABMVwAEKBJEF4mKAQEnDIv/UL5MF0xEiYoCAIgAUScMi/5Qi/8Wv4mKAQCIAEEnBIv/Z4mKAQEnDIv/UL5MF0xEsSInBGVETBaABMKvzNGyGov/shqyGrIYJLIQIrIBs7Q+SVcEAExXAAQoEkQXiTEAIitlRBJEiYoBAIj/8SuL/2eJ",clear:"CoEBQw=="},events:[{name:"BridgingFeeFromTokens",args:[{type:"uint64",name:"fee"}]},{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 Gn=class r{appClient;constructor(i){this.appClient=i instanceof Bn?i:new Bn({...i,appSpec:Wn})}decodeReturnValue(i,a){return a!==void 0?tr(a,this.appClient.getABIMethod(i),Wn.structs):void 0}static async fromCreatorAndName(i){return new r(await Bn.fromCreatorAndName({...i,appSpec:Wn}))}static async fromNetwork(i){return new r(await Bn.fromNetwork({...i,appSpec:Wn}))}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 nr,{ABIMethod as ir}from"algosdk";var ar=new ir({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:ar,args:[],sender:o,signer:s,note:`noop_${A}`})}function dt(r){return(r*1e3).microAlgos()}function je(...r){return r.map(a=>nr.encodeUnsignedTransaction(a)).map(a=>Buffer.from(a).toString("hex"))}var Ae=class{};import{PublicKey as or}from"@solana/web3.js";import{Address as rr}from"@stellar/stellar-sdk";import{Address as sr}from"algosdk";import{Big as ye}from"big.js";import Ra from"randombytes";import{utils as ha}from"tronweb";import{Big as Y}from"big.js";import Ti from"bn.js";function wi(r,i){return Y(100).minus(Y(100).times(i).div(r)).toNumber()}function At(r,i){return Ye(r,i,3).round(0,Y.roundDown)}function be(r,i){return Ye(r,3,i)}function Ye(r,i,a){let o=Y(a).minus(i).toNumber();return Y(r).times(xt(o))}function xt(r){return Y(10).pow(r)}function f(r,i){return Y(r).times(xt(i))}function Z(r,i){let a=Y(r);return a.eq(0)?Y(0):Y(a).div(xt(i))}function te(r){return Z(Y(r.tokenBalance).minus(r.vUsdBalance).toFixed(),3).div(2).toFixed()}function Je(r,{feeShare:i,decimals:a},o){let s=Y(r);if(s.lte(0))return"0";let d=s.times(i),A=s.minus(d),g=At(A,a),c=Y(o.tokenBalance).plus(g),l=ke(c,o.aValue,o.dValue);return Y(o.vUsdBalance).minus(l).round(0,Y.roundDown).toFixed()}function Ot(r,{feeShare:i,decimals:a},o){let s=Y(r);if(s.lte(0))return Y(0).toFixed();let d=s.plus(o.vUsdBalance),A=ke(d,o.aValue,o.dValue),g=be(Y(o.tokenBalance).minus(A),a),c=Y(g).times(i);return Y(g).minus(c).round(0,Y.roundDown).toFixed()}function ma(r,i){let a=Y(r);if(a.lte(0))return i;let o=a.plus(i.vUsdBalance),s=ke(o,i.aValue,i.dValue);return{aValue:i.aValue,dValue:i.dValue,tokenBalance:s.toFixed(0),vUsdBalance:o.toFixed(0)}}function pa(r,{feeShare:i,decimals:a},o){if(Y(r).lte(0))return Y(0);let s=Y(o.vUsdBalance).minus(r);if(s.lte(0))throw new De;let d=ke(s,o.aValue,o.dValue),A=Y(d).minus(o.tokenBalance),g=be(A,a),c=Y(i).div(Y(1).minus(i)),l=Y(g).times(c).round(0,Y.roundUp);return Y(g).plus(l).round(0,Y.roundDown)}function Ca(r,{feeShare:i,decimals:a},o){if(Y(r).lte(0))return Y(0);let s=Y(i).div(Y(1).minus(i)),d=Y(r).times(s).round(0,Y.roundUp),A=Y(r).plus(d),g=At(A,a),c=Y(o.tokenBalance).minus(g);if(c.lte(0))throw new De;let l=ke(c,o.aValue,o.dValue);return Y(l).minus(o.vUsdBalance).round(0,Y.roundDown)}function ke(r,i,a){let o=Y(4).times(i).times(Y(a).minus(r)).minus(a),s=Y(a).pow(3),d=o.pow(2),A=Y(r).times(Y(r).times(d).plus(Y(4).times(i).times(s))).sqrt().round(0,Y.roundDown),g=Y(8).times(i).times(r),c=o.times(r).plus(A).div(g).round(0,Y.roundDown);return c.eq(0)?Y(0):c.plus(1)}function Ia(r,i,a,o){let s=new Ti(r),d=new Ti(a),A=new Ti(i);return s.mul(d).shrn(o).sub(A).toString()}function ba(r){return Y(r).gt(0)?`${Number(Y(r).times(100).toFixed(2)).toLocaleString()}%`:"N/A"}function ya(r,i,a){let o=Y(i).times(a),s=Y(i).plus(a),d=Y(8).times(r).times(o).times(s),A=o.times(Y(16).times(r).minus(4)).div(3),g=d.times(d),c=A.times(A).times(A),l=g.plus(c),u=Y(l).sqrt(),m=Y(Math.cbrt(+d.plus(u).toFixed())),p=Y(Math.cbrt(+d.minus(u).toFixed()));return m.plus(p).toFixed()}function Ue(r,i,a){let o;switch(i){case"EVM":{o=va(r);break}case"SOLANA":{o=new or(r).toBuffer();break}case"TRX":{o=Ar(r);break}case"SRB":{o=new rr(r).toBuffer();break}case"SUI":{o=va(r);break}case"ALG":{o=dr(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 Ya(r){return Buffer.from(r.replace(/^0x/i,""),"hex")}function va(r){let a=Ya(r);return Buffer.concat([Buffer.alloc(32-a.length,0),a],32)}function dr(r){return Buffer.from(sr.fromString(r).publicKey)}function Ar(r){let i=Qt(r),a=Ya(i);return gr(a,32)}function Qt(r){let i=ha.crypto.decodeBase58Address(r);return i?ha.bytes.byteArray2hexStr(i).replace(/^41/,"0x"):""}function gr(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 Ra(32)}function ze(){let r=Ra(32).readBigInt64BE();return r<0?r*-1n:r}function Be(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=V.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 Vi(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,V.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 Xi(d,i.destinationToken,o.messenger,a),m,p;switch(o.gasFeePaymentMethod){case"native":m=V.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,V.getChainDecimalsByType(i.destinationToken.chainType)).toFixed(0,ye.roundDown);break}case"int":{o.extraGas=c;let b=Z(o.extraGas,V.getChainDecimalsByType(d.chainType)),W=p.mul(b);o.extraGasDest=f(W,V.getChainDecimalsByType(i.destinationToken.chainType)).toFixed(0,ye.roundDown);break}}lr(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"&&cr(o.amount,d.decimals,o.fee,o.extraGas),o}function cr(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, ${Z(ye(s).minus(1).neg(),i).toFixed()} stables is missing`)}async function Vi(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:Z(s.fee,V.getChainDecimalsByType(r.chainType)).toFixed()},adminFeeShareWithExtras:s.adminFeeShareWithExtras};if(s.sourceNativeTokenPrice){let A=Ye(new ye(s.fee).mul(s.sourceNativeTokenPrice),V.getChainDecimalsByType(r.chainType),r.decimals).toFixed(0,ye.roundUp);d.stablecoin={int:A,float:Z(A,r.decimals).toFixed()}}return d}function lr(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 Xi(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=Z(A,V.getChainDecimalsByType(i.chainType)).toFixed(),c=ye(g).div(d.exchangeRate).toFixed(V.getChainDecimalsByType(r.chainType),ye.roundDown),l=f(c,V.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:Z(i.txCostAmount.swap,V.getChainDecimalsByType(i.chainType)).toFixed()},transfer:{int:i.txCostAmount.transfer,float:Z(i.txCostAmount.transfer,V.getChainDecimalsByType(i.chainType)).toFixed()}},exchangeRate:d.exchangeRate,sourceNativeTokenPrice:d.sourceNativeTokenPrice}}function Ba(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(Wa.makeBasicAccountTransactionSigner(Wa.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=Ga.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(),R,B;W?(R=b,B=p+R):(y.addPayment({sender:A,receiver:d.appAddress,amount:ur.MicroAlgo(b)}),R=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:R},sender:A,extraFee:dt(W?9:8)})),yt({composer:y,appId:s,sender:A,count:W?2:1});let{transactions:h}=await y.buildTransactions();return je(...h)}async buildRawTransactionSwap(a){let o=Be(this.chainType,a),s=Ga.fromString(a.fromAccountAddress),d=a.toAccountAddress,A=BigInt(a.sourceToken.tokenAddress),g=BigInt(a.destinationToken.tokenAddress),c=BigInt(o.minimumReceiveAmount),l=BigInt(a.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();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 je(...b)}getBridge(a){return this.algorand.client.getTypedAppClientById(Gn,{appId:a})}};import{Big as hr}from"big.js";var mr={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"}]},Fa=mr;var pr={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"}]},Za=pr;var Cr={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"}]},fa=Cr;import*as Zn from"@project-serum/anchor";import{PublicKey as Ha}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 Na(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("lock"),Uint8Array.from(r)],i);return a}async function Dt(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 Ta(r,i){let[a]=await ge.findProgramAddress([r.toBuffer()],i);return a}async function Rt(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("token"),r.toBytes()],i);return a}async function wa(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 Si(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("chain_bridge"),Uint8Array.from([r])],i);return a}async function Mi(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("gas_usage"),Uint8Array.from([r])],i);return a}async function Va(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("sent_message"),r],i);return a}async function Li(r,i,a){let[o]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("user_deposit"),i.toBytes(),r.toBytes()],a);return o}async function Xa(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("cctp_bridge"),r.toBytes()],i);return a}async function Sa(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("token"),r.toBytes()],i);return a}function Ma(r,i){let[a]=ge.findProgramAddressSync([ae.utils.bytes.utf8.encode("lock"),i.toBuffer()],r);return a}function La(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 Ir}from"@project-serum/anchor";import{Connection as br,PublicKey as yr}from"@solana/web3.js";function et(r,i){let a=new br(r,"confirmed"),o=new yr(i);return new Ir(a,{publicKey:o},{preflightCommitment:"confirmed",commitment:"confirmed"})}async function fn(r,i,a,o){let s,d=new Ha(i),A=new Ha(a),g=await we(d,A),c=et(o,i);Zn.setProvider(c);let l=await Zn.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 Ut=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=Be(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,R="0x"+ht().toString("hex"),B,h,G=p;switch(W&&(G=hr(G).plus(W).toFixed()),m){case 3:case 4:{let w=await this.buildRawTransactionCctpSend(a,o,G);B=w.sendMethod,h=w.value;break}case 5:{let w=this.buildRawTransactionOftSend(a,o,G,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,R,m,G),h="0"):(B=w.methods.swapAndBridge(g,s,l,c,u,R,m,0),h=G)}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 fn(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(Fa.abi,a)}getCctpBridgeContract(a){return new this.web3.eth.Contract(Za.abi,a)}getOftBridgeContract(a){return new this.web3.eth.Contract(fa.abi,a)}};var Nn=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 X(i.amount),L("amount",i.amount,i.sourceToken.decimals),Ba(i)?Tn(i.sourceToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionSend(i):Tn(i.sourceToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionSwap(i)}};import{BN as Wt,Program as ji,Spl as Nr,web3 as tt}from"@project-serum/anchor";import{Keypair as Ea,PublicKey as Q,SystemProgram as Tr}from"@solana/web3.js";import{Big as Ve}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 Pa={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 vr}from"@project-serum/anchor";import Rr from"big.js";import{Web3 as wn}from"web3";async function Yt(r,i){return await vr.token(i).account.token.fetch(r)}async function ja(r,i,a){let o=await i.account.pool.fetch(a),s=o.decimals,d=Rr(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 Ja(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=wn.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=wn.utils.keccak256(Buffer.from(l.replace("0x",""),"hex")),m=Buffer.from(u.replace("0x",""),"hex");m[0]=o,m[1]=s;let p=wn.utils.encodePacked({t:"bytes32",v:"0x"+m.toString("hex")},{t:"bytes32",v:c});if(!p)throw new bt("messageWithSigner cannot be undefined");let b=wn.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 za,ComputeBudgetProgram as Vn,Connection as xa,TransactionMessage as Yr}from"@solana/web3.js";import{Big as Br}from"big.js";import{AddressLookupTableAccount as ka}from"@solana/web3.js";async function ct(r,i){return await Promise.all(r.message.addressTableLookups.map(async a=>new ka({key:a.accountKey,state:ka.deserialize(await i.getAccountInfo(a.accountKey).then(o=>{if(!o)throw new I("Cannot get AccountInfo");return o.data}))})))}var Hi="AUTO";async function Bt(r,i,a){let o=new xa(a,"confirmed"),s=(await o.simulateTransaction(r)).value.unitsConsumed;await Qa(r.instructions,s,i,o)}async function Oa(r,i,a){let o=new xa(a,"confirmed"),s=await ct(r,o),d=Yr.decompile(r.message,{addressLookupTableAccounts:s});if(r.serialize().length>1232)throw new Rn;await Qa(d.instructions,769230,i,o),r.message=d.compileToV0Message(s)}async function Qa(r,i,a,o){if(i>0){let s=Wr(i,r);if(a?.solana){let d=a.solana;if(d===Hi)await Pi(r,o);else if("pricePerUnitInMicroLamports"in d)await Pi(r,o,d.pricePerUnitInMicroLamports);else{let A=Br(d.extraFeeInLamports).div(s).mul(xt(6)).toFixed(0);await Pi(r,o,A)}}}}function Wr(r,i){let a=i.findIndex(d=>d.programId.equals(Vn.programId)&&za.decodeInstructionType(d)==="SetComputeUnitLimit"),o=Number((r*1.3).toFixed(0)),s=Vn.setComputeUnitLimit({units:o});return a>=0?i[a]=s:i.push(s),o.toString()}async function Pi(r,i,a){let o=r.findIndex(A=>A.programId.equals(Vn.programId)&&za.decodeInstructionType(A)==="SetComputeUnitPrice"),s=BigInt(a||await Gr(i)),d=Vn.setComputeUnitPrice({microLamports:s});return o>=0?r[o]=d:r.push(d),s.toString()}async function Gr(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 Fr}from"@solana/spl-token";import{Connection as Zr,TransactionMessage as Ka,VersionedTransaction as fr}from"@solana/web3.js";import Da,{AxiosError as Ua}from"axios";var Xn=class{connection;jupiterUrl;apiKeyHeader;maxAccounts;constructor(i,a){this.connection=new Zr(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=${Fr.toString()}&amount=${o}&swapMode=${m}&slippageBps=100&onlyDirectRoutes=true`;this.maxAccounts&&(p+=`&maxAccounts=${this.maxAccounts}`),d=await Da.get(p,{headers:this.apiKeyHeader?{"x-api-key":this.apiKeyHeader}:void 0})}catch(m){throw m instanceof Ua&&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 Da.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 Ua&&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=fr.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=Ka.decompile(i.message,{addressLookupTableAccounts:o}),A=Ka.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 Ji=1e6,_a=1.1,Sn=class extends Ae{constructor(a,o,s){super();this.solanaRpcUrl=a;this.params=o;this.api=s;this.jupiterService=new Xn(a,o.jupiterParams)}chainType="SOLANA";jupiterService;async buildRawTransactionSwap(a){let o=Be(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,R=u,B=s,h=m,G=new Q(b),w=et(this.solanaRpcUrl,G.toString()),O=new ji(_t,W,w),P=await vt(O.programId),pe=await qe(O.programId),_=new Q(y),Me=await Rt(_,O.programId),Le=new Q(o),Qe=await we(G,_),Fe=new Q(h),ue=new Q(R),ve=await Rt(ue,O.programId),Ze=new Q(B),Ce=await we(Fe,ue),He=[tt.ComputeBudgetProgram.setComputeUnitLimit({units:Ji})];try{await Yt(Ce,w)}catch{let xo=await Nr.associatedToken(w).methods.create().accounts({mint:ue,owner:Fe,associatedAccount:Ce}).instruction();He.push(xo)}let Pe=await O.methods.swap(new Wt(g),new Wt(p||0)).accounts({payer:G,config:pe,bridgeAuthority:P,user:G,sendBridgeToken:Me,sendMint:_,sendPool:Le,sendUserToken:Qe,receiveBridgeToken:ve,receiveMint:ue,receivePool:Ze,receiveUserToken:Ce}).preInstructions(He).transaction(),fe=w.connection;return Pe.recentBlockhash=(await fe.getLatestBlockhash()).blockhash,Pe.feePayer=G,await Bt(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 Oa(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?Ve(d):Ve(a.fee);A&&(c=c.plus(A)),s||(c=c.mul(_a));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=Ve(a.amount).minus(Ve(u).mul(_a)).toFixed(0)}else m=Ve(a.amount).minus(c).toFixed(0);if(Ve(m).lte(0))throw new It(`Amount not enough to pay fee, ${Z(Ve(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=Ve(o.fee).div(s).mul(Ve(10).pow(V.getChainDecimalsByType("SOLANA")-a.decimals)).toFixed(0),A;return o.extraGas&&(A=Ve(o.extraGas).div(s).mul(Ve(10).pow(V.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,R=u,B=l,h=s,G=d,w=et(this.solanaRpcUrl,W),O=new ji(_t,h,w),P=Array.from(ht()),pe=new Q(m),_=await ja(o,O,pe),Me=await Na(P,O.programId),Le=await vt(O.programId),Qe=await we(new Q(W),new Q(b)),Fe=await Rt(new Q(b),O.programId),ue=await Si(y,O.programId),ve=await wa(y,Buffer.from(R),O.programId),Ze=await qe(O.programId),Ce=await O.account.config.fetch(Ze),He=await Dt(y,Ce.gasOracleProgramId),Pe=await Dt(G,Ce.gasOracleProgramId),fe=Ja({amount:_,recipient:Buffer.from(B),nonce:Buffer.from(P),receiveToken:Buffer.from(R),destinationChainId:y,sourceChainId:G,chainBridge:(await vt(O.programId)).toBuffer()}),J={};return J.bridge=O,J.amount=new Wt(o),J.vusdAmount=new Wt(_),J.nonce=P,J.recipient=Array.from(B),J.receiveToken=Array.from(R),J.poolAccount=pe,J.lockAccount=Me,J.bridgeAuthority=Le,J.userToken=Qe,J.bridgeTokenAccount=Fe,J.chainBridgeAccount=ue,J.otherBridgeTokenAccount=ve,J.userAccount=new Q(W),J.destinationChainId=y,J.mint=new Q(b),J.config=Ze,J.configAccountInfo=Ce,J.gasPrice=He,J.thisGasPrice=Pe,J.message=fe,p&&(J.extraGasInstruction=this.getExtraGasInstruction(p,J.userAccount,Ze)),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:R,mint:B,config:h,configAccountInfo:G,gasPrice:w,thisGasPrice:O,message:P,extraGasInstruction:pe}=a,_=G.allbridgeMessengerProgramId,Me=await Mi(R,_),Le=await qe(_),Qe=await Va(P,_),Fe=[];pe&&Fe.push(pe);let ue=await o.methods.swapAndBridge({vusdAmount:s,nonce:d,destinationChainId:R,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:Le,sentMessageAccount:Qe,otherBridgeToken:W}).preInstructions([tt.ComputeBudgetProgram.setComputeUnitLimit({units:Ji})]).postInstructions(Fe).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:R,mint:B,config:h,configAccountInfo:G,gasPrice:w,thisGasPrice:O,message:P,extraGasInstruction:pe}=a,_=this.params.wormholeMessengerProgramId,[Me]=Q.findProgramAddressSync([Buffer.from("Bridge")],new Q(_)),[Le]=Q.findProgramAddressSync([Buffer.from("fee_collector")],new Q(_)),[Qe]=Q.findProgramAddressSync([Buffer.from("Sequence"),u.toBuffer()],new Q(_)),Fe=await Mi(R,G.wormholeMessengerProgramId),ue=await qe(G.wormholeMessengerProgramId),ve=Ea.generate(),Ze=et(this.solanaRpcUrl,y.toString()),Ce=await Ze.connection.getAccountInfo(Me);if(Ce==null)throw new I("Cannot fetch wormhole bridge account info");let He=new Wt(Ce.data.slice(16,24),"le").toString(),Pe=Tr.transfer({fromPubkey:y,toPubkey:Le,lamports:+He}),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:Fe,wormholeProgram:_,bridge:Me,message:ve.publicKey,wormholeMessenger:G.wormholeMessengerProgramId,sequence:Qe,feeCollector:Le,wormholeMessengerConfig:ue,clock:tt.SYSVAR_CLOCK_PUBKEY},pn=await o.methods.swapAndBridgeWormhole({vusdAmount:s,nonce:d,destinationChainId:R,recipient:A,receiveToken:g}).accounts(J).preInstructions([tt.ComputeBudgetProgram.setComputeUnitLimit({units:Ji}),Pe]).postInstructions(fe).signers([ve]).transaction();return pn.recentBlockhash=(await Ze.connection.getLatestBlockhash()).blockhash,pn.feePayer=y,{transaction:await this.convertToVersionedTransaction(pn,Ze.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,R=et(this.solanaRpcUrl,b),B=new ji(Pa,m,R),h=new Q(A),G=await Xa(h,B.programId),w=new Q(b),O=await B.account.cctpBridge.fetch(G),P={};return P.cctpBridge=B,P.cctpBridgeAccount=G,P.cctpAddressAccount=new Q(m),P.amount=new Wt(s),P.recipient=Array.from(y),P.receiveToken=Array.from(W),P.userToken=await we(w,h),P.bridgeAuthority=await Ta(G,B.programId),P.bridgeTokenAccount=await Sa(h,B.programId),P.chainBridgeAccount=await Si(g,B.programId),P.userAccount=w,P.destinationChainId=g,P.mint=h,P.gasPrice=await Dt(g,O.gasOracleProgramId),P.thisGasPrice=await Dt(p,O.gasOracleProgramId),P.provider=R,u&&(P.extraGasInstruction=this.getExtraGasInstruction(u,P.userAccount,G)),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:R,thisGasPrice:B,extraGasInstruction:h,provider:G}=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:Le,tokenMessengerEventAuthority:Qe,tokenMinter:Fe,localToken:ue,remoteTokenMessengerKey:ve,authorityPda:Ze}=La(w,y,pe,_),Ce=[];h&&Ce.push(h);let He=Ea.generate(),Pe=Ma(s.programId,He.publicKey),fe=await s.methods.bridge({amount:A,destinationChainId:W,recipient:g,receiveToken:c}).accounts({mint:y,user:b,cctpBridge:d,messageSentEventData:He.publicKey,lock:Pe,cctpMessenger:_,messageTransmitterProgram:pe,messageTransmitterAccount:Me,tokenMessenger:Le,tokenMinter:Fe,localToken:ue,remoteTokenMessengerKey:ve,authorityPda:Ze,eventAuthority:Qe,bridgeToken:m,gasPrice:R,thisGasPrice:B,chainBridge:p,userToken:u,bridgeAuthority:l}).preInstructions([tt.ComputeBudgetProgram.setComputeUnitLimit({units:2e6})]).postInstructions(Ce).transaction(),J=G.connection;return fe.recentBlockhash=(await J.getLatestBlockhash()).blockhash,fe.feePayer=b,{transaction:await this.convertToVersionedTransaction(fe,J),messageSentEventDataKeypair:He}}send(a){throw new k}};import{Address as ki,contract as mB}from"@stellar/stellar-sdk";import{Big as Xr}from"big.js";import{contract as n}from"@stellar/stellar-sdk";var wr=n.Spec,Vr=n.Client;var $t=class extends Vr{constructor(a){super(new wr(["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 Mn=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=Xr(b).plus(p).toFixed());let W=this.getContract($t,s,d),y;return m==="stablecoin"?y=await W.swap_and_bridge({sender:d,token:ki.contract(Buffer.from(A)).toString(),amount:BigInt(o),recipient:Buffer.from(c),destination_chain_id:+g,receive_token:Buffer.from(l),nonce:ze(),gas_amount:BigInt(0),fee_token_amount:BigInt(b)}):y=await W.swap_and_bridge({sender:d,token:ki.contract(Buffer.from(A)).toString(),amount:BigInt(o),recipient:Buffer.from(c),destination_chain_id:+g,receive_token:Buffer.from(l),nonce:ze(),gas_amount:BigInt(b),fee_token_amount:BigInt(0)}),y.toXDR()}async buildRawTransactionSwap(a){let o=Be(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:ki.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 Kr}from"@mysten/sui/client";import{coinWithBalance as U,Transaction as ea}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as uo}from"@mysten/sui/utils";import{Big as ta}from"big.js";var na=Ne(nt());var Ee=Ne(nt());ne();function eo(r,i,a){return r.moveCall({target:`${Ee.PUBLISHED_AT}::bridge_interface::swap`,typeArguments:i,arguments:[N(r,a.bridge),N(r,a.coin),We(r,a.receiveAmountMin,"u64")]})}function to(r,i,a){return r.moveCall({target:`${Ee.PUBLISHED_AT}::bridge_interface::deposit`,typeArguments:[i],arguments:[N(r,a.bridge),N(r,a.userDeposit),N(r,a.coin)]})}function no(r,i,a){return r.moveCall({target:`${Ee.PUBLISHED_AT}::bridge_interface::withdraw`,typeArguments:[i],arguments:[N(r,a.bridge),N(r,a.userDeposit),We(r,a.amountLp,"u64")]})}function io(r,i,a){return r.moveCall({target:`${Ee.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:`${Ee.PUBLISHED_AT}::bridge_interface::pool`,typeArguments:[i],arguments:[N(r,a)]})}function xi(r,i,a){return r.moveCall({target:`${Ee.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),We(r,a.destinationChainId,"u8"),N(r,a.receiveToken),We(r,a.nonce,"u256"),N(r,a.feeSuiCoin),N(r,a.feeTokenCoin)]})}function oo(r,i){return r.moveCall({target:`${Ee.PUBLISHED_AT}::bridge_interface::new_user_deposit`,typeArguments:[i],arguments:[]})}function Oi(r,i,a){return r.moveCall({target:`${Ee.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),We(r,a.destinationChainId,"u8"),N(r,a.receiveToken),We(r,a.nonce,"u256"),N(r,a.feeSuiCoin),N(r,a.feeTokenCoin)]})}var mo=Ne(Ki());var so=Ne(Ki());ne();function Di(r,i,a){return r.moveCall({target:`${so.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),We(r,a.destinationChainId,"u8"),N(r,a.recipient),N(r,a.recipientWalletAddress)]})}var po=Ne(Ei());var lo=Ne(Ei());ne();import{bcs as it}from"@mysten/sui/bcs";import{fromHEX as Jr,toHEX as kr}from"@mysten/sui/utils";import{bcs as jr}from"@mysten/sui/bcs";ne();var _i=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 jr.vector}static fromFields(i,a){return r.reified(i).new(a.map(o=>H(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 Gt(r){return _i.r(r)}function D(r){return typeof r=="string"?{phantomType:r,kind:"PhantomReified"}:{phantomType:r.fullTypeName,kind:"PhantomReified"}}var zr=it.bytes(32).transform({input:r=>Jr(r),output:r=>kr(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 zr;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 H(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 Xe(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(F(i[o])!==F(T(a[o])))throw new Error(`provided item has mismatching type argments ${r} (expected ${T(a[o])}, got ${i[o]}))`)}function xe(r,i){let{typeArgs:a}=oe(r.type);Xe(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 Ln="0x1";import{bcs as xl}from"@mysten/sui/bcs";import{fromB64 as Ql}from"@mysten/sui/utils";ne();import{bcs as $i}from"@mysten/sui/bcs";import{fromB64 as xr}from"@mysten/sui/utils";function Hn(r){return r=F(r),r===`${Ln}::string::String`}var Pn=class r{__StructClass=!0;static get $typeName(){return`${Ln}::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 D(r.reified())}static get p(){return r.phantom()}static get bcs(){return $i.struct("String",{bytes:$i.vector($i.u8())})}static fromFields(i){return r.reified().new({bytes:H(Gt("u8"),i.bytes)})}static fromFieldsWithTypes(i){if(!Hn(i.type))throw new Error("not a String type");return r.reified().new({bytes:S(Gt("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(Gt("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(!Hn(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"||!Hn(i.bcs.type))throw new Error("object at is not a String object");return r.fromBcs(xr(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"||!Hn(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 qi}from"@mysten/sui/bcs";import{fromB64 as co,fromHEX as Or,toHEX as Qr}from"@mysten/sui/utils";function jn(r){return r=F(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 D(r.reified())}static get p(){return r.phantom()}static get bcs(){return qi.struct("ID",{bytes:qi.bytes(32).transform({input:i=>Or(i),output:i=>Qr(i)})})}static fromFields(i){return r.reified().new({bytes:H("address",i.bytes)})}static fromFieldsWithTypes(i){if(!jn(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(!jn(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"||!jn(i.bcs.type))throw new Error("object at is not a ID object");return r.fromBcs(co(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"||!jn(o.data.bcs.type))throw new Error(`object at id ${a} is not a ID object`);return r.fromSuiObjectData(o.data)}};function Jn(r){return r=F(r),r===`${at}::object::UID`}var Ge=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 D(r.reified())}static get p(){return r.phantom()}static get bcs(){return qi.struct("UID",{id:ut.bcs})}static fromFields(i){return r.reified().new({id:H(ut.reified(),i.id)})}static fromFieldsWithTypes(i){if(!Jn(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(!Jn(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"||!Jn(i.bcs.type))throw new Error("object at is not a UID object");return r.fromBcs(co(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"||!Jn(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:`${lo.PUBLISHED_AT}::bytes32::from_hex`,arguments:[We(r,i,`${Pn.$typeName}`)]})}async function Oe(r,i,a=[]){let o=await r(i),s=a.concat(o.data);return o.hasNextPage&&o.nextCursor?Oe(r,o.nextCursor,s):s}var Ft=class extends Ae{constructor(a,o){super();this.nodeRpcUrlsConfig=a;this.api=o;this.client=new Kr({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,na.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin);let s=Be(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 ea;l.setSender(d);let u={bridge:o.bridgeObjectAddress,coin:U({balance:BigInt(s),type:A}),receiveAmountMin:BigInt(c)},m=eo(l,[A,g],u),p=await Oe(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=ea.from(a);return this.buildRawTransactionSendFromTx(s,d,o)}async buildRawTransactionSend(a){return this.buildRawTransactionSendFromTx(a,new ea)}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,na.setAddress)(g.bridgeAddress,g.bridgeAddressOrigin),(0,po.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=ta(y).plus(W).toFixed()),s.setSender(g),b==="stablecoin"){let R=BigInt(A)-BigInt(y),B,h;if(d){let[w]=s.splitCoins(d,[y]);B=d,h=w}else B=U({balance:R,type:c}),h=U({balance:BigInt(y),type:c});let G={bridge:o.bridgeObjectAddress,messenger:o.allbridgeMessengerObjectAddress,amount:B,destinationChainId:l,nonce:ze(),recipient:Se(s,Te(u)),receiveToken:Se(s,Te(m)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:h,feeSuiCoin:U({balance:BigInt(0),useGasCoin:!1})};Oi(s,c,G)}else{let R=y==="0"?U({balance:BigInt(y),useGasCoin:!1}):U({balance:BigInt(y)}),B={bridge:o.bridgeObjectAddress,messenger:o.allbridgeMessengerObjectAddress,amount:d??U({balance:BigInt(A),type:c}),destinationChainId:l,nonce:ze(),recipient:Se(s,Te(u)),receiveToken:Se(s,Te(m)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:U({balance:BigInt(0),type:c}),feeSuiCoin:R};Oi(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=ta(y).plus(W).toFixed()),s.setSender(g),b==="stablecoin"){let R=BigInt(A)-BigInt(y),B,h;if(d){let[w]=s.splitCoins(d,[y]);B=d,h=w}else B=U({balance:R,type:c}),h=U({balance:BigInt(y),type:c});let G={bridge:o.bridgeObjectAddress,messenger:o.wormholeMessengerObjectAddress,wormholeState:o.wormholeStateObjectAddress,theClock:uo,amount:B,destinationChainId:l,nonce:ze(),recipient:Se(s,Te(u)),receiveToken:Se(s,Te(m)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:h,feeSuiCoin:U({balance:BigInt(0),useGasCoin:!1})};xi(s,c,G)}else{let R=y==="0"?U({balance:BigInt(y),useGasCoin:!1}):U({balance:BigInt(y)}),B={bridge:o.bridgeObjectAddress,messenger:o.wormholeMessengerObjectAddress,wormholeState:o.wormholeStateObjectAddress,theClock:uo,amount:d??U({balance:BigInt(A),type:c}),destinationChainId:l,nonce:ze(),recipient:Se(s,Te(u)),receiveToken:Se(s,Te(m)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:U({balance:BigInt(0),type:c}),feeSuiCoin:R};xi(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,mo.setAddress)(s.cctpAddress,s.cctpAddressOrigin);let y=p;W&&(y=ta(y).plus(W).toFixed()),d.setSender(c);let R=Se(d,Te(m)),B;if(a.destinationToken.chainType==="SOLANA"){let h=await fn(this.chainType,a.toAccountAddress,a.destinationToken.tokenAddress,this.nodeRpcUrlsConfig.getNodeRpcUrl("SOL"));B=Se(d,Te(h))}else B=R;if(b==="stablecoin"){let h=BigInt(g)-BigInt(y),G,w;if(A){let[P]=d.splitCoins(A,[y]);G=A,w=P}else G=U({balance:h,type:l}),w=U({balance:BigInt(y),type:l});let O={cctpBridge:s.cctpObjectAddress,tokenMessengerMinterState:s.cctpTokenMessengerMinterStateObjectAddress,messageTransmitterState:s.cctpMessageTransmitterStateObjectAddress,treasury:s.cctpTreasuryObjectAddress,denyList:s.cctpDenyListObjectAddress,amount:G,destinationChainId:u,recipient:B,recipientWalletAddress:R,gasOracle:s.gasOracleObjectAddress,feeTokenCoin:w,feeSuiCoin:U({balance:BigInt(0),useGasCoin:!1})};Di(d,l,O)}else{let h=y==="0"?U({balance:BigInt(y),useGasCoin:!1}):U({balance:BigInt(y)}),G={cctpBridge:s.cctpObjectAddress,tokenMessengerMinterState:s.cctpTokenMessengerMinterStateObjectAddress,messageTransmitterState:s.cctpMessageTransmitterStateObjectAddress,treasury:s.cctpTreasuryObjectAddress,denyList:s.cctpDenyListObjectAddress,amount:A??U({balance:BigInt(g),type:l}),destinationChainId:u,recipient:B,recipientWalletAddress:R,gasOracle:s.gasOracleObjectAddress,feeTokenCoin:U({balance:BigInt(0),type:l}),feeSuiCoin:h};Di(d,l,G)}return await d.toJSON({client:this.client})}};import{Big as Er}from"big.js";import Dr from"bn.js";function kn(r){return"0x"+new Dr(r).toString("hex")}function Co(r){return new Promise(i=>setTimeout(()=>i(),r))}async function zn(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 Ur(r,s),{txId:s}}async function Ur(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 Co(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 zn(this.tronWeb,s)}async buildRawTransactionSwap(a){let o=Be(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,R=p;W&&(R=Er(R).plus(W).toFixed());let B=ze().toString(),h,G,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:R}],G="0"):(h=[{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"uint256",value:0}],G=R),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:R},{type:"uint256",value:y??"0"},{type:"uint256",value:"10"}],G="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"}],G=R),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:R}],G="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}],G=R),w="swapAndBridge(bytes32,uint256,bytes32,uint256,bytes32,uint256,uint8,uint256)";break}return this.buildRawTransaction(d,w,h,G,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 xn=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s;this.rawTxBuilder=new Nn(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 X(a.amount),L("amount",a.amount,a.sourceToken.decimals),Tn(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 Tn(r,i,a,o,s){switch(V.getChainProperty(r).chainType){case"EVM":{if(s)return new Ut(s,i,a);{let d=a.getNodeRpcUrl(r);return new Ut(new $r(d),i,a)}}case"TRX":{if(s)return new en(s,i);{let d=a.getNodeRpcUrl(r);return new en(new _r({fullHost:d,solidityNode:d,eventServer:d}),i)}}case"SOLANA":return new Sn(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 Mn(a,o,i);case"SUI":return new Ft(a,i);case"ALG":if(s){let d=s,A=Io.fromClients({algod:d});return new Kt(A,i)}else{let d=a.getNodeRpcUrl(r),A=Io.fromConfig({algodConfig:{server:d}});return new Kt(A,i)}}}import{AlgorandClient as Go}from"@algorandfoundation/algokit-utils";import{Big as ys}from"big.js";import hs from"timed-cache";import{TronWeb as vs}from"tronweb";import{FMT_BYTES as Rs,FMT_NUMBER as Ys,Web3 as Bs}from"web3";import{Big as _e}from"big.js";function bo(r,i,a,o,s){let d=f(r,3),A=_e(d),g=_e(a),c=_e(o).plus(s),l,u;if(g.eq(0)||c.eq(0)){let p=A.div(2);l=_e(o).plus(p),u=_e(s).plus(p)}else l=_e(o).plus(A.mul(o).div(c)),u=_e(s).plus(A.mul(s).div(c));return _e(ya(i,l.toFixed(),u.toFixed())).minus(g).toFixed()}function yo(r){let i=f(r,3);return _e(i).round().toFixed()}import{bytesToBigInt as ts}from"algosdk";import{getArc56ReturnValue as qr}from"@algorandfoundation/algokit-utils/types/app-arc56";import{AppClient as On}from"@algorandfoundation/algokit-utils/types/app-client";import{AppFactory as xm}from"@algorandfoundation/algokit-utils/types/app-factory";import{encodeAddress as es}from"algosdk";var Qn={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
1
+ var Ko=Object.create;var ua=Object.defineProperty;var Do=Object.getOwnPropertyDescriptor;var Uo=Object.getOwnPropertyNames;var Eo=Object.getPrototypeOf,_o=Object.prototype.hasOwnProperty;var $o=(r,i)=>()=>(r&&(i=r(r=0)),i);var fi=(r,i)=>()=>(i||r((i={exports:{}}).exports,i),i.exports);var qo=(r,i,a,o)=>{if(i&&typeof i=="object"||typeof i=="function")for(let s of Uo(i))!_o.call(r,s)&&s!==a&&ua(r,s,{get:()=>i[s],enumerable:!(o=Do(i,s))||o.enumerable});return r};var Ne=(r,i,a)=>(a=r!=null?Ko(Eo(r)):{},qo(i||!r||!r.__esModule?ua(a,"default",{value:r,enumerable:!0}):a,r));import{bcs as me}from"@mysten/sui/bcs";function jr(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=jr(r.slice(o+1,r.length-s-1),[i,a]);return{typeName:d,typeArgs:A}}function eo(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 eo(i)?i:r.object(i)}function We(r,i,a){if(eo(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:[We(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 Jr(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 F(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<${F(a[0])}>`;default:{let o=i.split("::");o[0]=Jr(o[0]);let s=o.join("::");return a.length>0?`${s}<${a.map(d=>F(d)).join(",")}>`:s}}}function j(r,...i){return i.length>0?`${r}<${i.join(", ")}>`:r}var ne=$o(()=>{"use strict"});var nt=fi((ml,to)=>{"use strict";ne();var Oi=class r{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return F(r.$PACKAGE_ID)}get PUBLISHED_AT(){return F(r.$PUBLISHED_AT)}get PKG_V1(){return F(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 Oi;to.exports=kr});var Ui=fi((bl,Ao)=>{"use strict";ne();var Di=class r{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return F(r.$PACKAGE_ID)}get PUBLISHED_AT(){return F(r.$PUBLISHED_AT)}get PKG_V1(){return F(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}},zr=new Di;Ao.exports=zr});var $i=fi((Rl,co)=>{"use strict";ne();var _i=class r{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return F(r.$PACKAGE_ID)}get PUBLISHED_AT(){return F(r.$PUBLISHED_AT)}get PKG_V1(){return F(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}},xr=new _i;co.exports=xr});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},Bd={solanaRpcUrl:"https://api.mainnet-beta.solana.com",tronRpcUrl:"https://api.trongrid.io"},Wd={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 yo}from"@algorandfoundation/algokit-utils";import{TronWeb as ns}from"tronweb";import{Web3 as is}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)}},Rn=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")}},er=(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))(er||{});var Ie=(R=>(R.BSC="BSC",R.ETH="ETH",R.BAS="BAS",R.SOL="SOL",R.TRX="TRX",R.POL="POL",R.ARB="ARB",R.CEL="CEL",R.AVA="AVA",R.SRB="SRB",R.STLR="STLR",R.OPT="OPT",R.SUI="SUI",R.SNC="SNC",R.UNI="UNI",R.ALG="ALG",R))(Ie||{}),z=(A=>(A.EVM="EVM",A.SOLANA="SOLANA",A.TRX="TRX",A.SRB="SRB",A.SUI="SUI",A.ALG="ALG",A))(z||{});var tr={EVM:18,SOLANA:9,TRX:6,SRB:7,SUI:9,ALG:6},nr={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"}},V=(()=>{let r={...nr};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 tr[i]}}})();var Ni=(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))(Ni||{});var Re=(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))(Re||{});import{Big as ma}from"big.js";async function $(r,i){return await r.getPoolInfoByKey({chainSymbol:i.chainSymbol,poolAddress:i.poolAddress})}function X(r){if(ma(r).lte(0))throw new Qe("Amount must be greater than zero")}function L(r,i,a){let o=ma(i).toFixed(),[s,d]=o.split(".");if(d&&d.length>a)throw new yn(r,d.length,a)}async function Yn(r,i,a){return await Promise.race([r,new Promise((o,s)=>{setTimeout(()=>s(new zt(i)),a)})])}async function Ti(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 Yn(r(),i,o)}catch{if(++s>=a)throw new zt(i)}}async function pa(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 br}from"@algorandfoundation/algokit-utils/types/amount";import Fa,{Address as Za}from"algosdk";import{getArc56ReturnValue as ir}from"@algorandfoundation/algokit-utils/types/app-arc56";import{AppClient as Bn}from"@algorandfoundation/algokit-utils/types/app-client";import{AppFactory as eA}from"@algorandfoundation/algokit-utils/types/app-factory";var Wn={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:"fee"}]},{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:[1366,1844,2135,2221,2315,2357],errorMessage:"Box must have value"},{pc:[1122],errorMessage:"Bridge: amount too low for fee"},{pc:[1130],errorMessage:"Bridge: bridge to the zero address"},{pc:[1504],errorMessage:"Bridge: message processed"},{pc:[1547],errorMessage:"Bridge: no message"},{pc:[1327,1455],errorMessage:"Bridge: not enough fee"},{pc:[1446],errorMessage:"Bridge: source not registered"},{pc:[1217],errorMessage:"Bridge: tokens already sent"},{pc:[1180],errorMessage:"Bridge: unknown chain or token"},{pc:[1167],errorMessage:"Bridge: wrong destination chain"},{pc:[1258,1412,1544,1783,1830,2199,2300,2401],errorMessage:"Bytes has valid prefix"},{pc:[927],errorMessage:"CloseTo not allowed"},{pc:[1223],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:[2411],errorMessage:"Only owner"},{pc:[920],errorMessage:"Rekey not allowed"},{pc:[2080],errorMessage:"Router: is not stopAuthority"},{pc:[2216],errorMessage:"Router: no pool"},{pc:[2130],errorMessage:"Router: no receive pool"},{pc:[1112,1436,1933],errorMessage:"Router: swap prohibited"},{pc:[913],errorMessage:"Wrong asset"},{pc:[1710],errorMessage:"account opted into asset"},{pc:[1266,2226],errorMessage:"application exists"},{pc:[2021],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,1163,1185,1230,1263,1270,1375,1380,1435,1460,1512,1678,1718,1753,1790,1932,2078,2147,2252,2363,2409],errorMessage:"check GlobalState exists"},{pc:[1896],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+KHsgaW5pdGlhbFZhbHVlOiBuZXcgQWRkcmVzcyhiemVybygwKSkgfSk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ6ZXJvCiAgICBieXRlYyA2IC8vICJyZWJhbGFuY2VyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NTAKICAgIC8vIGNhblN3YXAgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUAzNgogICAgcHVzaGJ5dGVzcyAweGZmZjgyODQxIDB4NjVmNzA1NzMgMHhlODNhODdhYiAweDJjOWY2ODQ3IDB4MzE5MTliMjggMHg0ZWJhMDcyMSAweGM2MTdlZDczIDB4NTc1MzE1NjAgMHg2MzgwODI3OCAweDA2NTA3YzZhIDB4ZjVmOTZlYjMgMHg0YjA2MmNhMCAweGMzY2RkOTJhIC8vIG1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oYWRkcmVzcyxieXRlLGFwcGxpY2F0aW9uLGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgIm9wdEluQXNzZXQodWludDY0KXZvaWQiLCBtZXRob2QgIm5vb3AoKXZvaWQiLCBtZXRob2QgInN3YXBBbmRCcmlkZ2UodWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0sYnl0ZVszMl0sdWludDY0KXZvaWQiLCBtZXRob2QgInJlY2VpdmVUb2tlbnModWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0sYnl0ZVszMl0sdWludDY0KXZvaWQiLCBtZXRob2QgInJlZ2lzdGVyQnJpZGdlKGJ5dGUsYnl0ZVszMl0pdm9pZCIsIG1ldGhvZCAiYWRkQnJpZGdlVG9rZW4oYnl0ZSxieXRlWzMyXSl2b2lkIiwgbWV0aG9kICJyZW1vdmVCcmlkZ2VUb2tlbihieXRlLGJ5dGVbMzJdKXZvaWQiLCBtZXRob2QgIndpdGhkcmF3R2FzVG9rZW5zKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnModWludDY0KXZvaWQiLCBtZXRob2QgImdldEJyaWRnaW5nQ29zdEluVG9rZW5zKGJ5dGUsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiaGFzaE1lc3NhZ2UodWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZSxieXRlWzMyXSxieXRlWzMyXSlieXRlWzMyXSIsIG1ldGhvZCAiaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkKGJ5dGUsYnl0ZVszMl0pYm9vbCIKICAgIGJ5dGVjIDEzIC8vIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25Db3N0KGJ5dGUpdWludDY0IgogICAgcHVzaGJ5dGVzcyAweDA3ZGY4NDI5IDB4ODBjNWM3MGYgMHhmYWIxMTFhMiAweGVmMTVmODU1IDB4NmIxZWUyMjMgMHgxODcwYTQ5MiAweDM1NTczMjRkIDB4MDRiMTYxZjEgMHhkMmIzNTdlYiAvLyBtZXRob2QgImdldFJlY2VpdmVUb2tlbnNDb3N0KCl1aW50NjQiLCBtZXRob2QgImdldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0KCl1aW50NjQiLCBtZXRob2QgInN3YXAodWludDY0LHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJhZGRQb29sKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAicmVtb3ZlUG9vbCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic3RvcFN3YXAoKXZvaWQiLCBtZXRob2QgInN0YXJ0U3dhcCgpdm9pZCIsIG1ldGhvZCAic2V0U3RvcEF1dGhvcml0eShhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldFJlYmFsYW5jZXIoYWRkcmVzcyl2b2lkIgogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJnZXRHYXNVc2FnZShieXRlKXVpbnQ2NCIKICAgIHB1c2hieXRlc3MgMHgwY2E1YWU3YSAweDM5N2I5MThiIDB4Y2JmYzZkMDIgMHhlMTdiYWZiNCAvLyBtZXRob2QgInNldEdhc1VzYWdlKGJ5dGUsdWludDY0KXZvaWQiLCBtZXRob2QgInNldEdhc09yYWNsZShhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJnZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGJ5dGUpdWludDY0IiwgbWV0aG9kICJ0cmFuc2Zlck93bmVyc2hpcChhZGRyZXNzKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NyZWF0ZUFwcGxpY2F0aW9uX3JvdXRlQDUgbWFpbl9vcHRJbkFzc2V0X3JvdXRlQDYgbWFpbl9ub29wX3JvdXRlQDcgbWFpbl9zd2FwQW5kQnJpZGdlX3JvdXRlQDggbWFpbl9yZWNlaXZlVG9rZW5zX3JvdXRlQDkgbWFpbl9yZWdpc3RlckJyaWRnZV9yb3V0ZUAxMCBtYWluX2FkZEJyaWRnZVRva2VuX3JvdXRlQDExIG1haW5fcmVtb3ZlQnJpZGdlVG9rZW5fcm91dGVAMTIgbWFpbl93aXRoZHJhd0dhc1Rva2Vuc19yb3V0ZUAxMyBtYWluX3dpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19yb3V0ZUAxNCBtYWluX2dldEJyaWRnaW5nQ29zdEluVG9rZW5zX3JvdXRlQDE1IG1haW5faGFzaE1lc3NhZ2Vfcm91dGVAMTYgbWFpbl9pc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWRfcm91dGVAMTcgbWFpbl9nZXRUcmFuc2FjdGlvbkNvc3Rfcm91dGVAMTggbWFpbl9nZXRSZWNlaXZlVG9rZW5zQ29zdF9yb3V0ZUAxOSBtYWluX2dldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0X3JvdXRlQDIwIG1haW5fc3dhcF9yb3V0ZUAyMSBtYWluX2FkZFBvb2xfcm91dGVAMjIgbWFpbl9yZW1vdmVQb29sX3JvdXRlQDIzIG1haW5fc3RvcFN3YXBfcm91dGVAMjQgbWFpbl9zdGFydFN3YXBfcm91dGVAMjUgbWFpbl9zZXRTdG9wQXV0aG9yaXR5X3JvdXRlQDI2IG1haW5fc2V0UmViYWxhbmNlcl9yb3V0ZUAyNyBtYWluX2dldEdhc1VzYWdlX3JvdXRlQDI4IG1haW5fc2V0R2FzVXNhZ2Vfcm91dGVAMjkgbWFpbl9zZXRHYXNPcmFjbGVfcm91dGVAMzAgbWFpbl9nZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0X3JvdXRlQDMxIG1haW5fdHJhbnNmZXJPd25lcnNoaXBfcm91dGVAMzIKCm1haW5fYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fdHJhbnNmZXJPd25lcnNoaXBfcm91dGVAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdHJhbnNmZXJPd25lcnNoaXAKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdF9yb3V0ZUAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjM0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRHYXNPcmFjbGVfcm91dGVAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0R2FzT3JhY2xlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldEdhc1VzYWdlX3JvdXRlQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoyMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjIKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRHYXNVc2FnZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRHYXNVc2FnZV9yb3V0ZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjE3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0R2FzVXNhZ2UKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0UmViYWxhbmNlcl9yb3V0ZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTQ2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRSZWJhbGFuY2VyCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldFN0b3BBdXRob3JpdHlfcm91dGVAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0U3RvcEF1dGhvcml0eQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zdGFydFN3YXBfcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgc3RhcnRTd2FwCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3N0b3BTd2FwX3JvdXRlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHN0b3BTd2FwCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZVBvb2xfcm91dGVAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTEwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlUG9vbAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRQb29sX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZFBvb2wKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3dhcF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NzgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjc4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRTZW5kVHJhbnNhY3Rpb25TdG9yYWdlQ29zdF9yb3V0ZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzIzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYnl0ZWMgMTUgLy8gMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDNkNTQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRSZWNlaXZlVG9rZW5zQ29zdF9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzE2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYnl0ZWMgMTUgLy8gMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDNkNTQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRUcmFuc2FjdGlvbkNvc3Rfcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMxMQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzExCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0VHJhbnNhY3Rpb25Db3N0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2lzT3RoZXJCcmlkZ2VUb2tlblN1cHBvcnRlZF9yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzA2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMDYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBpc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWQKICAgIGJ5dGVjIDkgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2hhc2hNZXNzYWdlX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3OQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGhhc2hNZXNzYWdlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldEJyaWRnaW5nQ29zdEluVG9rZW5zX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNjIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI2MgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGdldEJyaWRnaW5nQ29zdEluVG9rZW5zCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3dpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQ2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNDYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiB3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fd2l0aGRyYXdHYXNUb2tlbnNfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0MAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgd2l0aGRyYXdHYXNUb2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlQnJpZGdlVG9rZW5fcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIzNAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjM0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlQnJpZGdlVG9rZW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkQnJpZGdlVG9rZW5fcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjI4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkQnJpZGdlVG9rZW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVnaXN0ZXJCcmlkZ2Vfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjIyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVnaXN0ZXJCcmlkZ2UKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVjZWl2ZVRva2Vuc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNzQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlY2VpdmVUb2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3dhcEFuZEJyaWRnZV9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo5My05NwogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo5My05NwogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIGNhbGxzdWIgc3dhcEFuZEJyaWRnZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9ub29wX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcHRJbkFzc2V0X3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc0CiAgICAvLyBvcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc0CiAgICAvLyBvcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgY2FsbHN1YiBvcHRJbkFzc2V0CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZUFwcGxpY2F0aW9uX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo6Z2V0UHJldkFzc2V0UGF5KGFzc2V0SWQ6IHVpbnQ2NCkgLT4gdWludDY0OgpnZXRQcmV2QXNzZXRQYXk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRQcmV2QXNzZXRQYXkoYXNzZXRJZDogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjM2CiAgICAvLyBhc3NlcnQoVHhuLmdyb3VwSW5kZXggPiAwLCBgQXNzZXQgdHhuIG1pc3NpbmdgKTsKICAgIHR4biBHcm91cEluZGV4CiAgICBhc3NlcnQgLy8gQXNzZXQgdHhuIG1pc3NpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czozOQogICAgLy8gY29uc3QgcHJldklkeDogdWludDY0ID0gVHhuLmdyb3VwSW5kZXggLSAxOwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDEKICAgIC8vIGNvbnN0IHBheSA9IGd0eG4uQXNzZXRUcmFuc2ZlclR4bihwcmV2SWR4KTsKICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDQKICAgIC8vIGFzc2VydChwYXkuYXNzZXRSZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIGBBc3NldCBtdXN0IGdvIHRvIGFwcGApOwogICAgZHVwCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBBc3NldCBtdXN0IGdvIHRvIGFwcAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjQ1CiAgICAvLyBhc3NlcnQocGF5LnhmZXJBc3NldC5pZCA9PT0gYXNzZXRJZCwgYFdyb25nIGFzc2V0YCk7CiAgICBkdXAKICAgIGd0eG5zIFhmZXJBc3NldAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDgKICAgIC8vIGFzc2VydChwYXkucmVrZXlUbyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLCBgUmVrZXkgbm90IGFsbG93ZWRgKTsKICAgIGR1cAogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIFJla2V5IG5vdCBhbGxvd2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDkKICAgIC8vIGFzc2VydChwYXkuYXNzZXRDbG9zZVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsIGBDbG9zZVRvIG5vdCBhbGxvd2VkYCk7CiAgICBkdXAKICAgIGd0eG5zIEFzc2V0Q2xvc2VUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIENsb3NlVG8gbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo1MAogICAgLy8gcmV0dXJuIHBheS5hc3NldEFtb3VudDsKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6OmdldFByZXZQYXkocmVsVHhJbmRleDogdWludDY0KSAtPiB1aW50NjQ6CmdldFByZXZQYXk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTMKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRQcmV2UGF5KHJlbFR4SW5kZXg6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTQKICAgIC8vIGlmIChUeG4uZ3JvdXBJbmRleCA8IHJlbFR4SW5kZXgpIHJldHVybiAwOwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYnogZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDIKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTYKICAgIC8vIGNvbnN0IHR4SWR4OiB1aW50NjQgPSBUeG4uZ3JvdXBJbmRleCAtIHJlbFR4SW5kZXg7CiAgICB0eG4gR3JvdXBJbmRleAogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjU4CiAgICAvLyBpZiAoZ3R4bi5UcmFuc2FjdGlvbih0eElkeCkudHlwZSAhPT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpIHJldHVybiAwOwogICAgZ3R4bnMgVHlwZUVudW0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA0CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjU5CiAgICAvLyBjb25zdCBwYXkgPSBndHhuLlBheW1lbnRUeG4odHhJZHgpOwogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo2MQogICAgLy8gaWYgKHBheS5yZWNlaXZlciAhPT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpIHJldHVybiAwOwogICAgZnJhbWVfZGlnIDEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgIT0KICAgIGJ6IGdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA2CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjYzCiAgICAvLyBpZiAocGF5LnJla2V5VG8gIT09IEdsb2JhbC56ZXJvQWRkcmVzcykgcmV0dXJuIDA7CiAgICBmcmFtZV9kaWcgMQogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDgKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NjQKICAgIC8vIGlmIChwYXkuY2xvc2VSZW1haW5kZXJUbyAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSByZXR1cm4gMDsKICAgIGZyYW1lX2RpZyAxCiAgICBndHhucyBDbG9zZVJlbWFpbmRlclRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBnZXRQcmV2UGF5X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjY2CiAgICAvLyByZXR1cm4gcGF5LmFtb3VudDsKICAgIGZyYW1lX2RpZyAxCiAgICBndHhucyBBbW91bnQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLmNyZWF0ZUFwcGxpY2F0aW9uKG93bmVyOiBieXRlcywgY2hhaW5JZDogYnl0ZXMsIG1lc3NlbmdlcjogdWludDY0LCBnYXNPcmFjbGU6IHVpbnQ2NCkgLT4gdm9pZDoKY3JlYXRlQXBwbGljYXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgcHJvdG8gNCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgYnl0ZWNfMyAvLyAib3duZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo5CiAgICAvLyB0aGlzLm93bmVyLnZhbHVlID0gb3duZXI7CiAgICBmcmFtZV9kaWcgLTQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjkKICAgIC8vIGdhc09yYWNsZSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgYnl0ZWMgNCAvLyAiZ2FzT3JhY2xlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxNAogICAgLy8gdGhpcy5nYXNPcmFjbGUudmFsdWUgPSBnYXNPcmFjbGU7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjM5CiAgICAvLyBwcml2YXRlIHN0b3BBdXRob3JpdHkgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGJ5dGVjIDEwIC8vICJzdG9wQXV0aG9yaXR5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1NAogICAgLy8gdGhpcy5zdG9wQXV0aG9yaXR5LnZhbHVlID0gb3duZXI7CiAgICBmcmFtZV9kaWcgLTQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBjaGFpbklkID0gR2xvYmFsU3RhdGU8Qnl0ZT4oKTsKICAgIGJ5dGVjIDUgLy8gImNoYWluSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjcwCiAgICAvLyB0aGlzLmNoYWluSWQudmFsdWUgPSBjaGFpbklkOwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyB0aGlzLm1lc3Nlbmdlci52YWx1ZSA9IG1lc3NlbmdlcjsKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5vcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCkgLT4gdm9pZDoKb3B0SW5Bc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NzQKICAgIC8vIG9wdEluQXNzZXQoYXNzZXRJZDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NzUKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo3OC04NAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBBc3NldChhc3NldElkKSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo4MgogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjgxCiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc4LTgzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IEFzc2V0KGFzc2V0SWQpLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo3OC04NAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBBc3NldChhc3NldElkKSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6ODYKICAgIC8vIGxvZygnQnJpZGdlOiBvcHQtaW4gY29tcGxldGVkJyk7CiAgICBwdXNoYnl0ZXMgIkJyaWRnZTogb3B0LWluIGNvbXBsZXRlZCIKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLnN3YXBBbmRCcmlkZ2UodG9rZW5JZDogdWludDY0LCByZWNpcGllbnQ6IGJ5dGVzLCBkZXN0aW5hdGlvbkNoYWluSWQ6IGJ5dGVzLCByZWNlaXZlVG9rZW46IGJ5dGVzLCBub25jZTogYnl0ZXMsIGZlZVRva2VuQW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CnN3YXBBbmRCcmlkZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjkzLTEwNQogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIC8vIHN3YXBBbmRCcmlkZ2UoCiAgICAvLyAgIHRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIGRlc3RpbmF0aW9uQ2hhaW5JZDogQnl0ZSwKICAgIC8vICAgcmVjZWl2ZVRva2VuOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIG5vbmNlOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIGZlZVRva2VuQW1vdW50OiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDYgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MAogICAgLy8gY2FuU3dhcCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2MQogICAgLy8gYXNzZXJ0KHRoaXMuY2FuU3dhcC52YWx1ZSwgJ1JvdXRlcjogc3dhcCBwcm9oaWJpdGVkJyk7CiAgICBhc3NlcnQgLy8gUm91dGVyOiBzd2FwIHByb2hpYml0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyBjb25zdCBhbW91bnQgPSBnZXRQcmV2QXNzZXRQYXkodG9rZW5JZCk7CiAgICBmcmFtZV9kaWcgLTYKICAgIGNhbGxzdWIgZ2V0UHJldkFzc2V0UGF5CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTA4CiAgICAvLyBhc3NlcnQoYW1vdW50ID4gZmVlVG9rZW5BbW91bnQsICdCcmlkZ2U6IGFtb3VudCB0b28gbG93IGZvciBmZWUnKTsKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEJyaWRnZTogYW1vdW50IHRvbyBsb3cgZm9yIGZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMDkKICAgIC8vIGFzc2VydCghcmVjaXBpZW50LmJ5dGVzLmVxdWFscyhiemVybygzMikpLCAnQnJpZGdlOiBicmlkZ2UgdG8gdGhlIHplcm8gYWRkcmVzcycpOwogICAgcHVzaGludCAzMiAvLyAzMgogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtNQogICAgPT0KICAgICEKICAgIGFzc2VydCAvLyBCcmlkZ2U6IGJyaWRnZSB0byB0aGUgemVybyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gY29uc3QgYnJpZGdpbmdGZWU6IHVpbnQ2NCA9IGdldFByZXZQYXkoMikgKyB0aGlzLl9jb252ZXJ0QnJpZGdpbmdGZWVJblRva2Vuc1RvTmF0aXZlVG9rZW4odG9rZW5JZCwgZmVlVG9rZW5BbW91bnQpOwogICAgcHVzaGludCAyIC8vIDIKICAgIGNhbGxzdWIgZ2V0UHJldlBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMzcKICAgIC8vIGlmIChmZWVUb2tlbkFtb3VudCA9PT0gMCkgcmV0dXJuIDA7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBzd2FwQW5kQnJpZGdlX2FmdGVyX2lmX2Vsc2VAMwogICAgaW50Y18wIC8vIDAKCnN3YXBBbmRCcmlkZ2VfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuX2NvbnZlcnRCcmlkZ2luZ0ZlZUluVG9rZW5zVG9OYXRpdmVUb2tlbkA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMTEKICAgIC8vIGNvbnN0IGJyaWRnaW5nRmVlOiB1aW50NjQgPSBnZXRQcmV2UGF5KDIpICsgdGhpcy5fY29udmVydEJyaWRnaW5nRmVlSW5Ub2tlbnNUb05hdGl2ZVRva2VuKHRva2VuSWQsIGZlZVRva2VuQW1vdW50KTsKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExMgogICAgLy8gY29uc3QgYW1vdW50QWZ0ZXJGZWU6IHVpbnQ2NCA9IGFtb3VudCAtIGZlZVRva2VuQW1vdW50OwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIGNvbnN0IHZVc2RBbW91bnQgPSB0aGlzLnNlbmRBbmRTd2FwVG9WVXNkKHRva2VuSWQsIHNlbmRlciwgYW1vdW50QWZ0ZXJGZWUpOwogICAgZnJhbWVfZGlnIC02CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExMwogICAgLy8gY29uc3Qgc2VuZGVyID0gbmV3IEFkZHJlc3MoVHhuLnNlbmRlcik7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExNAogICAgLy8gY29uc3QgdlVzZEFtb3VudCA9IHRoaXMuc2VuZEFuZFN3YXBUb1ZVc2QodG9rZW5JZCwgc2VuZGVyLCBhbW91bnRBZnRlckZlZSk7CiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgc2VuZEFuZFN3YXBUb1ZVc2QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIGNoYWluSWQgPSBHbG9iYWxTdGF0ZTxCeXRlPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNoYWluSWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIGFzc2VydChkZXN0aW5hdGlvbkNoYWluSWQgIT09IHRoaXMuY2hhaW5JZC52YWx1ZSwgJ0JyaWRnZTogd3JvbmcgZGVzdGluYXRpb24gY2hhaW4nKTsKICAgIGZyYW1lX2RpZyAtNAogICAgIT0KICAgIGFzc2VydCAvLyBCcmlkZ2U6IHdyb25nIGRlc3RpbmF0aW9uIGNoYWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMzMwogICAgLy8gcmV0dXJuIGNoYWluSWQuYnl0ZXMuY29uY2F0KHRva2VuLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NjYKICAgIC8vIG90aGVyQnJpZGdlVG9rZW5zID0gQm94TWFwPGJ5dGVzLCBTdGF0aWNCeXRlcz4oeyBrZXlQcmVmaXg6ICd0JyB9KTsKICAgIGJ5dGVjIDcgLy8gInQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTI3CiAgICAvLyBhc3NlcnQodGhpcy5vdGhlckJyaWRnZVRva2Vucyh0aGlzLl9nZXRPdGhlckJyaWRnZVRva2Vuc0tleShkZXN0aW5hdGlvbkNoYWluSWQsIHJlY2VpdmVUb2tlbikpLmV4aXN0cywgJ0JyaWRnZTogdW5rbm93biBjaGFpbiBvciB0b2tlbicpOwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQnJpZGdlOiB1bmtub3duIGNoYWluIG9yIHRva2VuCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBjaGFpbklkID0gR2xvYmFsU3RhdGU8Qnl0ZT4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjaGFpbklkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTI5CiAgICAvLyBjb25zdCBtZXNzYWdlID0gdGhpcy5oYXNoTWVzc2FnZShhbW91bnQsIHJlY2lwaWVudCwgdGhpcy5jaGFpbklkLnZhbHVlLCBkZXN0aW5hdGlvbkNoYWluSWQsIHJlY2VpdmVUb2tlbiwgbm9uY2UpOwogICAgZGlnIDEKICAgIGZyYW1lX2RpZyAtNQogICAgdW5jb3ZlciAyCiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGhhc2hNZXNzYWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gY29uc3QgYnJpZGdlVHJhbnNhY3Rpb25Db3N0ID0gdGhpcy5nZXRUcmFuc2FjdGlvbkNvc3QoZGVzdGluYXRpb25DaGFpbklkKTsKICAgIGZyYW1lX2RpZyAtNAogICAgY2FsbHN1YiBnZXRUcmFuc2FjdGlvbkNvc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NjEKICAgIC8vIHNlbnRNZXNzYWdlcyA9IEJveE1hcDxTdGF0aWNCeXRlczwzMj4sIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ3MnIH0pOwogICAgcHVzaGJ5dGVzICJzIgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNDgKICAgIC8vIGFzc2VydCghdGhpcy5zZW50TWVzc2FnZXMobWVzc2FnZSkuZXhpc3RzLCAnQnJpZGdlOiB0b2tlbnMgYWxyZWFkeSBzZW50Jyk7CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEJyaWRnZTogdG9rZW5zIGFscmVhZHkgc2VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTAKICAgIC8vIHRoaXMuc2VudE1lc3NhZ2VzKG1lc3NhZ2UpLnZhbHVlID0gbmV3IFN0YXRpY0J5dGVzKCk7CiAgICBwdXNoYnl0ZXMgMHgKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTUyCiAgICAvLyBjb25zdCBkZXN0aW5hdGlvbkNoYWluSWQgPSBtZXNzYWdlLmF0KDEpOwogICAgZGlnIDEKICAgIGV4dHJhY3QgMSAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTMtMTU2CiAgICAvLyBjb25zdCBtZXNzYWdlQ29zdCA9IGFiaUNhbGwoTWVzc2VuZ2VyLnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbkNvc3QsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibWVzc2VuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTUzLTE1NgogICAgLy8gY29uc3QgbWVzc2FnZUNvc3QgPSBhYmlDYWxsKE1lc3Nlbmdlci5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25Db3N0LCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2Rlc3RpbmF0aW9uQ2hhaW5JZF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIGJ5dGVjIDEzIC8vIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25Db3N0KGJ5dGUpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibWVzc2VuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTYwCiAgICAvLyByZWNlaXZlcjogdGhpcy5tZXNzZW5nZXIudmFsdWUuYWRkcmVzcywKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTcKICAgIC8vIG1lc3NlbmdlciA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gIm1lc3NlbmdlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gaXR4bi5zdWJtaXRHcm91cChwYXltZW50UGFyYW1zLCBhcHBDYWxsUGFyYW1zKTsKICAgIGl0eG5fYmVnaW4KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTgtMTYxCiAgICAvLyBjb25zdCBwYXltZW50UGFyYW1zID0gaXR4bi5wYXltZW50KHsKICAgIC8vICAgYW1vdW50OiBtZXNzYWdlQ29zdCwKICAgIC8vICAgcmVjZWl2ZXI6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmFkZHJlc3MsCiAgICAvLyB9KTsKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKHBheW1lbnRQYXJhbXMsIGFwcENhbGxQYXJhbXMpOwogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE2NgogICAgLy8gYXJjNC5tZXRob2RTZWxlY3Rvcignc2VuZE1lc3NhZ2UoYnl0ZVszMl0pdm9pZCcpLAogICAgcHVzaGJ5dGVzIDB4YTMyNDk5ODkgLy8gbWV0aG9kICJzZW5kTWVzc2FnZShieXRlWzMyXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNjMtMTY5CiAgICAvLyBjb25zdCBhcHBDYWxsUGFyYW1zID0gaXR4bi5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICAvLyAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICBhcmM0Lm1ldGhvZFNlbGVjdG9yKCdzZW5kTWVzc2FnZShieXRlWzMyXSl2b2lkJyksCiAgICAvLyAgICAgbWVzc2FnZSwKICAgIC8vICAgXSwKICAgIC8vIH0pOwogICAgaW50Y18yIC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNzAKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAocGF5bWVudFBhcmFtcywgYXBwQ2FsbFBhcmFtcyk7CiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzIKICAgIC8vIGVtaXQ8UmVjZWl2ZUZlZT4oeyBicmlkZ2VUcmFuc2FjdGlvbkNvc3QsIG1lc3NhZ2VUcmFuc2FjdGlvbkNvc3QgfSk7CiAgICBkaWcgMQogICAgaXRvYgogICAgZGlnIDEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4NGI1NTQxOWIgLy8gbWV0aG9kICJSZWNlaXZlRmVlKHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTMzCiAgICAvLyBhc3NlcnQoYnJpZGdpbmdGZWUgPj0gYnJpZGdlVHJhbnNhY3Rpb25Db3N0ICsgbWVzc2FnZVRyYW5zYWN0aW9uQ29zdCwgJ0JyaWRnZTogbm90IGVub3VnaCBmZWUnKTsKICAgICsKICAgIHVuY292ZXIgMgogICAgPD0KICAgIGFzc2VydCAvLyBCcmlkZ2U6IG5vdCBlbm91Z2ggZmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzNQogICAgLy8gYW1vdW50LAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzQtMTQxCiAgICAvLyBlbWl0PFRva2Vuc1NlbnQ+KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGRlc3RpbmF0aW9uQ2hhaW5JZCwKICAgIC8vICAgICByZWNlaXZlVG9rZW4sCiAgICAvLyAgICAgbm9uY2UsCiAgICAvLyAgICAgbWVzc2VuZ2VyOiBBTExCUklER0VfTUVTU0VOR0VSLAogICAgLy8gICB9LAogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIGNvbnN0IEFMTEJSSURHRV9NRVNTRU5HRVIgPSBuZXcgQnl0ZSgxKTsKICAgIGJ5dGVjIDExIC8vIDB4MDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTM0LTE0MQogICAgLy8gZW1pdDxUb2tlbnNTZW50Pih7CiAgICAvLyAgICAgYW1vdW50LAogICAgLy8gICAgIHJlY2lwaWVudCwKICAgIC8vICAgICBkZXN0aW5hdGlvbkNoYWluSWQsCiAgICAvLyAgICAgcmVjZWl2ZVRva2VuLAogICAgLy8gICAgIG5vbmNlLAogICAgLy8gICAgIG1lc3NlbmdlcjogQUxMQlJJREdFX01FU1NFTkdFUiwKICAgIC8vICAgfSwKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzQtMTQyCiAgICAvLyBlbWl0PFRva2Vuc1NlbnQ+KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGRlc3RpbmF0aW9uQ2hhaW5JZCwKICAgIC8vICAgICByZWNlaXZlVG9rZW4sCiAgICAvLyAgICAgbm9uY2UsCiAgICAvLyAgICAgbWVzc2VuZ2VyOiBBTExCUklER0VfTUVTU0VOR0VSLAogICAgLy8gICB9LAogICAgLy8gKTsKICAgIHB1c2hieXRlcyAweDIyOWZiYWVjIC8vIG1ldGhvZCAiVG9rZW5zU2VudCh1aW50NjQsYnl0ZVszMl0sYnl0ZSxieXRlWzMyXSxieXRlWzMyXSxieXRlKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCnN3YXBBbmRCcmlkZ2VfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMzkKICAgIC8vIGNvbnN0IGZlZTogdWludDY0ID0gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlICogZmVlVG9rZW5BbW91bnQgLyBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0UHJpY2UsIHsKICAgIGZyYW1lX2RpZyAtNgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozNgogICAgLy8gcHJvdGVjdGVkIGJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZicgfSk7CiAgICBwdXNoYnl0ZXMgImYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzM5CiAgICAvLyBjb25zdCBmZWU6IHVpbnQ2NCA9IHRoaXMuYnJpZGdpbmdGZWVDb252ZXJzaW9uU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZSAqIGZlZVRva2VuQW1vdW50IC8gYWJpQ2FsbChHYXNPcmFjbGUucHJvdG90eXBlLmdldFByaWNlLCB7CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMzOS0zNDIKICAgIC8vIGNvbnN0IGZlZTogdWludDY0ID0gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlICogZmVlVG9rZW5BbW91bnQgLyBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0UHJpY2UsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuZ2FzT3JhY2xlLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbdGhpcy5jaGFpbklkLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo5CiAgICAvLyBnYXNPcmFjbGUgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJnYXNPcmFjbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NgogICAgLy8gY2hhaW5JZCA9IEdsb2JhbFN0YXRlPEJ5dGU+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiY2hhaW5JZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMzOS0zNDIKICAgIC8vIGNvbnN0IGZlZTogdWludDY0ID0gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlICogZmVlVG9rZW5BbW91bnQgLyBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0UHJpY2UsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuZ2FzT3JhY2xlLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbdGhpcy5jaGFpbklkLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgcHVzaGJ5dGVzIDB4MWRiNzBjZGQgLy8gbWV0aG9kICJnZXRQcmljZShieXRlKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGJ0b2kKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzQ0CiAgICAvLyBlbWl0PEJyaWRnaW5nRmVlRnJvbVRva2Vucz4oeyBmZWUgfSk7CiAgICBkdXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweGUwN2Y2YjM2IC8vIG1ldGhvZCAiQnJpZGdpbmdGZWVGcm9tVG9rZW5zKHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMTEKICAgIC8vIGNvbnN0IGJyaWRnaW5nRmVlOiB1aW50NjQgPSBnZXRQcmV2UGF5KDIpICsgdGhpcy5fY29udmVydEJyaWRnaW5nRmVlSW5Ub2tlbnNUb05hdGl2ZVRva2VuKHRva2VuSWQsIGZlZVRva2VuQW1vdW50KTsKICAgIGIgc3dhcEFuZEJyaWRnZV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5fY29udmVydEJyaWRnaW5nRmVlSW5Ub2tlbnNUb05hdGl2ZVRva2VuQDUKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UucmVjZWl2ZVRva2VucyhhbW91bnQ6IHVpbnQ2NCwgcmVjaXBpZW50OiBieXRlcywgc291cmNlQ2hhaW5JZDogYnl0ZXMsIHJlY2VpdmVUb2tlbjogYnl0ZXMsIG5vbmNlOiBieXRlcywgcmVjZWl2ZUFtb3VudE1pbjogdWludDY0KSAtPiB2b2lkOgpyZWNlaXZlVG9rZW5zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNzQtMTgyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHJlY2VpdmVUb2tlbnMoCiAgICAvLyAgIGFtb3VudDogdWludDY0LAogICAgLy8gICByZWNpcGllbnQ6IFN0YXRpY0J5dGVzPDMyPiwKICAgIC8vICAgc291cmNlQ2hhaW5JZDogQnl0ZSwKICAgIC8vICAgcmVjZWl2ZVRva2VuOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIG5vbmNlOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICk6IHZvaWQgewogICAgcHJvdG8gNiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjUwCiAgICAvLyBjYW5Td2FwID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2FuU3dhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjYxCiAgICAvLyBhc3NlcnQodGhpcy5jYW5Td2FwLnZhbHVlLCAnUm91dGVyOiBzd2FwIHByb2hpYml0ZWQnKTsKICAgIGFzc2VydCAvLyBSb3V0ZXI6IHN3YXAgcHJvaGliaXRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2MwogICAgLy8gb3RoZXJCcmlkZ2VzID0gQm94TWFwPEJ5dGUsIFN0YXRpY0J5dGVzPDMyPj4oeyBrZXlQcmVmaXg6ICdiJyB9KTsKICAgIHB1c2hieXRlcyAiYiIKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE4NAogICAgLy8gYXNzZXJ0KHRoaXMub3RoZXJCcmlkZ2VzKHNvdXJjZUNoYWluSWQpLmV4aXN0cywgJ0JyaWRnZTogc291cmNlIG5vdCByZWdpc3RlcmVkJyk7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBCcmlkZ2U6IHNvdXJjZSBub3QgcmVnaXN0ZXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxODUKICAgIC8vIGNvbnN0IHZhbHVlOiB1aW50NjQgPSBnZXRQcmV2UGF5KDEpOwogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgZ2V0UHJldlBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxODcKICAgIC8vIGFzc2VydCh2YWx1ZSA+PSBzdG9yYWdlRmVlLCAnQnJpZGdlOiBub3QgZW5vdWdoIGZlZScpOwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMyMAogICAgLy8gcmV0dXJuIDE1NzAwOwogICAgaW50YyA0IC8vIDE1NzAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE4NwogICAgLy8gYXNzZXJ0KHZhbHVlID49IHN0b3JhZ2VGZWUsICdCcmlkZ2U6IG5vdCBlbm91Z2ggZmVlJyk7CiAgICA+PQogICAgYXNzZXJ0IC8vIEJyaWRnZTogbm90IGVub3VnaCBmZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIGNoYWluSWQgPSBHbG9iYWxTdGF0ZTxCeXRlPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNoYWluSWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxODkKICAgIC8vIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmhhc2hNZXNzYWdlKGFtb3VudCwgcmVjaXBpZW50LCBzb3VyY2VDaGFpbklkLCB0aGlzLmNoYWluSWQudmFsdWUsIHJlY2VpdmVUb2tlbiwgbm9uY2UpOwogICAgZnJhbWVfZGlnIC02CiAgICBmcmFtZV9kaWcgLTUKICAgIGZyYW1lX2RpZyAtNAogICAgdW5jb3ZlciAzCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBoYXNoTWVzc2FnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjgwCiAgICAvLyBjb25zdCBoOiBieXRlcyA9IG9wLmtlY2NhazI1NihvcC5jb25jYXQobWVzc2FnZS5ieXRlcywgc2VuZGVyQWRkcmVzcykpOwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gY29uc3QgbWVzc2FnZVdpdGhTZW5kZXIgPSBoYXNoV2l0aFNlbmRlckFkZHJlc3MobWVzc2FnZSwgVHhuLnNlbmRlci5ieXRlcyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6ODAKICAgIC8vIGNvbnN0IGg6IGJ5dGVzID0gb3Aua2VjY2FrMjU2KG9wLmNvbmNhdChtZXNzYWdlLmJ5dGVzLCBzZW5kZXJBZGRyZXNzKSk7CiAgICBjb25jYXQKICAgIGtlY2NhazI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjgzCiAgICAvLyBjb25zdCBmaXJzdDIgPSBvcC5zdWJzdHJpbmcobWVzc2FnZS5ieXRlcywgMCwgMik7CiAgICBzd2FwCiAgICBzdWJzdHJpbmcgMCAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6ODUKICAgIC8vIGNvbnN0IGxhc3QzMCA9IG9wLnN1YnN0cmluZyhoLCAyLCAzMik7CiAgICBzd2FwCiAgICBzdWJzdHJpbmcgMiAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gbmV3IFN0YXRpY0J5dGVzPDMyPihvcC5jb25jYXQoZmlyc3QyLCBsYXN0MzApKTsKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU5CiAgICAvLyBwcm9jZXNzZWRNZXNzYWdlcyA9IEJveE1hcDxTdGF0aWNCeXRlczwzMj4sIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ20nIH0pOwogICAgcHVzaGJ5dGVzICJtIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxOTIKICAgIC8vIGFzc2VydCghdGhpcy5wcm9jZXNzZWRNZXNzYWdlcyhtZXNzYWdlV2l0aFNlbmRlcikuZXhpc3RzLCAnQnJpZGdlOiBtZXNzYWdlIHByb2Nlc3NlZCcpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBCcmlkZ2U6IG1lc3NhZ2UgcHJvY2Vzc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE5NAogICAgLy8gdGhpcy5wcm9jZXNzZWRNZXNzYWdlcyhtZXNzYWdlV2l0aFNlbmRlcikudmFsdWUgPSBuZXcgU3RhdGljQnl0ZXMoKTsKICAgIHB1c2hieXRlcyAweAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxOTctMjAwCiAgICAvLyBhc3NlcnQoYWJpQ2FsbChNZXNzZW5nZXIucHJvdG90eXBlLnJlY2VpdmVkTWVzc2FnZXMsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbbWVzc2FnZVdpdGhTZW5kZXJdLAogICAgLy8gfSkucmV0dXJuVmFsdWUsICdCcmlkZ2U6IG5vIG1lc3NhZ2UnKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTcKICAgIC8vIG1lc3NlbmdlciA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gIm1lc3NlbmdlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE5Ny0yMDAKICAgIC8vIGFzc2VydChhYmlDYWxsKE1lc3Nlbmdlci5wcm90b3R5cGUucmVjZWl2ZWRNZXNzYWdlcywgewogICAgLy8gICBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFttZXNzYWdlV2l0aFNlbmRlcl0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZSwgJ0JyaWRnZTogbm8gbWVzc2FnZScpOwogICAgcHVzaGJ5dGVzIDB4MzNlMTQ3YWEgLy8gbWV0aG9kICJyZWNlaXZlZE1lc3NhZ2VzKGJ5dGVbMzJdKWJvb2wiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBhc3NlcnQgLy8gQnJpZGdlOiBubyBtZXNzYWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIwMgogICAgLy8gY29uc3QgdG9rZW5JZDogdWludDY0ID0gb3AuZXh0cmFjdFVpbnQ2NChyZWNlaXZlVG9rZW4uYnl0ZXMsIDI0KTsKICAgIGZyYW1lX2RpZyAtMwogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjA0LTIwOQogICAgLy8gY29uc3QgcmVjZWl2ZUFtb3VudCA9IHRoaXMucmVjZWl2ZUFuZFN3YXBGcm9tVlVzZCgKICAgIC8vICAgdG9rZW5JZCwKICAgIC8vICAgcmVjaXBpZW50QWRkcmVzcywKICAgIC8vICAgYW1vdW50LAogICAgLy8gICByZWNlaXZlQW1vdW50TWluLAogICAgLy8gKTsKICAgIGZyYW1lX2RpZyAtNQogICAgZnJhbWVfZGlnIC02CiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgcmVjZWl2ZUFuZFN3YXBGcm9tVlVzZAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMTIKICAgIC8vIGNvbnN0IGV4dHJhR2FzOiB1aW50NjQgPSB2YWx1ZSAtIHN0b3JhZ2VGZWU7CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzIwCiAgICAvLyByZXR1cm4gMTU3MDA7CiAgICBpbnRjIDQgLy8gMTU3MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjEyCiAgICAvLyBjb25zdCBleHRyYUdhczogdWludDY0ID0gdmFsdWUgLSBzdG9yYWdlRmVlOwogICAgLQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMjAKICAgIC8vIHJldHVybiAxNTcwMDsKICAgIGludGMgNCAvLyAxNTcwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMTMKICAgIC8vIGlmICh2YWx1ZSA+IHN0b3JhZ2VGZWUpIHsKICAgID4KICAgIGJ6IHJlY2VpdmVUb2tlbnNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIxNC0yMTcKICAgIC8vIHBheW1lbnQoewogICAgLy8gICBhbW91bnQ6IGV4dHJhR2FzLAogICAgLy8gICByZWNlaXZlcjogcmVjaXBpZW50QWRkcmVzcy5ieXRlcywKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC01CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgMgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CgpyZWNlaXZlVG9rZW5zX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjE5CiAgICAvLyBlbWl0PFRva2Vuc1JlY2VpdmVkPih7IHJlY2VpdmVBbW91bnQsIHJlY2lwaWVudDogcmVjaXBpZW50QWRkcmVzcywgbm9uY2UsIG1lc3NlbmdlcjogQUxMQlJJREdFX01FU1NFTkdFUiwgbWVzc2FnZTogbWVzc2FnZVdpdGhTZW5kZXIgfSk7CiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyBjb25zdCBBTExCUklER0VfTUVTU0VOR0VSID0gbmV3IEJ5dGUoMSk7CiAgICBieXRlYyAxMSAvLyAweDAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIxOQogICAgLy8gZW1pdDxUb2tlbnNSZWNlaXZlZD4oeyByZWNlaXZlQW1vdW50LCByZWNpcGllbnQ6IHJlY2lwaWVudEFkZHJlc3MsIG5vbmNlLCBtZXNzZW5nZXI6IEFMTEJSSURHRV9NRVNTRU5HRVIsIG1lc3NhZ2U6IG1lc3NhZ2VXaXRoU2VuZGVyIH0pOwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg0NTgzNmFkNiAvLyBtZXRob2QgIlRva2Vuc1JlY2VpdmVkKHVpbnQ2NCxhZGRyZXNzLGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0pIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5yZWdpc3RlckJyaWRnZShjaGFpbklkOiBieXRlcywgYnJpZGdlQWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6CnJlZ2lzdGVyQnJpZGdlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMjItMjIzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHJlZ2lzdGVyQnJpZGdlKGNoYWluSWQ6IEJ5dGUsIGJyaWRnZUFkZHJlc3M6IFN0YXRpY0J5dGVzPDMyPik6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyNAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjYzCiAgICAvLyBvdGhlckJyaWRnZXMgPSBCb3hNYXA8Qnl0ZSwgU3RhdGljQnl0ZXM8MzI+Pih7IGtleVByZWZpeDogJ2InIH0pOwogICAgcHVzaGJ5dGVzICJiIgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjI1CiAgICAvLyB0aGlzLm90aGVyQnJpZGdlcyhjaGFpbklkKS52YWx1ZSA9IGJyaWRnZUFkZHJlc3M7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5hZGRCcmlkZ2VUb2tlbihjaGFpbklkOiBieXRlcywgdG9rZW5BZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKYWRkQnJpZGdlVG9rZW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyOC0yMjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gYWRkQnJpZGdlVG9rZW4oY2hhaW5JZDogQnl0ZSwgdG9rZW5BZGRyZXNzOiBTdGF0aWNCeXRlczwzMj4pOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMzAKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMzMKICAgIC8vIHJldHVybiBjaGFpbklkLmJ5dGVzLmNvbmNhdCh0b2tlbi5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY2CiAgICAvLyBvdGhlckJyaWRnZVRva2VucyA9IEJveE1hcDxieXRlcywgU3RhdGljQnl0ZXM+KHsga2V5UHJlZml4OiAndCcgfSk7CiAgICBieXRlYyA3IC8vICJ0IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gdGhpcy5vdGhlckJyaWRnZVRva2Vucyh0aGlzLl9nZXRPdGhlckJyaWRnZVRva2Vuc0tleShjaGFpbklkLCB0b2tlbkFkZHJlc3MpKS52YWx1ZSA9IG5ldyBTdGF0aWNCeXRlcygpOwogICAgcHVzaGJ5dGVzIDB4CiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UucmVtb3ZlQnJpZGdlVG9rZW4oY2hhaW5JZDogYnl0ZXMsIHRva2VuQWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZUJyaWRnZVRva2VuOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMzQtMjM1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHJlbW92ZUJyaWRnZVRva2VuKGNoYWluSWQ6IEJ5dGUsIHRva2VuQWRkcmVzczogU3RhdGljQnl0ZXM8MzI+KTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjM2CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzMzCiAgICAvLyByZXR1cm4gY2hhaW5JZC5ieXRlcy5jb25jYXQodG9rZW4uYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2NgogICAgLy8gb3RoZXJCcmlkZ2VUb2tlbnMgPSBCb3hNYXA8Ynl0ZXMsIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ3QnIH0pOwogICAgYnl0ZWMgNyAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMzcKICAgIC8vIHRoaXMub3RoZXJCcmlkZ2VUb2tlbnModGhpcy5fZ2V0T3RoZXJCcmlkZ2VUb2tlbnNLZXkoY2hhaW5JZCwgdG9rZW5BZGRyZXNzKSkuZGVsZXRlKCk7CiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS53aXRoZHJhd0dhc1Rva2VucyhhbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKd2l0aGRyYXdHYXNUb2tlbnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0MC0yNDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gd2l0aGRyYXdHYXNUb2tlbnMoYW1vdW50OiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNDIKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNDMKICAgIC8vIHBheW1lbnQoeyBhbW91bnQ6IGFtb3VudCwgcmVjZWl2ZXI6IHRoaXMub3duZXIudmFsdWUuYnl0ZXMgfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm93bmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQzCiAgICAvLyBwYXltZW50KHsgYW1vdW50OiBhbW91bnQsIHJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzIH0pLnN1Ym1pdCgpOwogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS53aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnMoYXNzZXRJZDogdWludDY0KSAtPiB2b2lkOgp3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0Ni0yNDcKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gd2l0aGRyYXdCcmlkZ2luZ0ZlZUluVG9rZW5zKGFzc2V0SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0OAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI1MAogICAgLy8gY29uc3QgYXBwQWNjdDogQWNjb3VudCA9IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzOwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTEKICAgIC8vIGNvbnN0IGJhbGFuY2UgPSBhc3NldC5iYWxhbmNlKGFwcEFjY3QpOwogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI1MgogICAgLy8gaWYgKGJhbGFuY2UgPiBVaW50NjQoMCkpIHsKICAgIGJ6IHdpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjUzLTI1OAogICAgLy8gYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHNlbmRlcjogYXBwQWNjdCwKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGJhbGFuY2UsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMub3duZXIudmFsdWUuYnl0ZXMKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAxCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBmcmFtZV9kaWcgMAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjUzLTI1OAogICAgLy8gYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHNlbmRlcjogYXBwQWNjdCwKICAgIC8vICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGJhbGFuY2UsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMub3duZXIudmFsdWUuYnl0ZXMKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKCndpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuZ2V0QnJpZGdpbmdDb3N0SW5Ub2tlbnMoZGVzdGluYXRpb25DaGFpbklkOiBieXRlcywgdG9rZW5JZDogdWludDY0KSAtPiB1aW50NjQ6CmdldEJyaWRnaW5nQ29zdEluVG9rZW5zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNjItMjY2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGdldEJyaWRnaW5nQ29zdEluVG9rZW5zKAogICAgLy8gICBkZXN0aW5hdGlvbkNoYWluSWQ6IEJ5dGUsCiAgICAvLyAgIHRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjY3CiAgICAvLyBjb25zdCBicmlkZ2VHYXNBbW91bnQ6IHVpbnQ2NCA9IHRoaXMuZ2V0R2FzVXNhZ2UoZGVzdGluYXRpb25DaGFpbklkKTsKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBnZXRHYXNVc2FnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNjgtMjcxCiAgICAvLyBjb25zdCBtZXNzZW5nZXJHYXNBbW91bnQ6IHVpbnQ2NCA9IGFiaUNhbGwoTWVzc2VuZ2VyLnByb3RvdHlwZS5nZXRHYXNVc2FnZSwgewogICAgLy8gICBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU3CiAgICAvLyBtZXNzZW5nZXIgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNjgtMjcxCiAgICAvLyBjb25zdCBtZXNzZW5nZXJHYXNBbW91bnQ6IHVpbnQ2NCA9IGFiaUNhbGwoTWVzc2VuZ2VyLnByb3RvdHlwZS5nZXRHYXNVc2FnZSwgewogICAgLy8gICBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBieXRlYyAxNCAvLyBtZXRob2QgImdldEdhc1VzYWdlKGJ5dGUpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3My0yNzYKICAgIC8vIHJldHVybiBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5VU0QsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuZ2FzT3JhY2xlLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkLCBicmlkZ2VHYXNBbW91bnQgKyBtZXNzZW5nZXJHYXNBbW91bnRdLAogICAgLy8gfSkucmV0dXJuVmFsdWUgLyB0aGlzLmZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo5CiAgICAvLyBnYXNPcmFjbGUgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJnYXNPcmFjbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzUKICAgIC8vIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWQsIGJyaWRnZUdhc0Ftb3VudCArIG1lc3Nlbmdlckdhc0Ftb3VudF0sCiAgICBjb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3My0yNzYKICAgIC8vIHJldHVybiBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5VU0QsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMuZ2FzT3JhY2xlLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkLCBicmlkZ2VHYXNBbW91bnQgKyBtZXNzZW5nZXJHYXNBbW91bnRdLAogICAgLy8gfSkucmV0dXJuVmFsdWUgLyB0aGlzLmZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlOwogICAgcHVzaGJ5dGVzIDB4N2JmN2Q1MGMgLy8gbWV0aG9kICJnZXRUcmFuc2FjdGlvbkdhc0Nvc3RJblVTRChieXRlLHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3NgogICAgLy8gfSkucmV0dXJuVmFsdWUgLyB0aGlzLmZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjMzCiAgICAvLyBwcm90ZWN0ZWQgZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZScgfSk7CiAgICBwdXNoYnl0ZXMgImUiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyB9KS5yZXR1cm5WYWx1ZSAvIHRoaXMuZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWU7CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzMtMjc2CiAgICAvLyByZXR1cm4gYWJpQ2FsbChHYXNPcmFjbGUucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uR2FzQ29zdEluVVNELCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2Rlc3RpbmF0aW9uQ2hhaW5JZCwgYnJpZGdlR2FzQW1vdW50ICsgbWVzc2VuZ2VyR2FzQW1vdW50XSwKICAgIC8vIH0pLnJldHVyblZhbHVlIC8gdGhpcy5mcm9tR2FzT3JhY2xlU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZTsKICAgIC8KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5oYXNoTWVzc2FnZShhbW91bnQ6IHVpbnQ2NCwgcmVjaXBpZW50OiBieXRlcywgc291cmNlQ2hhaW5JZDogYnl0ZXMsIGRlc3RpbmF0aW9uQ2hhaW5JZDogYnl0ZXMsIHJlY2VpdmVUb2tlbjogYnl0ZXMsIG5vbmNlOiBieXRlcykgLT4gYnl0ZXM6Cmhhc2hNZXNzYWdlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzktMjg3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGhhc2hNZXNzYWdlKAogICAgLy8gICBhbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIHNvdXJjZUNoYWluSWQ6IEJ5dGUsCiAgICAvLyAgIGRlc3RpbmF0aW9uQ2hhaW5JZDogQnl0ZSwKICAgIC8vICAgcmVjZWl2ZVRva2VuOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIG5vbmNlOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyApOiBTdGF0aWNCeXRlczwzMj4gewogICAgcHJvdG8gNiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI4OAogICAgLy8gY29uc3QgYW1vdW50MzIgPSBiemVybygyNCkuY29uY2F0KG9wLml0b2IoYW1vdW50KSk7CiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBiemVybwogICAgZnJhbWVfZGlnIC02CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6Mjg5CiAgICAvLyBjb25zdCBzb3VyY2VDaGFpbklkMzIgPSBiemVybygzMSkuY29uY2F0KHNvdXJjZUNoYWluSWQuYnl0ZXMpOwogICAgcHVzaGludCAzMSAvLyAzMQogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI5MC0yOTEKICAgIC8vIGNvbnN0IHBhY2tlZCA9IGFtb3VudDMyCiAgICAvLyAgIC5jb25jYXQocmVjaXBpZW50LmJ5dGVzKQogICAgc3dhcAogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjkwLTI5MgogICAgLy8gY29uc3QgcGFja2VkID0gYW1vdW50MzIKICAgIC8vICAgLmNvbmNhdChyZWNpcGllbnQuYnl0ZXMpCiAgICAvLyAgIC5jb25jYXQoc291cmNlQ2hhaW5JZDMyKQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI5MC0yOTMKICAgIC8vIGNvbnN0IHBhY2tlZCA9IGFtb3VudDMyCiAgICAvLyAgIC5jb25jYXQocmVjaXBpZW50LmJ5dGVzKQogICAgLy8gICAuY29uY2F0KHNvdXJjZUNoYWluSWQzMikKICAgIC8vICAgLmNvbmNhdChyZWNlaXZlVG9rZW4uYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyOTAtMjk0CiAgICAvLyBjb25zdCBwYWNrZWQgPSBhbW91bnQzMgogICAgLy8gICAuY29uY2F0KHJlY2lwaWVudC5ieXRlcykKICAgIC8vICAgLmNvbmNhdChzb3VyY2VDaGFpbklkMzIpCiAgICAvLyAgIC5jb25jYXQocmVjZWl2ZVRva2VuLmJ5dGVzKQogICAgLy8gICAuY29uY2F0KG5vbmNlLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIGNvbnN0IEFMTEJSSURHRV9NRVNTRU5HRVIgPSBuZXcgQnl0ZSgxKTsKICAgIGJ5dGVjIDExIC8vIDB4MDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjkwLTI5NQogICAgLy8gY29uc3QgcGFja2VkID0gYW1vdW50MzIKICAgIC8vICAgLmNvbmNhdChyZWNpcGllbnQuYnl0ZXMpCiAgICAvLyAgIC5jb25jYXQoc291cmNlQ2hhaW5JZDMyKQogICAgLy8gICAuY29uY2F0KHJlY2VpdmVUb2tlbi5ieXRlcykKICAgIC8vICAgLmNvbmNhdChub25jZS5ieXRlcykKICAgIC8vICAgLmNvbmNhdChBTExCUklER0VfTUVTU0VOR0VSLmJ5dGVzKTsKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyOTcKICAgIC8vIGNvbnN0IGhhc2ggPSBvcC5rZWNjYWsyNTYocGFja2VkKTsgLy8gMzIgYnl0ZXMKICAgIGtlY2NhazI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMDAKICAgIC8vIGNvbnN0IHdpdGhTcmMgPSBvcC5zZXRCeXRlKGhhc2gsIDAsIG9wLmJ0b2koc291cmNlQ2hhaW5JZC5ieXRlcykpOwogICAgZnJhbWVfZGlnIC00CiAgICBidG9pCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgc2V0Ynl0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMDEKICAgIC8vIGNvbnN0IHdpdGhEc3QgPSBvcC5zZXRCeXRlKHdpdGhTcmMsIDEsIG9wLmJ0b2koZGVzdGluYXRpb25DaGFpbklkLmJ5dGVzKSk7CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ0b2kKICAgIGludGNfMSAvLyAxCiAgICBzd2FwCiAgICBzZXRieXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMwMwogICAgLy8gcmV0dXJuIG5ldyBTdGF0aWNCeXRlczwzMj4od2l0aERzdCk7CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHNpemUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5pc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWQoY2hhaW5JZDogYnl0ZXMsIHRva2VuOiBieXRlcykgLT4gdWludDY0Ogppc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMwNi0zMDcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkKGNoYWluSWQ6IEJ5dGUsIHRva2VuOiBTdGF0aWNCeXRlczwzMj4pOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMzMKICAgIC8vIHJldHVybiBjaGFpbklkLmJ5dGVzLmNvbmNhdCh0b2tlbi5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY2CiAgICAvLyBvdGhlckJyaWRnZVRva2VucyA9IEJveE1hcDxieXRlcywgU3RhdGljQnl0ZXM+KHsga2V5UHJlZml4OiAndCcgfSk7CiAgICBieXRlYyA3IC8vICJ0IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMwOAogICAgLy8gcmV0dXJuIHRoaXMub3RoZXJCcmlkZ2VUb2tlbnModGhpcy5fZ2V0T3RoZXJCcmlkZ2VUb2tlbnNLZXkoY2hhaW5JZCwgdG9rZW4pKS5leGlzdHM7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5nZXRUcmFuc2FjdGlvbkNvc3QoY2hhaW5JZDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0VHJhbnNhY3Rpb25Db3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTEtMzEyCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGdldFRyYW5zYWN0aW9uQ29zdChjaGFpbklkOiBCeXRlKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTMKICAgIC8vIHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uUmVsYXllckNvc3QoY2hhaW5JZCkgKyB0aGlzLmdldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0KCk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMjcKICAgIC8vIHJldHVybiAxNTcwMDsKICAgIGludGMgNCAvLyAxNTcwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTMKICAgIC8vIHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uUmVsYXllckNvc3QoY2hhaW5JZCkgKyB0aGlzLmdldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0KCk7CiAgICArCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIuc3dhcCh0b2tlbklkOiB1aW50NjQsIHJlY2VpdmVUb2tlbklkOiB1aW50NjQsIHJlY2lwaWVudDogYnl0ZXMsIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCkgLT4gdm9pZDoKc3dhcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NzgtODQKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gc3dhcCgKICAgIC8vICAgdG9rZW5JZDogdWludDY0LAogICAgLy8gICByZWNlaXZlVG9rZW5JZDogdWludDY0LAogICAgLy8gICByZWNpcGllbnQ6IEFkZHJlc3MsCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICk6IHZvaWQgewogICAgcHJvdG8gNCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjUwCiAgICAvLyBjYW5Td2FwID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2FuU3dhcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjYxCiAgICAvLyBhc3NlcnQodGhpcy5jYW5Td2FwLnZhbHVlLCAnUm91dGVyOiBzd2FwIHByb2hpYml0ZWQnKTsKICAgIGFzc2VydCAvLyBSb3V0ZXI6IHN3YXAgcHJvaGliaXRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo4NgogICAgLy8gY29uc3Qgc2VuZGVyID0gbmV3IEFkZHJlc3MoVHhuLnNlbmRlcik7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjg3CiAgICAvLyBjb25zdCBhbW91bnQgPSBnZXRQcmV2QXNzZXRQYXkodG9rZW5JZCk7CiAgICBmcmFtZV9kaWcgLTQKICAgIGNhbGxzdWIgZ2V0UHJldkFzc2V0UGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjg4CiAgICAvLyBjb25zdCB2VXNkQW1vdW50ID0gdGhpcy5zZW5kQW5kU3dhcFRvVlVzZCh0b2tlbklkLCBzZW5kZXIsIGFtb3VudCk7CiAgICBmcmFtZV9kaWcgLTQKICAgIGRpZyAyCiAgICBkaWcgMgogICAgY2FsbHN1YiBzZW5kQW5kU3dhcFRvVlVzZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo4OQogICAgLy8gY29uc3QgcmVjZWl2ZWRBbW91bnQgPSB0aGlzLnJlY2VpdmVBbmRTd2FwRnJvbVZVc2QocmVjZWl2ZVRva2VuSWQsIHJlY2lwaWVudCwgdlVzZEFtb3VudCwgcmVjZWl2ZUFtb3VudE1pbik7CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgdW5jb3ZlciAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgcmVjZWl2ZUFuZFN3YXBGcm9tVlVzZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo5MAogICAgLy8gZW1pdDxTd2FwcGVkPih7IHNlbmRlciwgcmVjaXBpZW50LCB0b2tlbklkLCByZWNlaXZlVG9rZW5JZCwgYW1vdW50LCByZWNlaXZlZEFtb3VudCB9KTsKICAgIGZyYW1lX2RpZyAtNAogICAgaXRvYgogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgdW5jb3ZlciA0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTQwNDRiMyAvLyBtZXRob2QgIlN3YXBwZWQoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLmFkZFBvb2wocG9vbElkOiB1aW50NjQsIHRva2VuSWQ6IHVpbnQ2NCkgLT4gdm9pZDoKYWRkUG9vbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTAwLTEwMQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBhZGRQb29sKHBvb2xJZDogdWludDY0LCB0b2tlbklkOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDIKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDMKICAgIC8vIHRoaXMucG9vbHModG9rZW5JZCkudmFsdWUgPSBwb29sSWQ7CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzEKICAgIC8vIHBvb2xzID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ3AnIH0pOwogICAgYnl0ZWMgOCAvLyAicCIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTAzCiAgICAvLyB0aGlzLnBvb2xzKHRva2VuSWQpLnZhbHVlID0gcG9vbElkOwogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwNQogICAgLy8gY29uc3QgdG9rZW5EZWNpbWFscyA9IGFzc2V0LmRlY2ltYWxzOwogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLW9yYWNsZS5jb250cmFjdC5hbGdvLnRzOjgKICAgIC8vIGV4cG9ydCBjb25zdCBPUkFDTEVfUFJJQ0VfUFJFQ0lTSU9OOiB1aW50NjQgPSA5OwogICAgcHVzaGludCA5IC8vIDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTA2CiAgICAvLyB0aGlzLmJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgPSAxMCAqKiAoT1JBQ0xFX1BSSUNFX1BSRUNJU0lPTiAtIHRva2VuRGVjaW1hbHMgKyBDSEFJTl9QUkVDSVNJT04pOwogICAgc3dhcAogICAgLQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy1vcmFjbGUuY29udHJhY3QuYWxnby50czo3CiAgICAvLyBleHBvcnQgY29uc3QgQ0hBSU5fUFJFQ0lTSU9OOiB1aW50NjQgPSA2OwogICAgaW50Y18yIC8vIDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTA2CiAgICAvLyB0aGlzLmJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgPSAxMCAqKiAoT1JBQ0xFX1BSSUNFX1BSRUNJU0lPTiAtIHRva2VuRGVjaW1hbHMgKyBDSEFJTl9QUkVDSVNJT04pOwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozNgogICAgLy8gcHJvdGVjdGVkIGJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZicgfSk7CiAgICBwdXNoYnl0ZXMgImYiCiAgICBkaWcgMwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwNgogICAgLy8gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlID0gMTAgKiogKE9SQUNMRV9QUklDRV9QUkVDSVNJT04gLSB0b2tlbkRlY2ltYWxzICsgQ0hBSU5fUFJFQ0lTSU9OKTsKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIHVuY292ZXIgMgogICAgZXhwCiAgICBpdG9iCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjMzCiAgICAvLyBwcm90ZWN0ZWQgZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZScgfSk7CiAgICBwdXNoYnl0ZXMgImUiCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDcKICAgIC8vIHRoaXMuZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgPSAxMCAqKiAoT1JBQ0xFX1BSSUNFX1BSRUNJU0lPTiAtIHRva2VuRGVjaW1hbHMpOwogICAgcHVzaGludCAxMCAvLyAxMAogICAgdW5jb3ZlciAyCiAgICBleHAKICAgIGl0b2IKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5yZW1vdmVQb29sKHRva2VuSWQ6IHVpbnQ2NCkgLT4gdm9pZDoKcmVtb3ZlUG9vbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTEwLTExMQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyByZW1vdmVQb29sKHRva2VuSWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMgogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMwogICAgLy8gdGhpcy5wb29scyh0b2tlbklkKS5kZWxldGUoKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozMQogICAgLy8gcG9vbHMgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAncCcgfSk7CiAgICBieXRlYyA4IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMwogICAgLy8gdGhpcy5wb29scyh0b2tlbklkKS5kZWxldGUoKTsKICAgIGJveF9kZWwKICAgIHBvcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnN0b3BTd2FwKCkgLT4gdm9pZDoKc3RvcFN3YXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjY4CiAgICAvLyBhc3NlcnQob3AuVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5zdG9wQXV0aG9yaXR5LnZhbHVlLmJ5dGVzLCAnUm91dGVyOiBpcyBub3Qgc3RvcEF1dGhvcml0eScpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozOQogICAgLy8gcHJpdmF0ZSBzdG9wQXV0aG9yaXR5ID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBjYW4gcmVzdHJpY3QgZGVwb3NpdCBvciB3aXRoZHJhdyBvcGVyYXRpb25zCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInN0b3BBdXRob3JpdHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2OAogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZS5ieXRlcywgJ1JvdXRlcjogaXMgbm90IHN0b3BBdXRob3JpdHknKTsKICAgID09CiAgICBhc3NlcnQgLy8gUm91dGVyOiBpcyBub3Qgc3RvcEF1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MAogICAgLy8gY2FuU3dhcCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOwogICAgYnl0ZWNfMSAvLyAiY2FuU3dhcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTIyCiAgICAvLyB0aGlzLmNhblN3YXAudmFsdWUgPSBmYWxzZTsKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnN0YXJ0U3dhcCgpIC0+IHZvaWQ6CnN0YXJ0U3dhcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTMwCiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NTAKICAgIC8vIGNhblN3YXAgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzMQogICAgLy8gdGhpcy5jYW5Td2FwLnZhbHVlID0gdHJ1ZTsKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnNldFN0b3BBdXRob3JpdHkoc3RvcEF1dGhvcml0eTogYnl0ZXMpIC0+IHZvaWQ6CnNldFN0b3BBdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzNy0xMzgKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gc2V0U3RvcEF1dGhvcml0eShzdG9wQXV0aG9yaXR5OiBBZGRyZXNzKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTM5CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzkKICAgIC8vIHByaXZhdGUgc3RvcEF1dGhvcml0eSA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgYnl0ZWMgMTAgLy8gInN0b3BBdXRob3JpdHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE0MAogICAgLy8gdGhpcy5zdG9wQXV0aG9yaXR5LnZhbHVlID0gc3RvcEF1dGhvcml0eTsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5zZXRSZWJhbGFuY2VyKHJlYmFsYW5jZXI6IGJ5dGVzKSAtPiB2b2lkOgpzZXRSZWJhbGFuY2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDYtMTQ3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHNldFJlYmFsYW5jZXIocmViYWxhbmNlcjogQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE0OAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjQ5CiAgICAvLyBwcml2YXRlIHJlYmFsYW5jZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPih7IGluaXRpYWxWYWx1ZTogbmV3IEFkZHJlc3MoYnplcm8oMCkpIH0pOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGJ5dGVjIDYgLy8gInJlYmFsYW5jZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE0OQogICAgLy8gdGhpcy5yZWJhbGFuY2VyLnZhbHVlID0gcmViYWxhbmNlcjsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5yZWNlaXZlQW5kU3dhcEZyb21WVXNkKHRva2VuSWQ6IHVpbnQ2NCwgcmVjaXBpZW50OiBieXRlcywgdlVzZEFtb3VudDogdWludDY0LCByZWNlaXZlQW1vdW50TWluOiB1aW50NjQpIC0+IHVpbnQ2NDoKcmVjZWl2ZUFuZFN3YXBGcm9tVlVzZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTUyLTE1NwogICAgLy8gcHJvdGVjdGVkIHJlY2VpdmVBbmRTd2FwRnJvbVZVc2QoCiAgICAvLyAgIHRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBBZGRyZXNzLAogICAgLy8gICB2VXNkQW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBwcm90byA0IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTU4CiAgICAvLyBhc3NlcnQodGhpcy5wb29scyh0b2tlbklkKS5leGlzdHMsICdSb3V0ZXI6IG5vIHJlY2VpdmUgcG9vbCcpOwogICAgZnJhbWVfZGlnIC00CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjMxCiAgICAvLyBwb29scyA9IEJveE1hcDx1aW50NjQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdwJyB9KTsKICAgIGJ5dGVjIDggLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTU4CiAgICAvLyBhc3NlcnQodGhpcy5wb29scyh0b2tlbklkKS5leGlzdHMsICdSb3V0ZXI6IG5vIHJlY2VpdmUgcG9vbCcpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBSb3V0ZXI6IG5vIHJlY2VpdmUgcG9vbAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNTkKICAgIC8vIGNvbnN0IHBvb2xJZCA9IHRoaXMucG9vbHModG9rZW5JZCkudmFsdWU7CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjAtMTYzCiAgICAvLyByZXR1cm4gYWJpQ2FsbChQb29sLnByb3RvdHlwZS5zd2FwRnJvbVZVc2QsIHsKICAgIC8vICAgYXBwSWQ6IHBvb2xJZCwKICAgIC8vICAgYXJnczogW3JlY2lwaWVudCwgdlVzZEFtb3VudCwgcmVjZWl2ZUFtb3VudE1pbiwgcmVjaXBpZW50ID09PSB0aGlzLnJlYmFsYW5jZXIudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE2MgogICAgLy8gYXJnczogW3JlY2lwaWVudCwgdlVzZEFtb3VudCwgcmVjZWl2ZUFtb3VudE1pbiwgcmVjaXBpZW50ID09PSB0aGlzLnJlYmFsYW5jZXIudmFsdWVdLAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NDkKICAgIC8vIHByaXZhdGUgcmViYWxhbmNlciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KHsgaW5pdGlhbFZhbHVlOiBuZXcgQWRkcmVzcyhiemVybygwKSkgfSk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInJlYmFsYW5jZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjIKICAgIC8vIGFyZ3M6IFtyZWNpcGllbnQsIHZVc2RBbW91bnQsIHJlY2VpdmVBbW91bnRNaW4sIHJlY2lwaWVudCA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGJ5dGVjIDkgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE2MC0xNjMKICAgIC8vIHJldHVybiBhYmlDYWxsKFBvb2wucHJvdG90eXBlLnN3YXBGcm9tVlVzZCwgewogICAgLy8gICBhcHBJZDogcG9vbElkLAogICAgLy8gICBhcmdzOiBbcmVjaXBpZW50LCB2VXNkQW1vdW50LCByZWNlaXZlQW1vdW50TWluLCByZWNpcGllbnQgPT09IHRoaXMucmViYWxhbmNlci52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIHB1c2hieXRlcyAweDBkMWI0YzA2IC8vIG1ldGhvZCAic3dhcEZyb21WVXNkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIuc2VuZEFuZFN3YXBUb1ZVc2QodG9rZW5JZDogdWludDY0LCB1c2VyOiBieXRlcywgYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKc2VuZEFuZFN3YXBUb1ZVc2Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE2NwogICAgLy8gcHJvdGVjdGVkIHNlbmRBbmRTd2FwVG9WVXNkKHRva2VuSWQ6IHVpbnQ2NCwgdXNlcjogQWRkcmVzcywgYW1vdW50OiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE2OAogICAgLy8gYXNzZXJ0KHRoaXMucG9vbHModG9rZW5JZCkuZXhpc3RzLCAnUm91dGVyOiBubyBwb29sJyk7CiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzEKICAgIC8vIHBvb2xzID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ3AnIH0pOwogICAgYnl0ZWMgOCAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjgKICAgIC8vIGFzc2VydCh0aGlzLnBvb2xzKHRva2VuSWQpLmV4aXN0cywgJ1JvdXRlcjogbm8gcG9vbCcpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBSb3V0ZXI6IG5vIHBvb2wKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTY5CiAgICAvLyBjb25zdCBwb29sSWQgPSB0aGlzLnBvb2xzKHRva2VuSWQpLnZhbHVlOwogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgc3dhcAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTcxLTE3NgogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgeGZlckFzc2V0OiB0b2tlbklkLAogICAgLy8gICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBBcHBsaWNhdGlvbihwb29sSWQpLmFkZHJlc3MsCiAgICAvLyB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE3NAogICAgLy8gYXNzZXRSZWNlaXZlcjogQXBwbGljYXRpb24ocG9vbElkKS5hZGRyZXNzLAogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNzEtMTc1CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRva2VuSWQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHBvb2xJZCkuYWRkcmVzcywKICAgIC8vIH0pCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE3MS0xNzYKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogdG9rZW5JZCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogQXBwbGljYXRpb24ocG9vbElkKS5hZGRyZXNzLAogICAgLy8gfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTc4LTE4MQogICAgLy8gcmV0dXJuIGFiaUNhbGwoUG9vbC5wcm90b3R5cGUuc3dhcFRvVlVzZCwgewogICAgLy8gICBhcHBJZDogcG9vbElkLAogICAgLy8gICBhcmdzOiBbdXNlciwgYW1vdW50LCB1c2VyID09PSB0aGlzLnJlYmFsYW5jZXIudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE4MAogICAgLy8gYXJnczogW3VzZXIsIGFtb3VudCwgdXNlciA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo0OQogICAgLy8gcHJpdmF0ZSByZWJhbGFuY2VyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oeyBpbml0aWFsVmFsdWU6IG5ldyBBZGRyZXNzKGJ6ZXJvKDApKSB9KTsvLyBjYW4gcmVzdHJpY3QgZGVwb3NpdCBvciB3aXRoZHJhdyBvcGVyYXRpb25zCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAicmViYWxhbmNlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE4MAogICAgLy8gYXJnczogW3VzZXIsIGFtb3VudCwgdXNlciA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ5dGVjIDkgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE3OC0xODEKICAgIC8vIHJldHVybiBhYmlDYWxsKFBvb2wucHJvdG90eXBlLnN3YXBUb1ZVc2QsIHsKICAgIC8vICAgYXBwSWQ6IHBvb2xJZCwKICAgIC8vICAgYXJnczogW3VzZXIsIGFtb3VudCwgdXNlciA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgcHVzaGJ5dGVzIDB4ZDk3OGFkMTQgLy8gbWV0aG9kICJzd2FwVG9WVXNkKGFkZHJlc3MsdWludDY0LGJvb2wpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGJ0b2kKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6Okdhc1VzYWdlLmdldEdhc1VzYWdlKGNoYWluSWQ6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldEdhc1VzYWdlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxNy0xOAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBnZXRHYXNVc2FnZShjaGFpbklkOiBCeXRlKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxMAogICAgLy8gZ2FzVXNhZ2UgPSBCb3hNYXA8Qnl0ZSwgdWludDY0Pih7IGtleVByZWZpeDogJ2cnIH0pOwogICAgYnl0ZWMgMTIgLy8gImciCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxOQogICAgLy8gcmV0dXJuIHRoaXMuZ2FzVXNhZ2UoY2hhaW5JZCkudmFsdWU7CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo6R2FzVXNhZ2Uuc2V0R2FzVXNhZ2UoY2hhaW5JZDogYnl0ZXMsIGdhc0Ftb3VudDogdWludDY0KSAtPiB2b2lkOgpzZXRHYXNVc2FnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjItMjMKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gc2V0R2FzVXNhZ2UoY2hhaW5JZDogQnl0ZSwgZ2FzQW1vdW50OiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoyNAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjEwCiAgICAvLyBnYXNVc2FnZSA9IEJveE1hcDxCeXRlLCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZycgfSk7CiAgICBieXRlYyAxMiAvLyAiZyIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI1CiAgICAvLyB0aGlzLmdhc1VzYWdlKGNoYWluSWQpLnZhbHVlID0gZ2FzQW1vdW50OwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjpHYXNVc2FnZS5zZXRHYXNPcmFjbGUoZ2FzT3JhY2xlOiB1aW50NjQpIC0+IHZvaWQ6CnNldEdhc09yYWNsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjgtMjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gc2V0R2FzT3JhY2xlKGdhc09yYWNsZTogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czozMAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjkKICAgIC8vIGdhc09yYWNsZSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgYnl0ZWMgNCAvLyAiZ2FzT3JhY2xlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czozMQogICAgLy8gdGhpcy5nYXNPcmFjbGUudmFsdWUgPSBnYXNPcmFjbGU7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjpHYXNVc2FnZS5nZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGNoYWluSWQ6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldFRyYW5zYWN0aW9uUmVsYXllckNvc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjM0LTM1CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGdldFRyYW5zYWN0aW9uUmVsYXllckNvc3QoY2hhaW5JZDogQnl0ZSk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTAKICAgIC8vIGdhc1VzYWdlID0gQm94TWFwPEJ5dGUsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdnJyB9KTsKICAgIGJ5dGVjIDEyIC8vICJnIgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzYKICAgIC8vIGNvbnN0IGdhc0Ftb3VudCA9IHRoaXMuZ2FzVXNhZ2UoY2hhaW5JZCkudmFsdWU7CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czozNy00MAogICAgLy8gcmV0dXJuIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbkdhc0Nvc3RJbk5hdGl2ZVRva2VuLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2NoYWluSWQsIGdhc0Ftb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6OQogICAgLy8gZ2FzT3JhY2xlID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiZ2FzT3JhY2xlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzkKICAgIC8vIGFyZ3M6IFtjaGFpbklkLCBnYXNBbW91bnRdLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czozNy00MAogICAgLy8gcmV0dXJuIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbkdhc0Nvc3RJbk5hdGl2ZVRva2VuLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2NoYWluSWQsIGdhc0Ftb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIHB1c2hieXRlcyAweGMyYWZjY2QxIC8vIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5OYXRpdmVUb2tlbihieXRlLHVpbnQ2NCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo6T3duYWJsZS5vbmx5T3duZXIoKSAtPiB2b2lkOgpvbmx5T3duZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxMwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsICdPbmx5IG93bmVyJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm93bmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjEzCiAgICAvLyBhc3NlcnQob3AuVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5vd25lci52YWx1ZS5ieXRlcywgJ09ubHkgb3duZXInKTsKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBvd25lcgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6Ok93bmFibGUudHJhbnNmZXJPd25lcnNoaXAobmV3T3duZXI6IGJ5dGVzKSAtPiB2b2lkOgp0cmFuc2Zlck93bmVyc2hpcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE2LTE3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB0cmFuc2Zlck93bmVyc2hpcChuZXdPd25lcjogQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxOAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgYnl0ZWNfMyAvLyAib3duZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxOQogICAgLy8gdGhpcy5vd25lci52YWx1ZSA9IG5ld093bmVyOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCg==",clear:"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="},byteCode:{approval:"CiAFAAEGBNR6JhAEFR98dQdjYW5Td2FwCW1lc3NlbmdlcgVvd25lcglnYXNPcmFjbGUHY2hhaW5JZApyZWJhbGFuY2VyAXQBcAEADXN0b3BBdXRob3JpdHkBAQFnBENBeqME90dbggwVH3x1AAAAAAAAPVQxGEAACSKvJwZMZykjZzEbQQDJgg0E//goQQRl9wVzBOg6h6sELJ9oRwQxkZsoBE66ByEExhftcwRXUxVgBGOAgngEBlB8agT1+W6zBEsGLKAEw83ZKicNggkEB9+EKQSAxccPBPqxEaIE7xX4VQRrHuIjBBhwpJIENVcyTQQEsWHxBNKzV+snDoIEBAylrnoEOXuRiwTL/G0CBOF7r7Q2GgCOHAIFAfUB7AHMAawBmgGIAXYBZgFWAT4BGwD/AOsA3wDTALgApACUAIgAfABtAF4ASgA3ACUAEQACIkMxGRREMRhENhoBiAgOI0MxGRREMRhENhoBiAe7FihMULAjQzEZFEQxGEQ2GgEXwDKIB5gjQzEZFEQxGEQ2GgE2GgIXiAd1I0MxGRREMRhENhoBiAdYFihMULAjQzEZFEQxGEQ2GgGIBn0jQzEZFEQxGEQ2GgGIBmIjQzEZFEQxGESIBk8jQzEZFEQxGESIBjYjQzEZFEQxGEQ2GgEXiAYWI0MxGRREMRhENhoBFzYaAheIBckjQzEZFEQxGEQ2GgEXNhoCFzYaAzYaBBeIBWUjQzEZFEQxGEQnD7AjQzEZFEQxGEQnD7AjQzEZFEQxGEQ2GgGIBTIWKExQsCNDMRkURDEYRDYaATYaAogFCycJIk8CVChMULAjQzEZFEQxGEQ2GgEXNhoCNhoDNhoENhoFNhoGiASvKExQsCNDMRkURDEYRDYaATYaAheIBC4WKExQsCNDMRkURDEYRDYaAReIA+kjQzEZFEQxGEQ2GgEXiAPAI0MxGRREMRhENhoBNhoCiAOcI0MxGRREMRhENhoBNhoCiAN3I0MxGRREMRhENhoBNhoCiANVI0MxGRREMRhENhoBFzYaAjYaAzYaBDYaBTYaBheIAnsjQzEZFEQxGEQ2GgEXNhoCNhoDNhoENhoFNhoGF4gBFyNDMRkURDEYRCNDMRkURDEYRDYaAReIAMkjQzEZFEQxGBRENhoBNhoCNhoDF8AyNhoEF8AyiACPI0OKAQExFkQxFiMJSTgQJRJESTgUMgoSREk4EYv/EkRJOCAyAxJESTgVMgMSRDgSiYoBAYAASTEWi/8MQQAEIowAiTEWi/8JSYwBOBBJjAAjE0EABCKMAImLACMSRIsBOAcyChNBAAQijACJiwE4IDIDE0EABCKMAImLATgJMgMTQQAEIowAiYsBOAiMAImKBAAri/xnJwSL/2cnCov8ZycFi/1nKov+Z4mKAQCIBUKxMgqyFCKyEov/shElshAisgGzgBhCcmlkZ2U6IG9wdC1pbiBjb21wbGV0ZWSwiYoGACIpZUREi/qI/xZJi/8NRIEgr4v7EhREgQKI/zOL/0AA1SKLAQiLAIv/CYv6MQBPAogEEyInBWVEi/wTRIv8i/1QJwdMUL1FAUQiJwVlREsBi/tPAov8i/2L/ogChov8iALEgAFzSwJQSb1FARREgAC/SwFXAQGxIiplRCcNshqyGLIaJLIQIrIBs7Q+SVcEAExXAAQoEkQXIiplRHIIRCIqZUSxTLIHSwGyCCOyECKyAbaABKMkmYmyGk8DshqyGCSyECKyAbNLARZLARZQgARLVUGbTFCwCE8CDkQWi/tQi/xQi/1Qi/5QJwtQgAQin7rsTFCwiYv6FoABZkxQvkwXTESL/wuxIicEZUQiJwVlRIAEHbcM3bIashqyGCSyECKyAbO0PklXBABMVwAEKBJEFwpJFoAE4H9rNkxQsEL+4YoGACIpZUREgAFii/xQvUUBRCOI/fhJIQQPRCInBWVEi/qL+4v8TwOL/Yv+iAFzSTEAUAJMUQACTFECIFBJTgKAAW1LAVBJvUUBFESAAL+xIiplRIAEM+FHqrIashiyGiSyECKyAbO0PklXBABMVwAEKBJEIlNEi/2BGFuL+4v6i/+IAipMSSEECUwhBA1BABCxi/uyB4sCsggjshAisgGziwEWi/tQi/5QJwtQiwBQgARFg2rWTFCwiYoCAIgDD4ABYov+UIv/v4mKAgCIAv+L/ov/UCcHTFCAAL+JigIAiALsi/6L/1AnB0xQvEiJigEAiALasSIrZUSyB4v/sggjshAisgGziYoBAIgCwTIKSYv/cABMSU8CREEAGrEiK2VEshSLAbISi/+yEYsAsgAlshAisgGziYoCAYv+iAIqsSIqZUQnDrIai/6yGrIYJLIQIrIBs7Q+SVcEAExXAAQoEkQXsSInBGVETgIIFoAEe/fVDLIai/6yGrIashgkshAisgGztD5JVwQATFcABCgSRBeL/xaAAWVMUL5MF0xEComKBgGBGK+L+hZQgR+vi/xQTIv7UExQi/5Qi/9QJwtQAov8FyJMVov9FyNMVkkVgSASRImKAgGL/ov/UCcHTFC9RQGJigEBi/+IAachBAiJigQAIillREQxAIv8iPvfi/xLAksCiAD8i/2L/k8Ci/+IAJuL/BaL/RZPAxZPAxZPBIv+UE8EUE8DUE8CUExQgAQVQESzTFCwiYoCAIgBj4v/FicISwFQi/4Wv4v/cQFEgQlMCUkkCIABZksDUIEKTwKUFr+AAWVPAlCBCk8ClBa/iYoBAIgBVov/FicITFC8SIkxACInCmVEEkQpImeJiAE8KSNniYoBAIgBMicKi/9niYoBAIgBJicGi/9niYoEAYv8FicITFBJvUUBRL5MF0xEsYv+Fov/FiInBmVEi/0SJwkiTwJUgAQNG0wGshqL/bIaTwKyGkyyGrIashgkshAisgGztD5JVwQATFcABCgSRBeJigMBi/0WJwhMUEm9RQFEvkwXTESxSXIIRLIUi/+yEov9shElshAisgGzsYv/FiInBmVEi/4SJwkiTwJUgATZeK0UshqL/rIaTLIashqyGCSyECKyAbO0PklXBABMVwAEKBJEF4mKAQEnDIv/UL5MF0xEiYoCAIgAUScMi/5Qi/8Wv4mKAQCIAEEnBIv/Z4mKAQEnDIv/UL5MF0xEsSInBGVETBaABMKvzNGyGov/shqyGrIYJLIQIrIBs7Q+SVcEAExXAAQoEkQXiTEAIitlRBJEiYoBAIj/8SuL/2eJ",clear:"CoEBQw=="},events:[{name:"BridgingFeeFromTokens",args:[{type:"uint64",name:"fee"}]},{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 Gn=class r{appClient;constructor(i){this.appClient=i instanceof Bn?i:new Bn({...i,appSpec:Wn})}decodeReturnValue(i,a){return a!==void 0?ir(a,this.appClient.getABIMethod(i),Wn.structs):void 0}static async fromCreatorAndName(i){return new r(await Bn.fromCreatorAndName({...i,appSpec:Wn}))}static async fromNetwork(i){return new r(await Bn.fromNetwork({...i,appSpec:Wn}))}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 ar}from"@algorandfoundation/algokit-utils";import or,{ABIMethod as rr,AtomicTransactionComposer as sr,makeBasicAccountTransactionSigner as dr}from"algosdk";var Ar=new rr({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:Ar,args:[],sender:o,signer:s,note:`noop_${A}`})}function dt(r){return(r*1e3).microAlgos()}async function wi(r,i,a){let o=new sr,s=dr({addr:i,sk:new Uint8Array(64)});r.forEach(g=>{o.addTransaction({txn:g,signer:s})});let A=(await ar(o,a)).buildGroup().map(g=>g.txn);return _e(...A)}function _e(...r){return r.map(a=>or.encodeUnsignedTransaction(a)).map(a=>Buffer.from(a).toString("hex"))}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 gr}from"@solana/web3.js";import{Address as cr}from"@stellar/stellar-sdk";import{Address as lr}from"algosdk";import{Big as ye}from"big.js";import Ba from"randombytes";import{utils as Ra}from"tronweb";import{Big as Y}from"big.js";import Vi from"bn.js";function Xi(r,i){return Y(100).minus(Y(100).times(i).div(r)).toNumber()}function At(r,i){return Ye(r,i,3).round(0,Y.roundDown)}function be(r,i){return Ye(r,3,i)}function Ye(r,i,a){let o=Y(a).minus(i).toNumber();return Y(r).times(xt(o))}function xt(r){return Y(10).pow(r)}function f(r,i){return Y(r).times(xt(i))}function Z(r,i){let a=Y(r);return a.eq(0)?Y(0):Y(a).div(xt(i))}function te(r){return Z(Y(r.tokenBalance).minus(r.vUsdBalance).toFixed(),3).div(2).toFixed()}function je(r,{feeShare:i,decimals:a},o){let s=Y(r);if(s.lte(0))return"0";let d=s.times(i),A=s.minus(d),g=At(A,a),c=Y(o.tokenBalance).plus(g),l=Je(c,o.aValue,o.dValue);return Y(o.vUsdBalance).minus(l).round(0,Y.roundDown).toFixed()}function Ot(r,{feeShare:i,decimals:a},o){let s=Y(r);if(s.lte(0))return Y(0).toFixed();let d=s.plus(o.vUsdBalance),A=Je(d,o.aValue,o.dValue),g=be(Y(o.tokenBalance).minus(A),a),c=Y(g).times(i);return Y(g).minus(c).round(0,Y.roundDown).toFixed()}function Ca(r,i){let a=Y(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 Ia(r,{feeShare:i,decimals:a},o){if(Y(r).lte(0))return Y(0);let s=Y(o.vUsdBalance).minus(r);if(s.lte(0))throw new Ke;let d=Je(s,o.aValue,o.dValue),A=Y(d).minus(o.tokenBalance),g=be(A,a),c=Y(i).div(Y(1).minus(i)),l=Y(g).times(c).round(0,Y.roundUp);return Y(g).plus(l).round(0,Y.roundDown)}function ba(r,{feeShare:i,decimals:a},o){if(Y(r).lte(0))return Y(0);let s=Y(i).div(Y(1).minus(i)),d=Y(r).times(s).round(0,Y.roundUp),A=Y(r).plus(d),g=At(A,a),c=Y(o.tokenBalance).minus(g);if(c.lte(0))throw new Ke;let l=Je(c,o.aValue,o.dValue);return Y(l).minus(o.vUsdBalance).round(0,Y.roundDown)}function Je(r,i,a){let o=Y(4).times(i).times(Y(a).minus(r)).minus(a),s=Y(a).pow(3),d=o.pow(2),A=Y(r).times(Y(r).times(d).plus(Y(4).times(i).times(s))).sqrt().round(0,Y.roundDown),g=Y(8).times(i).times(r),c=o.times(r).plus(A).div(g).round(0,Y.roundDown);return c.eq(0)?Y(0):c.plus(1)}function ya(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 ha(r){return Y(r).gt(0)?`${Number(Y(r).times(100).toFixed(2)).toLocaleString()}%`:"N/A"}function va(r,i,a){let o=Y(i).times(a),s=Y(i).plus(a),d=Y(8).times(r).times(o).times(s),A=o.times(Y(16).times(r).minus(4)).div(3),g=d.times(d),c=A.times(A).times(A),l=g.plus(c),u=Y(l).sqrt(),m=Y(Math.cbrt(+d.plus(u).toFixed())),p=Y(Math.cbrt(+d.minus(u).toFixed()));return m.plus(p).toFixed()}function De(r,i,a){let o;switch(i){case"EVM":{o=Ya(r);break}case"SOLANA":{o=new gr(r).toBuffer();break}case"TRX":{o=mr(r);break}case"SRB":{o=new cr(r).toBuffer();break}case"SUI":{o=Ya(r);break}case"ALG":{o=ur(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 Wa(r){return Buffer.from(r.replace(/^0x/i,""),"hex")}function Ya(r){let a=Wa(r);return Buffer.concat([Buffer.alloc(32-a.length,0),a],32)}function ur(r){return Buffer.from(lr.fromString(r).publicKey)}function mr(r){let i=Qt(r),a=Wa(i);return pr(a,32)}function Qt(r){let i=Ra.crypto.decodeBase58Address(r);return i?Ra.bytes.byteArray2hexStr(i).replace(/^41/,"0x"):""}function pr(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 Ba(32)}function ke(){let r=Ba(32).readBigInt64BE();return r<0?r*-1n:r}function Be(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=De(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=De(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=V.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 Si(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,V.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 Mi(d,i.destinationToken,o.messenger,a),m,p;switch(o.gasFeePaymentMethod){case"native":m=V.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,V.getChainDecimalsByType(i.destinationToken.chainType)).toFixed(0,ye.roundDown);break}case"int":{o.extraGas=c;let b=Z(o.extraGas,V.getChainDecimalsByType(d.chainType)),W=p.mul(b);o.extraGasDest=f(W,V.getChainDecimalsByType(i.destinationToken.chainType)).toFixed(0,ye.roundDown);break}}Ir(o.extraGas,o.gasFeePaymentMethod,u)}return["SUI","ALG"].includes(r)||(o.fromTokenAddress=De(o.fromTokenAddress,r,r)),o.toAccountAddress=De(i.toAccountAddress,s,r),o.toTokenAddress=De(o.toTokenAddress,s,r),o.gasFeePaymentMethod=="stablecoin"&&Cr(o.amount,d.decimals,o.fee,o.extraGas),o}function Cr(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, ${Z(ye(s).minus(1).neg(),i).toFixed()} stables is missing`)}async function Si(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:Z(s.fee,V.getChainDecimalsByType(r.chainType)).toFixed()},adminFeeShareWithExtras:s.adminFeeShareWithExtras};if(s.sourceNativeTokenPrice){let A=Ye(new ye(s.fee).mul(s.sourceNativeTokenPrice),V.getChainDecimalsByType(r.chainType),r.decimals).toFixed(0,ye.roundUp);d.stablecoin={int:A,float:Z(A,r.decimals).toFixed()}}return d}function Ir(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 Mi(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=Z(A,V.getChainDecimalsByType(i.chainType)).toFixed(),c=ye(g).div(d.exchangeRate).toFixed(V.getChainDecimalsByType(r.chainType),ye.roundDown),l=f(c,V.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:Z(i.txCostAmount.swap,V.getChainDecimalsByType(i.chainType)).toFixed()},transfer:{int:i.txCostAmount.transfer,float:Z(i.txCostAmount.transfer,V.getChainDecimalsByType(i.chainType)).toFixed()}},exchangeRate:d.exchangeRate,sourceNativeTokenPrice:d.sourceNativeTokenPrice}}function Ga(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=Za.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(),R,B;W?(R=b,B=p+R):(y.addPayment({sender:A,receiver:d.appAddress,amount:br.MicroAlgo(b)}),R=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:R},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 wi(h,A,this.algorand.client.algod)}async buildRawTransactionSwap(a){let o=Be(this.chainType,a),s=Za.fromString(a.fromAccountAddress),d=a.toAccountAddress,A=BigInt(a.sourceToken.tokenAddress),g=BigInt(a.destinationToken.tokenAddress),c=BigInt(o.minimumReceiveAmount),l=BigInt(a.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();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 wi(b,s,this.algorand.client.algod)}getBridge(a){return this.algorand.client.getTypedAppClientById(Gn,{appId:a})}};import{Big as Wr}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"}]},fa=yr;var hr={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"}]},Na=hr;var vr={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"}]},Ta=vr;import*as fn from"@project-serum/anchor";import{PublicKey as ja}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 wa(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("lock"),Uint8Array.from(r)],i);return a}async function Dt(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 Va(r,i){let[a]=await ge.findProgramAddress([r.toBuffer()],i);return a}async function Rt(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("token"),r.toBytes()],i);return a}async function Xa(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 Hi(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("gas_usage"),Uint8Array.from([r])],i);return a}async function Sa(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("sent_message"),r],i);return a}async function Pi(r,i,a){let[o]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("user_deposit"),i.toBytes(),r.toBytes()],a);return o}async function Ma(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("cctp_bridge"),r.toBytes()],i);return a}async function La(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("token"),r.toBytes()],i);return a}function Ha(r,i){let[a]=ge.findProgramAddressSync([ae.utils.bytes.utf8.encode("lock"),i.toBuffer()],r);return a}function Pa(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 Rr}from"@project-serum/anchor";import{Connection as Yr,PublicKey as Br}from"@solana/web3.js";function et(r,i){let a=new Yr(r,"confirmed"),o=new Br(i);return new Rr(a,{publicKey:o},{preflightCommitment:"confirmed",commitment:"confirmed"})}async function Nn(r,i,a,o){let s,d=new ja(i),A=new ja(a),g=await we(d,A),c=et(o,i);fn.setProvider(c);let l=await fn.Spl.token(c).account.token.fetchNullable(g);if(l?.authority.equals(d))s=De(g.toBase58(),"SOLANA",r);else{let u=await c.connection.getTokenAccountsByOwner(d,{mint:A});if(u.value.length===0&&!l)s=De(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=De(m.pubkey.toBase58(),"SOLANA",r)}else throw new I("Associated account has wrong owner")}return s}var Ut=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=Be(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,R="0x"+ht().toString("hex"),B,h,G=p;switch(W&&(G=Wr(G).plus(W).toFixed()),m){case 3:case 4:{let w=await this.buildRawTransactionCctpSend(a,o,G);B=w.sendMethod,h=w.value;break}case 5:{let w=this.buildRawTransactionOftSend(a,o,G,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,R,m,G),h="0"):(B=w.methods.swapAndBridge(g,s,l,c,u,R,m,0),h=G)}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 Nn(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(fa.abi,a)}getCctpBridgeContract(a){return new this.web3.eth.Contract(Na.abi,a)}getOftBridgeContract(a){return new this.web3.eth.Contract(Ta.abi,a)}};var Tn=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 X(i.amount),L("amount",i.amount,i.sourceToken.decimals),Ga(i)?wn(i.sourceToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionSend(i):wn(i.sourceToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionSwap(i)}};import{BN as Wt,Program as ki,Spl as Sr,web3 as tt}from"@project-serum/anchor";import{Keypair as $a,PublicKey as Q,SystemProgram as Mr}from"@solana/web3.js";import{Big as Ve}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 Ja={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 Gr}from"@project-serum/anchor";import Fr from"big.js";import{Web3 as Vn}from"web3";async function Yt(r,i){return await Gr.token(i).account.token.fetch(r)}async function ka(r,i,a){let o=await i.account.pool.fetch(a),s=o.decimals,d=Fr(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 za(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 Oa,ComputeBudgetProgram as Xn,Connection as Qa,TransactionMessage as Zr}from"@solana/web3.js";import{Big as fr}from"big.js";import{AddressLookupTableAccount as xa}from"@solana/web3.js";async function ct(r,i){return await Promise.all(r.message.addressTableLookups.map(async a=>new xa({key:a.accountKey,state:xa.deserialize(await i.getAccountInfo(a.accountKey).then(o=>{if(!o)throw new I("Cannot get AccountInfo");return o.data}))})))}var ji="AUTO";async function Bt(r,i,a){let o=new Qa(a,"confirmed"),s=(await o.simulateTransaction(r)).value.unitsConsumed;await Da(r.instructions,s,i,o)}async function Ka(r,i,a){let o=new Qa(a,"confirmed"),s=await ct(r,o),d=Zr.decompile(r.message,{addressLookupTableAccounts:s});if(r.serialize().length>1232)throw new Rn;await Da(d.instructions,769230,i,o),r.message=d.compileToV0Message(s)}async function Da(r,i,a,o){if(i>0){let s=Nr(i,r);if(a?.solana){let d=a.solana;if(d===ji)await Ji(r,o);else if("pricePerUnitInMicroLamports"in d)await Ji(r,o,d.pricePerUnitInMicroLamports);else{let A=fr(d.extraFeeInLamports).div(s).mul(xt(6)).toFixed(0);await Ji(r,o,A)}}}}function Nr(r,i){let a=i.findIndex(d=>d.programId.equals(Xn.programId)&&Oa.decodeInstructionType(d)==="SetComputeUnitLimit"),o=Number((r*1.3).toFixed(0)),s=Xn.setComputeUnitLimit({units:o});return a>=0?i[a]=s:i.push(s),o.toString()}async function Ji(r,i,a){let o=r.findIndex(A=>A.programId.equals(Xn.programId)&&Oa.decodeInstructionType(A)==="SetComputeUnitPrice"),s=BigInt(a||await Tr(i)),d=Xn.setComputeUnitPrice({microLamports:s});return o>=0?r[o]=d:r.push(d),s.toString()}async function Tr(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 wr}from"@solana/spl-token";import{Connection as Vr,TransactionMessage as Ua,VersionedTransaction as Xr}from"@solana/web3.js";import Ea,{AxiosError as _a}from"axios";var Sn=class{connection;jupiterUrl;apiKeyHeader;maxAccounts;constructor(i,a){this.connection=new Vr(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=${wr.toString()}&amount=${o}&swapMode=${m}&slippageBps=100&onlyDirectRoutes=true`;this.maxAccounts&&(p+=`&maxAccounts=${this.maxAccounts}`),d=await Ea.get(p,{headers:this.apiKeyHeader?{"x-api-key":this.apiKeyHeader}:void 0})}catch(m){throw m instanceof _a&&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 Ea.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 _a&&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=Xr.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=Ua.decompile(i.message,{addressLookupTableAccounts:o}),A=Ua.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 zi=1e6,qa=1.1,Mn=class extends Ae{constructor(a,o,s){super();this.solanaRpcUrl=a;this.params=o;this.api=s;this.jupiterService=new Sn(a,o.jupiterParams)}chainType="SOLANA";jupiterService;async buildRawTransactionSwap(a){let o=Be(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,R=u,B=s,h=m,G=new Q(b),w=et(this.solanaRpcUrl,G.toString()),O=new ki(_t,W,w),P=await vt(O.programId),pe=await qe(O.programId),_=new Q(y),Me=await Rt(_,O.programId),Le=new Q(o),Oe=await we(G,_),Fe=new Q(h),ue=new Q(R),ve=await Rt(ue,O.programId),Ze=new Q(B),Ce=await we(Fe,ue),He=[tt.ComputeBudgetProgram.setComputeUnitLimit({units:zi})];try{await Yt(Ce,w)}catch{let Qo=await Sr.associatedToken(w).methods.create().accounts({mint:ue,owner:Fe,associatedAccount:Ce}).instruction();He.push(Qo)}let Pe=await O.methods.swap(new Wt(g),new Wt(p||0)).accounts({payer:G,config:pe,bridgeAuthority:P,user:G,sendBridgeToken:Me,sendMint:_,sendPool:Le,sendUserToken:Oe,receiveBridgeToken:ve,receiveMint:ue,receivePool:Ze,receiveUserToken:Ce}).preInstructions(He).transaction(),fe=w.connection;return Pe.recentBlockhash=(await fe.getLatestBlockhash()).blockhash,Pe.feePayer=G,await Bt(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 Ka(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?Ve(d):Ve(a.fee);A&&(c=c.plus(A)),s||(c=c.mul(qa));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=Ve(a.amount).minus(Ve(u).mul(qa)).toFixed(0)}else m=Ve(a.amount).minus(c).toFixed(0);if(Ve(m).lte(0))throw new It(`Amount not enough to pay fee, ${Z(Ve(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=Ve(o.fee).div(s).mul(Ve(10).pow(V.getChainDecimalsByType("SOLANA")-a.decimals)).toFixed(0),A;return o.extraGas&&(A=Ve(o.extraGas).div(s).mul(Ve(10).pow(V.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,R=u,B=l,h=s,G=d,w=et(this.solanaRpcUrl,W),O=new ki(_t,h,w),P=Array.from(ht()),pe=new Q(m),_=await ka(o,O,pe),Me=await wa(P,O.programId),Le=await vt(O.programId),Oe=await we(new Q(W),new Q(b)),Fe=await Rt(new Q(b),O.programId),ue=await Li(y,O.programId),ve=await Xa(y,Buffer.from(R),O.programId),Ze=await qe(O.programId),Ce=await O.account.config.fetch(Ze),He=await Dt(y,Ce.gasOracleProgramId),Pe=await Dt(G,Ce.gasOracleProgramId),fe=za({amount:_,recipient:Buffer.from(B),nonce:Buffer.from(P),receiveToken:Buffer.from(R),destinationChainId:y,sourceChainId:G,chainBridge:(await vt(O.programId)).toBuffer()}),J={};return J.bridge=O,J.amount=new Wt(o),J.vusdAmount=new Wt(_),J.nonce=P,J.recipient=Array.from(B),J.receiveToken=Array.from(R),J.poolAccount=pe,J.lockAccount=Me,J.bridgeAuthority=Le,J.userToken=Oe,J.bridgeTokenAccount=Fe,J.chainBridgeAccount=ue,J.otherBridgeTokenAccount=ve,J.userAccount=new Q(W),J.destinationChainId=y,J.mint=new Q(b),J.config=Ze,J.configAccountInfo=Ce,J.gasPrice=He,J.thisGasPrice=Pe,J.message=fe,p&&(J.extraGasInstruction=this.getExtraGasInstruction(p,J.userAccount,Ze)),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:R,mint:B,config:h,configAccountInfo:G,gasPrice:w,thisGasPrice:O,message:P,extraGasInstruction:pe}=a,_=G.allbridgeMessengerProgramId,Me=await Hi(R,_),Le=await qe(_),Oe=await Sa(P,_),Fe=[];pe&&Fe.push(pe);let ue=await o.methods.swapAndBridge({vusdAmount:s,nonce:d,destinationChainId:R,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:Le,sentMessageAccount:Oe,otherBridgeToken:W}).preInstructions([tt.ComputeBudgetProgram.setComputeUnitLimit({units:zi})]).postInstructions(Fe).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:R,mint:B,config:h,configAccountInfo:G,gasPrice:w,thisGasPrice:O,message:P,extraGasInstruction:pe}=a,_=this.params.wormholeMessengerProgramId,[Me]=Q.findProgramAddressSync([Buffer.from("Bridge")],new Q(_)),[Le]=Q.findProgramAddressSync([Buffer.from("fee_collector")],new Q(_)),[Oe]=Q.findProgramAddressSync([Buffer.from("Sequence"),u.toBuffer()],new Q(_)),Fe=await Hi(R,G.wormholeMessengerProgramId),ue=await qe(G.wormholeMessengerProgramId),ve=$a.generate(),Ze=et(this.solanaRpcUrl,y.toString()),Ce=await Ze.connection.getAccountInfo(Me);if(Ce==null)throw new I("Cannot fetch wormhole bridge account info");let He=new Wt(Ce.data.slice(16,24),"le").toString(),Pe=Mr.transfer({fromPubkey:y,toPubkey:Le,lamports:+He}),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:Fe,wormholeProgram:_,bridge:Me,message:ve.publicKey,wormholeMessenger:G.wormholeMessengerProgramId,sequence:Oe,feeCollector:Le,wormholeMessengerConfig:ue,clock:tt.SYSVAR_CLOCK_PUBKEY},pn=await o.methods.swapAndBridgeWormhole({vusdAmount:s,nonce:d,destinationChainId:R,recipient:A,receiveToken:g}).accounts(J).preInstructions([tt.ComputeBudgetProgram.setComputeUnitLimit({units:zi}),Pe]).postInstructions(fe).signers([ve]).transaction();return pn.recentBlockhash=(await Ze.connection.getLatestBlockhash()).blockhash,pn.feePayer=y,{transaction:await this.convertToVersionedTransaction(pn,Ze.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,R=et(this.solanaRpcUrl,b),B=new ki(Ja,m,R),h=new Q(A),G=await Ma(h,B.programId),w=new Q(b),O=await B.account.cctpBridge.fetch(G),P={};return P.cctpBridge=B,P.cctpBridgeAccount=G,P.cctpAddressAccount=new Q(m),P.amount=new Wt(s),P.recipient=Array.from(y),P.receiveToken=Array.from(W),P.userToken=await we(w,h),P.bridgeAuthority=await Va(G,B.programId),P.bridgeTokenAccount=await La(h,B.programId),P.chainBridgeAccount=await Li(g,B.programId),P.userAccount=w,P.destinationChainId=g,P.mint=h,P.gasPrice=await Dt(g,O.gasOracleProgramId),P.thisGasPrice=await Dt(p,O.gasOracleProgramId),P.provider=R,u&&(P.extraGasInstruction=this.getExtraGasInstruction(u,P.userAccount,G)),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:R,thisGasPrice:B,extraGasInstruction:h,provider:G}=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:Le,tokenMessengerEventAuthority:Oe,tokenMinter:Fe,localToken:ue,remoteTokenMessengerKey:ve,authorityPda:Ze}=Pa(w,y,pe,_),Ce=[];h&&Ce.push(h);let He=$a.generate(),Pe=Ha(s.programId,He.publicKey),fe=await s.methods.bridge({amount:A,destinationChainId:W,recipient:g,receiveToken:c}).accounts({mint:y,user:b,cctpBridge:d,messageSentEventData:He.publicKey,lock:Pe,cctpMessenger:_,messageTransmitterProgram:pe,messageTransmitterAccount:Me,tokenMessenger:Le,tokenMinter:Fe,localToken:ue,remoteTokenMessengerKey:ve,authorityPda:Ze,eventAuthority:Oe,bridgeToken:m,gasPrice:R,thisGasPrice:B,chainBridge:p,userToken:u,bridgeAuthority:l}).preInstructions([tt.ComputeBudgetProgram.setComputeUnitLimit({units:2e6})]).postInstructions(Ce).transaction(),J=G.connection;return fe.recentBlockhash=(await J.getLatestBlockhash()).blockhash,fe.feePayer=b,{transaction:await this.convertToVersionedTransaction(fe,J),messageSentEventDataKeypair:He}}send(a){throw new k}};import{Address as xi,contract as RB}from"@stellar/stellar-sdk";import{Big as Pr}from"big.js";import{contract as n}from"@stellar/stellar-sdk";var Lr=n.Spec,Hr=n.Client;var $t=class extends Hr{constructor(a){super(new Lr(["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=Pr(b).plus(p).toFixed());let W=this.getContract($t,s,d),y;return m==="stablecoin"?y=await W.swap_and_bridge({sender:d,token:xi.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:xi.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=Be(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:xi.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 $r}from"@mysten/sui/client";import{coinWithBalance as U,Transaction as na}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as po}from"@mysten/sui/utils";import{Big as ia}from"big.js";var aa=Ne(nt());var Ue=Ne(nt());ne();function no(r,i,a){return r.moveCall({target:`${Ue.PUBLISHED_AT}::bridge_interface::swap`,typeArguments:i,arguments:[N(r,a.bridge),N(r,a.coin),We(r,a.receiveAmountMin,"u64")]})}function io(r,i,a){return r.moveCall({target:`${Ue.PUBLISHED_AT}::bridge_interface::deposit`,typeArguments:[i],arguments:[N(r,a.bridge),N(r,a.userDeposit),N(r,a.coin)]})}function ao(r,i,a){return r.moveCall({target:`${Ue.PUBLISHED_AT}::bridge_interface::withdraw`,typeArguments:[i],arguments:[N(r,a.bridge),N(r,a.userDeposit),We(r,a.amountLp,"u64")]})}function oo(r,i,a){return r.moveCall({target:`${Ue.PUBLISHED_AT}::bridge_interface::claim_reward`,typeArguments:[i],arguments:[N(r,a.bridge),N(r,a.userDeposit)]})}function ro(r,i,a){return r.moveCall({target:`${Ue.PUBLISHED_AT}::bridge_interface::pool`,typeArguments:[i],arguments:[N(r,a)]})}function Qi(r,i,a){return r.moveCall({target:`${Ue.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),We(r,a.destinationChainId,"u8"),N(r,a.receiveToken),We(r,a.nonce,"u256"),N(r,a.feeSuiCoin),N(r,a.feeTokenCoin)]})}function so(r,i){return r.moveCall({target:`${Ue.PUBLISHED_AT}::bridge_interface::new_user_deposit`,typeArguments:[i],arguments:[]})}function Ki(r,i,a){return r.moveCall({target:`${Ue.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),We(r,a.destinationChainId,"u8"),N(r,a.receiveToken),We(r,a.nonce,"u256"),N(r,a.feeSuiCoin),N(r,a.feeTokenCoin)]})}var Co=Ne(Ui());var go=Ne(Ui());ne();function Ei(r,i,a){return r.moveCall({target:`${go.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),We(r,a.destinationChainId,"u8"),N(r,a.recipient),N(r,a.recipientWalletAddress)]})}var Io=Ne($i());var mo=Ne($i());ne();import{bcs as it}from"@mysten/sui/bcs";import{fromHEX as Qr,toHEX as Kr}from"@mysten/sui/utils";import{bcs as Or}from"@mysten/sui/bcs";ne();var qi=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 Or.vector}static fromFields(i,a){return r.reified(i).new(a.map(o=>H(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 Gt(r){return qi.r(r)}function D(r){return typeof r=="string"?{phantomType:r,kind:"PhantomReified"}:{phantomType:r.fullTypeName,kind:"PhantomReified"}}var Dr=it.bytes(32).transform({input:r=>Qr(r),output:r=>Kr(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 Dr;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 H(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 Xe(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(F(i[o])!==F(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);Xe(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 Hn="0x1";import{bcs as $l}from"@mysten/sui/bcs";import{fromB64 as eu}from"@mysten/sui/utils";ne();import{bcs as ea}from"@mysten/sui/bcs";import{fromB64 as Ur}from"@mysten/sui/utils";function Pn(r){return r=F(r),r===`${Hn}::string::String`}var jn=class r{__StructClass=!0;static get $typeName(){return`${Hn}::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 D(r.reified())}static get p(){return r.phantom()}static get bcs(){return ea.struct("String",{bytes:ea.vector(ea.u8())})}static fromFields(i){return r.reified().new({bytes:H(Gt("u8"),i.bytes)})}static fromFieldsWithTypes(i){if(!Pn(i.type))throw new Error("not a String type");return r.reified().new({bytes:S(Gt("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(Gt("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(!Pn(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"||!Pn(i.bcs.type))throw new Error("object at is not a String object");return r.fromBcs(Ur(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"||!Pn(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 ta}from"@mysten/sui/bcs";import{fromB64 as uo,fromHEX as Er,toHEX as _r}from"@mysten/sui/utils";function Jn(r){return r=F(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 D(r.reified())}static get p(){return r.phantom()}static get bcs(){return ta.struct("ID",{bytes:ta.bytes(32).transform({input:i=>Er(i),output:i=>_r(i)})})}static fromFields(i){return r.reified().new({bytes:H("address",i.bytes)})}static fromFieldsWithTypes(i){if(!Jn(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(!Jn(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"||!Jn(i.bcs.type))throw new Error("object at is not a ID object");return r.fromBcs(uo(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"||!Jn(o.data.bcs.type))throw new Error(`object at id ${a} is not a ID object`);return r.fromSuiObjectData(o.data)}};function kn(r){return r=F(r),r===`${at}::object::UID`}var Ge=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 D(r.reified())}static get p(){return r.phantom()}static get bcs(){return ta.struct("UID",{id:ut.bcs})}static fromFields(i){return r.reified().new({id:H(ut.reified(),i.id)})}static fromFieldsWithTypes(i){if(!kn(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(!kn(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"||!kn(i.bcs.type))throw new Error("object at is not a UID object");return r.fromBcs(uo(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"||!kn(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:`${mo.PUBLISHED_AT}::bytes32::from_hex`,arguments:[We(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 Ft=class extends Ae{constructor(a,o){super();this.nodeRpcUrlsConfig=a;this.api=o;this.client=new $r({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,aa.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin);let s=Be(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 na;l.setSender(d);let u={bridge:o.bridgeObjectAddress,coin:U({balance:BigInt(s),type:A}),receiveAmountMin:BigInt(c)},m=no(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=na.from(a);return this.buildRawTransactionSendFromTx(s,d,o)}async buildRawTransactionSend(a){return this.buildRawTransactionSendFromTx(a,new na)}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,aa.setAddress)(g.bridgeAddress,g.bridgeAddressOrigin),(0,Io.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=ia(y).plus(W).toFixed()),s.setSender(g),b==="stablecoin"){let R=BigInt(A)-BigInt(y),B,h;if(d){let[w]=s.splitCoins(d,[y]);B=d,h=w}else B=U({balance:R,type:c}),h=U({balance:BigInt(y),type:c});let G={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:U({balance:BigInt(0),useGasCoin:!1})};Ki(s,c,G)}else{let R=y==="0"?U({balance:BigInt(y),useGasCoin:!1}):U({balance:BigInt(y)}),B={bridge:o.bridgeObjectAddress,messenger:o.allbridgeMessengerObjectAddress,amount:d??U({balance:BigInt(A),type:c}),destinationChainId:l,nonce:ke(),recipient:Se(s,Te(u)),receiveToken:Se(s,Te(m)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:U({balance:BigInt(0),type:c}),feeSuiCoin:R};Ki(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=ia(y).plus(W).toFixed()),s.setSender(g),b==="stablecoin"){let R=BigInt(A)-BigInt(y),B,h;if(d){let[w]=s.splitCoins(d,[y]);B=d,h=w}else B=U({balance:R,type:c}),h=U({balance:BigInt(y),type:c});let G={bridge:o.bridgeObjectAddress,messenger:o.wormholeMessengerObjectAddress,wormholeState:o.wormholeStateObjectAddress,theClock:po,amount:B,destinationChainId:l,nonce:ke(),recipient:Se(s,Te(u)),receiveToken:Se(s,Te(m)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:h,feeSuiCoin:U({balance:BigInt(0),useGasCoin:!1})};Qi(s,c,G)}else{let R=y==="0"?U({balance:BigInt(y),useGasCoin:!1}):U({balance:BigInt(y)}),B={bridge:o.bridgeObjectAddress,messenger:o.wormholeMessengerObjectAddress,wormholeState:o.wormholeStateObjectAddress,theClock:po,amount:d??U({balance:BigInt(A),type:c}),destinationChainId:l,nonce:ke(),recipient:Se(s,Te(u)),receiveToken:Se(s,Te(m)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:U({balance:BigInt(0),type:c}),feeSuiCoin:R};Qi(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,Co.setAddress)(s.cctpAddress,s.cctpAddressOrigin);let y=p;W&&(y=ia(y).plus(W).toFixed()),d.setSender(c);let R=Se(d,Te(m)),B;if(a.destinationToken.chainType==="SOLANA"){let h=await Nn(this.chainType,a.toAccountAddress,a.destinationToken.tokenAddress,this.nodeRpcUrlsConfig.getNodeRpcUrl("SOL"));B=Se(d,Te(h))}else B=R;if(b==="stablecoin"){let h=BigInt(g)-BigInt(y),G,w;if(A){let[P]=d.splitCoins(A,[y]);G=A,w=P}else G=U({balance:h,type:l}),w=U({balance:BigInt(y),type:l});let O={cctpBridge:s.cctpObjectAddress,tokenMessengerMinterState:s.cctpTokenMessengerMinterStateObjectAddress,messageTransmitterState:s.cctpMessageTransmitterStateObjectAddress,treasury:s.cctpTreasuryObjectAddress,denyList:s.cctpDenyListObjectAddress,amount:G,destinationChainId:u,recipient:B,recipientWalletAddress:R,gasOracle:s.gasOracleObjectAddress,feeTokenCoin:w,feeSuiCoin:U({balance:BigInt(0),useGasCoin:!1})};Ei(d,l,O)}else{let h=y==="0"?U({balance:BigInt(y),useGasCoin:!1}):U({balance:BigInt(y)}),G={cctpBridge:s.cctpObjectAddress,tokenMessengerMinterState:s.cctpTokenMessengerMinterStateObjectAddress,messageTransmitterState:s.cctpMessageTransmitterStateObjectAddress,treasury:s.cctpTreasuryObjectAddress,denyList:s.cctpDenyListObjectAddress,amount:A??U({balance:BigInt(g),type:l}),destinationChainId:u,recipient:B,recipientWalletAddress:R,gasOracle:s.gasOracleObjectAddress,feeTokenCoin:U({balance:BigInt(0),type:l}),feeSuiCoin:h};Ei(d,l,G)}return await d.toJSON({client:this.client})}};import{Big as ts}from"big.js";import qr from"bn.js";function zn(r){return"0x"+new qr(r).toString("hex")}function bo(r){return new Promise(i=>setTimeout(()=>i(),r))}async function xn(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 es(r,s),{txId:s}}async function es(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 bo(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 xn(this.tronWeb,s)}async buildRawTransactionSwap(a){let o=Be(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,R=p;W&&(R=ts(R).plus(W).toFixed());let B=ke().toString(),h,G,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:R}],G="0"):(h=[{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"uint256",value:0}],G=R),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:R},{type:"uint256",value:y??"0"},{type:"uint256",value:"10"}],G="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"}],G=R),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:R}],G="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}],G=R),w="swapAndBridge(bytes32,uint256,bytes32,uint256,bytes32,uint256,uint8,uint256)";break}return this.buildRawTransaction(d,w,h,G,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 On=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s;this.rawTxBuilder=new Tn(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 X(a.amount),L("amount",a.amount,a.sourceToken.decimals),wn(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 wn(r,i,a,o,s){switch(V.getChainProperty(r).chainType){case"EVM":{if(s)return new Ut(s,i,a);{let d=a.getNodeRpcUrl(r);return new Ut(new is(d),i,a)}}case"TRX":{if(s)return new en(s,i);{let d=a.getNodeRpcUrl(r);return new en(new ns({fullHost:d,solidityNode:d,eventServer:d}),i)}}case"SOLANA":return new Mn(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 Ft(a,i);case"ALG":if(s){let d=s,A=yo.fromClients({algod:d});return new Kt(A,i)}else{let d=a.getNodeRpcUrl(r),A=yo.fromConfig({algodConfig:{server:d}});return new Kt(A,i)}}}import{AlgorandClient as Zo}from"@algorandfoundation/algokit-utils";import{Big as Bs}from"big.js";import Ws from"timed-cache";import{TronWeb as Gs}from"tronweb";import{FMT_BYTES as Fs,FMT_NUMBER as Zs,Web3 as fs}from"web3";import{Big as Ee}from"big.js";function ho(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(va(i,l.toFixed(),u.toFixed())).minus(g).toFixed()}function vo(r){let i=f(r,3);return Ee(i).round().toFixed()}import{bytesToBigInt as rs}from"algosdk";import{getArc56ReturnValue as as}from"@algorandfoundation/algokit-utils/types/app-arc56";import{AppClient as Qn}from"@algorandfoundation/algokit-utils/types/app-client";import{AppFactory as $m}from"@algorandfoundation/algokit-utils/types/app-factory";import{encodeAddress as os}from"algosdk";var Kn={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
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:"user"},{type:"uint64",name:"asset"},{type:"uint64",name:"amount"},{type:"uint64",name:"result"},{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
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
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:"user"},{type:"uint64",name:"asset"},{type:"uint64",name:"amount"},{type:"uint64",name:"result"},{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
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+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gcmVzdWx0ID0gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSAtIHZVc2ROZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgLQogICAgZnJhbWVfYnVyeSAxCgpzd2FwVG9WVXNkX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzOAogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSA9IHZVc2ROZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzOQogICAgLy8gdGhpcy5hZGRSZXdhcmRzKGZlZSk7CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjYWxsc3ViIGFkZFJld2FyZHMKICAgIGZyYW1lX2J1cnkgMwogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgNAoKc3dhcFRvVlVzZF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNDIKICAgIC8vIGVtaXQ8U3dhcHBlZFRvVlVzZD4oeyB1c2VyLCBhc3NldDogdGhpcy5hc3NldC52YWx1ZS5pZCwgYW1vdW50LCByZXN1bHQsIGZlZSB9KTsKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgZGlnIDIKICAgIGl0b2IKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgZnJhbWVfZGlnIC0zCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDJiYmJlY2EzIC8vIG1ldGhvZCAiU3dhcHBlZFRvVlVzZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjQ0CiAgICAvLyB0aGlzLnZhbGlkYXRlQmFsYW5jZVJhdGlvKCk7CiAgICBjYWxsc3ViIHZhbGlkYXRlQmFsYW5jZVJhdGlvCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNDUKICAgIC8vIHJldHVybiByZXN1bHQ7CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnN3YXBGcm9tVlVzZCh1c2VyOiBieXRlcywgYW1vdW50OiB1aW50NjQsIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwgemVyb0ZlZTogdWludDY0KSAtPiB1aW50NjQ6CnN3YXBGcm9tVlVzZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI1OS0yNjQKICAgIC8vIHN3YXBGcm9tVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICAgemVyb0ZlZTogYm9vbGVhbiwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBwcm90byA0IDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNjUKICAgIC8vIHRoaXMub25seVJvdXRlcigpOwogICAgY2FsbHN1YiBvbmx5Um91dGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNjcKICAgIC8vIGxldCByZXN1bHRTUDogdWludDY0ID0gMDsgLy8gMCBieSBkZWZhdWx0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjY4LTI2OQogICAgLy8gbGV0IHJlc3VsdDogdWludDY0ID0gMDsgLy8gMCBieSBkZWZhdWx0CiAgICAvLyBsZXQgZmVlOiB1aW50NjQgPSAwOwogICAgZHVwbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNzAKICAgIC8vIGlmIChhbW91bnQgPiAwKSB7CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IHN3YXBGcm9tVlVzZF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjcxCiAgICAvLyB0aGlzLnZVc2RCYWxhbmNlLnZhbHVlICs9IGFtb3VudDsKICAgIGZyYW1lX2RpZyAtMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDIKICAgIC8vIHZVc2RCYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjcxCiAgICAvLyB0aGlzLnZVc2RCYWxhbmNlLnZhbHVlICs9IGFtb3VudDsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI3MgogICAgLy8gY29uc3QgbmV3QW1vdW50ID0gdGhpcy5nZXRZKHRoaXMudlVzZEJhbGFuY2UudmFsdWUpOwogICAgY2FsbHN1YiBnZXRZCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNzQKICAgIC8vIGlmICh0b2tlbkJhbGFuY2UgPiBuZXdBbW91bnQpIHsKICAgIDwKICAgIGJ6IHN3YXBGcm9tVlVzZF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI3NQogICAgLy8gcmVzdWx0U1AgPSB0b2tlbkJhbGFuY2UgLSBuZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIC0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNzYKICAgIC8vIHJlc3VsdCA9IHRoaXMuZnJvbVN5c3RlbVByZWNpc2lvbihyZXN1bHRTUCk7CiAgICBjYWxsc3ViIGZyb21TeXN0ZW1QcmVjaXNpb24KICAgIGZyYW1lX2J1cnkgMwoKc3dhcEZyb21WVXNkX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjgwCiAgICAvLyBhc3NlcnQocmVzdWx0U1AgPD0gdGhpcy5yZXNlcnZlcy52YWx1ZSwgJ1Bvb2w6IHJlc2VydmVzJyk7CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIDw9CiAgICBhc3NlcnQgLy8gUG9vbDogcmVzZXJ2ZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjgyCiAgICAvLyB0aGlzLnJlc2VydmVzLnZhbHVlIC09IHJlc3VsdFNQOwogICAgc3dhcAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIHJlc2VydmVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjgyCiAgICAvLyB0aGlzLnJlc2VydmVzLnZhbHVlIC09IHJlc3VsdFNQOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4MwogICAgLy8gaWYgKCF6ZXJvRmVlKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBzd2FwRnJvbVZVc2RfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOQogICAgLy8gZmVlU2hhcmVCUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAiZmVlU2hhcmVCUCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyODQKICAgIC8vIGZlZSA9IChyZXN1bHQgKiB0aGlzLmZlZVNoYXJlQlAudmFsdWUpIC8gQlA7CiAgICBmcmFtZV9kaWcgMwogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjg0CiAgICAvLyBmZWUgPSAocmVzdWx0ICogdGhpcy5mZWVTaGFyZUJQLnZhbHVlKSAvIEJQOwogICAgLwogICAgZnJhbWVfYnVyeSA0Cgpzd2FwRnJvbVZVc2RfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjg3CiAgICAvLyByZXN1bHQgLT0gZmVlOwogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjg5CiAgICAvLyB0aGlzLnRva2VuQmFsYW5jZS52YWx1ZSA9IG5ld0Ftb3VudDsKICAgIGZyYW1lX2RpZyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjkwCiAgICAvLyBhc3NlcnQocmVzdWx0ID49IHJlY2VpdmVBbW91bnRNaW4sICdQb29sOiBzbGlwcGFnZScpOwogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgID49CiAgICBhc3NlcnQgLy8gUG9vbDogc2xpcHBhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI5MS0yOTUKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IHJlc3VsdCwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogdXNlci5uYXRpdmUsCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyOTEtMjk1CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgIGFzc2V0QW1vdW50OiByZXN1bHQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHVzZXIubmF0aXZlLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjk2CiAgICAvLyB0aGlzLmFkZFJld2FyZHMoZmVlKTsKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFkZFJld2FyZHMKICAgIGZyYW1lX2J1cnkgNgogICAgZnJhbWVfYnVyeSA1Cgpzd2FwRnJvbVZVc2RfYWZ0ZXJfaWZfZWxzZUA3OgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjk4CiAgICAvLyBlbWl0PFN3YXBwZWRGcm9tVlVzZD4oeyB1c2VyLCBhc3NldDogdGhpcy5hc3NldC52YWx1ZS5pZCwgYW1vdW50LCByZXN1bHQsIGZlZSB9KTsKICAgIGZyYW1lX2RpZyAtMwogICAgaXRvYgogICAgZGlnIDIKICAgIGl0b2IKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgZnJhbWVfZGlnIC00CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGQzZjFkNTQyIC8vIG1ldGhvZCAiU3dhcHBlZEZyb21WVXNkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDAKICAgIC8vIHRoaXMudmFsaWRhdGVCYWxhbmNlUmF0aW8oKTsKICAgIGNhbGxzdWIgdmFsaWRhdGVCYWxhbmNlUmF0aW8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMwMQogICAgLy8gcmV0dXJuIHJlc3VsdDsKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuc2V0RmVlU2hhcmUoZmVlU2hhcmVCUDogdWludDY0KSAtPiB2b2lkOgpzZXRGZWVTaGFyZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMwNwogICAgLy8gc2V0RmVlU2hhcmUoZmVlU2hhcmVCUDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMwOAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDkKICAgIC8vIGFzc2VydChmZWVTaGFyZUJQIDw9IEJQLCAnUG9vbDogdG9vIGxhcmdlJyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxOQogICAgLy8gZXhwb3J0IGNvbnN0IEJQOiB1aW50NjQgPSAxMF8wMDA7CiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMwOQogICAgLy8gYXNzZXJ0KGZlZVNoYXJlQlAgPD0gQlAsICdQb29sOiB0b28gbGFyZ2UnKTsKICAgIDw9CiAgICBhc3NlcnQgLy8gUG9vbDogdG9vIGxhcmdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOQogICAgLy8gZmVlU2hhcmVCUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDE1IC8vICJmZWVTaGFyZUJQIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzEwCiAgICAvLyB0aGlzLmZlZVNoYXJlQlAudmFsdWUgPSBmZWVTaGFyZUJQOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuYWRqdXN0VG90YWxMcEFtb3VudCgpIC0+IHZvaWQ6CmFkanVzdFRvdGFsTHBBbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMTMKICAgIC8vIGFkanVzdFRvdGFsTHBBbW91bnQoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMxNAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NgogICAgLy8gZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAidG90YWxTdXBwbHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMTgKICAgIC8vIGlmIChkID4gdG90YWxTdXBwbHkpIHsKICAgID4KICAgIGJ6IGFkanVzdFRvdGFsTHBBbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMTkKICAgIC8vIHRoaXMuZGVwb3NpdExwKFR4bi5zZW5kZXIsIGQgLSB0b3RhbFN1cHBseSk7CiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIGNhbGxzdWIgZGVwb3NpdExwCgphZGp1c3RUb3RhbExwQW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnNldEJhbGFuY2VSYXRpb01pbkJQKGJhbGFuY2VSYXRpb01pbkJQOiB1aW50NjQpIC0+IHZvaWQ6CnNldEJhbGFuY2VSYXRpb01pbkJQOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzI2CiAgICAvLyBzZXRCYWxhbmNlUmF0aW9NaW5CUChiYWxhbmNlUmF0aW9NaW5CUDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMyNwogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMjgKICAgIC8vIGFzc2VydChiYWxhbmNlUmF0aW9NaW5CUCA8PSBCUCwgJ1Bvb2w6IHRvbyBsYXJnZScpOwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTkKICAgIC8vIGV4cG9ydCBjb25zdCBCUDogdWludDY0ID0gMTBfMDAwOwogICAgaW50YyA0IC8vIDEwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMjgKICAgIC8vIGFzc2VydChiYWxhbmNlUmF0aW9NaW5CUCA8PSBCUCwgJ1Bvb2w6IHRvbyBsYXJnZScpOwogICAgPD0KICAgIGFzc2VydCAvLyBQb29sOiB0b28gbGFyZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzCiAgICAvLyBiYWxhbmNlUmF0aW9NaW5CUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDE2IC8vICJiYWxhbmNlUmF0aW9NaW5CUCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMyOQogICAgLy8gdGhpcy5iYWxhbmNlUmF0aW9NaW5CUC52YWx1ZSA9IGJhbGFuY2VSYXRpb01pbkJQOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuc3RvcERlcG9zaXQoKSAtPiB2b2lkOgpzdG9wRGVwb3NpdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzMwogICAgLy8gdGhpcy5vbmx5U3RvcEF1dGhvcml0eSgpOwogICAgY2FsbHN1YiBvbmx5U3RvcEF1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIGNhbkRlcG9zaXQgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyBkZXBvc2l0IG9wZXJhdGlvbiBhbGxvd2VkCiAgICBieXRlYyAxMiAvLyAiY2FuRGVwb3NpdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzNAogICAgLy8gdGhpcy5jYW5EZXBvc2l0LnZhbHVlID0gZmFsc2U7CiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnN0YXJ0RGVwb3NpdCgpIC0+IHZvaWQ6CnN0YXJ0RGVwb3NpdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzOAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MgogICAgLy8gY2FuRGVwb3NpdCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOy8vIGlzIGRlcG9zaXQgb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEyIC8vICJjYW5EZXBvc2l0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzM5CiAgICAvLyB0aGlzLmNhbkRlcG9zaXQudmFsdWUgPSB0cnVlOwogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zdG9wV2l0aGRyYXcoKSAtPiB2b2lkOgpzdG9wV2l0aGRyYXc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIHRoaXMub25seVN0b3BBdXRob3JpdHkoKTsKICAgIGNhbGxzdWIgb25seVN0b3BBdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUzCiAgICAvLyBjYW5XaXRoZHJhdyA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOy8vIGlzIHdpdGhkcmF3biBvcGVyYXRpb24gYWxsb3dlZAogICAgYnl0ZWMgMTMgLy8gImNhbldpdGhkcmF3IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQ0CiAgICAvLyB0aGlzLmNhbldpdGhkcmF3LnZhbHVlID0gZmFsc2U7CiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnN0YXJ0V2l0aGRyYXcoKSAtPiB2b2lkOgpzdGFydFdpdGhkcmF3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQ4CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUzCiAgICAvLyBjYW5XaXRoZHJhdyA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOy8vIGlzIHdpdGhkcmF3biBvcGVyYXRpb24gYWxsb3dlZAogICAgYnl0ZWMgMTMgLy8gImNhbldpdGhkcmF3IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQ5CiAgICAvLyB0aGlzLmNhbldpdGhkcmF3LnZhbHVlID0gdHJ1ZTsKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuc2V0U3RvcEF1dGhvcml0eShzdG9wQXV0aG9yaXR5OiBieXRlcykgLT4gdm9pZDoKc2V0U3RvcEF1dGhvcml0eToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM1MgogICAgLy8gc2V0U3RvcEF1dGhvcml0eShzdG9wQXV0aG9yaXR5OiBBZGRyZXNzKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM1MwogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MQogICAgLy8gcHJpdmF0ZSBzdG9wQXV0aG9yaXR5ID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBjYW4gcmVzdHJpY3QgZGVwb3NpdCBvciB3aXRoZHJhdyBvcGVyYXRpb25zCiAgICBieXRlYyAyMiAvLyAic3RvcEF1dGhvcml0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gdGhpcy5zdG9wQXV0aG9yaXR5LnZhbHVlID0gc3RvcEF1dGhvcml0eTsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnNldFJvdXRlcihyb3V0ZXI6IGJ5dGVzKSAtPiB2b2lkOgpzZXRSb3V0ZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTcKICAgIC8vIHNldFJvdXRlcihyb3V0ZXI6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwCiAgICAvLyByb3V0ZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOy8vIGlzIGRlcG9zaXQgb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDIxIC8vICJyb3V0ZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTkKICAgIC8vIHRoaXMucm91dGVyLnZhbHVlID0gcm91dGVyOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuZ2V0WSh4OiB1aW50NjQpIC0+IHVpbnQ2NDoKZ2V0WToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM2NQogICAgLy8gcHJpdmF0ZSBnZXRZKHg6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM2NgogICAgLy8gY29uc3QgeF8gPSBCaWdVaW50KHgpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM2NwogICAgLy8gY29uc3QgZF8gPSBCaWdVaW50KHRoaXMuZC52YWx1ZSk7CiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ1CiAgICAvLyBhID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM2OAogICAgLy8gY29uc3QgYTQgPSBCaWdVaW50KHRoaXMuYS52YWx1ZSA8PCAyKTsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBzaGwKICAgIGl0b2IKICAgIGR1cAogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzY5CiAgICAvLyBjb25zdCBhOCA9IEJpZ1VpbnQoYTQgKiAybik7CiAgICBieXRlYyAxNyAvLyAweDAyCiAgICBiKgogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzcxCiAgICAvLyBjb25zdCBkTWludXNYSXNQb3NpdGl2ZSA9IGRfID49IHhfOwogICAgYjw9CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM3MgogICAgLy8gY29uc3QgZE1pbnVzWEFiczogYmlndWludCA9IGRNaW51c1hJc1Bvc2l0aXZlID8gKGRfIC0geF8pIDogKHhfIC0gZF8pOwogICAgYnogZ2V0WV90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgYi0KCmdldFlfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mzc0CiAgICAvLyBjb25zdCBhNEJ5RE1pbnVzWEFiczogYmlndWludCA9IGE0ICogZE1pbnVzWEFiczsKICAgIGZyYW1lX2RpZyA0CiAgICBiKgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNzkKICAgIC8vIGlmIChkTWludXNYSXNQb3NpdGl2ZSkgewogICAgZnJhbWVfZGlnIDYKICAgIGJ6IGdldFlfZWxzZV9ib2R5QDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM4MAogICAgLy8gaWYgKGE0QnlETWludXNYQWJzID49IGRfKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDMKICAgIGI+PQogICAgYnogZ2V0WV9lbHNlX2JvZHlANgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzgxCiAgICAvLyBwYXJ0MUFicyA9IGE0QnlETWludXNYQWJzIC0gZF87CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDMKICAgIGItCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM4MgogICAgLy8gcGFydDFJc1Bvc2l0aXZlID0gdHJ1ZTsKICAgIGludGNfMSAvLyAxCgpnZXRZX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM5MwogICAgLy8gY29uc3QgcGFydDI6IGJpZ3VpbnQgPSBCaWdVaW50KHgpICogKGE0ICogZF8gKiBkXyAqIGRfICsgeF8gKiAocGFydDFBYnMgKiBwYXJ0MUFicykpOwogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGIqCiAgICBkaWcgMQogICAgYioKICAgIGIqCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBiKgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBiKgogICAgdW5jb3ZlciAyCiAgICBiKwogICAgYioKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM5NAogICAgLy8gbGV0IG51bWVyYXRvcjogYmlndWludCA9IHRoaXMuc3FydChwYXJ0Mik7CiAgICBjYWxsc3ViIHNxcnQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM5NwogICAgLy8gaWYgKHBhcnQxSXNQb3NpdGl2ZSkgewogICAgYnogZ2V0WV9lbHNlX2JvZHlAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM5OAogICAgLy8gbnVtZXJhdG9yICs9IHhfICogcGFydDFBYnM7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIGIqCiAgICBiKwoKZ2V0WV9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDA0CiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKG51bWVyYXRvciAvIChhOCAqIHhfKSArIDFuKTsgLy8gKzEgdG8gb2Zmc2V0IHJvdW5kaW5nIGVycm9ycwogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyAyCiAgICBiKgogICAgYi8KICAgIGJ5dGVjIDEwIC8vIDB4MDEKICAgIGIrCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFlfZWxzZV9ib2R5QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDAwCiAgICAvLyBudW1lcmF0b3IgLT0geF8gKiBwYXJ0MUFiczsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgYioKICAgIGItCiAgICBiIGdldFlfYWZ0ZXJfaWZfZWxzZUAxMgoKZ2V0WV9lbHNlX2JvZHlANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM4NAogICAgLy8gcGFydDFBYnMgPSBkXyAtIGE0QnlETWludXNYQWJzOwogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAwCiAgICBiLQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozODUKICAgIC8vIHBhcnQxSXNQb3NpdGl2ZSA9IGZhbHNlOwogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0WV9hZnRlcl9pZl9lbHNlQDkKCmdldFlfZWxzZV9ib2R5QDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozODgKICAgIC8vIHBhcnQxQWJzID0gYTRCeURNaW51c1hBYnMgKyBkXzsKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMwogICAgYisKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mzg5CiAgICAvLyBwYXJ0MUlzUG9zaXRpdmUgPSBmYWxzZTsKICAgIGludGNfMCAvLyAwCiAgICBiIGdldFlfYWZ0ZXJfaWZfZWxzZUA5CgpnZXRZX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM3MgogICAgLy8gY29uc3QgZE1pbnVzWEFiczogYmlndWludCA9IGRNaW51c1hJc1Bvc2l0aXZlID8gKGRfIC0geF8pIDogKHhfIC0gZF8pOwogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAzCiAgICBiLQogICAgYiBnZXRZX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnVwZGF0ZUQoKSAtPiB2b2lkOgp1cGRhdGVEOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDA3CiAgICAvLyBwcml2YXRlIHVwZGF0ZUQoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MDgKICAgIC8vIGNvbnN0IHggPSBCaWdVaW50KHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlKTsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDA5CiAgICAvLyBjb25zdCB5ID0gQmlnVWludCh0aGlzLnZVc2RCYWxhbmNlLnZhbHVlKTsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxNAogICAgLy8gY29uc3QgeHk6IGJpZ3VpbnQgPSB4ICogeTsKICAgIGR1cDIKICAgIGIqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NQogICAgLy8gYSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MTUKICAgIC8vIGNvbnN0IGFfID0gQmlnVWludCh0aGlzLmEudmFsdWUpOwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDE3CiAgICAvLyBjb25zdCBwMTogYmlndWludCA9IGFfICogeHkgKiAoeCArIHkpOwogICAgZHVwCiAgICBkaWcgMgogICAgYioKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICBiKwogICAgYioKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDE5CiAgICAvLyBjb25zdCBwMjogYmlndWludCA9ICh4eSAqICgoYV8gKiA0bikgLSAxbikpIC8gM247CiAgICBwdXNoYnl0ZXMgMHgwNAogICAgYioKICAgIGJ5dGVjIDEwIC8vIDB4MDEKICAgIGItCiAgICB1bmNvdmVyIDIKICAgIGIqCiAgICBieXRlYyAyNiAvLyAweDAzCiAgICBiLwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDIxCiAgICAvLyBjb25zdCBwMzogYmlndWludCA9IHRoaXMuc3FydCgocDEgKiBwMSkgKyAocDIgKiBwMiAqIHAyKSk7CiAgICBkaWcgMQogICAgZGlnIDIKICAgIGIqCiAgICBkaWcgMQogICAgZGlnIDIKICAgIGIqCiAgICB1bmNvdmVyIDIKICAgIGIqCiAgICBiKwogICAgY2FsbHN1YiBzcXJ0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyMgogICAgLy8gbGV0IGRfID0gdGhpcy5jYnJ0KHAxICsgcDMpOwogICAgZHVwMgogICAgYisKICAgIGNhbGxzdWIgY2JydAogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDIzCiAgICAvLyBpZiAocDMgPiBwMSkgewogICAgYjwKICAgIGJ6IHVwZGF0ZURfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyNAogICAgLy8gZF8gLT0gdGhpcy5jYnJ0KHAzIC0gcDEpOwogICAgZnJhbWVfZGlnIDAKICAgIGItCiAgICBjYWxsc3ViIGNicnQKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICAtCiAgICBmcmFtZV9idXJ5IDEKCnVwZGF0ZURfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDI4CiAgICAvLyB0aGlzLmQudmFsdWUgPSAoZF8gPDwgMSk7CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18xIC8vIDEKICAgIHNobAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYKICAgIC8vIGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWMgNiAvLyAiZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyOAogICAgLy8gdGhpcy5kLnZhbHVlID0gKGRfIDw8IDEpOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKdXBkYXRlRF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyNgogICAgLy8gZF8gKz0gdGhpcy5jYnJ0KHAxIC0gcDMpOwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGItCiAgICBjYWxsc3ViIGNicnQKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgdXBkYXRlRF9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC50b1N5c3RlbVByZWNpc2lvbihhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0Ogp0b1N5c3RlbVByZWNpc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzMQogICAgLy8gcHJpdmF0ZSB0b1N5c3RlbVByZWNpc2lvbihhbW91bnQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyBwcml2YXRlIHRva2VuQW1vdW50UmVkdWNlID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJ0b2tlbkFtb3VudFJlZHVjZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDkKICAgIC8vIHByaXZhdGUgdG9rZW5BbW91bnRJbmNyZWFzZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAidG9rZW5BbW91bnRJbmNyZWFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MzUKICAgIC8vIGlmICh0b2tlbkFtb3VudFJlZHVjZSA+IDApIHsKICAgIGJ6IHRvU3lzdGVtUHJlY2lzaW9uX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MzYKICAgIC8vIHJldHVybiBhbW91bnQgLyB0b2tlbkFtb3VudFJlZHVjZTsKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDAKICAgIC8KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp0b1N5c3RlbVByZWNpc2lvbl9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzNwogICAgLy8gfSBlbHNlIGlmICh0b2tlbkFtb3VudEluY3JlYXNlID4gMCkgewogICAgZnJhbWVfZGlnIDEKICAgIGJ6IHRvU3lzdGVtUHJlY2lzaW9uX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDM4CiAgICAvLyByZXR1cm4gYW1vdW50ICogdG9rZW5BbW91bnRJbmNyZWFzZTsKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDEKICAgICoKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp0b1N5c3RlbVByZWNpc2lvbl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NDAKICAgIC8vIHJldHVybiBhbW91bnQ7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuZnJvbVN5c3RlbVByZWNpc2lvbihhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0Ogpmcm9tU3lzdGVtUHJlY2lzaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQzCiAgICAvLyBwcml2YXRlIGZyb21TeXN0ZW1QcmVjaXNpb24oYW1vdW50OiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OAogICAgLy8gcHJpdmF0ZSB0b2tlbkFtb3VudFJlZHVjZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAidG9rZW5BbW91bnRSZWR1Y2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ5CiAgICAvLyBwcml2YXRlIHRva2VuQW1vdW50SW5jcmVhc2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjQgLy8gInRva2VuQW1vdW50SW5jcmVhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQ3CiAgICAvLyBpZiAodG9rZW5BbW91bnRSZWR1Y2UgPiAwKSB7CiAgICBieiBmcm9tU3lzdGVtUHJlY2lzaW9uX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NDgKICAgIC8vIHJldHVybiBhbW91bnQgKiB0b2tlbkFtb3VudFJlZHVjZTsKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDAKICAgICoKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpmcm9tU3lzdGVtUHJlY2lzaW9uX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQ5CiAgICAvLyB9IGVsc2UgaWYgKHRva2VuQW1vdW50SW5jcmVhc2UgPiAwKSB7CiAgICBmcmFtZV9kaWcgMQogICAgYnogZnJvbVN5c3RlbVByZWNpc2lvbl9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ1MAogICAgLy8gcmV0dXJuIGFtb3VudCAvIHRva2VuQW1vdW50SW5jcmVhc2U7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAxCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZnJvbVN5c3RlbVByZWNpc2lvbl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTIKICAgIC8vIHJldHVybiBhbW91bnQ7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuc3FydChuOiBieXRlcykgLT4gYnl0ZXM6CnNxcnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTUKICAgIC8vIHByaXZhdGUgc3FydChuOiBiaWd1aW50KTogYmlndWludCB7CiAgICBwcm90byAxIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ1NgogICAgLy8gYXNzZXJ0KG4gPiAwbiwgJ24gbXVzdCBiZSBub24tbmVnYXRpdmUnKTsKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGJ5dGVzIDB4CiAgICBiPgogICAgYXNzZXJ0IC8vIG4gbXVzdCBiZSBub24tbmVnYXRpdmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ1NwogICAgLy8gaWYgKG4gPT09IDBuKSByZXR1cm4gMG47CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hieXRlcyAweAogICAgYj09CiAgICBieiBzcXJ0X2FmdGVyX2lmX2Vsc2VAMgogICAgcHVzaGJ5dGVzIDB4CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc3FydF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTgKICAgIC8vIGlmIChuIDw9IDNuKSByZXR1cm4gMW47CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjIDI2IC8vIDB4MDMKICAgIGI8PQogICAgYnogc3FydF9hZnRlcl9pZl9lbHNlQDQKICAgIGJ5dGVjIDEwIC8vIDB4MDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpzcXJ0X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2MQogICAgLy8gY29uc3QgYmwgPSBiaXRMZW5ndGgoQnl0ZXMobikpOwogICAgZnJhbWVfZGlnIC0xCiAgICBiaXRsZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2MgogICAgLy8gbGV0IHdpZGUgPSBleHB3KDIsIChibCArIDEpIC8gMik7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgcHVzaGludCAyIC8vIDIKICAgIC8KICAgIHB1c2hpbnQgMiAvLyAyCiAgICBzd2FwCiAgICBleHB3CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjMKICAgIC8vIGNvbnN0IGhpID0gQmlnVWludCh3aWRlWzBdKTsKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2NAogICAgLy8gY29uc3QgbG8gPSBCaWdVaW50KHdpZGVbMV0pOwogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDY1CiAgICAvLyBsZXQgeDogYmlndWludCA9IGhpICogU0hJRlQ2NCArIGxvOwogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjIKICAgIC8vIGNvbnN0IFNISUZUNjQ6IGJpZ3VpbnQgPSAxODQ0Njc0NDA3MzcwOTU1MTYxNm47IC8vIDJeNjQKICAgIGJ5dGVjIDI3IC8vIDB4MDEwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjUKICAgIC8vIGxldCB4OiBiaWd1aW50ID0gaGkgKiBTSElGVDY0ICsgbG87CiAgICBiKgogICAgYisKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjgKICAgIC8vIGxldCB5OiBiaWd1aW50ID0gKHggKyBuIC8geCkgLyAybjsKICAgIGZyYW1lX2RpZyAtMQogICAgZGlnIDEKICAgIGIvCiAgICBiKwogICAgYnl0ZWMgMTcgLy8gMHgwMgogICAgYi8KICAgIGZyYW1lX2J1cnkgMQoKc3FydF93aGlsZV90b3BANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2OQogICAgLy8gd2hpbGUgKHkgPCB4KSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIGI8CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjktNDcyCiAgICAvLyB3aGlsZSAoeSA8IHgpIHsKICAgIC8vICAgeCA9IHk7CiAgICAvLyAgIHkgPSAoeCArIG4gLyB4KSAvIDJuOwogICAgLy8gfQogICAgYnogc3FydF9hZnRlcl93aGlsZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NzEKICAgIC8vIHkgPSAoeCArIG4gLyB4KSAvIDJuOwogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBiLwogICAgZGlnIDEKICAgIGIrCiAgICBieXRlYyAxNyAvLyAweDAyCiAgICBiLwogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgc3FydF93aGlsZV90b3BANQoKc3FydF9hZnRlcl93aGlsZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDczCiAgICAvLyByZXR1cm4geDsKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmNicnQobjogYnl0ZXMpIC0+IHVpbnQ2NDoKY2JydDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ3NgogICAgLy8gcHJpdmF0ZSBjYnJ0KG46IGJpZ3VpbnQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NzcKICAgIC8vIGlmIChuID09PSAwbikgcmV0dXJuIDA7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hieXRlcyAweAogICAgYj09CiAgICBieiBjYnJ0X2FmdGVyX2lmX2Vsc2VAMgogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpjYnJ0X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ3OAogICAgLy8gaWYgKG4gPCA4bikgcmV0dXJuIDE7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hieXRlcyAweDA4CiAgICBiPAogICAgYnogY2JydF9hZnRlcl9pZl9lbHNlQDQKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY2JydF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0ODEKICAgIC8vIGNvbnN0IGJsID0gYml0TGVuZ3RoKEJ5dGVzKG4pKTsKICAgIGZyYW1lX2RpZyAtMQogICAgYml0bGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0ODIKICAgIC8vIGxldCB3aWRlID0gZXhwdygyLCAoYmwgKyAyKSAvIDMpOwogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAvCiAgICBwdXNoaW50IDIgLy8gMgogICAgc3dhcAogICAgZXhwdwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDgzCiAgICAvLyBjb25zdCBoaSA9IEJpZ1VpbnQod2lkZVswXSk7CiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0ODQKICAgIC8vIGNvbnN0IGxvID0gQmlnVWludCh3aWRlWzFdKTsKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ4NQogICAgLy8gbGV0IHg6IGJpZ3VpbnQgPSBoaSAqIFNISUZUNjQgKyBsbzsKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyCiAgICAvLyBjb25zdCBTSElGVDY0OiBiaWd1aW50ID0gMTg0NDY3NDQwNzM3MDk1NTE2MTZuOyAvLyAyXjY0CiAgICBieXRlYyAyNyAvLyAweDAxMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDg1CiAgICAvLyBsZXQgeDogYmlndWludCA9IGhpICogU0hJRlQ2NCArIGxvOwogICAgYioKICAgIGIrCiAgICBmcmFtZV9idXJ5IDEKCmNicnRfd2hpbGVfdG9wQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0ODkKICAgIC8vIGNvbnN0IHgyOiBiaWd1aW50ID0geCAqIHg7CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBiKgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ5MAogICAgLy8gaWYgKHgyID09PSAwbikgYnJlYWs7IC8vIHNob3VsZCBub3QgaGFwcGVuIGZvciB4PjAKICAgIHB1c2hieXRlcyAweAogICAgYj09CiAgICBibnogY2JydF93aGlsZV90b3BAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ5MQogICAgLy8gY29uc3QgbmV4dDogYmlndWludCA9ICgybiAqIHggKyBuIC8geDIpIC8gM247CiAgICBieXRlYyAxNyAvLyAweDAyCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBiKgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMwogICAgYi8KICAgIGIrCiAgICBieXRlYyAyNiAvLyAweDAzCiAgICBiLwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ5MgogICAgLy8gaWYgKG5leHQgPT09IHggfHwgbmV4dCA9PT0geCAtIDFuKSB7CiAgICBiPT0KICAgIGJueiBjYnJ0X2lmX2JvZHlAMTAKICAgIGZyYW1lX2RpZyAxCiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBiLQogICAgZnJhbWVfZGlnIDAKICAgIGI9PQogICAgYnogY2JydF9hZnRlcl9pZl9lbHNlQDExCgpjYnJ0X2lmX2JvZHlAMTA6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfYnVyeSAxCgpjYnJ0X3doaWxlX3RvcEAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUwMAogICAgLy8gd2hpbGUgKCh4ICsgMW4pICogKHggKyAxbikgKiAoeCArIDFuKSA8PSBuKSB4ICs9IDFuOwogICAgZnJhbWVfZGlnIDEKICAgIGJ5dGVjIDEwIC8vIDB4MDEKICAgIGIrCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZHVwCiAgICBkaWcgMQogICAgYioKICAgIGIqCiAgICBmcmFtZV9kaWcgLTEKICAgIGI8PQogICAgYnogY2JydF93aGlsZV90b3BAMTcKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgY2JydF93aGlsZV90b3BAMTQKCmNicnRfd2hpbGVfdG9wQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTAxCiAgICAvLyB3aGlsZSAoeCAqIHggKiB4ID4gbikgeCAtPSAxbjsKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGRpZyAxCiAgICBiKgogICAgYioKICAgIGZyYW1lX2RpZyAtMQogICAgYj4KICAgIGJ6IGNicnRfYWZ0ZXJfd2hpbGVAMTkKICAgIGZyYW1lX2RpZyAxCiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBiLQogICAgZnJhbWVfYnVyeSAxCiAgICBiIGNicnRfd2hpbGVfdG9wQDE3CgpjYnJ0X2FmdGVyX3doaWxlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTAyCiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKHgpOwogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgYmlndWludFRvVWludDY0TW9kdWxvCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY2JydF9hZnRlcl9pZl9lbHNlQDExOgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgMQogICAgYiBjYnJ0X3doaWxlX3RvcEA1CgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLmNsYWltUmV3YXJkcygpIC0+IHZvaWQ6CmNsYWltUmV3YXJkczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1MC01MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBjbGFpbVJld2FyZHMoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTIKICAgIC8vIGNvbnN0IHVzZXIgPSBUeG4uc2VuZGVyOwogICAgdHhuIFNlbmRlcgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTMKICAgIC8vIGNvbnN0IHVzZXJMcEFtb3VudCA9IHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTMKICAgIC8vIGNvbnN0IHVzZXJMcEFtb3VudCA9IHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZTsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1NAogICAgLy8gaWYgKHVzZXJMcEFtb3VudCA+IDApIHsKICAgIGJ6IGNsYWltUmV3YXJkc19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1NQogICAgLy8gY29uc3QgcmV3YXJkcyA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhCaWdVaW50KHVzZXJMcEFtb3VudCkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSAvIFBfU0NBTEUpOwogICAgZnJhbWVfZGlnIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMAogICAgLy8gYWNjUmV3YXJkUGVyU2hhcmVQID0gR2xvYmFsU3RhdGU8YmlndWludD4oeyBpbml0aWFsVmFsdWU6IDBuIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImFjY1Jld2FyZFBlclNoYXJlUCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTUKICAgIC8vIGNvbnN0IHJld2FyZHMgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oQmlnVWludCh1c2VyTHBBbW91bnQpICogdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgLyBQX1NDQUxFKTsKICAgIGIqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjAKICAgIC8vIGNvbnN0IFBfU0NBTEU6IGJpZ3VpbnQgPSBCaWdVaW50KDEgPDwgUCk7CiAgICBieXRlYyA5IC8vIDB4MDEwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1NQogICAgLy8gY29uc3QgcmV3YXJkcyA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhCaWdVaW50KHVzZXJMcEFtb3VudCkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSAvIFBfU0NBTEUpOwogICAgYi8KICAgIGNhbGxzdWIgYmlndWludFRvVWludDY0TW9kdWxvCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjU2CiAgICAvLyBjb25zdCBwZW5kaW5nOiB1aW50NjQgPSByZXdhcmRzIC0gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZTsKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTYKICAgIC8vIGNvbnN0IHBlbmRpbmc6IHVpbnQ2NCA9IHJld2FyZHMgLSB0aGlzLnVzZXJSZXdhcmREZWJ0KHVzZXIpLnZhbHVlOwogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjU3CiAgICAvLyBpZiAocGVuZGluZyA+IDApIHsKICAgIGJ6IGNsYWltUmV3YXJkc19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1OAogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZSA9IHJld2FyZHM7CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzQKICAgIC8vIHVzZXJSZXdhcmREZWJ0ID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA1IC8vICJ1c2VyUmV3YXJkRGVidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1OAogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZSA9IHJld2FyZHM7CiAgICBmcmFtZV9kaWcgMQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjU5CiAgICAvLyBhc3NldFRyYW5zZmVyKHsgeGZlckFzc2V0OiB0aGlzLmFzc2V0LnZhbHVlLCBhc3NldEFtb3VudDogcGVuZGluZywgYXNzZXRSZWNlaXZlcjogdXNlciB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjU5CiAgICAvLyBhc3NldFRyYW5zZmVyKHsgeGZlckFzc2V0OiB0aGlzLmFzc2V0LnZhbHVlLCBhc3NldEFtb3VudDogcGVuZGluZywgYXNzZXRSZWNlaXZlcjogdXNlciB9KS5zdWJtaXQoKTsKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjAKICAgIC8vIGVtaXQ8UmV3YXJkc0NsYWltZWQ+KHsgdXNlcjogbmV3IEFkZHJlc3ModXNlciksIHBlbmRpbmcgfSk7CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDI1IC8vIG1ldGhvZCAiUmV3YXJkc0NsYWltZWQoYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKCmNsYWltUmV3YXJkc19hZnRlcl9pZl9lbHNlQDU6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6OlJld2FyZE1hbmFnZXIuc2V0QWRtaW5GZWVTaGFyZShhZG1pbkZlZVNoYXJlQlA6IHVpbnQ2NCkgLT4gdm9pZDoKc2V0QWRtaW5GZWVTaGFyZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo2NS02NgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBzZXRBZG1pbkZlZVNoYXJlKGFkbWluRmVlU2hhcmVCUDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo2NwogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjgKICAgIC8vIGFzc2VydChhZG1pbkZlZVNoYXJlQlAgPD0gQlAsICdSZXdhcmRNYW5hZ2VyOiB0b28gaGlnaCcpOwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTkKICAgIC8vIGV4cG9ydCBjb25zdCBCUDogdWludDY0ID0gMTBfMDAwOwogICAgaW50YyA0IC8vIDEwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjgKICAgIC8vIGFzc2VydChhZG1pbkZlZVNoYXJlQlAgPD0gQlAsICdSZXdhcmRNYW5hZ2VyOiB0b28gaGlnaCcpOwogICAgPD0KICAgIGFzc2VydCAvLyBSZXdhcmRNYW5hZ2VyOiB0b28gaGlnaAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI4CiAgICAvLyBhZG1pbkZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBCUCAvIDUgfSk7IC8vIERlZmF1bHQgYWRtaW4gZmVlIGlzIDIwJQogICAgYnl0ZWMgMTggLy8gImFkbWluRmVlU2hhcmVCUCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo2OQogICAgLy8gdGhpcy5hZG1pbkZlZVNoYXJlQlAudmFsdWUgPSBhZG1pbkZlZVNoYXJlQlA7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6OlJld2FyZE1hbmFnZXIuY2xhaW1BZG1pbkZlZSgpIC0+IHZvaWQ6CmNsYWltQWRtaW5GZWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NzItNzMKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gY2xhaW1BZG1pbkZlZSgpOiB2b2lkIHsKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjc0CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMQogICAgLy8gYWRtaW5GZWVBbW91bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJhZG1pbkZlZUFtb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjc2CiAgICAvLyBpZiAoYWRtaW5GZWVBbW91bnQgPiAwKSB7CiAgICBieiBjbGFpbUFkbWluRmVlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjc3LTgxCiAgICAvLyBhc3NldFRyYW5zZmVyKHsKICAgIC8vICAgeGZlckFzc2V0OiB0aGlzLmFzc2V0LnZhbHVlLAogICAgLy8gICBhc3NldEFtb3VudDogYWRtaW5GZWVBbW91bnQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjc3LTgxCiAgICAvLyBhc3NldFRyYW5zZmVyKHsKICAgIC8vICAgeGZlckFzc2V0OiB0aGlzLmFzc2V0LnZhbHVlLAogICAgLy8gICBhc3NldEFtb3VudDogYWRtaW5GZWVBbW91bnQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjIDExIC8vICJhZG1pbkZlZUFtb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo4MgogICAgLy8gdGhpcy5hZG1pbkZlZUFtb3VudC52YWx1ZSA9IDA7CiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCmNsYWltQWRtaW5GZWVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLnBlbmRpbmdSZXdhcmQodXNlcjogYnl0ZXMpIC0+IHVpbnQ2NDoKcGVuZGluZ1Jld2FyZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo4Ni04NwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBwZW5kaW5nUmV3YXJkKHVzZXI6IEFjY291bnQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODgKICAgIC8vIHJldHVybiBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodGhpcy5iYWxhbmNlKHVzZXIpLnZhbHVlKSAqIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlKSAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZTsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMwogICAgLy8gYmFsYW5jZSA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNCAvLyAiYmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo4OAogICAgLy8gcmV0dXJuIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbygoQmlnVWludCh0aGlzLmJhbGFuY2UodXNlcikudmFsdWUpICogdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUpIC8gUF9TQ0FMRSkgLSB0aGlzLnVzZXJSZXdhcmREZWJ0KHVzZXIpLnZhbHVlOwogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzAKICAgIC8vIGFjY1Jld2FyZFBlclNoYXJlUCA9IEdsb2JhbFN0YXRlPGJpZ3VpbnQ+KHsgaW5pdGlhbFZhbHVlOiAwbiB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJhY2NSZXdhcmRQZXJTaGFyZVAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZSkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBQX1NDQUxFOiBiaWd1aW50ID0gQmlnVWludCgxIDw8IFApOwogICAgYnl0ZWMgOSAvLyAweDAxMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODgKICAgIC8vIHJldHVybiBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodGhpcy5iYWxhbmNlKHVzZXIpLnZhbHVlKSAqIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlKSAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZTsKICAgIGIvCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODgKICAgIC8vIHJldHVybiBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodGhpcy5iYWxhbmNlKHVzZXIpLnZhbHVlKSAqIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlKSAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZTsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLmFkZFJld2FyZHMocmV3YXJkQW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmFkZFJld2FyZHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6OTYKICAgIC8vIHByb3RlY3RlZCBhZGRSZXdhcmRzKHJld2FyZEFtb3VudDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOQogICAgLy8gdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsU3VwcGx5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6OTgKICAgIC8vIGlmICh0b3RhbFN1cHBseSA+IDApIHsKICAgIGJ6IGFkZFJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjgKICAgIC8vIGFkbWluRmVlU2hhcmVCUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IEJQIC8gNSB9KTsgLy8gRGVmYXVsdCBhZG1pbiBmZWUgaXMgMjAlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gImFkbWluRmVlU2hhcmVCUCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6OTkKICAgIC8vIGNvbnN0IGFkbWluRmVlUmV3YXJkczogdWludDY0ID0gKHJld2FyZEFtb3VudCAqIHRoaXMuYWRtaW5GZWVTaGFyZUJQLnZhbHVlKSAvIEJQOwogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTkKICAgIC8vIGV4cG9ydCBjb25zdCBCUDogdWludDY0ID0gMTBfMDAwOwogICAgaW50YyA0IC8vIDEwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6OTkKICAgIC8vIGNvbnN0IGFkbWluRmVlUmV3YXJkczogdWludDY0ID0gKHJld2FyZEFtb3VudCAqIHRoaXMuYWRtaW5GZWVTaGFyZUJQLnZhbHVlKSAvIEJQOwogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwMAogICAgLy8gcmV3YXJkQW1vdW50IC09IGFkbWluRmVlUmV3YXJkczsKICAgIGZyYW1lX2RpZyAtMQogICAgZGlnIDEKICAgIC0KICAgIGZyYW1lX2J1cnkgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMAogICAgLy8gYWNjUmV3YXJkUGVyU2hhcmVQID0gR2xvYmFsU3RhdGU8YmlndWludD4oeyBpbml0aWFsVmFsdWU6IDBuIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImFjY1Jld2FyZFBlclNoYXJlUCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTAxCiAgICAvLyB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSArPSBCaWdVaW50KHJld2FyZEFtb3VudCkgKiBQX1NDQUxFIC8gQmlnVWludCh0b3RhbFN1cHBseSk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyMAogICAgLy8gY29uc3QgUF9TQ0FMRTogYmlndWludCA9IEJpZ1VpbnQoMSA8PCBQKTsKICAgIGJ5dGVjIDkgLy8gMHgwMTAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwMQogICAgLy8gdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgKz0gQmlnVWludChyZXdhcmRBbW91bnQpICogUF9TQ0FMRSAvIEJpZ1VpbnQodG90YWxTdXBwbHkpOwogICAgYioKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICBiLwogICAgYisKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMAogICAgLy8gYWNjUmV3YXJkUGVyU2hhcmVQID0gR2xvYmFsU3RhdGU8YmlndWludD4oeyBpbml0aWFsVmFsdWU6IDBuIH0pOwogICAgYnl0ZWMgOCAvLyAiYWNjUmV3YXJkUGVyU2hhcmVQIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwMQogICAgLy8gdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgKz0gQmlnVWludChyZXdhcmRBbW91bnQpICogUF9TQ0FMRSAvIEJpZ1VpbnQodG90YWxTdXBwbHkpOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMQogICAgLy8gYWRtaW5GZWVBbW91bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJhZG1pbkZlZUFtb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTAyCiAgICAvLyB0aGlzLmFkbWluRmVlQW1vdW50LnZhbHVlICs9IGFkbWluRmVlUmV3YXJkczsKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMQogICAgLy8gYWRtaW5GZWVBbW91bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWMgMTEgLy8gImFkbWluRmVlQW1vdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwMgogICAgLy8gdGhpcy5hZG1pbkZlZUFtb3VudC52YWx1ZSArPSBhZG1pbkZlZVJld2FyZHM7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYWRkUmV3YXJkc19hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6OlJld2FyZE1hbmFnZXIuZGVwb3NpdExwKHRvOiBieXRlcywgbHBBbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKZGVwb3NpdExwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwNgogICAgLy8gcHJvdGVjdGVkIGRlcG9zaXRMcCh0bzogQWNjb3VudCwgbHBBbW91bnQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzAKICAgIC8vIGFjY1Jld2FyZFBlclNoYXJlUCA9IEdsb2JhbFN0YXRlPGJpZ3VpbnQ+KHsgaW5pdGlhbFZhbHVlOiAwbiB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJhY2NSZXdhcmRQZXJTaGFyZVAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwOAogICAgLy8gbGV0IHBlbmRpbmc6IHVpbnQ2NCA9IDA7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwOQogICAgLy8gbGV0IHVzZXJMcEFtb3VudCA9IHRoaXMuYmFsYW5jZSh0bykudmFsdWU7CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTA5CiAgICAvLyBsZXQgdXNlckxwQW1vdW50ID0gdGhpcy5iYWxhbmNlKHRvKS52YWx1ZTsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTAKICAgIC8vIGlmICh1c2VyTHBBbW91bnQgPiAwKSB7CiAgICBieiBkZXBvc2l0THBfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTExCiAgICAvLyBwZW5kaW5nID0gYmlndWludFRvVWludDY0TW9kdWxvKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWU7CiAgICBmcmFtZV9kaWcgMgogICAgaXRvYgogICAgZnJhbWVfZGlnIDAKICAgIGIqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjAKICAgIC8vIGNvbnN0IFBfU0NBTEU6IGJpZ3VpbnQgPSBCaWdVaW50KDEgPDwgUCk7CiAgICBieXRlYyA5IC8vIDB4MDEwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTEKICAgIC8vIHBlbmRpbmcgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oQmlnVWludCh1c2VyTHBBbW91bnQpICogYWNjUmV3YXJkUGVyU2hhcmVQIC8gUF9TQ0FMRSkgLSB0aGlzLnVzZXJSZXdhcmREZWJ0KHRvKS52YWx1ZTsKICAgIGIvCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTExCiAgICAvLyBwZW5kaW5nID0gYmlndWludFRvVWludDY0TW9kdWxvKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWU7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIC0KICAgIGZyYW1lX2J1cnkgMQoKZGVwb3NpdExwX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTMKICAgIC8vIHVzZXJMcEFtb3VudCArPSBscEFtb3VudDsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTQKICAgIC8vIHRoaXMuYmFsYW5jZSh0bykudmFsdWUgKz0gbHBBbW91bnQ7CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTE0CiAgICAvLyB0aGlzLmJhbGFuY2UodG8pLnZhbHVlICs9IGxwQW1vdW50OwogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2RpZyAtMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMzCiAgICAvLyBiYWxhbmNlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA0IC8vICJiYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExNAogICAgLy8gdGhpcy5iYWxhbmNlKHRvKS52YWx1ZSArPSBscEFtb3VudDsKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAidG90YWxTdXBwbHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExNQogICAgLy8gdGhpcy50b3RhbFN1cHBseS52YWx1ZSArPSBscEFtb3VudDsKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyA3IC8vICJ0b3RhbFN1cHBseSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTUKICAgIC8vIHRoaXMudG90YWxTdXBwbHkudmFsdWUgKz0gbHBBbW91bnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExNwogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWUgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCkgLyBQX1NDQUxFKTsKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAwCiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBQX1NDQUxFOiBiaWd1aW50ID0gQmlnVWludCgxIDw8IFApOwogICAgYnl0ZWMgOSAvLyAweDAxMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTE3CiAgICAvLyB0aGlzLnVzZXJSZXdhcmREZWJ0KHRvKS52YWx1ZSA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbygoQmlnVWludCh1c2VyTHBBbW91bnQpICogYWNjUmV3YXJkUGVyU2hhcmVQKSAvIFBfU0NBTEUpOwogICAgYi8KICAgIGNhbGxzdWIgYmlndWludFRvVWludDY0TW9kdWxvCiAgICBmcmFtZV9kaWcgLTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExNwogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWUgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCkgLyBQX1NDQUxFKTsKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExOAogICAgLy8gaWYgKHBlbmRpbmcgPiAwKSB7CiAgICBmcmFtZV9kaWcgMQogICAgYnogZGVwb3NpdExwX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExOQogICAgLy8gYXNzZXRUcmFuc2Zlcih7IHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwgYXNzZXRBbW91bnQ6IHBlbmRpbmcsIGFzc2V0UmVjZWl2ZXI6IHRvIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExOQogICAgLy8gYXNzZXRUcmFuc2Zlcih7IHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwgYXNzZXRBbW91bnQ6IHBlbmRpbmcsIGFzc2V0UmVjZWl2ZXI6IHRvIH0pLnN1Ym1pdCgpOwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMjAKICAgIC8vIGVtaXQ8UmV3YXJkc0NsYWltZWQ+KHsgdXNlcjogbmV3IEFkZHJlc3ModG8pLCBwZW5kaW5nIH0pOwogICAgaXRvYgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDI1IC8vIG1ldGhvZCAiUmV3YXJkc0NsYWltZWQoYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKCmRlcG9zaXRMcF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTIyCiAgICAvLyBlbWl0PERlcG9zaXQ+KHsgdG86IG5ldyBBZGRyZXNzKHRvKSwgbHBBbW91bnQgfSk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHhjZmFiODcyMyAvLyBtZXRob2QgIkRlcG9zaXQoYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjpPd25hYmxlLm9ubHlPd25lcigpIC0+IHZvaWQ6Cm9ubHlPd25lcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjEzCiAgICAvLyBhc3NlcnQob3AuVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5vd25lci52YWx1ZS5ieXRlcywgJ09ubHkgb3duZXInKTsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjYKICAgIC8vIHByb3RlY3RlZCBvd25lciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm93bmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjEzCiAgICAvLyBhc3NlcnQob3AuVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5vd25lci52YWx1ZS5ieXRlcywgJ09ubHkgb3duZXInKTsKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBvd25lcgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6Ok93bmFibGUudHJhbnNmZXJPd25lcnNoaXAobmV3T3duZXI6IGJ5dGVzKSAtPiB2b2lkOgp0cmFuc2Zlck93bmVyc2hpcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE2LTE3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB0cmFuc2Zlck93bmVyc2hpcChuZXdPd25lcjogQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxOAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgYnl0ZWMgMTQgLy8gIm93bmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTkKICAgIC8vIHRoaXMub3duZXIudmFsdWUgPSBuZXdPd25lcjsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1Ygo=",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:"user"},{type:"uint64",name:"asset"},{type:"uint64",name:"amount"},{type:"uint64",name:"result"},{type:"uint64",name:"fee"}]},{name:"SwappedFromVUsd",args:[{type:"address",name:"user"},{type:"uint64",name:"asset"},{type:"uint64",name:"amount"},{type:"uint64",name:"result"},{type:"uint64",name:"fee"}]}],templateVariables:{}},Kn=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 Dn=class r{appClient;constructor(i){this.appClient=i instanceof On?i:new On({...i,appSpec:Qn})}decodeReturnValue(i,a){return a!==void 0?qr(a,this.appClient.getABIMethod(i),Qn.structs):void 0}static async fromCreatorAndName(i){return new r(await On.fromCreatorAndName({...i,appSpec:Qn}))}static async fromNetwork(i){return new r(await On.fromNetwork({...i,appSpec:Qn}))}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 Kn(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 Kn(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:es(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 Z(this.lpAmount,3).toFixed()}earned(i,a){let o=Ia(this.lpAmount,this.rewardDebt,i.accRewardPerShareP,i.p);return a?Z(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 je(...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=this.algorand.newGroup();c.addAssetTransfer({assetId:d,amount:s,sender:o,receiver:g.appAddress}),c.addAppCallMethodCall(await g.params.deposit({args:[],sender:o,extraFee:dt(1)})),yt({composer:c,appId:A,sender:o,count:4});let{transactions:l}=await c.buildTransactions();return je(...l)}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(1),assetReferences:[d]})),yt({composer:c,appId:A,sender:o,count:4});let{transactions:l}=await c.buildTransactions();return je(...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=ts(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(Dn,{appId:a})}};import{Web3 as ot}from"web3";var ns={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=ns;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 Yn(this.getUserBalanceInfoByBatch(a,o),`Cannot get UserBalanceInfo for ${o.name} on ${o.chainSymbol}`,5e3)}catch{s=await Ni(()=>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 Yn(this.getPoolInfoByBatch(a),`Cannot get PoolInfo for ${a.name} on ${a.chainSymbol}`,5e3)}catch{o=await Ni(()=>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,R]=await o.execute();if(m&&p&&b&&W&&y&&R&&!m.error&&!p.error&&!b.error&&!W.error&&!y.error&&!R.error){let B=ot.utils.toBigInt(b.result).toString(),h=ot.utils.toBigInt(W.result).toString(),G=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(R.result).toString(),p:this.P,imbalance:G}}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 Un=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 X(i.amount),L("amount",i.amount,i.token.decimals),i.amount=f(i.amount,i.token.decimals).toFixed(),Zt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionDeposit(i)}async withdraw(i,a){return X(i.amount),L("amount",i.amount,i.token.decimals),i.amount=f(i.amount,3).toFixed(),Zt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionWithdraw(i)}async claimRewards(i,a){return Zt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionClaimRewards(i)}};import{AnchorProvider as is,BN as ho,Program as as,Spl as os,web3 as rs}from"@project-serum/anchor";import{Connection as ss,PublicKey as rt}from"@solana/web3.js";var En=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 Li(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 ho(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 Bt(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 ho(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 Bt(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 Bt(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 as(_t,a,o)}buildAnchorProvider(a){let o=new ss(this.solanaRpcUrl,"confirmed"),s=new rt(a);return new is(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 Rt(m,a.programId),W=await Li(A,m,a.programId),y=[rs.ComputeBudgetProgram.setComputeUnitLimit({units:1e6})];try{await Yt(p,d)}catch{let G=await os.associatedToken(d).methods.create().accounts({mint:m,owner:A,associatedAccount:p}).instruction();y.push(G)}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 pB}from"@stellar/stellar-sdk";import{contract as t}from"@stellar/stellar-sdk";var ds=t.Spec,As=t.Client;var _n=class extends As{constructor(a){super(new ds(["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 aC,rpc as gs}from"@stellar/stellar-sdk";var vo=gs.Api;function ft(r){let{simulation:i,options:a}=r;if(!i)throw new Error("Soroban assembled transaction does not have simulation");if(vo.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 vo.isSimulationError(i)}var $n=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 _n(s)}};import{SuiClient as Is}from"@mysten/sui/client";import{Transaction as si}from"@mysten/sui/transactions";var wt=Ne(nt());ne();ne();import{bcs as Ro}from"@mysten/sui/bcs";import{fromB64 as cs}from"@mysten/sui/utils";function qn(r){return r=F(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 D(r.reified(i))}static get p(){return r.phantom}static get bcs(){return Ro.struct("Balance",{value:Ro.u64()})}static fromFields(i,a){return r.reified(i).new({value:H("u64",a.value)})}static fromFieldsWithTypes(i,a){if(!qn(a.type))throw new Error("not a Balance type");return xe(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 Xe(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(!qn(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"||!qn(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=F(o[0]),d=F(T(i));if(s!==F(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,cs(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"||!qn(s.data.bcs.type))throw new Error(`object at id ${o} is not a Balance object`);return r.fromSuiObjectData(a,s.data)}};var oa=Ne(nt());ne();var ia=Ne(nt());import{bcs as ei}from"@mysten/sui/bcs";import{fromB64 as ls}from"@mysten/sui/utils";function ti(r){return r=F(r),r.startsWith(`${ia.PKG_V1}::pool_rewards::PoolRewards<`)}var mt=class r{__StructClass=!0;static get $typeName(){return`${ia.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 D(r.reified(i))}static get p(){return r.phantom}static get bcs(){return ei.struct("PoolRewards",{acc_reward_per_share_p:ei.u128(),admin_fee_share_bp:ei.u64(),admin_fee:re.bcs,rewards:re.bcs,lp_supply:ei.u64()})}static fromFields(i,a){return r.reified(i).new({accRewardPerShareP:H("u128",a.acc_reward_per_share_p),adminFeeShareBp:H("u64",a.admin_fee_share_bp),adminFee:H(re.reified(i),a.admin_fee),rewards:H(re.reified(i),a.rewards),lpSupply:H("u64",a.lp_supply)})}static fromFieldsWithTypes(i,a){if(!ti(a.type))throw new Error("not a PoolRewards type");return xe(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 Xe(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 PoolRewards 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 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=F(o[0]),d=F(T(i));if(s!==F(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,ls(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"||!ti(s.data.bcs.type))throw new Error(`object at id ${o} is not a PoolRewards object`);return r.fromSuiObjectData(a,s.data)}};ne();var aa=Ne(nt());import{bcs as Tt}from"@mysten/sui/bcs";import{fromB64 as us}from"@mysten/sui/utils";function ni(r){return r=F(r),r.startsWith(`${aa.PKG_V1}::pool_state::PoolState<`)}var pt=class r{__StructClass=!0;static get $typeName(){return`${aa.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 D(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:H("u64",a.token_balance),vusdBalance:H("u64",a.vusd_balance),d:H("u64",a.d),a:H("u64",a.a),balanceRatioMinBp:H("u64",a.balance_ratio_min_bp)})}static fromFieldsWithTypes(i,a){if(!ni(a.type))throw new Error("not a PoolState type");return xe(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 Xe(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(!ni(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"||!ni(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=F(o[0]),d=F(T(i));if(s!==F(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,us(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"||!ni(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 ms}from"@mysten/sui/utils";function ii(r){return r=F(r),r.startsWith(`${oa.PKG_V1}::pool::Pool<`)}var ai=class r{__StructClass=!0;static get $typeName(){return`${oa.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 D(r.reified(i))}static get p(){return r.phantom}static get bcs(){return on.struct("Pool",{id:Ge.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:H(Ge.reified(),a.id),state:H(pt.reified(i),a.state),rewards:H(mt.reified(i),a.rewards),feeShareBp:H("u64",a.fee_share_bp),canDeposit:H("bool",a.can_deposit),canWithdraw:H("bool",a.can_withdraw),decimals:H("u8",a.decimals),balance:H(re.reified(i),a.balance)})}static fromFieldsWithTypes(i,a){if(!ii(a.type))throw new Error("not a Pool type");return xe(a,[i]),r.reified(i).new({id:S(Ge.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(Ge.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 Xe(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 Pool 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 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=F(o[0]),d=F(T(i));if(s!==F(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,ms(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"||!ii(s.data.bcs.type))throw new Error(`object at id ${o} is not a Pool object`);return r.fromSuiObjectData(a,s.data)}};ne();var sa=Ne(nt());import{bcs as ra}from"@mysten/sui/bcs";import{fromB64 as ps}from"@mysten/sui/utils";function oi(r){return r=F(r),r.startsWith(`${sa.PKG_V1}::user_deposit::UserDeposit<`)}var ri=class r{__StructClass=!0;static get $typeName(){return`${sa.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 D(r.reified(i))}static get p(){return r.phantom}static get bcs(){return ra.struct("UserDeposit",{id:Ge.bcs,lp_amount:ra.u64(),reward_debt:ra.u64()})}static fromFields(i,a){return r.reified(i).new({id:H(Ge.reified(),a.id),lpAmount:H("u64",a.lp_amount),rewardDebt:H("u64",a.reward_debt)})}static fromFieldsWithTypes(i,a){if(!oi(a.type))throw new Error("not a UserDeposit type");return xe(a,[i]),r.reified(i).new({id:S(Ge.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(Ge.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 Xe(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 UserDeposit 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 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=F(o[0]),d=F(T(i));if(s!==F(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,ps(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"||!oi(s.data.bcs.type))throw new Error(`object at id ${o} is not a UserDeposit object`);return r.fromSuiObjectData(a,s.data)}};function Bo(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 Yo(a,o,A,r);d+=BigInt(g.balance),A.push(g)}return d>=s?Yo(a,o,A,r):[]}function Yo(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 Cs="0x0000000000000000000000000000000000000000000000000000000000000000";async function Wo(r,i,a){let o=await r.devInspectTransactionBlock({sender:Cs,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 di=class extends ce{constructor(a,o){super();this.suiRpcUrl=a;this.api=o;this.client=new Is({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 Oe(s=>this.client.getOwnedObjects({owner:a,filter:{StructType:ri.phantom(D(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 si;ao(d,a.originTokenAddress,o.bridgeObjectAddress);let A=await Wo(this.client,d,ai.reified(D(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 Oe(m=>this.client.getCoins({owner:a.accountAddress,coinType:a.token.originTokenAddress,cursor:m}));if(s.length===0||!s[0])throw new Ke("No coins to deposit");let d=s[0],A=new si;A.setSender(a.accountAddress);let{depositObj:g,isNewDeposit:c}=await this.getDepositObject(a.accountAddress,a.token.originTokenAddress,A),[l]=Bo([a.amount],s,A);if(!l)throw new Ke("No coins to deposit");if(!a.token.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let u=to(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=D(o).phantomType;return{depositObj:oo(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=D(a.token.originTokenAddress).phantomType,d=new si;d.setSender(a.accountAddress);let{depositObj:A,isNewDeposit:g}=await this.getDepositObject(a.accountAddress,a.token.originTokenAddress,d);if(g)throw new Ke("No deposit found");let c=no(d,s,{bridge:o.bridgeObjectAddress,userDeposit:A,amountLp:BigInt(a.amount)}),l=await Oe(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=D(a.token.originTokenAddress).phantomType,d=new si;d.setSender(a.accountAddress);let{depositObj:A,isNewDeposit:g}=await this.getDepositObject(a.accountAddress,a.token.originTokenAddress,d);if(g)throw new Ke("No deposit found");let c=io(d,s,{bridge:o.bridgeObjectAddress,userDeposit:A}),l=await Oe(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 Ai}from"web3";import{encodeFunctionCall as bs}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 Ai.utils.toBigInt(p.result).toString()};return new q({lpAmount:Ai.utils.toBigInt(u(2)).toString(),rewardDebt:Ai.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 Ai.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 bs(s,o)}};var gi=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s;this.rawTxBuilder=new Un(i,a,this.params,s);let d=o.cachePoolInfoChainSec>0?o.cachePoolInfoChainSec*1e3:20*1e3;this.cache=new hs({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){X(i),L("amount",i,a.decimals);let s=await this.getPoolInfoFromChain(a,o),{vUsdBalance:d,tokenBalance:A,aValue:g,dValue:c}=s,l=bo(i,g,c,A,d);return Z(l,3).toFixed()}async getAmountToBeWithdrawn(i,a,o,s){X(i),L("amount",i,o.decimals);let d=await this.getPoolInfoFromChain(o,s),A=yo(i),g=be(A,o.decimals),l=(await this.getUserBalanceInfo(a,o,s)).earned(d)||"0",u=ys(g).plus(l).toFixed();return Z(u,o.decimals).toFixed()}async getUserBalanceInfo(i,a,o){return Zt(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 Zt(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 Zt(r,i,a,o,s){switch(V.getChainProperty(r).chainType){case"EVM":{if(s)return new an(s,i);{let d=a.getNodeRpcUrl(r),A=new Bs(d);return A.defaultReturnFormat={number:Ys.STR,bytes:Rs.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 vs({fullHost:d});return new rn(g,i,A)}}case"SOLANA":{let d=a.getNodeRpcUrl(r);return new En(d,i)}case"SRB":return new $n(a,o,i);case"SUI":return new di(a.getNodeRpcUrl(r),i);case"ALG":if(s){let d=s,A=Go.fromClients({algod:d});return new tn(A,i)}else{let d=a.getNodeRpcUrl(r),A=Go.fromConfig({algodConfig:{server:d}});return new tn(A,i)}}}import{TronWeb as Fs}from"tronweb";import{FMT_BYTES as Zs,FMT_NUMBER as fs,Web3 as Ns}from"web3";var Ws={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"}]},ci=Ws;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 Z(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 Z(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(ci.abi,a)}};var li=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 X(i.amount),L("amount",i.amount,i.token.decimals),X(i.minVirtualAmount),L("minVirtualAmount",i.minVirtualAmount,3),i.amount=f(i.amount,i.token.decimals).toFixed(),i.minVirtualAmount=f(i.minVirtualAmount,3).toFixed(),Vt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.owner,a).buildRawTransactionDeposit(i)}async withdraw(i,a){return X(i.amount),L("amount",i.amount,3),i.amount=f(i.amount,3).toFixed(),Vt(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 Z(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 Z(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(ci.abi,a)}};function Gs(r){if(!ui(r))throw new vn("Token does not support Yield")}function ui(r){return!!r.yieldAddress&&r.yieldId!==void 0}var mi=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s;this.rawTxBuilder=new li(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(ui);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 Vt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.owner,a).balanceOf(i)}async getEstimatedAmountOnDeposit(i,a){return X(i.amount),L("amount",i.amount,i.token.decimals),Vt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.token.yieldAddress,a).getEstimatedAmountOnDeposit(i)}async getWithdrawAmounts(i,a){X(i.amount),L("amount",i.amount,3);let o=await Vt(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:Z(o[s.yieldId],s.decimals).toFixed(),token:s}))}};function Vt(r,i,a,o,s){switch(V.getChainProperty(r).chainType){case"EVM":{if(s)return new sn(s,i);{let d=a.getNodeRpcUrl(r),A=new Ns(d);return A.defaultReturnFormat={number:fs.STR,bytes:Zs.HEX},new sn(A,i)}}case"TRX":{if(s)return new dn(s,i);{let d=a.getNodeRpcUrl(r),A=new Fs({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 fo(r,i,a){let o=Ts(r,{decimals:i.decimals,feeShare:i.feeShare},i.poolInfo),s=ws(o.amountIncludingCommissionInSystemPrecision,{decimals:a.decimals,feeShare:a.feeShare},a.poolInfo);return{swapToVUsdCalcResult:o,swapFromVUsdCalcResult:s}}function No(r,i,a){let o=Vs(r,{decimals:a.decimals,feeShare:a.feeShare},a.poolInfo),s=Xs(o.amountIncludingCommissionInSystemPrecision,{decimals:i.decimals,feeShare:i.feeShare},i.poolInfo);return{swapToVUsdCalcResult:o,swapFromVUsdCalcResult:s}}function Ts(r,{feeShare:i,decimals:a},o){let s=E(r),d=s.times(i),A=s.minus(d);return{bridgeFeeInTokenPrecision:d.round().toFixed(),amountIncludingCommissionInSystemPrecision:Fo(At(A,a),o),amountExcludingCommissionInSystemPrecision:Fo(At(s,a),o)}}function Fo(r,i){if(r.eq(0))return"0";let a=E(i.tokenBalance).plus(r),o=ke(a.toFixed(),i.aValue,i.dValue);return E(i.vUsdBalance).minus(o).round().toFixed()}function ws(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=ke(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 Vs(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:Zo(At(A,a),o),amountExcludingCommissionInSystemPrecision:Zo(At(r,a),o)}}function Zo(r,i){let a=E(i.tokenBalance).minus(r),o=ke(a.toFixed(),i.aValue,i.dValue);return E(o).minus(i.vUsdBalance).round().toFixed()}function Xs(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=ke(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 To(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:Z(c,i.decimals).neg().round(i.decimals,st.roundUp).toFixed(),swap:Z(st(r).minus(A).minus(c),i.decimals).neg().round(i.decimals,st.roundUp).toFixed()},destLPSwap:{fee:Z(l,o.decimals).neg().round(o.decimals,st.roundUp).toFixed(),swap:Z(be(d,o.decimals).minus(g).minus(l),o.decimals).neg().round(o.decimals,st.roundUp).toFixed()}}}import{AlgorandClient as wo}from"@algorandfoundation/algokit-utils";import{ABIMethod as Ss,OnApplicationComplete as Ms}from"algosdk";var pi=class{constructor(i){this.nodeRpcUrlsConfig=i}async checkAssetOptIn(i,a,o){let s=this.getAlgorand(o);typeof i=="string"&&(i=BigInt(i));let A=(await s.account.getInformation(a)).assets;return A?A.find(({assetId:c})=>c===i)!==void 0:!1}async checkAppOptIn(i,a,o){let s=this.getAlgorand(o);typeof i=="string"&&(i=BigInt(i));let A=(await s.account.getInformation(a)).appsLocalState;return A?A.find(({id:c})=>c===i)!==void 0:!1}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 je(d)}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 Ss({name:"optInToApplication",desc:void 0,args:[],returns:{type:"void",desc:void 0},events:[],readonly:!1}),args:[],sender:a,signer:A,onComplete:Ms.OptInOC});let{transactions:g}=await d.buildTransactions();return je(...g)}getAlgorand(i){if(i)return wo.fromClients({algod:i});{let a=this.nodeRpcUrlsConfig.getNodeRpcUrl("ALG");return wo.fromConfig({algodConfig:{server:a}})}}};import ks from"axios";var Vo="3.26.0-alpha.3";function Xo(r){return Object.entries(r).reduce((i,a)=>{let o=a[0],s=a[1],d=Js(o,s);return d&&(i[o]=d),i},{})}function So(r){let i={};for(let[a,o]of Object.entries(r)){let s=a;for(let d of o.tokens){let A=Xt({chainSymbol:s,poolAddress:d.poolAddress}),g=te(d.poolInfo);i[A]={...d.poolInfo,imbalance:g}}}return i}function Ls(r,i){let{name:a,...o}=r,{poolInfo:s,...d}=i;return{...d,...o,chainName:a}}function Hs(r){switch(r){case"allbridge":return 1;case"wormhole":return 2;case"cctp":return 3;case"cctpV2":return 4;case"oft":return 5}}function Ps(r){return Object.entries(r).reduce((i,[a,o])=>(i[a]=js(o),i),{})}function js(r){return Object.entries(r).reduce((i,[a,o])=>{let s=Hs(a);return s&&o!=null&&(i[s]=o),i},{})}function Js(r,i){let a=V.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:Ps(i.transferTime),txCostAmount:i.txCostAmount,confirmations:i.confirmations,suiAddresses:i.suiAddresses};return{...o,tokens:i.tokens.map(s=>Ls(o,s))}}function Xt(r){return r.chainSymbol+"_"+r.poolAddress}function Mo(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 Lo(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[Xt({chainSymbol:s,poolAddress:d})]=A}return i}var St=class{api;constructor(i){this.api=ks.create({baseURL:i.coreApiUrl,headers:{Accept:"application/json",...i.coreApiHeaders,"x-Sdk-Agent":"AllbridgeCoreSDK/"+Vo},params:i.coreApiQueryParams})}async getTokenInfo(){let{data:i}=await this.api.get("/token-info",{params:{filter:"all"}});return{chainDetailsMap:Xo(i),poolInfoMap:So(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 Lo(o)}};import Ci from"timed-cache";var da=20*1e3,zs=55*1e3,Mt=class{constructor(i){this.apiClient=i;this.tokenInfoCache=new Ci({defaultTtl:zs}),this.receivedTransactionCache=new Ci({defaultTtl:da}),this.pendingInfoCache=new Ci({defaultTtl:da}),this.gasBalanceCache=new Ci({defaultTtl:da})}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 Lt=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 Ht=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:Ho(d.tokens,i,this.isStaging)})}return o}async tokens(i){return Ho(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 Ho(r,i,a){return r.filter(o=>a?!0:o.flags[i]).map(xs)}function xs(r){let{flags:i,...a}=r;return a}import Os from"timed-cache";var Qs=55*1e3,Pt=class{constructor(i){this.client=i;this.poolInfoCache=new Aa}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[Xt(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(Mo(o.chainDetailsMap))}this.poolInfoCache.putAll(a)}cachePut(i,a){this.poolInfoCache.put(Xt(i),a)}},Aa=class{cache;constructor(){this.cache=new Os({defaultTtl:Qs})}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=Xt(i);return this.cache.get(a)}};import{AlgorandClient as jo}from"@algorandfoundation/algokit-utils";import{Big as nd}from"big.js";import{TronWeb as id}from"tronweb";import{Web3 as ad}from"web3";import{Big as Po}from"big.js";var le=class{async checkAllowance(i){let a=await this.getAllowance(i);return Po(a).gte(Po(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 Ks={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"}]},Ii=Ks;var Ds="0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",Us="0xdac17f958d2ee523a2206206994597c13d831ec7",Es=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()===Us}buildRawTransactionApprove(a){let{tokenAddress:o,spender:s,owner:d,amount:A}=a,c=this.getERC20Contract(o).methods.approve(s,A==null?Ds:kn(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=Es: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(Ii.abi,a)}};import{AnchorProvider as _s}from"@project-serum/anchor";import{Connection as $s,PublicKey as bi}from"@solana/web3.js";var yi=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 $s(this.solanaRpcUrl,"confirmed"),s=new bi(a);return new _s(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 bi(o),new bi(s.tokenAddress));return(await Yt(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 bi(a.account))).toString()}};import{Horizon as v2,NotFoundError as qs}from"@stellar/stellar-sdk";var hi=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 v2.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")),A;try{A=await d.loadAccount(a.account)}catch(l){if(l instanceof qs)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,V.getChainDecimalsByType(V.getChainProperty(a.token.chainSymbol).chainType)).toFixed():"0"}async getNativeTokenBalance(a){let A=(await new v2.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")).loadAccount(a.account)).balances.find(g=>g.asset_type==="native");return A?.balance?f(A.balance,V.getChainDecimalsByType(V.getChainProperty(a.chainSymbol).chainType)).toFixed():"0"}approve(){throw new k}buildRawTransactionApprove(){throw new k}};import{SuiClient as ed}from"@mysten/sui/client";var vi=class extends le{constructor(a,o){super();this.suiRpcUrl=a;this.api=o;this.suiClient=new ed({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 Oe(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 td="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 zn(this.tronWeb,o)}async buildRawTransactionApprove(a){let{tokenAddress:o,spender:s,owner:d,amount:A}=a,g=A==null?td:kn(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(Ii.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 Z(o,i.token.decimals).toFixed()}async checkAllowance(i,a){return X(i.amount),L("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&&(X(a.amount),L("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&&(X(i.amount),L("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?Z(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:Z(o,V.getChainDecimalsByType(V.getChainProperty(i.chainSymbol).chainType)).toFixed()}}getChainTokenService(i,a,o){switch(V.getChainProperty(i).chainType){case"EVM":{if(o)return new gn(o,this.api);{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i);return new gn(new ad(s),this.api)}}case"TRX":{if(o)return new cn(o,this.api);{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i),d=new id({fullHost:s});return d.setAddress(a),new cn(d,this.api)}}case"SOLANA":{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i);return new yi(s,this.api)}case"SRB":return new hi(this.nodeRpcUrlsConfig,this.params,this.api);case"SUI":return new vi(this.nodeRpcUrlsConfig.getNodeRpcUrl(i),this.api);case"ALG":if(o){let s=o,d=jo.fromClients({algod:s});return new An(d,this.api)}else{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i),d=jo.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:nd(i.amount).toFixed()}}};var Ri=class{constructor(i,a){this.nodeRpcUrlsConfig=i;this.params=a;let o=new St(a),s=new Mt(o),d=new Lt(s),A=new Pt(d);this.api=new Ht(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 od,PublicKey as rd,TransactionMessage as sd}from"@solana/web3.js";var Yi=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 od(this.nodeRpcUrlsConfig.getNodeRpcUrl("SOL"),"confirmed"),s=await ct(i,o),d=sd.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 rd(Buffer.from(a)),isSigner:!1,isWritable:!1}),i.message=d.compileToV0Message(s)}};import{Asset as gd,BASE_FEE as cd,contract as CB,Horizon as Jo,Operation as ld,Operation as ud,rpc as un,TimeoutInfinite as md,TransactionBuilder as ga,TransactionBuilder as ko}from"@stellar/stellar-sdk";import{contract as e}from"@stellar/stellar-sdk";var dd=e.Spec,Ad=e.Client;var ln=class extends Ad{constructor(a){super(new dd(["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 pd=100,Cd=180,Bi=class{constructor(i,a){this.nodeRpcUrlsConfig=i;this.params=a}async buildChangeTrustLineXdrTx(i){let o=await new Jo.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 gd(g,c),u=ud.changeTrust({asset:l,limit:i.limit});return new ko(o,{fee:pd.toString(10),networkPassphrase:this.params.sorobanNetworkPassphrase}).addOperation(u).setTimeout(Cd).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 Jo.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 Jo.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")),o=ko.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=ga.fromXDR(i,this.params.sorobanNetworkPassphrase),A=await o.simulateTransaction(d);if(un.Api.isSimulationRestore(A))return new ga(s,{fee:(+cd+ +A.restorePreamble.minResourceFee).toString(),networkPassphrase:this.params.sorobanNetworkPassphrase}).setSorobanData(A.restorePreamble.transactionData.build()).addOperation(ld.restoreFootprint({})).setTimeout(md).build().toXDR()}async sendTransactionSoroban(i){let a=new un.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")),o=ga.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 ua(()=>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 Wi=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 Ft(this.nodeRpcUrlsConfig,this.api)),this._suiBridgeService}};var Gi=class{constructor(i){this.service=i;this.srb=new Bi(i.nodeRpcUrlsConfig,i.params),this.sol=new Yi(i.nodeRpcUrlsConfig,i.params),this.sui=new Wi(i.nodeRpcUrlsConfig,i.api),this.evm=new Ri(i.nodeRpcUrlsConfig,i.params),this.alg=new pi(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;V.addChainsProperties(a.additionalChainsProperties);let o=new St(a),s=new Mt(o),d=new Lt(s),A=new Pt(d);this.api=new Ht(A,a),this.tokenService=new jt(this.api,i,a),this.bridge=new xn(this.api,i,a,this.tokenService),this.pool=new gi(this.api,i,a,this.tokenService),this.yield=new mi(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){X(i);let d;a=="float"?(L("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=ma(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:Ye(l.totalSentAmount,3,s.decimals).toFixed(0),float:Z(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){X(i),L("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 wi(o,d)}async calculateFeePercentOnDestinationChain(i,a,o){X(i),L("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 wi(g,A)}async getAmountToBeReceivedAndGasFeeOptions(i,a,o,s){return X(i),L("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 X(i),L("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){X(i),L("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){X(i),L("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=Ye(A,a.decimals,o.decimals).round(0);return Z(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=Ye(A,a.decimals,o.decimals).round(0);return Z(g,o.decimals).toFixed()}}}async getAmountToBeReceivedComputeOft(i,a,o){X(i),L("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=Ye(A,a.decimals,o.decimals).round(0);return Z(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){X(i),L("amountToBeReceivedFloat",i,o.decimals);let A=f(i,o.decimals),g=Ca(A,o,d),c=pa(g,a,s);if(ee(c).lte(0))throw new De;return Z(c,a.decimals).toFixed()}getAmountToSendComputeCctp(i,a,o,s){X(i),L("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=Ye(A,o.decimals,a.decimals).round(0);return Z(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=Ye(A,o.decimals,a.decimals).round(0);return Z(g,a.decimals).toFixed()}}}async getAmountToSendComputeOft(i,a,o){X(i),L("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=Ye(A,o.decimals,a.decimals).round(0);return Z(g,a.decimals).toFixed()}async getGasFeeOptions(i,a,o){return Vi(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 ba(i)}async getExtraGasMaxLimits(i,a,o){return await Xi(i,a,o,this.api)}async getVUsdFromAmount(i,a,o){X(i);let s;a=="float"?(L("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:Z(d,3).toFixed()}}async getAmountFromVUsd(i,a){return this.getAmountFromVUsdFormatted(i,a,await $(this.api,a))}getAmountFromVUsdFormatted(i,a,o){X(i);let s=Ot(i,a,o);if(ee(s).lt(0))throw new De;return{int:s,float:Z(s,a.decimals).toFixed()}}async swapAndBridgeFeeCalculation(i,a,o){return fo(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=No(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 De;return s}async getSendAmountDetails(i,a,o,s){X(i);let d;return a=="float"?(L("amount",i,o.decimals),d=f(i,o.decimals).toFixed()):d=i,To(d,o,await $(this.api,o),s,await $(this.api,s))}};function Id(r){return"solanaRpcUrl"in r}var zo=class{params;bridge;pool;yield;utils;service;constructor(i,a=Cn){let o;Id(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 Gi(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{fi as AddressStatus,zo as AllbridgeCoreSdk,Fn as AmountFormat,It as AmountNotEnoughError,yn as ArgumentInvalidDecimalsError,se as CCTPDoesNotSupportedError,Ie as ChainSymbol,z as ChainType,$o as ErrorCode,bn as ExtraGasMaxLimitExceededError,$e as FeePaymentMethod,De as InsufficientPoolLiquidityError,Ke as InvalidAmountError,Jt as InvalidGasFeePaymentOptionError,In as InvalidMessengerOptionError,bt as InvalidTxError,ie as JupiterError,Re as Messenger,k as MethodNotSupportedError,hn as NodeRpcUrlNotInitializedError,de as OFTDoesNotSupportedError,I as SdkError,K as SdkRootError,Hi as SolanaAutoTxFee,zt as TimeoutError,Rn as TxTooLargeError,kt as VerifyTxError,vn as YieldDoesNotSupportedError,Gs as assertYieldIsSupported,ui as isYieldSupported,Cn as mainnet,hd as nodeRpcUrlsDefault,yd as nodeUrlsDefault};
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+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gcmVzdWx0ID0gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSAtIHZVc2ROZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgLQogICAgZnJhbWVfYnVyeSAxCgpzd2FwVG9WVXNkX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzOAogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSA9IHZVc2ROZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzOQogICAgLy8gdGhpcy5hZGRSZXdhcmRzKGZlZSk7CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjYWxsc3ViIGFkZFJld2FyZHMKICAgIGZyYW1lX2J1cnkgMwogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgNAoKc3dhcFRvVlVzZF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNDIKICAgIC8vIGVtaXQ8U3dhcHBlZFRvVlVzZD4oeyB1c2VyLCBhc3NldDogdGhpcy5hc3NldC52YWx1ZS5pZCwgYW1vdW50LCByZXN1bHQsIGZlZSB9KTsKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgZGlnIDIKICAgIGl0b2IKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgZnJhbWVfZGlnIC0zCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDJiYmJlY2EzIC8vIG1ldGhvZCAiU3dhcHBlZFRvVlVzZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjQ0CiAgICAvLyB0aGlzLnZhbGlkYXRlQmFsYW5jZVJhdGlvKCk7CiAgICBjYWxsc3ViIHZhbGlkYXRlQmFsYW5jZVJhdGlvCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNDUKICAgIC8vIHJldHVybiByZXN1bHQ7CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnN3YXBGcm9tVlVzZCh1c2VyOiBieXRlcywgYW1vdW50OiB1aW50NjQsIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwgemVyb0ZlZTogdWludDY0KSAtPiB1aW50NjQ6CnN3YXBGcm9tVlVzZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI1OS0yNjQKICAgIC8vIHN3YXBGcm9tVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICAgemVyb0ZlZTogYm9vbGVhbiwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBwcm90byA0IDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNjUKICAgIC8vIHRoaXMub25seVJvdXRlcigpOwogICAgY2FsbHN1YiBvbmx5Um91dGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNjcKICAgIC8vIGxldCByZXN1bHRTUDogdWludDY0ID0gMDsgLy8gMCBieSBkZWZhdWx0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjY4LTI2OQogICAgLy8gbGV0IHJlc3VsdDogdWludDY0ID0gMDsgLy8gMCBieSBkZWZhdWx0CiAgICAvLyBsZXQgZmVlOiB1aW50NjQgPSAwOwogICAgZHVwbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNzAKICAgIC8vIGlmIChhbW91bnQgPiAwKSB7CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IHN3YXBGcm9tVlVzZF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjcxCiAgICAvLyB0aGlzLnZVc2RCYWxhbmNlLnZhbHVlICs9IGFtb3VudDsKICAgIGZyYW1lX2RpZyAtMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDIKICAgIC8vIHZVc2RCYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjcxCiAgICAvLyB0aGlzLnZVc2RCYWxhbmNlLnZhbHVlICs9IGFtb3VudDsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI3MgogICAgLy8gY29uc3QgbmV3QW1vdW50ID0gdGhpcy5nZXRZKHRoaXMudlVzZEJhbGFuY2UudmFsdWUpOwogICAgY2FsbHN1YiBnZXRZCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAxCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNzQKICAgIC8vIGlmICh0b2tlbkJhbGFuY2UgPiBuZXdBbW91bnQpIHsKICAgIDwKICAgIGJ6IHN3YXBGcm9tVlVzZF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI3NQogICAgLy8gcmVzdWx0U1AgPSB0b2tlbkJhbGFuY2UgLSBuZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIC0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNzYKICAgIC8vIHJlc3VsdCA9IHRoaXMuZnJvbVN5c3RlbVByZWNpc2lvbihyZXN1bHRTUCk7CiAgICBjYWxsc3ViIGZyb21TeXN0ZW1QcmVjaXNpb24KICAgIGZyYW1lX2J1cnkgMwoKc3dhcEZyb21WVXNkX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjgwCiAgICAvLyBhc3NlcnQocmVzdWx0U1AgPD0gdGhpcy5yZXNlcnZlcy52YWx1ZSwgJ1Bvb2w6IHJlc2VydmVzJyk7CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIDw9CiAgICBhc3NlcnQgLy8gUG9vbDogcmVzZXJ2ZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjgyCiAgICAvLyB0aGlzLnJlc2VydmVzLnZhbHVlIC09IHJlc3VsdFNQOwogICAgc3dhcAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIHJlc2VydmVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjgyCiAgICAvLyB0aGlzLnJlc2VydmVzLnZhbHVlIC09IHJlc3VsdFNQOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4MwogICAgLy8gaWYgKCF6ZXJvRmVlKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBzd2FwRnJvbVZVc2RfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOQogICAgLy8gZmVlU2hhcmVCUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAiZmVlU2hhcmVCUCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyODQKICAgIC8vIGZlZSA9IChyZXN1bHQgKiB0aGlzLmZlZVNoYXJlQlAudmFsdWUpIC8gQlA7CiAgICBmcmFtZV9kaWcgMwogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjg0CiAgICAvLyBmZWUgPSAocmVzdWx0ICogdGhpcy5mZWVTaGFyZUJQLnZhbHVlKSAvIEJQOwogICAgLwogICAgZnJhbWVfYnVyeSA0Cgpzd2FwRnJvbVZVc2RfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjg3CiAgICAvLyByZXN1bHQgLT0gZmVlOwogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjg5CiAgICAvLyB0aGlzLnRva2VuQmFsYW5jZS52YWx1ZSA9IG5ld0Ftb3VudDsKICAgIGZyYW1lX2RpZyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjkwCiAgICAvLyBhc3NlcnQocmVzdWx0ID49IHJlY2VpdmVBbW91bnRNaW4sICdQb29sOiBzbGlwcGFnZScpOwogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgID49CiAgICBhc3NlcnQgLy8gUG9vbDogc2xpcHBhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI5MS0yOTUKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IHJlc3VsdCwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogdXNlci5uYXRpdmUsCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyOTEtMjk1CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgIGFzc2V0QW1vdW50OiByZXN1bHQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHVzZXIubmF0aXZlLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjk2CiAgICAvLyB0aGlzLmFkZFJld2FyZHMoZmVlKTsKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFkZFJld2FyZHMKICAgIGZyYW1lX2J1cnkgNgogICAgZnJhbWVfYnVyeSA1Cgpzd2FwRnJvbVZVc2RfYWZ0ZXJfaWZfZWxzZUA3OgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjk4CiAgICAvLyBlbWl0PFN3YXBwZWRGcm9tVlVzZD4oeyB1c2VyLCBhc3NldDogdGhpcy5hc3NldC52YWx1ZS5pZCwgYW1vdW50LCByZXN1bHQsIGZlZSB9KTsKICAgIGZyYW1lX2RpZyAtMwogICAgaXRvYgogICAgZGlnIDIKICAgIGl0b2IKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgZnJhbWVfZGlnIC00CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGQzZjFkNTQyIC8vIG1ldGhvZCAiU3dhcHBlZEZyb21WVXNkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDAKICAgIC8vIHRoaXMudmFsaWRhdGVCYWxhbmNlUmF0aW8oKTsKICAgIGNhbGxzdWIgdmFsaWRhdGVCYWxhbmNlUmF0aW8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMwMQogICAgLy8gcmV0dXJuIHJlc3VsdDsKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuc2V0RmVlU2hhcmUoZmVlU2hhcmVCUDogdWludDY0KSAtPiB2b2lkOgpzZXRGZWVTaGFyZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMwNwogICAgLy8gc2V0RmVlU2hhcmUoZmVlU2hhcmVCUDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMwOAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDkKICAgIC8vIGFzc2VydChmZWVTaGFyZUJQIDw9IEJQLCAnUG9vbDogdG9vIGxhcmdlJyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxOQogICAgLy8gZXhwb3J0IGNvbnN0IEJQOiB1aW50NjQgPSAxMF8wMDA7CiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMwOQogICAgLy8gYXNzZXJ0KGZlZVNoYXJlQlAgPD0gQlAsICdQb29sOiB0b28gbGFyZ2UnKTsKICAgIDw9CiAgICBhc3NlcnQgLy8gUG9vbDogdG9vIGxhcmdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOQogICAgLy8gZmVlU2hhcmVCUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDE1IC8vICJmZWVTaGFyZUJQIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzEwCiAgICAvLyB0aGlzLmZlZVNoYXJlQlAudmFsdWUgPSBmZWVTaGFyZUJQOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuYWRqdXN0VG90YWxMcEFtb3VudCgpIC0+IHZvaWQ6CmFkanVzdFRvdGFsTHBBbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMTMKICAgIC8vIGFkanVzdFRvdGFsTHBBbW91bnQoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMxNAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NgogICAgLy8gZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAidG90YWxTdXBwbHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMTgKICAgIC8vIGlmIChkID4gdG90YWxTdXBwbHkpIHsKICAgID4KICAgIGJ6IGFkanVzdFRvdGFsTHBBbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMTkKICAgIC8vIHRoaXMuZGVwb3NpdExwKFR4bi5zZW5kZXIsIGQgLSB0b3RhbFN1cHBseSk7CiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIGNhbGxzdWIgZGVwb3NpdExwCgphZGp1c3RUb3RhbExwQW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnNldEJhbGFuY2VSYXRpb01pbkJQKGJhbGFuY2VSYXRpb01pbkJQOiB1aW50NjQpIC0+IHZvaWQ6CnNldEJhbGFuY2VSYXRpb01pbkJQOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzI2CiAgICAvLyBzZXRCYWxhbmNlUmF0aW9NaW5CUChiYWxhbmNlUmF0aW9NaW5CUDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMyNwogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMjgKICAgIC8vIGFzc2VydChiYWxhbmNlUmF0aW9NaW5CUCA8PSBCUCwgJ1Bvb2w6IHRvbyBsYXJnZScpOwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTkKICAgIC8vIGV4cG9ydCBjb25zdCBCUDogdWludDY0ID0gMTBfMDAwOwogICAgaW50YyA0IC8vIDEwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMjgKICAgIC8vIGFzc2VydChiYWxhbmNlUmF0aW9NaW5CUCA8PSBCUCwgJ1Bvb2w6IHRvbyBsYXJnZScpOwogICAgPD0KICAgIGFzc2VydCAvLyBQb29sOiB0b28gbGFyZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzCiAgICAvLyBiYWxhbmNlUmF0aW9NaW5CUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDE2IC8vICJiYWxhbmNlUmF0aW9NaW5CUCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMyOQogICAgLy8gdGhpcy5iYWxhbmNlUmF0aW9NaW5CUC52YWx1ZSA9IGJhbGFuY2VSYXRpb01pbkJQOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuc3RvcERlcG9zaXQoKSAtPiB2b2lkOgpzdG9wRGVwb3NpdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzMwogICAgLy8gdGhpcy5vbmx5U3RvcEF1dGhvcml0eSgpOwogICAgY2FsbHN1YiBvbmx5U3RvcEF1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIGNhbkRlcG9zaXQgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyBkZXBvc2l0IG9wZXJhdGlvbiBhbGxvd2VkCiAgICBieXRlYyAxMiAvLyAiY2FuRGVwb3NpdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzNAogICAgLy8gdGhpcy5jYW5EZXBvc2l0LnZhbHVlID0gZmFsc2U7CiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnN0YXJ0RGVwb3NpdCgpIC0+IHZvaWQ6CnN0YXJ0RGVwb3NpdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzOAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MgogICAgLy8gY2FuRGVwb3NpdCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOy8vIGlzIGRlcG9zaXQgb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEyIC8vICJjYW5EZXBvc2l0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzM5CiAgICAvLyB0aGlzLmNhbkRlcG9zaXQudmFsdWUgPSB0cnVlOwogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zdG9wV2l0aGRyYXcoKSAtPiB2b2lkOgpzdG9wV2l0aGRyYXc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIHRoaXMub25seVN0b3BBdXRob3JpdHkoKTsKICAgIGNhbGxzdWIgb25seVN0b3BBdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUzCiAgICAvLyBjYW5XaXRoZHJhdyA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOy8vIGlzIHdpdGhkcmF3biBvcGVyYXRpb24gYWxsb3dlZAogICAgYnl0ZWMgMTMgLy8gImNhbldpdGhkcmF3IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQ0CiAgICAvLyB0aGlzLmNhbldpdGhkcmF3LnZhbHVlID0gZmFsc2U7CiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnN0YXJ0V2l0aGRyYXcoKSAtPiB2b2lkOgpzdGFydFdpdGhkcmF3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQ4CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUzCiAgICAvLyBjYW5XaXRoZHJhdyA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOy8vIGlzIHdpdGhkcmF3biBvcGVyYXRpb24gYWxsb3dlZAogICAgYnl0ZWMgMTMgLy8gImNhbldpdGhkcmF3IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQ5CiAgICAvLyB0aGlzLmNhbldpdGhkcmF3LnZhbHVlID0gdHJ1ZTsKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuc2V0U3RvcEF1dGhvcml0eShzdG9wQXV0aG9yaXR5OiBieXRlcykgLT4gdm9pZDoKc2V0U3RvcEF1dGhvcml0eToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM1MgogICAgLy8gc2V0U3RvcEF1dGhvcml0eShzdG9wQXV0aG9yaXR5OiBBZGRyZXNzKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM1MwogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MQogICAgLy8gcHJpdmF0ZSBzdG9wQXV0aG9yaXR5ID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBjYW4gcmVzdHJpY3QgZGVwb3NpdCBvciB3aXRoZHJhdyBvcGVyYXRpb25zCiAgICBieXRlYyAyMiAvLyAic3RvcEF1dGhvcml0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gdGhpcy5zdG9wQXV0aG9yaXR5LnZhbHVlID0gc3RvcEF1dGhvcml0eTsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnNldFJvdXRlcihyb3V0ZXI6IGJ5dGVzKSAtPiB2b2lkOgpzZXRSb3V0ZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTcKICAgIC8vIHNldFJvdXRlcihyb3V0ZXI6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwCiAgICAvLyByb3V0ZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOy8vIGlzIGRlcG9zaXQgb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDIxIC8vICJyb3V0ZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTkKICAgIC8vIHRoaXMucm91dGVyLnZhbHVlID0gcm91dGVyOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuZ2V0WSh4OiB1aW50NjQpIC0+IHVpbnQ2NDoKZ2V0WToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM2NQogICAgLy8gcHJpdmF0ZSBnZXRZKHg6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM2NgogICAgLy8gY29uc3QgeF8gPSBCaWdVaW50KHgpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM2NwogICAgLy8gY29uc3QgZF8gPSBCaWdVaW50KHRoaXMuZC52YWx1ZSk7CiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ1CiAgICAvLyBhID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM2OAogICAgLy8gY29uc3QgYTQgPSBCaWdVaW50KHRoaXMuYS52YWx1ZSA8PCAyKTsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBzaGwKICAgIGl0b2IKICAgIGR1cAogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzY5CiAgICAvLyBjb25zdCBhOCA9IEJpZ1VpbnQoYTQgKiAybik7CiAgICBieXRlYyAxNyAvLyAweDAyCiAgICBiKgogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzcxCiAgICAvLyBjb25zdCBkTWludXNYSXNQb3NpdGl2ZSA9IGRfID49IHhfOwogICAgYjw9CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM3MgogICAgLy8gY29uc3QgZE1pbnVzWEFiczogYmlndWludCA9IGRNaW51c1hJc1Bvc2l0aXZlID8gKGRfIC0geF8pIDogKHhfIC0gZF8pOwogICAgYnogZ2V0WV90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgYi0KCmdldFlfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mzc0CiAgICAvLyBjb25zdCBhNEJ5RE1pbnVzWEFiczogYmlndWludCA9IGE0ICogZE1pbnVzWEFiczsKICAgIGZyYW1lX2RpZyA0CiAgICBiKgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNzkKICAgIC8vIGlmIChkTWludXNYSXNQb3NpdGl2ZSkgewogICAgZnJhbWVfZGlnIDYKICAgIGJ6IGdldFlfZWxzZV9ib2R5QDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM4MAogICAgLy8gaWYgKGE0QnlETWludXNYQWJzID49IGRfKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDMKICAgIGI+PQogICAgYnogZ2V0WV9lbHNlX2JvZHlANgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzgxCiAgICAvLyBwYXJ0MUFicyA9IGE0QnlETWludXNYQWJzIC0gZF87CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDMKICAgIGItCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM4MgogICAgLy8gcGFydDFJc1Bvc2l0aXZlID0gdHJ1ZTsKICAgIGludGNfMSAvLyAxCgpnZXRZX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM5MwogICAgLy8gY29uc3QgcGFydDI6IGJpZ3VpbnQgPSBCaWdVaW50KHgpICogKGE0ICogZF8gKiBkXyAqIGRfICsgeF8gKiAocGFydDFBYnMgKiBwYXJ0MUFicykpOwogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGIqCiAgICBkaWcgMQogICAgYioKICAgIGIqCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBiKgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBiKgogICAgdW5jb3ZlciAyCiAgICBiKwogICAgYioKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM5NAogICAgLy8gbGV0IG51bWVyYXRvcjogYmlndWludCA9IHRoaXMuc3FydChwYXJ0Mik7CiAgICBjYWxsc3ViIHNxcnQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM5NwogICAgLy8gaWYgKHBhcnQxSXNQb3NpdGl2ZSkgewogICAgYnogZ2V0WV9lbHNlX2JvZHlAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM5OAogICAgLy8gbnVtZXJhdG9yICs9IHhfICogcGFydDFBYnM7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIGIqCiAgICBiKwoKZ2V0WV9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDA0CiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKG51bWVyYXRvciAvIChhOCAqIHhfKSArIDFuKTsgLy8gKzEgdG8gb2Zmc2V0IHJvdW5kaW5nIGVycm9ycwogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyAyCiAgICBiKgogICAgYi8KICAgIGJ5dGVjIDEwIC8vIDB4MDEKICAgIGIrCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFlfZWxzZV9ib2R5QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDAwCiAgICAvLyBudW1lcmF0b3IgLT0geF8gKiBwYXJ0MUFiczsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgYioKICAgIGItCiAgICBiIGdldFlfYWZ0ZXJfaWZfZWxzZUAxMgoKZ2V0WV9lbHNlX2JvZHlANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM4NAogICAgLy8gcGFydDFBYnMgPSBkXyAtIGE0QnlETWludXNYQWJzOwogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAwCiAgICBiLQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozODUKICAgIC8vIHBhcnQxSXNQb3NpdGl2ZSA9IGZhbHNlOwogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0WV9hZnRlcl9pZl9lbHNlQDkKCmdldFlfZWxzZV9ib2R5QDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozODgKICAgIC8vIHBhcnQxQWJzID0gYTRCeURNaW51c1hBYnMgKyBkXzsKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMwogICAgYisKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mzg5CiAgICAvLyBwYXJ0MUlzUG9zaXRpdmUgPSBmYWxzZTsKICAgIGludGNfMCAvLyAwCiAgICBiIGdldFlfYWZ0ZXJfaWZfZWxzZUA5CgpnZXRZX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM3MgogICAgLy8gY29uc3QgZE1pbnVzWEFiczogYmlndWludCA9IGRNaW51c1hJc1Bvc2l0aXZlID8gKGRfIC0geF8pIDogKHhfIC0gZF8pOwogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAzCiAgICBiLQogICAgYiBnZXRZX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnVwZGF0ZUQoKSAtPiB2b2lkOgp1cGRhdGVEOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDA3CiAgICAvLyBwcml2YXRlIHVwZGF0ZUQoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MDgKICAgIC8vIGNvbnN0IHggPSBCaWdVaW50KHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlKTsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDA5CiAgICAvLyBjb25zdCB5ID0gQmlnVWludCh0aGlzLnZVc2RCYWxhbmNlLnZhbHVlKTsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxNAogICAgLy8gY29uc3QgeHk6IGJpZ3VpbnQgPSB4ICogeTsKICAgIGR1cDIKICAgIGIqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NQogICAgLy8gYSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MTUKICAgIC8vIGNvbnN0IGFfID0gQmlnVWludCh0aGlzLmEudmFsdWUpOwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDE3CiAgICAvLyBjb25zdCBwMTogYmlndWludCA9IGFfICogeHkgKiAoeCArIHkpOwogICAgZHVwCiAgICBkaWcgMgogICAgYioKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICBiKwogICAgYioKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDE5CiAgICAvLyBjb25zdCBwMjogYmlndWludCA9ICh4eSAqICgoYV8gKiA0bikgLSAxbikpIC8gM247CiAgICBwdXNoYnl0ZXMgMHgwNAogICAgYioKICAgIGJ5dGVjIDEwIC8vIDB4MDEKICAgIGItCiAgICB1bmNvdmVyIDIKICAgIGIqCiAgICBieXRlYyAyNiAvLyAweDAzCiAgICBiLwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDIxCiAgICAvLyBjb25zdCBwMzogYmlndWludCA9IHRoaXMuc3FydCgocDEgKiBwMSkgKyAocDIgKiBwMiAqIHAyKSk7CiAgICBkaWcgMQogICAgZGlnIDIKICAgIGIqCiAgICBkaWcgMQogICAgZGlnIDIKICAgIGIqCiAgICB1bmNvdmVyIDIKICAgIGIqCiAgICBiKwogICAgY2FsbHN1YiBzcXJ0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyMgogICAgLy8gbGV0IGRfID0gdGhpcy5jYnJ0KHAxICsgcDMpOwogICAgZHVwMgogICAgYisKICAgIGNhbGxzdWIgY2JydAogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDIzCiAgICAvLyBpZiAocDMgPiBwMSkgewogICAgYjwKICAgIGJ6IHVwZGF0ZURfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyNAogICAgLy8gZF8gLT0gdGhpcy5jYnJ0KHAzIC0gcDEpOwogICAgZnJhbWVfZGlnIDAKICAgIGItCiAgICBjYWxsc3ViIGNicnQKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICAtCiAgICBmcmFtZV9idXJ5IDEKCnVwZGF0ZURfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDI4CiAgICAvLyB0aGlzLmQudmFsdWUgPSAoZF8gPDwgMSk7CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18xIC8vIDEKICAgIHNobAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYKICAgIC8vIGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWMgNiAvLyAiZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyOAogICAgLy8gdGhpcy5kLnZhbHVlID0gKGRfIDw8IDEpOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKdXBkYXRlRF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyNgogICAgLy8gZF8gKz0gdGhpcy5jYnJ0KHAxIC0gcDMpOwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGItCiAgICBjYWxsc3ViIGNicnQKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgdXBkYXRlRF9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC50b1N5c3RlbVByZWNpc2lvbihhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0Ogp0b1N5c3RlbVByZWNpc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzMQogICAgLy8gcHJpdmF0ZSB0b1N5c3RlbVByZWNpc2lvbihhbW91bnQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyBwcml2YXRlIHRva2VuQW1vdW50UmVkdWNlID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJ0b2tlbkFtb3VudFJlZHVjZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDkKICAgIC8vIHByaXZhdGUgdG9rZW5BbW91bnRJbmNyZWFzZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAidG9rZW5BbW91bnRJbmNyZWFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MzUKICAgIC8vIGlmICh0b2tlbkFtb3VudFJlZHVjZSA+IDApIHsKICAgIGJ6IHRvU3lzdGVtUHJlY2lzaW9uX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MzYKICAgIC8vIHJldHVybiBhbW91bnQgLyB0b2tlbkFtb3VudFJlZHVjZTsKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDAKICAgIC8KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp0b1N5c3RlbVByZWNpc2lvbl9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzNwogICAgLy8gfSBlbHNlIGlmICh0b2tlbkFtb3VudEluY3JlYXNlID4gMCkgewogICAgZnJhbWVfZGlnIDEKICAgIGJ6IHRvU3lzdGVtUHJlY2lzaW9uX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDM4CiAgICAvLyByZXR1cm4gYW1vdW50ICogdG9rZW5BbW91bnRJbmNyZWFzZTsKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDEKICAgICoKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp0b1N5c3RlbVByZWNpc2lvbl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NDAKICAgIC8vIHJldHVybiBhbW91bnQ7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuZnJvbVN5c3RlbVByZWNpc2lvbihhbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0Ogpmcm9tU3lzdGVtUHJlY2lzaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQzCiAgICAvLyBwcml2YXRlIGZyb21TeXN0ZW1QcmVjaXNpb24oYW1vdW50OiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OAogICAgLy8gcHJpdmF0ZSB0b2tlbkFtb3VudFJlZHVjZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAidG9rZW5BbW91bnRSZWR1Y2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ5CiAgICAvLyBwcml2YXRlIHRva2VuQW1vdW50SW5jcmVhc2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjQgLy8gInRva2VuQW1vdW50SW5jcmVhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQ3CiAgICAvLyBpZiAodG9rZW5BbW91bnRSZWR1Y2UgPiAwKSB7CiAgICBieiBmcm9tU3lzdGVtUHJlY2lzaW9uX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NDgKICAgIC8vIHJldHVybiBhbW91bnQgKiB0b2tlbkFtb3VudFJlZHVjZTsKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDAKICAgICoKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpmcm9tU3lzdGVtUHJlY2lzaW9uX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQ5CiAgICAvLyB9IGVsc2UgaWYgKHRva2VuQW1vdW50SW5jcmVhc2UgPiAwKSB7CiAgICBmcmFtZV9kaWcgMQogICAgYnogZnJvbVN5c3RlbVByZWNpc2lvbl9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ1MAogICAgLy8gcmV0dXJuIGFtb3VudCAvIHRva2VuQW1vdW50SW5jcmVhc2U7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAxCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZnJvbVN5c3RlbVByZWNpc2lvbl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTIKICAgIC8vIHJldHVybiBhbW91bnQ7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuc3FydChuOiBieXRlcykgLT4gYnl0ZXM6CnNxcnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTUKICAgIC8vIHByaXZhdGUgc3FydChuOiBiaWd1aW50KTogYmlndWludCB7CiAgICBwcm90byAxIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ1NgogICAgLy8gYXNzZXJ0KG4gPiAwbiwgJ24gbXVzdCBiZSBub24tbmVnYXRpdmUnKTsKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGJ5dGVzIDB4CiAgICBiPgogICAgYXNzZXJ0IC8vIG4gbXVzdCBiZSBub24tbmVnYXRpdmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ1NwogICAgLy8gaWYgKG4gPT09IDBuKSByZXR1cm4gMG47CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hieXRlcyAweAogICAgYj09CiAgICBieiBzcXJ0X2FmdGVyX2lmX2Vsc2VAMgogICAgcHVzaGJ5dGVzIDB4CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc3FydF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTgKICAgIC8vIGlmIChuIDw9IDNuKSByZXR1cm4gMW47CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjIDI2IC8vIDB4MDMKICAgIGI8PQogICAgYnogc3FydF9hZnRlcl9pZl9lbHNlQDQKICAgIGJ5dGVjIDEwIC8vIDB4MDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpzcXJ0X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2MQogICAgLy8gY29uc3QgYmwgPSBiaXRMZW5ndGgoQnl0ZXMobikpOwogICAgZnJhbWVfZGlnIC0xCiAgICBiaXRsZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2MgogICAgLy8gbGV0IHdpZGUgPSBleHB3KDIsIChibCArIDEpIC8gMik7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgcHVzaGludCAyIC8vIDIKICAgIC8KICAgIHB1c2hpbnQgMiAvLyAyCiAgICBzd2FwCiAgICBleHB3CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjMKICAgIC8vIGNvbnN0IGhpID0gQmlnVWludCh3aWRlWzBdKTsKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2NAogICAgLy8gY29uc3QgbG8gPSBCaWdVaW50KHdpZGVbMV0pOwogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDY1CiAgICAvLyBsZXQgeDogYmlndWludCA9IGhpICogU0hJRlQ2NCArIGxvOwogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjIKICAgIC8vIGNvbnN0IFNISUZUNjQ6IGJpZ3VpbnQgPSAxODQ0Njc0NDA3MzcwOTU1MTYxNm47IC8vIDJeNjQKICAgIGJ5dGVjIDI3IC8vIDB4MDEwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjUKICAgIC8vIGxldCB4OiBiaWd1aW50ID0gaGkgKiBTSElGVDY0ICsgbG87CiAgICBiKgogICAgYisKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjgKICAgIC8vIGxldCB5OiBiaWd1aW50ID0gKHggKyBuIC8geCkgLyAybjsKICAgIGZyYW1lX2RpZyAtMQogICAgZGlnIDEKICAgIGIvCiAgICBiKwogICAgYnl0ZWMgMTcgLy8gMHgwMgogICAgYi8KICAgIGZyYW1lX2J1cnkgMQoKc3FydF93aGlsZV90b3BANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2OQogICAgLy8gd2hpbGUgKHkgPCB4KSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIGI8CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjktNDcyCiAgICAvLyB3aGlsZSAoeSA8IHgpIHsKICAgIC8vICAgeCA9IHk7CiAgICAvLyAgIHkgPSAoeCArIG4gLyB4KSAvIDJuOwogICAgLy8gfQogICAgYnogc3FydF9hZnRlcl93aGlsZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NzEKICAgIC8vIHkgPSAoeCArIG4gLyB4KSAvIDJuOwogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBiLwogICAgZGlnIDEKICAgIGIrCiAgICBieXRlYyAxNyAvLyAweDAyCiAgICBiLwogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgc3FydF93aGlsZV90b3BANQoKc3FydF9hZnRlcl93aGlsZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDczCiAgICAvLyByZXR1cm4geDsKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmNicnQobjogYnl0ZXMpIC0+IHVpbnQ2NDoKY2JydDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ3NgogICAgLy8gcHJpdmF0ZSBjYnJ0KG46IGJpZ3VpbnQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NzcKICAgIC8vIGlmIChuID09PSAwbikgcmV0dXJuIDA7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hieXRlcyAweAogICAgYj09CiAgICBieiBjYnJ0X2FmdGVyX2lmX2Vsc2VAMgogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpjYnJ0X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ3OAogICAgLy8gaWYgKG4gPCA4bikgcmV0dXJuIDE7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hieXRlcyAweDA4CiAgICBiPAogICAgYnogY2JydF9hZnRlcl9pZl9lbHNlQDQKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY2JydF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0ODEKICAgIC8vIGNvbnN0IGJsID0gYml0TGVuZ3RoKEJ5dGVzKG4pKTsKICAgIGZyYW1lX2RpZyAtMQogICAgYml0bGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0ODIKICAgIC8vIGxldCB3aWRlID0gZXhwdygyLCAoYmwgKyAyKSAvIDMpOwogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAvCiAgICBwdXNoaW50IDIgLy8gMgogICAgc3dhcAogICAgZXhwdwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDgzCiAgICAvLyBjb25zdCBoaSA9IEJpZ1VpbnQod2lkZVswXSk7CiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0ODQKICAgIC8vIGNvbnN0IGxvID0gQmlnVWludCh3aWRlWzFdKTsKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ4NQogICAgLy8gbGV0IHg6IGJpZ3VpbnQgPSBoaSAqIFNISUZUNjQgKyBsbzsKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyCiAgICAvLyBjb25zdCBTSElGVDY0OiBiaWd1aW50ID0gMTg0NDY3NDQwNzM3MDk1NTE2MTZuOyAvLyAyXjY0CiAgICBieXRlYyAyNyAvLyAweDAxMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDg1CiAgICAvLyBsZXQgeDogYmlndWludCA9IGhpICogU0hJRlQ2NCArIGxvOwogICAgYioKICAgIGIrCiAgICBmcmFtZV9idXJ5IDEKCmNicnRfd2hpbGVfdG9wQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0ODkKICAgIC8vIGNvbnN0IHgyOiBiaWd1aW50ID0geCAqIHg7CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBiKgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ5MAogICAgLy8gaWYgKHgyID09PSAwbikgYnJlYWs7IC8vIHNob3VsZCBub3QgaGFwcGVuIGZvciB4PjAKICAgIHB1c2hieXRlcyAweAogICAgYj09CiAgICBibnogY2JydF93aGlsZV90b3BAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ5MQogICAgLy8gY29uc3QgbmV4dDogYmlndWludCA9ICgybiAqIHggKyBuIC8geDIpIC8gM247CiAgICBieXRlYyAxNyAvLyAweDAyCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBiKgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMwogICAgYi8KICAgIGIrCiAgICBieXRlYyAyNiAvLyAweDAzCiAgICBiLwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ5MgogICAgLy8gaWYgKG5leHQgPT09IHggfHwgbmV4dCA9PT0geCAtIDFuKSB7CiAgICBiPT0KICAgIGJueiBjYnJ0X2lmX2JvZHlAMTAKICAgIGZyYW1lX2RpZyAxCiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBiLQogICAgZnJhbWVfZGlnIDAKICAgIGI9PQogICAgYnogY2JydF9hZnRlcl9pZl9lbHNlQDExCgpjYnJ0X2lmX2JvZHlAMTA6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfYnVyeSAxCgpjYnJ0X3doaWxlX3RvcEAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUwMAogICAgLy8gd2hpbGUgKCh4ICsgMW4pICogKHggKyAxbikgKiAoeCArIDFuKSA8PSBuKSB4ICs9IDFuOwogICAgZnJhbWVfZGlnIDEKICAgIGJ5dGVjIDEwIC8vIDB4MDEKICAgIGIrCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZHVwCiAgICBkaWcgMQogICAgYioKICAgIGIqCiAgICBmcmFtZV9kaWcgLTEKICAgIGI8PQogICAgYnogY2JydF93aGlsZV90b3BAMTcKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgY2JydF93aGlsZV90b3BAMTQKCmNicnRfd2hpbGVfdG9wQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTAxCiAgICAvLyB3aGlsZSAoeCAqIHggKiB4ID4gbikgeCAtPSAxbjsKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGRpZyAxCiAgICBiKgogICAgYioKICAgIGZyYW1lX2RpZyAtMQogICAgYj4KICAgIGJ6IGNicnRfYWZ0ZXJfd2hpbGVAMTkKICAgIGZyYW1lX2RpZyAxCiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBiLQogICAgZnJhbWVfYnVyeSAxCiAgICBiIGNicnRfd2hpbGVfdG9wQDE3CgpjYnJ0X2FmdGVyX3doaWxlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTAyCiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKHgpOwogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgYmlndWludFRvVWludDY0TW9kdWxvCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY2JydF9hZnRlcl9pZl9lbHNlQDExOgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgMQogICAgYiBjYnJ0X3doaWxlX3RvcEA1CgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLmNsYWltUmV3YXJkcygpIC0+IHZvaWQ6CmNsYWltUmV3YXJkczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1MC01MQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBjbGFpbVJld2FyZHMoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTIKICAgIC8vIGNvbnN0IHVzZXIgPSBUeG4uc2VuZGVyOwogICAgdHhuIFNlbmRlcgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTMKICAgIC8vIGNvbnN0IHVzZXJMcEFtb3VudCA9IHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTMKICAgIC8vIGNvbnN0IHVzZXJMcEFtb3VudCA9IHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZTsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1NAogICAgLy8gaWYgKHVzZXJMcEFtb3VudCA+IDApIHsKICAgIGJ6IGNsYWltUmV3YXJkc19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1NQogICAgLy8gY29uc3QgcmV3YXJkcyA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhCaWdVaW50KHVzZXJMcEFtb3VudCkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSAvIFBfU0NBTEUpOwogICAgZnJhbWVfZGlnIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMAogICAgLy8gYWNjUmV3YXJkUGVyU2hhcmVQID0gR2xvYmFsU3RhdGU8YmlndWludD4oeyBpbml0aWFsVmFsdWU6IDBuIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImFjY1Jld2FyZFBlclNoYXJlUCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTUKICAgIC8vIGNvbnN0IHJld2FyZHMgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oQmlnVWludCh1c2VyTHBBbW91bnQpICogdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgLyBQX1NDQUxFKTsKICAgIGIqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjAKICAgIC8vIGNvbnN0IFBfU0NBTEU6IGJpZ3VpbnQgPSBCaWdVaW50KDEgPDwgUCk7CiAgICBieXRlYyA5IC8vIDB4MDEwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1NQogICAgLy8gY29uc3QgcmV3YXJkcyA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhCaWdVaW50KHVzZXJMcEFtb3VudCkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSAvIFBfU0NBTEUpOwogICAgYi8KICAgIGNhbGxzdWIgYmlndWludFRvVWludDY0TW9kdWxvCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjU2CiAgICAvLyBjb25zdCBwZW5kaW5nOiB1aW50NjQgPSByZXdhcmRzIC0gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZTsKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTYKICAgIC8vIGNvbnN0IHBlbmRpbmc6IHVpbnQ2NCA9IHJld2FyZHMgLSB0aGlzLnVzZXJSZXdhcmREZWJ0KHVzZXIpLnZhbHVlOwogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjU3CiAgICAvLyBpZiAocGVuZGluZyA+IDApIHsKICAgIGJ6IGNsYWltUmV3YXJkc19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1OAogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZSA9IHJld2FyZHM7CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzQKICAgIC8vIHVzZXJSZXdhcmREZWJ0ID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA1IC8vICJ1c2VyUmV3YXJkRGVidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1OAogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZSA9IHJld2FyZHM7CiAgICBmcmFtZV9kaWcgMQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjU5CiAgICAvLyBhc3NldFRyYW5zZmVyKHsgeGZlckFzc2V0OiB0aGlzLmFzc2V0LnZhbHVlLCBhc3NldEFtb3VudDogcGVuZGluZywgYXNzZXRSZWNlaXZlcjogdXNlciB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjU5CiAgICAvLyBhc3NldFRyYW5zZmVyKHsgeGZlckFzc2V0OiB0aGlzLmFzc2V0LnZhbHVlLCBhc3NldEFtb3VudDogcGVuZGluZywgYXNzZXRSZWNlaXZlcjogdXNlciB9KS5zdWJtaXQoKTsKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjAKICAgIC8vIGVtaXQ8UmV3YXJkc0NsYWltZWQ+KHsgdXNlcjogbmV3IEFkZHJlc3ModXNlciksIHBlbmRpbmcgfSk7CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDI1IC8vIG1ldGhvZCAiUmV3YXJkc0NsYWltZWQoYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKCmNsYWltUmV3YXJkc19hZnRlcl9pZl9lbHNlQDU6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6OlJld2FyZE1hbmFnZXIuc2V0QWRtaW5GZWVTaGFyZShhZG1pbkZlZVNoYXJlQlA6IHVpbnQ2NCkgLT4gdm9pZDoKc2V0QWRtaW5GZWVTaGFyZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo2NS02NgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBzZXRBZG1pbkZlZVNoYXJlKGFkbWluRmVlU2hhcmVCUDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo2NwogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjgKICAgIC8vIGFzc2VydChhZG1pbkZlZVNoYXJlQlAgPD0gQlAsICdSZXdhcmRNYW5hZ2VyOiB0b28gaGlnaCcpOwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTkKICAgIC8vIGV4cG9ydCBjb25zdCBCUDogdWludDY0ID0gMTBfMDAwOwogICAgaW50YyA0IC8vIDEwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjgKICAgIC8vIGFzc2VydChhZG1pbkZlZVNoYXJlQlAgPD0gQlAsICdSZXdhcmRNYW5hZ2VyOiB0b28gaGlnaCcpOwogICAgPD0KICAgIGFzc2VydCAvLyBSZXdhcmRNYW5hZ2VyOiB0b28gaGlnaAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI4CiAgICAvLyBhZG1pbkZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBCUCAvIDUgfSk7IC8vIERlZmF1bHQgYWRtaW4gZmVlIGlzIDIwJQogICAgYnl0ZWMgMTggLy8gImFkbWluRmVlU2hhcmVCUCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo2OQogICAgLy8gdGhpcy5hZG1pbkZlZVNoYXJlQlAudmFsdWUgPSBhZG1pbkZlZVNoYXJlQlA7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6OlJld2FyZE1hbmFnZXIuY2xhaW1BZG1pbkZlZSgpIC0+IHZvaWQ6CmNsYWltQWRtaW5GZWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NzItNzMKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gY2xhaW1BZG1pbkZlZSgpOiB2b2lkIHsKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjc0CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMQogICAgLy8gYWRtaW5GZWVBbW91bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJhZG1pbkZlZUFtb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjc2CiAgICAvLyBpZiAoYWRtaW5GZWVBbW91bnQgPiAwKSB7CiAgICBieiBjbGFpbUFkbWluRmVlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjc3LTgxCiAgICAvLyBhc3NldFRyYW5zZmVyKHsKICAgIC8vICAgeGZlckFzc2V0OiB0aGlzLmFzc2V0LnZhbHVlLAogICAgLy8gICBhc3NldEFtb3VudDogYWRtaW5GZWVBbW91bnQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjc3LTgxCiAgICAvLyBhc3NldFRyYW5zZmVyKHsKICAgIC8vICAgeGZlckFzc2V0OiB0aGlzLmFzc2V0LnZhbHVlLAogICAgLy8gICBhc3NldEFtb3VudDogYWRtaW5GZWVBbW91bnQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjIDExIC8vICJhZG1pbkZlZUFtb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo4MgogICAgLy8gdGhpcy5hZG1pbkZlZUFtb3VudC52YWx1ZSA9IDA7CiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCmNsYWltQWRtaW5GZWVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLnBlbmRpbmdSZXdhcmQodXNlcjogYnl0ZXMpIC0+IHVpbnQ2NDoKcGVuZGluZ1Jld2FyZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo4Ni04NwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBwZW5kaW5nUmV3YXJkKHVzZXI6IEFjY291bnQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODgKICAgIC8vIHJldHVybiBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodGhpcy5iYWxhbmNlKHVzZXIpLnZhbHVlKSAqIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlKSAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZTsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMwogICAgLy8gYmFsYW5jZSA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNCAvLyAiYmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo4OAogICAgLy8gcmV0dXJuIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbygoQmlnVWludCh0aGlzLmJhbGFuY2UodXNlcikudmFsdWUpICogdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUpIC8gUF9TQ0FMRSkgLSB0aGlzLnVzZXJSZXdhcmREZWJ0KHVzZXIpLnZhbHVlOwogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzAKICAgIC8vIGFjY1Jld2FyZFBlclNoYXJlUCA9IEdsb2JhbFN0YXRlPGJpZ3VpbnQ+KHsgaW5pdGlhbFZhbHVlOiAwbiB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJhY2NSZXdhcmRQZXJTaGFyZVAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZSkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBQX1NDQUxFOiBiaWd1aW50ID0gQmlnVWludCgxIDw8IFApOwogICAgYnl0ZWMgOSAvLyAweDAxMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODgKICAgIC8vIHJldHVybiBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodGhpcy5iYWxhbmNlKHVzZXIpLnZhbHVlKSAqIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlKSAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZTsKICAgIGIvCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODgKICAgIC8vIHJldHVybiBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodGhpcy5iYWxhbmNlKHVzZXIpLnZhbHVlKSAqIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlKSAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZTsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLmFkZFJld2FyZHMocmV3YXJkQW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmFkZFJld2FyZHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6OTYKICAgIC8vIHByb3RlY3RlZCBhZGRSZXdhcmRzKHJld2FyZEFtb3VudDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOQogICAgLy8gdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsU3VwcGx5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6OTgKICAgIC8vIGlmICh0b3RhbFN1cHBseSA+IDApIHsKICAgIGJ6IGFkZFJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjgKICAgIC8vIGFkbWluRmVlU2hhcmVCUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IEJQIC8gNSB9KTsgLy8gRGVmYXVsdCBhZG1pbiBmZWUgaXMgMjAlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gImFkbWluRmVlU2hhcmVCUCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6OTkKICAgIC8vIGNvbnN0IGFkbWluRmVlUmV3YXJkczogdWludDY0ID0gKHJld2FyZEFtb3VudCAqIHRoaXMuYWRtaW5GZWVTaGFyZUJQLnZhbHVlKSAvIEJQOwogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTkKICAgIC8vIGV4cG9ydCBjb25zdCBCUDogdWludDY0ID0gMTBfMDAwOwogICAgaW50YyA0IC8vIDEwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6OTkKICAgIC8vIGNvbnN0IGFkbWluRmVlUmV3YXJkczogdWludDY0ID0gKHJld2FyZEFtb3VudCAqIHRoaXMuYWRtaW5GZWVTaGFyZUJQLnZhbHVlKSAvIEJQOwogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwMAogICAgLy8gcmV3YXJkQW1vdW50IC09IGFkbWluRmVlUmV3YXJkczsKICAgIGZyYW1lX2RpZyAtMQogICAgZGlnIDEKICAgIC0KICAgIGZyYW1lX2J1cnkgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMAogICAgLy8gYWNjUmV3YXJkUGVyU2hhcmVQID0gR2xvYmFsU3RhdGU8YmlndWludD4oeyBpbml0aWFsVmFsdWU6IDBuIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImFjY1Jld2FyZFBlclNoYXJlUCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTAxCiAgICAvLyB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSArPSBCaWdVaW50KHJld2FyZEFtb3VudCkgKiBQX1NDQUxFIC8gQmlnVWludCh0b3RhbFN1cHBseSk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyMAogICAgLy8gY29uc3QgUF9TQ0FMRTogYmlndWludCA9IEJpZ1VpbnQoMSA8PCBQKTsKICAgIGJ5dGVjIDkgLy8gMHgwMTAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwMQogICAgLy8gdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgKz0gQmlnVWludChyZXdhcmRBbW91bnQpICogUF9TQ0FMRSAvIEJpZ1VpbnQodG90YWxTdXBwbHkpOwogICAgYioKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICBiLwogICAgYisKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMAogICAgLy8gYWNjUmV3YXJkUGVyU2hhcmVQID0gR2xvYmFsU3RhdGU8YmlndWludD4oeyBpbml0aWFsVmFsdWU6IDBuIH0pOwogICAgYnl0ZWMgOCAvLyAiYWNjUmV3YXJkUGVyU2hhcmVQIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwMQogICAgLy8gdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgKz0gQmlnVWludChyZXdhcmRBbW91bnQpICogUF9TQ0FMRSAvIEJpZ1VpbnQodG90YWxTdXBwbHkpOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMQogICAgLy8gYWRtaW5GZWVBbW91bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJhZG1pbkZlZUFtb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTAyCiAgICAvLyB0aGlzLmFkbWluRmVlQW1vdW50LnZhbHVlICs9IGFkbWluRmVlUmV3YXJkczsKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMQogICAgLy8gYWRtaW5GZWVBbW91bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWMgMTEgLy8gImFkbWluRmVlQW1vdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwMgogICAgLy8gdGhpcy5hZG1pbkZlZUFtb3VudC52YWx1ZSArPSBhZG1pbkZlZVJld2FyZHM7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYWRkUmV3YXJkc19hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6OlJld2FyZE1hbmFnZXIuZGVwb3NpdExwKHRvOiBieXRlcywgbHBBbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKZGVwb3NpdExwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwNgogICAgLy8gcHJvdGVjdGVkIGRlcG9zaXRMcCh0bzogQWNjb3VudCwgbHBBbW91bnQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzAKICAgIC8vIGFjY1Jld2FyZFBlclNoYXJlUCA9IEdsb2JhbFN0YXRlPGJpZ3VpbnQ+KHsgaW5pdGlhbFZhbHVlOiAwbiB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJhY2NSZXdhcmRQZXJTaGFyZVAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwOAogICAgLy8gbGV0IHBlbmRpbmc6IHVpbnQ2NCA9IDA7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwOQogICAgLy8gbGV0IHVzZXJMcEFtb3VudCA9IHRoaXMuYmFsYW5jZSh0bykudmFsdWU7CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTA5CiAgICAvLyBsZXQgdXNlckxwQW1vdW50ID0gdGhpcy5iYWxhbmNlKHRvKS52YWx1ZTsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTAKICAgIC8vIGlmICh1c2VyTHBBbW91bnQgPiAwKSB7CiAgICBieiBkZXBvc2l0THBfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTExCiAgICAvLyBwZW5kaW5nID0gYmlndWludFRvVWludDY0TW9kdWxvKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWU7CiAgICBmcmFtZV9kaWcgMgogICAgaXRvYgogICAgZnJhbWVfZGlnIDAKICAgIGIqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjAKICAgIC8vIGNvbnN0IFBfU0NBTEU6IGJpZ3VpbnQgPSBCaWdVaW50KDEgPDwgUCk7CiAgICBieXRlYyA5IC8vIDB4MDEwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTEKICAgIC8vIHBlbmRpbmcgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oQmlnVWludCh1c2VyTHBBbW91bnQpICogYWNjUmV3YXJkUGVyU2hhcmVQIC8gUF9TQ0FMRSkgLSB0aGlzLnVzZXJSZXdhcmREZWJ0KHRvKS52YWx1ZTsKICAgIGIvCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTExCiAgICAvLyBwZW5kaW5nID0gYmlndWludFRvVWludDY0TW9kdWxvKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWU7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIC0KICAgIGZyYW1lX2J1cnkgMQoKZGVwb3NpdExwX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTMKICAgIC8vIHVzZXJMcEFtb3VudCArPSBscEFtb3VudDsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTQKICAgIC8vIHRoaXMuYmFsYW5jZSh0bykudmFsdWUgKz0gbHBBbW91bnQ7CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTE0CiAgICAvLyB0aGlzLmJhbGFuY2UodG8pLnZhbHVlICs9IGxwQW1vdW50OwogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2RpZyAtMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMzCiAgICAvLyBiYWxhbmNlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA0IC8vICJiYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExNAogICAgLy8gdGhpcy5iYWxhbmNlKHRvKS52YWx1ZSArPSBscEFtb3VudDsKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAidG90YWxTdXBwbHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExNQogICAgLy8gdGhpcy50b3RhbFN1cHBseS52YWx1ZSArPSBscEFtb3VudDsKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyA3IC8vICJ0b3RhbFN1cHBseSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTUKICAgIC8vIHRoaXMudG90YWxTdXBwbHkudmFsdWUgKz0gbHBBbW91bnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExNwogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWUgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCkgLyBQX1NDQUxFKTsKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAwCiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBQX1NDQUxFOiBiaWd1aW50ID0gQmlnVWludCgxIDw8IFApOwogICAgYnl0ZWMgOSAvLyAweDAxMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTE3CiAgICAvLyB0aGlzLnVzZXJSZXdhcmREZWJ0KHRvKS52YWx1ZSA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbygoQmlnVWludCh1c2VyTHBBbW91bnQpICogYWNjUmV3YXJkUGVyU2hhcmVQKSAvIFBfU0NBTEUpOwogICAgYi8KICAgIGNhbGxzdWIgYmlndWludFRvVWludDY0TW9kdWxvCiAgICBmcmFtZV9kaWcgLTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExNwogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWUgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCkgLyBQX1NDQUxFKTsKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExOAogICAgLy8gaWYgKHBlbmRpbmcgPiAwKSB7CiAgICBmcmFtZV9kaWcgMQogICAgYnogZGVwb3NpdExwX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExOQogICAgLy8gYXNzZXRUcmFuc2Zlcih7IHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwgYXNzZXRBbW91bnQ6IHBlbmRpbmcsIGFzc2V0UmVjZWl2ZXI6IHRvIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExOQogICAgLy8gYXNzZXRUcmFuc2Zlcih7IHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwgYXNzZXRBbW91bnQ6IHBlbmRpbmcsIGFzc2V0UmVjZWl2ZXI6IHRvIH0pLnN1Ym1pdCgpOwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMjAKICAgIC8vIGVtaXQ8UmV3YXJkc0NsYWltZWQ+KHsgdXNlcjogbmV3IEFkZHJlc3ModG8pLCBwZW5kaW5nIH0pOwogICAgaXRvYgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDI1IC8vIG1ldGhvZCAiUmV3YXJkc0NsYWltZWQoYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKCmRlcG9zaXRMcF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTIyCiAgICAvLyBlbWl0PERlcG9zaXQ+KHsgdG86IG5ldyBBZGRyZXNzKHRvKSwgbHBBbW91bnQgfSk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHhjZmFiODcyMyAvLyBtZXRob2QgIkRlcG9zaXQoYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjpPd25hYmxlLm9ubHlPd25lcigpIC0+IHZvaWQ6Cm9ubHlPd25lcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjEzCiAgICAvLyBhc3NlcnQob3AuVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5vd25lci52YWx1ZS5ieXRlcywgJ09ubHkgb3duZXInKTsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjYKICAgIC8vIHByb3RlY3RlZCBvd25lciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gIm93bmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjEzCiAgICAvLyBhc3NlcnQob3AuVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5vd25lci52YWx1ZS5ieXRlcywgJ09ubHkgb3duZXInKTsKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBvd25lcgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6Ok93bmFibGUudHJhbnNmZXJPd25lcnNoaXAobmV3T3duZXI6IGJ5dGVzKSAtPiB2b2lkOgp0cmFuc2Zlck93bmVyc2hpcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE2LTE3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB0cmFuc2Zlck93bmVyc2hpcChuZXdPd25lcjogQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxOAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgYnl0ZWMgMTQgLy8gIm93bmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTkKICAgIC8vIHRoaXMub3duZXIudmFsdWUgPSBuZXdPd25lcjsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1Ygo=",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:"user"},{type:"uint64",name:"asset"},{type:"uint64",name:"amount"},{type:"uint64",name:"result"},{type:"uint64",name:"fee"}]},{name:"SwappedFromVUsd",args:[{type:"address",name:"user"},{type:"uint64",name:"asset"},{type:"uint64",name:"amount"},{type:"uint64",name:"result"},{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 Un=class r{appClient;constructor(i){this.appClient=i instanceof Qn?i:new Qn({...i,appSpec:Kn})}decodeReturnValue(i,a){return a!==void 0?as(a,this.appClient.getABIMethod(i),Kn.structs):void 0}static async fromCreatorAndName(i){return new r(await Qn.fromCreatorAndName({...i,appSpec:Kn}))}static async fromNetwork(i){return new r(await Qn.fromNetwork({...i,appSpec:Kn}))}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:os(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 Z(this.lpAmount,3).toFixed()}earned(i,a){let o=ya(this.lpAmount,this.rewardDebt,i.accRewardPerShareP,i.p);return a?Z(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 _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 _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(1),assetReferences:[d]})),yt({composer:c,appId:A,sender:o,count:4});let{transactions:l}=await c.buildTransactions();return _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=rs(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(Un,{appId:a})}};import{Web3 as ot}from"web3";var ss={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=ss;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 Yn(this.getUserBalanceInfoByBatch(a,o),`Cannot get UserBalanceInfo for ${o.name} on ${o.chainSymbol}`,5e3)}catch{s=await Ti(()=>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 Yn(this.getPoolInfoByBatch(a),`Cannot get PoolInfo for ${a.name} on ${a.chainSymbol}`,5e3)}catch{o=await Ti(()=>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,R]=await o.execute();if(m&&p&&b&&W&&y&&R&&!m.error&&!p.error&&!b.error&&!W.error&&!y.error&&!R.error){let B=ot.utils.toBigInt(b.result).toString(),h=ot.utils.toBigInt(W.result).toString(),G=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(R.result).toString(),p:this.P,imbalance:G}}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 En=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 X(i.amount),L("amount",i.amount,i.token.decimals),i.amount=f(i.amount,i.token.decimals).toFixed(),Zt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionDeposit(i)}async withdraw(i,a){return X(i.amount),L("amount",i.amount,i.token.decimals),i.amount=f(i.amount,3).toFixed(),Zt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionWithdraw(i)}async claimRewards(i,a){return Zt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionClaimRewards(i)}};import{AnchorProvider as ds,BN as Ro,Program as As,Spl as gs,web3 as cs}from"@project-serum/anchor";import{Connection as ls,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 Pi(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 Ro(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 Bt(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 Ro(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 Bt(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 Bt(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 As(_t,a,o)}buildAnchorProvider(a){let o=new ls(this.solanaRpcUrl,"confirmed"),s=new rt(a);return new ds(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 Rt(m,a.programId),W=await Pi(A,m,a.programId),y=[cs.ComputeBudgetProgram.setComputeUnitLimit({units:1e6})];try{await Yt(p,d)}catch{let G=await gs.associatedToken(d).methods.create().accounts({mint:m,owner:A,associatedAccount:p}).instruction();y.push(G)}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 YB}from"@stellar/stellar-sdk";import{contract as t}from"@stellar/stellar-sdk";var us=t.Spec,ms=t.Client;var $n=class extends ms{constructor(a){super(new us(["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 lC,rpc as ps}from"@stellar/stellar-sdk";var Yo=ps.Api;function ft(r){let{simulation:i,options:a}=r;if(!i)throw new Error("Soroban assembled transaction does not have simulation");if(Yo.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 Yo.isSimulationError(i)}var qn=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 $n(s)}};import{SuiClient as Rs}from"@mysten/sui/client";import{Transaction as di}from"@mysten/sui/transactions";var wt=Ne(nt());ne();ne();import{bcs as Bo}from"@mysten/sui/bcs";import{fromB64 as Cs}from"@mysten/sui/utils";function ei(r){return r=F(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 D(r.reified(i))}static get p(){return r.phantom}static get bcs(){return Bo.struct("Balance",{value:Bo.u64()})}static fromFields(i,a){return r.reified(i).new({value:H("u64",a.value)})}static fromFieldsWithTypes(i,a){if(!ei(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 Xe(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(!ei(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"||!ei(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=F(o[0]),d=F(T(i));if(s!==F(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,Cs(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"||!ei(s.data.bcs.type))throw new Error(`object at id ${o} is not a Balance object`);return r.fromSuiObjectData(a,s.data)}};var sa=Ne(nt());ne();var oa=Ne(nt());import{bcs as ti}from"@mysten/sui/bcs";import{fromB64 as Is}from"@mysten/sui/utils";function ni(r){return r=F(r),r.startsWith(`${oa.PKG_V1}::pool_rewards::PoolRewards<`)}var mt=class r{__StructClass=!0;static get $typeName(){return`${oa.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 D(r.reified(i))}static get p(){return r.phantom}static get bcs(){return ti.struct("PoolRewards",{acc_reward_per_share_p:ti.u128(),admin_fee_share_bp:ti.u64(),admin_fee:re.bcs,rewards:re.bcs,lp_supply:ti.u64()})}static fromFields(i,a){return r.reified(i).new({accRewardPerShareP:H("u128",a.acc_reward_per_share_p),adminFeeShareBp:H("u64",a.admin_fee_share_bp),adminFee:H(re.reified(i),a.admin_fee),rewards:H(re.reified(i),a.rewards),lpSupply:H("u64",a.lp_supply)})}static fromFieldsWithTypes(i,a){if(!ni(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 Xe(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(!ni(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"||!ni(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=F(o[0]),d=F(T(i));if(s!==F(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,Is(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"||!ni(s.data.bcs.type))throw new Error(`object at id ${o} is not a PoolRewards object`);return r.fromSuiObjectData(a,s.data)}};ne();var ra=Ne(nt());import{bcs as Tt}from"@mysten/sui/bcs";import{fromB64 as bs}from"@mysten/sui/utils";function ii(r){return r=F(r),r.startsWith(`${ra.PKG_V1}::pool_state::PoolState<`)}var pt=class r{__StructClass=!0;static get $typeName(){return`${ra.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 D(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:H("u64",a.token_balance),vusdBalance:H("u64",a.vusd_balance),d:H("u64",a.d),a:H("u64",a.a),balanceRatioMinBp:H("u64",a.balance_ratio_min_bp)})}static fromFieldsWithTypes(i,a){if(!ii(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 Xe(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 PoolState 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 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=F(o[0]),d=F(T(i));if(s!==F(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,bs(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"||!ii(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 ai(r){return r=F(r),r.startsWith(`${sa.PKG_V1}::pool::Pool<`)}var oi=class r{__StructClass=!0;static get $typeName(){return`${sa.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 D(r.reified(i))}static get p(){return r.phantom}static get bcs(){return on.struct("Pool",{id:Ge.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:H(Ge.reified(),a.id),state:H(pt.reified(i),a.state),rewards:H(mt.reified(i),a.rewards),feeShareBp:H("u64",a.fee_share_bp),canDeposit:H("bool",a.can_deposit),canWithdraw:H("bool",a.can_withdraw),decimals:H("u8",a.decimals),balance:H(re.reified(i),a.balance)})}static fromFieldsWithTypes(i,a){if(!ai(a.type))throw new Error("not a Pool type");return ze(a,[i]),r.reified(i).new({id:S(Ge.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(Ge.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 Xe(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 Pool 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 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=F(o[0]),d=F(T(i));if(s!==F(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"||!ai(s.data.bcs.type))throw new Error(`object at id ${o} is not a Pool object`);return r.fromSuiObjectData(a,s.data)}};ne();var Aa=Ne(nt());import{bcs as da}from"@mysten/sui/bcs";import{fromB64 as hs}from"@mysten/sui/utils";function ri(r){return r=F(r),r.startsWith(`${Aa.PKG_V1}::user_deposit::UserDeposit<`)}var si=class r{__StructClass=!0;static get $typeName(){return`${Aa.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 D(r.reified(i))}static get p(){return r.phantom}static get bcs(){return da.struct("UserDeposit",{id:Ge.bcs,lp_amount:da.u64(),reward_debt:da.u64()})}static fromFields(i,a){return r.reified(i).new({id:H(Ge.reified(),a.id),lpAmount:H("u64",a.lp_amount),rewardDebt:H("u64",a.reward_debt)})}static fromFieldsWithTypes(i,a){if(!ri(a.type))throw new Error("not a UserDeposit type");return ze(a,[i]),r.reified(i).new({id:S(Ge.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(Ge.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 Xe(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(!ri(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"||!ri(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=F(o[0]),d=F(T(i));if(s!==F(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 UserDeposit object at id ${o}: ${s.error.code}`);if(s.data?.bcs?.dataType!=="moveObject"||!ri(s.data.bcs.type))throw new Error(`object at id ${o} is not a UserDeposit object`);return r.fromSuiObjectData(a,s.data)}};function Go(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 Wo(a,o,A,r);d+=BigInt(g.balance),A.push(g)}return d>=s?Wo(a,o,A,r):[]}function Wo(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 vs="0x0000000000000000000000000000000000000000000000000000000000000000";async function Fo(r,i,a){let o=await r.devInspectTransactionBlock({sender:vs,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 Ai=class extends ce{constructor(a,o){super();this.suiRpcUrl=a;this.api=o;this.client=new Rs({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:si.phantom(D(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 di;ro(d,a.originTokenAddress,o.bridgeObjectAddress);let A=await Fo(this.client,d,oi.reified(D(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 di;A.setSender(a.accountAddress);let{depositObj:g,isNewDeposit:c}=await this.getDepositObject(a.accountAddress,a.token.originTokenAddress,A),[l]=Go([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=io(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=D(o).phantomType;return{depositObj:so(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=D(a.token.originTokenAddress).phantomType,d=new di;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=ao(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=D(a.token.originTokenAddress).phantomType,d=new di;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=oo(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 gi}from"web3";import{encodeFunctionCall as Ys}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 gi.utils.toBigInt(p.result).toString()};return new q({lpAmount:gi.utils.toBigInt(u(2)).toString(),rewardDebt:gi.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 gi.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 Ys(s,o)}};var ci=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s;this.rawTxBuilder=new En(i,a,this.params,s);let d=o.cachePoolInfoChainSec>0?o.cachePoolInfoChainSec*1e3:20*1e3;this.cache=new Ws({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){X(i),L("amount",i,a.decimals);let s=await this.getPoolInfoFromChain(a,o),{vUsdBalance:d,tokenBalance:A,aValue:g,dValue:c}=s,l=ho(i,g,c,A,d);return Z(l,3).toFixed()}async getAmountToBeWithdrawn(i,a,o,s){X(i),L("amount",i,o.decimals);let d=await this.getPoolInfoFromChain(o,s),A=vo(i),g=be(A,o.decimals),l=(await this.getUserBalanceInfo(a,o,s)).earned(d)||"0",u=Bs(g).plus(l).toFixed();return Z(u,o.decimals).toFixed()}async getUserBalanceInfo(i,a,o){return Zt(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 Zt(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 Zt(r,i,a,o,s){switch(V.getChainProperty(r).chainType){case"EVM":{if(s)return new an(s,i);{let d=a.getNodeRpcUrl(r),A=new fs(d);return A.defaultReturnFormat={number:Zs.STR,bytes:Fs.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 Gs({fullHost:d});return new rn(g,i,A)}}case"SOLANA":{let d=a.getNodeRpcUrl(r);return new _n(d,i)}case"SRB":return new qn(a,o,i);case"SUI":return new Ai(a.getNodeRpcUrl(r),i);case"ALG":if(s){let d=s,A=Zo.fromClients({algod:d});return new tn(A,i)}else{let d=a.getNodeRpcUrl(r),A=Zo.fromConfig({algodConfig:{server:d}});return new tn(A,i)}}}import{TronWeb as ws}from"tronweb";import{FMT_BYTES as Vs,FMT_NUMBER as Xs,Web3 as Ss}from"web3";var Ns={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"}]},li=Ns;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 Z(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 Z(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(li.abi,a)}};var ui=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 X(i.amount),L("amount",i.amount,i.token.decimals),X(i.minVirtualAmount),L("minVirtualAmount",i.minVirtualAmount,3),i.amount=f(i.amount,i.token.decimals).toFixed(),i.minVirtualAmount=f(i.minVirtualAmount,3).toFixed(),Vt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.owner,a).buildRawTransactionDeposit(i)}async withdraw(i,a){return X(i.amount),L("amount",i.amount,3),i.amount=f(i.amount,3).toFixed(),Vt(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 Z(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 Z(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(li.abi,a)}};function Ts(r){if(!mi(r))throw new vn("Token does not support Yield")}function mi(r){return!!r.yieldAddress&&r.yieldId!==void 0}var pi=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s;this.rawTxBuilder=new ui(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(mi);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 Vt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.owner,a).balanceOf(i)}async getEstimatedAmountOnDeposit(i,a){return X(i.amount),L("amount",i.amount,i.token.decimals),Vt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.token.yieldAddress,a).getEstimatedAmountOnDeposit(i)}async getWithdrawAmounts(i,a){X(i.amount),L("amount",i.amount,3);let o=await Vt(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:Z(o[s.yieldId],s.decimals).toFixed(),token:s}))}};function Vt(r,i,a,o,s){switch(V.getChainProperty(r).chainType){case"EVM":{if(s)return new sn(s,i);{let d=a.getNodeRpcUrl(r),A=new Ss(d);return A.defaultReturnFormat={number:Xs.STR,bytes:Vs.HEX},new sn(A,i)}}case"TRX":{if(s)return new dn(s,i);{let d=a.getNodeRpcUrl(r),A=new ws({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 To(r,i,a){let o=Ms(r,{decimals:i.decimals,feeShare:i.feeShare},i.poolInfo),s=Ls(o.amountIncludingCommissionInSystemPrecision,{decimals:a.decimals,feeShare:a.feeShare},a.poolInfo);return{swapToVUsdCalcResult:o,swapFromVUsdCalcResult:s}}function wo(r,i,a){let o=Hs(r,{decimals:a.decimals,feeShare:a.feeShare},a.poolInfo),s=Ps(o.amountIncludingCommissionInSystemPrecision,{decimals:i.decimals,feeShare:i.feeShare},i.poolInfo);return{swapToVUsdCalcResult:o,swapFromVUsdCalcResult:s}}function Ms(r,{feeShare:i,decimals:a},o){let s=E(r),d=s.times(i),A=s.minus(d);return{bridgeFeeInTokenPrecision:d.round().toFixed(),amountIncludingCommissionInSystemPrecision:fo(At(A,a),o),amountExcludingCommissionInSystemPrecision:fo(At(s,a),o)}}function fo(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 Ls(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 Hs(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:No(At(A,a),o),amountExcludingCommissionInSystemPrecision:No(At(r,a),o)}}function No(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 Ps(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 Vo(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:Z(c,i.decimals).neg().round(i.decimals,st.roundUp).toFixed(),swap:Z(st(r).minus(A).minus(c),i.decimals).neg().round(i.decimals,st.roundUp).toFixed()},destLPSwap:{fee:Z(l,o.decimals).neg().round(o.decimals,st.roundUp).toFixed(),swap:Z(be(d,o.decimals).minus(g).minus(l),o.decimals).neg().round(o.decimals,st.roundUp).toFixed()}}}import{AlgorandClient as Xo}from"@algorandfoundation/algokit-utils";import{ABIMethod as js,OnApplicationComplete as Js}from"algosdk";var Ci=class{constructor(i){this.nodeRpcUrlsConfig=i}async checkAssetOptIn(i,a,o){let s=this.getAlgorand(o);typeof i=="string"&&(i=BigInt(i));let A=(await s.account.getInformation(a)).assets;return A?A.find(({assetId:c})=>c===i)!==void 0:!1}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 js({name:"optInToApplication",desc:void 0,args:[],returns:{type:"void",desc:void 0},events:[],readonly:!1}),args:[],sender:a,signer:A,onComplete:Js.OptInOC});let{transactions:g}=await d.buildTransactions();return _e(...g)}getAlgorand(i){if(i)return Xo.fromClients({algod:i});{let a=this.nodeRpcUrlsConfig.getNodeRpcUrl("ALG");return Xo.fromConfig({algodConfig:{server:a}})}}};import Ks from"axios";var So="3.26.0-alpha.4";function Mo(r){return Object.entries(r).reduce((i,a)=>{let o=a[0],s=a[1],d=Qs(o,s);return d&&(i[o]=d),i},{})}function Lo(r){let i={};for(let[a,o]of Object.entries(r)){let s=a;for(let d of o.tokens){let A=Xt({chainSymbol:s,poolAddress:d.poolAddress}),g=te(d.poolInfo);i[A]={...d.poolInfo,imbalance:g}}}return i}function ks(r,i){let{name:a,...o}=r,{poolInfo:s,...d}=i;return{...d,...o,chainName:a}}function zs(r){switch(r){case"allbridge":return 1;case"wormhole":return 2;case"cctp":return 3;case"cctpV2":return 4;case"oft":return 5}}function xs(r){return Object.entries(r).reduce((i,[a,o])=>(i[a]=Os(o),i),{})}function Os(r){return Object.entries(r).reduce((i,[a,o])=>{let s=zs(a);return s&&o!=null&&(i[s]=o),i},{})}function Qs(r,i){let a=V.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:xs(i.transferTime),txCostAmount:i.txCostAmount,confirmations:i.confirmations,suiAddresses:i.suiAddresses};return{...o,tokens:i.tokens.map(s=>ks(o,s))}}function Xt(r){return r.chainSymbol+"_"+r.poolAddress}function Ho(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 Po(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[Xt({chainSymbol:s,poolAddress:d})]=A}return i}var St=class{api;constructor(i){this.api=Ks.create({baseURL:i.coreApiUrl,headers:{Accept:"application/json",...i.coreApiHeaders,"x-Sdk-Agent":"AllbridgeCoreSDK/"+So},params:i.coreApiQueryParams})}async getTokenInfo(){let{data:i}=await this.api.get("/token-info",{params:{filter:"all"}});return{chainDetailsMap:Mo(i),poolInfoMap:Lo(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 Po(o)}};import Ii from"timed-cache";var ga=20*1e3,Ds=55*1e3,Mt=class{constructor(i){this.apiClient=i;this.tokenInfoCache=new Ii({defaultTtl:Ds}),this.receivedTransactionCache=new Ii({defaultTtl:ga}),this.pendingInfoCache=new Ii({defaultTtl:ga}),this.gasBalanceCache=new Ii({defaultTtl:ga})}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 Lt=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 Ht=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:jo(d.tokens,i,this.isStaging)})}return o}async tokens(i){return jo(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 jo(r,i,a){return r.filter(o=>a?!0:o.flags[i]).map(Us)}function Us(r){let{flags:i,...a}=r;return a}import Es from"timed-cache";var _s=55*1e3,Pt=class{constructor(i){this.client=i;this.poolInfoCache=new ca}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[Xt(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(Ho(o.chainDetailsMap))}this.poolInfoCache.putAll(a)}cachePut(i,a){this.poolInfoCache.put(Xt(i),a)}},ca=class{cache;constructor(){this.cache=new Es({defaultTtl:_s})}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=Xt(i);return this.cache.get(a)}};import{AlgorandClient as ko}from"@algorandfoundation/algokit-utils";import{Big as sd}from"big.js";import{TronWeb as dd}from"tronweb";import{Web3 as Ad}from"web3";import{Big as Jo}from"big.js";var le=class{async checkAllowance(i){let a=await this.getAllowance(i);return Jo(a).gte(Jo(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 $s={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"}]},bi=$s;var qs="0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",ed="0xdac17f958d2ee523a2206206994597c13d831ec7",td=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()===ed}buildRawTransactionApprove(a){let{tokenAddress:o,spender:s,owner:d,amount:A}=a,c=this.getERC20Contract(o).methods.approve(s,A==null?qs:zn(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=td: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(bi.abi,a)}};import{AnchorProvider as nd}from"@project-serum/anchor";import{Connection as id,PublicKey as yi}from"@solana/web3.js";var hi=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 id(this.solanaRpcUrl,"confirmed"),s=new yi(a);return new nd(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 yi(o),new yi(s.tokenAddress));return(await Yt(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 yi(a.account))).toString()}};import{Horizon as f2,NotFoundError as ad}from"@stellar/stellar-sdk";var vi=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 f2.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")),A;try{A=await d.loadAccount(a.account)}catch(l){if(l instanceof ad)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,V.getChainDecimalsByType(V.getChainProperty(a.token.chainSymbol).chainType)).toFixed():"0"}async getNativeTokenBalance(a){let A=(await new f2.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")).loadAccount(a.account)).balances.find(g=>g.asset_type==="native");return A?.balance?f(A.balance,V.getChainDecimalsByType(V.getChainProperty(a.chainSymbol).chainType)).toFixed():"0"}approve(){throw new k}buildRawTransactionApprove(){throw new k}};import{SuiClient as od}from"@mysten/sui/client";var Ri=class extends le{constructor(a,o){super();this.suiRpcUrl=a;this.api=o;this.suiClient=new od({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 rd="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 xn(this.tronWeb,o)}async buildRawTransactionApprove(a){let{tokenAddress:o,spender:s,owner:d,amount:A}=a,g=A==null?rd:zn(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(bi.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 Z(o,i.token.decimals).toFixed()}async checkAllowance(i,a){return X(i.amount),L("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&&(X(a.amount),L("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&&(X(i.amount),L("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?Z(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:Z(o,V.getChainDecimalsByType(V.getChainProperty(i.chainSymbol).chainType)).toFixed()}}getChainTokenService(i,a,o){switch(V.getChainProperty(i).chainType){case"EVM":{if(o)return new gn(o,this.api);{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i);return new gn(new Ad(s),this.api)}}case"TRX":{if(o)return new cn(o,this.api);{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i),d=new dd({fullHost:s});return d.setAddress(a),new cn(d,this.api)}}case"SOLANA":{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i);return new hi(s,this.api)}case"SRB":return new vi(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=ko.fromClients({algod:s});return new An(d,this.api)}else{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i),d=ko.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:sd(i.amount).toFixed()}}};var Yi=class{constructor(i,a){this.nodeRpcUrlsConfig=i;this.params=a;let o=new St(a),s=new Mt(o),d=new Lt(s),A=new Pt(d);this.api=new Ht(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 gd,PublicKey as cd,TransactionMessage as ld}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 gd(this.nodeRpcUrlsConfig.getNodeRpcUrl("SOL"),"confirmed"),s=await ct(i,o),d=ld.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 cd(Buffer.from(a)),isSigner:!1,isWritable:!1}),i.message=d.compileToV0Message(s)}};import{Asset as pd,BASE_FEE as Cd,contract as BB,Horizon as zo,Operation as Id,Operation as bd,rpc as un,TimeoutInfinite as yd,TransactionBuilder as la,TransactionBuilder as xo}from"@stellar/stellar-sdk";import{contract as e}from"@stellar/stellar-sdk";var ud=e.Spec,md=e.Client;var ln=class extends md{constructor(a){super(new ud(["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 hd=100,vd=180,Wi=class{constructor(i,a){this.nodeRpcUrlsConfig=i;this.params=a}async buildChangeTrustLineXdrTx(i){let o=await new zo.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 pd(g,c),u=bd.changeTrust({asset:l,limit:i.limit});return new xo(o,{fee:hd.toString(10),networkPassphrase:this.params.sorobanNetworkPassphrase}).addOperation(u).setTimeout(vd).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 zo.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 zo.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")),o=xo.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=la.fromXDR(i,this.params.sorobanNetworkPassphrase),A=await o.simulateTransaction(d);if(un.Api.isSimulationRestore(A))return new la(s,{fee:(+Cd+ +A.restorePreamble.minResourceFee).toString(),networkPassphrase:this.params.sorobanNetworkPassphrase}).setSorobanData(A.restorePreamble.transactionData.build()).addOperation(Id.restoreFootprint({})).setTimeout(yd).build().toXDR()}async sendTransactionSoroban(i){let a=new un.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")),o=la.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 pa(()=>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 Ft(this.nodeRpcUrlsConfig,this.api)),this._suiBridgeService}};var Fi=class{constructor(i){this.service=i;this.srb=new Wi(i.nodeRpcUrlsConfig,i.params),this.sol=new Bi(i.nodeRpcUrlsConfig,i.params),this.sui=new Gi(i.nodeRpcUrlsConfig,i.api),this.evm=new Yi(i.nodeRpcUrlsConfig,i.params),this.alg=new Ci(i.nodeRpcUrlsConfig)}srb;sol;sui;evm;alg};var $e=(a=>(a.WITH_NATIVE_CURRENCY="native",a.WITH_STABLECOIN="stablecoin",a))($e||{}),Zn=(a=>(a.INT="int",a.FLOAT="float",a))(Zn||{});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)}},Zi=class{constructor(i,a=Cn){this.nodeRpcUrlsConfig=i;V.addChainsProperties(a.additionalChainsProperties);let o=new St(a),s=new Mt(o),d=new Lt(s),A=new Pt(d);this.api=new Ht(A,a),this.tokenService=new jt(this.api,i,a),this.bridge=new On(this.api,i,a,this.tokenService),this.pool=new ci(this.api,i,a,this.tokenService),this.yield=new pi(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){X(i);let d;a=="float"?(L("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=Ca(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:Ye(l.totalSentAmount,3,s.decimals).toFixed(0),float:Z(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){X(i),L("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 Xi(o,d)}async calculateFeePercentOnDestinationChain(i,a,o){X(i),L("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 Xi(g,A)}async getAmountToBeReceivedAndGasFeeOptions(i,a,o,s){return X(i),L("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 X(i),L("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){X(i),L("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){X(i),L("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=Ye(A,a.decimals,o.decimals).round(0);return Z(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=Ye(A,a.decimals,o.decimals).round(0);return Z(g,o.decimals).toFixed()}}}async getAmountToBeReceivedComputeOft(i,a,o){X(i),L("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=Ye(A,a.decimals,o.decimals).round(0);return Z(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){X(i),L("amountToBeReceivedFloat",i,o.decimals);let A=f(i,o.decimals),g=ba(A,o,d),c=Ia(g,a,s);if(ee(c).lte(0))throw new Ke;return Z(c,a.decimals).toFixed()}getAmountToSendComputeCctp(i,a,o,s){X(i),L("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=Ye(A,o.decimals,a.decimals).round(0);return Z(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=Ye(A,o.decimals,a.decimals).round(0);return Z(g,a.decimals).toFixed()}}}async getAmountToSendComputeOft(i,a,o){X(i),L("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=Ye(A,o.decimals,a.decimals).round(0);return Z(g,a.decimals).toFixed()}async getGasFeeOptions(i,a,o){return Si(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 ha(i)}async getExtraGasMaxLimits(i,a,o){return await Mi(i,a,o,this.api)}async getVUsdFromAmount(i,a,o){X(i);let s;a=="float"?(L("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:Z(d,3).toFixed()}}async getAmountFromVUsd(i,a){return this.getAmountFromVUsdFormatted(i,a,await $(this.api,a))}getAmountFromVUsdFormatted(i,a,o){X(i);let s=Ot(i,a,o);if(ee(s).lt(0))throw new Ke;return{int:s,float:Z(s,a.decimals).toFixed()}}async swapAndBridgeFeeCalculation(i,a,o){return To(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=wo(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){X(i);let d;return a=="float"?(L("amount",i,o.decimals),d=f(i,o.decimals).toFixed()):d=i,Vo(d,o,await $(this.api,o),s,await $(this.api,s))}};function Rd(r){return"solanaRpcUrl"in r}var Oo=class{params;bridge;pool;yield;utils;service;constructor(i,a=Cn){let o;Rd(i)?o=new mn({SOL:i.solanaRpcUrl,TRX:i.tronRpcUrl}):o=new mn(i),this.service=new Zi(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{Ni as AddressStatus,Oo as AllbridgeCoreSdk,Zn as AmountFormat,It as AmountNotEnoughError,yn as ArgumentInvalidDecimalsError,se as CCTPDoesNotSupportedError,Ie as ChainSymbol,z as ChainType,er 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,Re as Messenger,k as MethodNotSupportedError,hn as NodeRpcUrlNotInitializedError,de as OFTDoesNotSupportedError,I as SdkError,K as SdkRootError,ji as SolanaAutoTxFee,zt as TimeoutError,Rn as TxTooLargeError,kt as VerifyTxError,vn as YieldDoesNotSupportedError,Ts as assertYieldIsSupported,mi as isYieldSupported,Cn as mainnet,Wd as nodeRpcUrlsDefault,Bd as nodeUrlsDefault};
7
7
  //# sourceMappingURL=index.js.map