@keetanetwork/anchor 0.0.58 → 0.0.60

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.
Files changed (54) hide show
  1. package/lib/chaining.d.ts +3 -3
  2. package/lib/chaining.d.ts.map +1 -1
  3. package/lib/chaining.js.map +1 -1
  4. package/lib/queue/drivers/queue_postgres.d.ts +20 -3
  5. package/lib/queue/drivers/queue_postgres.d.ts.map +1 -1
  6. package/lib/queue/drivers/queue_postgres.js +152 -40
  7. package/lib/queue/drivers/queue_postgres.js.map +1 -1
  8. package/lib/resolver.d.ts +1 -1
  9. package/lib/resolver.d.ts.map +1 -1
  10. package/lib/resolver.js +214 -244
  11. package/lib/resolver.js.map +1 -1
  12. package/npm-shrinkwrap.json +2 -2
  13. package/package.json +1 -1
  14. package/services/asset-movement/client.d.ts +20 -8
  15. package/services/asset-movement/client.d.ts.map +1 -1
  16. package/services/asset-movement/client.js +63 -22
  17. package/services/asset-movement/client.js.map +1 -1
  18. package/services/asset-movement/common.d.ts +33 -12
  19. package/services/asset-movement/common.d.ts.map +1 -1
  20. package/services/asset-movement/common.generated.d.ts +3 -0
  21. package/services/asset-movement/common.generated.d.ts.map +1 -1
  22. package/services/asset-movement/common.generated.js +24320 -7253
  23. package/services/asset-movement/common.generated.js.map +1 -1
  24. package/services/asset-movement/common.js +3 -0
  25. package/services/asset-movement/common.js.map +1 -1
  26. package/services/asset-movement/lib/data/addresses/bank-account/ca.d.ts +4 -0
  27. package/services/asset-movement/lib/data/addresses/bank-account/ca.d.ts.map +1 -0
  28. package/services/asset-movement/lib/data/addresses/bank-account/ca.js +49 -0
  29. package/services/asset-movement/lib/data/addresses/bank-account/ca.js.map +1 -0
  30. package/services/asset-movement/lib/data/addresses/bank-account/index.generated.d.ts +4 -0
  31. package/services/asset-movement/lib/data/addresses/bank-account/index.generated.d.ts.map +1 -1
  32. package/services/asset-movement/lib/data/addresses/bank-account/index.generated.js +4 -0
  33. package/services/asset-movement/lib/data/addresses/bank-account/index.generated.js.map +1 -1
  34. package/services/asset-movement/lib/data/addresses/bank-account/interac.d.ts.map +1 -1
  35. package/services/asset-movement/lib/data/addresses/bank-account/interac.js +9 -20
  36. package/services/asset-movement/lib/data/addresses/bank-account/interac.js.map +1 -1
  37. package/services/asset-movement/lib/data/addresses/bank-account/pix.d.ts.map +1 -1
  38. package/services/asset-movement/lib/data/addresses/bank-account/pix.js +3 -2
  39. package/services/asset-movement/lib/data/addresses/bank-account/pix.js.map +1 -1
  40. package/services/asset-movement/lib/data/addresses/bank-account/uae.d.ts +4 -0
  41. package/services/asset-movement/lib/data/addresses/bank-account/uae.d.ts.map +1 -0
  42. package/services/asset-movement/lib/data/addresses/bank-account/uae.js +45 -0
  43. package/services/asset-movement/lib/data/addresses/bank-account/uae.js.map +1 -0
  44. package/services/asset-movement/lib/data/addresses/types.generated.d.ts +260 -52
  45. package/services/asset-movement/lib/data/addresses/types.generated.d.ts.map +1 -1
  46. package/services/asset-movement/lib/data/addresses/types.generated.js +252 -35
  47. package/services/asset-movement/lib/data/addresses/types.generated.js.map +1 -1
  48. package/services/asset-movement/lib/location.generated.js +3 -3
  49. package/services/asset-movement/server.d.ts +5 -1
  50. package/services/asset-movement/server.d.ts.map +1 -1
  51. package/services/asset-movement/server.js +23 -2
  52. package/services/asset-movement/server.js.map +1 -1
  53. package/services/storage/clients/contacts.generated.js +636 -312
  54. package/services/storage/clients/contacts.generated.js.map +1 -1
package/lib/chaining.d.ts CHANGED
@@ -145,9 +145,9 @@ interface KeetaSendStepLike {
145
145
  export type AnchorChainingStepLike = GraphNodeLike | KeetaSendStepLike;
146
146
  export type AnchorChainingAsset = TokenAddress | ISOCurrencyCode | ExternalChainAsset;
147
147
  export type AnchorChainingListAssetsSideFilter = {
148
- location?: AssetLocationLike;
149
- asset?: AnchorChainingAsset;
150
- rail?: Rail;
148
+ location?: AssetLocationLike | undefined;
149
+ asset?: AnchorChainingAsset | undefined;
150
+ rail?: Rail | undefined;
151
151
  };
152
152
  type AnchorChainingListAssetsShared = {
153
153
  maxStepCount?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"chaining.d.ts","sourceRoot":"","sources":["../../src/lib/chaining.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chaining.d.ts","sourceRoot":"","sources":["../../src/lib/chaining.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chaining.js","sourceRoot":"","sources":["../../src/lib/chaining.ts"],"names":[],"mappings":"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","sourcesContent":["import type { lib as KeetaNetLib } from '@keetanetwork/keetanet-client';\nimport { KeetaNet } from \"../client/index.js\";\nimport type { AssetLocationLike, AssetTransferInstructions, AssetWithRails, FiatPushRails, MovableAssetSearchCanonical, PickChainLocation, Rail, RailOrRailWithExtendedDetails, RecipientResolved } from \"../services/asset-movement/common.js\";\nimport { convertAssetLocationToString, convertAssetSearchInputToCanonical, isChainLocation, toAssetLocation } from \"../services/asset-movement/common.js\";\nimport type { Resolver } from \"./index.js\";\nimport { getDefaultResolver } from '../config.js';\nimport type { ISOCurrencyCode } from '@keetanetwork/currency-info';\nimport { Currency } from '@keetanetwork/currency-info';\nimport type { Account, GenericAccount, TokenAddress } from '@keetanetwork/keetanet-client/lib/account.js';\nimport { isAssetLocationLike } from '../services/asset-movement/lib/location.generated.js';\nimport type { ToValuizable } from './resolver.js';\nimport { isFiatRail, isMovableAssetSearchCanonical, isRail } from '../services/asset-movement/common.generated.js';\nimport { assertNever } from './utils/never.js';\nimport KeetaFXAnchorClient from '../services/fx/client.js';\nimport KeetaAssetMovementAnchorClient from '../services/asset-movement/client.js';\nimport type { ExternalChainAsset } from './asset.js';\nimport { isExternalChainAsset } from './asset.js';\nimport type { Logger } from './log/index.js';\nimport type { BlockHash } from '@keetanetwork/keetanet-client/lib/block/index.js';\n\ntype FXQuoteOrEstimate = NonNullable<Awaited<ReturnType<KeetaFXAnchorClient['getQuotesOrEstimates']>>>[number];\ntype AssetMovementProvider = NonNullable<Awaited<ReturnType<KeetaAssetMovementAnchorClient['getProvidersForTransfer']>>>[number];\ntype AssetMovementTransfer = Awaited<ReturnType<AssetMovementProvider['initiateTransfer']>>;\ntype FXExchange = Awaited<ReturnType<FXQuoteOrEstimate['createExchange']>>;\n\ninterface ChainStepResolutionBase<Type extends 'fx' | 'assetMovement' | 'keetaSend'> {\n\ttype: Type;\n\tvalueIn: bigint;\n\tvalueOut: bigint;\n\tstep: Type extends 'keetaSend' ? null : Extract<GraphNodeLike, { type: Type }>;\n}\n\ninterface ChainStepResolutionFX extends ChainStepResolutionBase<'fx'> {\n\ttype: 'fx';\n\tresult: FXQuoteOrEstimate;\n};\n\ntype SendingToType = 'SELF' | 'NEXT_STEP' | 'FINAL_DESTINATION';\n\ninterface ChainStepResolutionAssetMovement extends ChainStepResolutionBase<'assetMovement'> {\n\tusingInstruction: AssetTransferInstructions;\n\tsendingTo: SendingToType;\n\ttransfer: AssetMovementTransfer;\n};\n\ninterface ChainStepResolutionKeetaSend extends ChainStepResolutionBase<'keetaSend'> {\n\tusingInstruction: Extract<AssetTransferInstructions, { type: 'KEETA_SEND' }>;\n};\n\nexport type ChainStepResolution = ChainStepResolutionFX | ChainStepResolutionAssetMovement | ChainStepResolutionKeetaSend;\n\ntype AnchorChainingPathComputedPlan = {\n\tsteps: ChainStepResolution[];\n\ttotalValueIn: bigint;\n\ttotalValueOut: bigint;\n};\n\ntype ExecutedStepFX = {\n\ttype: 'fx';\n\tplan: ChainStepResolutionFX;\n\texchange: FXExchange;\n};\n\ntype ExecutedStepAssetMovement = {\n\ttype: 'assetMovement';\n\tplan: ChainStepResolutionAssetMovement;\n};\n\ntype ExecutedStepKeetaSend = {\n\ttype: 'keetaSend';\n\tplan: ChainStepResolutionKeetaSend;\n};\n\n\nexport type ExecutedStep = ExecutedStepFX | ExecutedStepAssetMovement | ExecutedStepKeetaSend;\n\nexport type AnchorChainingPathExecuteResult = {\n\tsteps: ExecutedStep[];\n};\n\nexport type AnchorChainingPathExecuteOptions = {\n\trequireSendAuth?: boolean;\n};\n\nexport type AnchorChainingPathState =\n\t| { status: 'idle' }\n\t| { status: 'executing'; completedSteps: ExecutedStep[]; currentStepIndex: number }\n\t| { status: 'completed'; result: AnchorChainingPathExecuteResult }\n\t| { status: 'failed'; error: Error; completedSteps: ExecutedStep[]; failedAtStepIndex: number };\n\ninterface StepNeededActionEventPayloadBase<ActionType, ActionPayload, CompletedPayload extends readonly unknown[] = []> {\n\ttype: ActionType;\n\n\tmarkCompleted: (...args: CompletedPayload) => void;\n\tmarkFailed: (error?: unknown) => void;\n\n\taction: ActionPayload;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface StepNeededActionEventAssetMovement extends StepNeededActionEventPayloadBase<'assetMovementUserExecutionRequired', { assetMovementTransfer: AssetMovementTransfer; }, []> {}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface StepNeededActionEventKeetaSend extends StepNeededActionEventPayloadBase<'keetaSendAuthRequired', {\n\tsendToAddress: GenericAccount;\n\tvalue: bigint;\n\ttoken: TokenAddress;\n\texternal?: string;\n}, [ { sent: boolean | BlockHash; }]> {}\n\ntype StepNeededActionEventPayload = StepNeededActionEventKeetaSend | StepNeededActionEventAssetMovement;\n\ntype AnchorChainingPathEventMap = {\n\tstateChange: [state: AnchorChainingPathState];\n\tstepExecuted: [step: ExecutedStep, index: number];\n\tcompleted: [result: AnchorChainingPathExecuteResult];\n\tfailed: [error: Error, completedSteps: ExecutedStep[], failedAtStepIndex: number];\n\tstepNeedsAction: [StepNeededActionEventPayload];\n}\n\ninterface AnchorChainingAssetAndLocation<AssetType extends AnchorChainingAsset = AnchorChainingAsset, Location extends AssetLocationLike = AssetLocationLike> {\n\tasset: AssetType;\n\tlocation: Location;\n\trail: Rail;\n\tvalue?: bigint;\n\n}\n\ninterface AnchorChainingDestination extends AnchorChainingAssetAndLocation {\n\trecipient: RecipientResolved;\n}\n\ninterface AnchorChainingPathInput {\n\tsource: AnchorChainingAssetAndLocation;\n\tdestination: AnchorChainingDestination;\n}\n\nexport interface AnchorChainingConfig {\n\tclient: KeetaNet.UserClient;\n\tresolver?: Resolver;\n\tsigner?: InstanceType<typeof KeetaNetLib.Account>;\n\taccount?: InstanceType<typeof KeetaNetLib.Account>;\n\tlogger?: Logger;\n}\n\ninterface BaseGraphNodeLike<Type extends 'fx' | 'assetMovement', AssetType extends AnchorChainingAsset> {\n\ttype: Type;\n\tproviderID: string;\n\n\tfrom: AnchorChainingAssetAndLocation<AssetType>;\n\tto: AnchorChainingAssetAndLocation<AssetType>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface FXGraphNode extends BaseGraphNodeLike<'fx', Exclude<AnchorChainingAsset, ExternalChainAsset>> {}\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface AssetMovementGraphNode extends BaseGraphNodeLike<'assetMovement', AnchorChainingAsset> {}\nexport type GraphNodeLike = FXGraphNode | AssetMovementGraphNode;\n\ntype KeetaLocationLike = Extract<AssetLocationLike, `chain:keeta:${bigint}`> | PickChainLocation<'keeta'>;\ninterface KeetaSendStepLike {\n\ttype: 'keetaSend';\n\n\tproviderID?: null;\n\n\tfrom: AnchorChainingAssetAndLocation<AnchorChainingAsset, KeetaLocationLike>;\n\tto: AnchorChainingAssetAndLocation<AnchorChainingAsset, KeetaLocationLike>;\n}\n\nexport type AnchorChainingStepLike = GraphNodeLike | KeetaSendStepLike;\n\nexport type AnchorChainingAsset = TokenAddress | ISOCurrencyCode | ExternalChainAsset;\n\nfunction areBothTokenAndEqual(a: string | TokenAddress, b: string | TokenAddress): boolean {\n\ttry {\n\t\tconst aParsed = KeetaNet.lib.Account.toAccount(a);\n\t\tconst bParsed = KeetaNet.lib.Account.toAccount(b);\n\n\t\tif (!aParsed.isToken() || !bParsed.isToken()) {\n\t\t\treturn(false);\n\t\t}\n\n\n\t\treturn(aParsed.comparePublicKey(bParsed));\n\t} catch {\n\t\treturn(false);\n\t}\n}\n\nfunction isAnchorChainingAssetEqual(a: AnchorChainingAsset, b: AnchorChainingAsset): boolean {\n\tif (typeof a === 'string' && typeof b === 'string' && a === b) {\n\t\treturn(true);\n\t} else if (areBothTokenAndEqual(a, b)) {\n\t\treturn(true);\n\t} else {\n\t\treturn(false);\n\t}\n}\n\nfunction nodeSideSupports(side: AnchorChainingAssetAndLocation, required: AnchorChainingAssetAndLocation): boolean {\n\tif (side.rail !== required.rail) {\n\t\treturn(false);\n\t}\n\n\tif (convertAssetLocationToString(side.location) !== convertAssetLocationToString(required.location)) {\n\t\treturn(false);\n\t}\n\n\tif (!isAnchorChainingAssetEqual(side.asset, required.asset)) {\n\t\treturn(false);\n\t}\n\n\treturn(true);\n}\n\n/**\n * Returns true for nodes that keep assets on Keeta: FX nodes, plus\n * asset-movement nodes whose from and to share the same Keeta chain location\n * (custodial FX anchors that don't actually move funds off-chain).\n */\nfunction isFXLikeNode(node: GraphNodeLike): boolean {\n\tif (node.type === 'fx') {\n\t\treturn(true);\n\t}\n\tconst fromStr = convertAssetLocationToString(node.from.location);\n\tconst toStr = convertAssetLocationToString(node.to.location);\n\treturn(fromStr === toStr && fromStr.startsWith('chain:keeta:'));\n}\n\ninterface AssetMovementResolvedRails {\n\tcommon: Rail[];\n\tinbound: Rail[];\n\toutbound: Rail[];\n}\n\nexport type AnchorChainingListAssetsSideFilter = {\n\tlocation?: AssetLocationLike;\n\tasset?: AnchorChainingAsset;\n\trail?: Rail;\n};\n\ntype AnchorChainingListAssetsShared = {\n\tmaxStepCount?: number;\n\tonlyAllowFXLike?: boolean;\n};\n\nexport type AnchorChainingListAssetsFilter =\n\t| ({ from: AnchorChainingListAssetsSideFilter; to?: never } & AnchorChainingListAssetsShared)\n\t| ({ to: AnchorChainingListAssetsSideFilter; from?: never } & AnchorChainingListAssetsShared)\n\t| ({ from?: never; to?: never } & AnchorChainingListAssetsShared);\n\nexport type AnchorChainingResolveAssetsFilter = {\n\tfrom?: AnchorChainingListAssetsSideFilter;\n\tto?: AnchorChainingListAssetsSideFilter;\n\tmaxStepCount?: number;\n\tonlyAllowFXLike?: boolean;\n};\n\nexport interface AnchorChainingResolveAssetsResult {\n\tfrom: AnchorChainingAssetInfo[];\n\tto: AnchorChainingAssetInfo[];\n}\n\nexport interface AnchorChainingAssetInfo {\n\tasset: AnchorChainingAsset;\n\tlocation: AssetLocationLike;\n\trails: {\n\t\tinbound: Rail[];\n\t\toutbound: Rail[];\n\t};\n\n\tdistance: {\n\t\tpathLength: number;\n\t} | null;\n}\n\ntype GetAccountForActionPayload = {\n\ttype: 'assetMovement';\n\tproviderMethod: 'initiateTransfer';\n\tprovider: AssetMovementProvider;\n}\n\ninterface AnchorChainingAccountOverrides {\n\taccount?: Account | undefined | ((providerMethodPayload: GetAccountForActionPayload) => Promise<Account> | Account);\n}\n\nclass AnchorGraph {\n\tclient: KeetaNet.UserClient;\n\tresolver: Resolver;\n\tlogger?: Logger | undefined;\n\t#assetNameCache = new Map<MovableAssetSearchCanonical, ISOCurrencyCode | TokenAddress | ExternalChainAsset>();\n\n\tconstructor(args: { client: KeetaNet.UserClient; resolver: Resolver; logger?: Logger | undefined; }) {\n\t\tthis.resolver = args.resolver;\n\t\tthis.client = args.client;\n\t\tthis.logger = args.logger;\n\t}\n\n\tasync #computeFXNodes() {\n\t\tconst fxServices = await this.resolver.lookup('fx', {});\n\n\t\tif (!fxServices) {\n\t\t\treturn([]);\n\t\t}\n\n\t\tconst networkLocation = `chain:keeta:${this.client.network}` satisfies AssetLocationLike;\n\n\t\tconst providerLookupResult = await Promise.all(Object.entries(fxServices).map(async ([ providerID, service ]) => {\n\t\t\tconst fromEntries = await service.from('array');\n\n\t\t\tif (!fromEntries) {\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tconst pathNodes = await Promise.all(fromEntries.map(async function(fromEntry) {\n\t\t\t\tconst pathNodesResult: GraphNodeLike[] = [];\n\n\t\t\t\tconst parsedEntry = await fromEntry('object');\n\n\t\t\t\tconst [ fromCodes, toCodes ] = await Promise.all([\n\t\t\t\t\tparsedEntry.currencyCodes('array'),\n\t\t\t\t\tparsedEntry.to('array')\n\t\t\t\t]);\n\n\t\t\t\tfor (const from of fromCodes) {\n\t\t\t\t\tconst fromResolved = await from('string');\n\t\t\t\t\tif (!fromResolved) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst fromAccount = KeetaNet.lib.Account.fromPublicKeyString(fromResolved).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN);\n\n\t\t\t\t\tfor (const to of toCodes) {\n\t\t\t\t\t\tconst toResolved = await to('string');\n\t\t\t\t\t\tif (!toResolved) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst toAccount = KeetaNet.lib.Account.fromPublicKeyString(toResolved).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN);\n\n\t\t\t\t\t\tif (fromAccount.comparePublicKey(toAccount)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpathNodesResult.push({\n\t\t\t\t\t\t\ttype: 'fx',\n\t\t\t\t\t\t\tproviderID: providerID,\n\t\t\t\t\t\t\tfrom: { asset: fromAccount, location: networkLocation, rail: 'KEETA_SEND' },\n\t\t\t\t\t\t\tto: { asset: toAccount, location: networkLocation, rail: 'KEETA_SEND' }\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn(pathNodesResult);\n\t\t\t}));\n\n\t\t\treturn(pathNodes.flat());\n\t\t}));\n\n\t\treturn(providerLookupResult.flat().filter((node): node is GraphNodeLike => !!node));\n\t}\n\n\tasync #resolveAssetName(name: MovableAssetSearchCanonical): Promise<ISOCurrencyCode | TokenAddress | ExternalChainAsset> {\n\t\tif (KeetaNet.lib.Account.isInstance(name) && name.isToken()) {\n\t\t\treturn(name);\n\t\t}\n\n\t\tif (typeof name === 'string') {\n\t\t\ttry {\n\t\t\t\treturn(KeetaNet.lib.Account.fromPublicKeyString(name).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN));\n\t\t\t} catch {\n\t\t\t\t/* ignore error and continue with other resolution methods */\n\t\t\t}\n\t\t}\n\n\t\tlet found = this.#assetNameCache.get(name);\n\t\tif (found) {\n\t\t\treturn(found);\n\t\t}\n\n\t\tif (isExternalChainAsset(name)) {\n\t\t\tfound = name;\n\t\t} else if (Currency.isCurrencyCode(name)) {\n\t\t\tfound = name;\n\t\t} else if (Currency.isISOCurrencyNumber(name)) {\n\t\t\tfound = new Currency(name).code;\n\t\t} else {\n\t\t\tconst lookupRet = await this.resolver.lookupToken(name);\n\t\t\tif (lookupRet) {\n\t\t\t\tfound = KeetaNet.lib.Account.toAccount(lookupRet.token);\n\t\t\t}\n\t\t}\n\n\t\tif (!found) {\n\t\t\tthrow(new Error(`Unable to resolve asset name: ${name}`));\n\t\t}\n\n\t\tthis.#assetNameCache.set(name, found);\n\n\t\treturn(found);\n\t}\n\n\tasync #computeAssetRails(assetInput: ToValuizable<RailOrRailWithExtendedDetails>): Promise<{ rail: Rail }> {\n\t\ttry {\n\t\t\tconst railResolved = await assetInput('string');\n\n\t\t\tif (!isRail(railResolved)) {\n\t\t\t\tthrow(new Error(`Invalid rail format: ${railResolved}`));\n\t\t\t}\n\n\t\t\treturn({ rail: railResolved });\n\t\t} catch {\n\t\t\t/* ignore error */\n\t\t}\n\n\t\tconst extendedDetailsResolved = await assetInput('object');\n\n\t\tif (!extendedDetailsResolved || typeof extendedDetailsResolved !== 'object' || Array.isArray(extendedDetailsResolved)) {\n\t\t\tthrow(new Error(`Invalid asset format, expected string or object with extended details`));\n\t\t}\n\n\t\tif (!('rail' in extendedDetailsResolved)) {\n\t\t\tthrow(new Error(`Invalid asset format, missing 'rail' field in extended details`));\n\t\t}\n\n\t\tconst railResolved = await extendedDetailsResolved.rail?.('string');\n\n\t\tif (!isRail(railResolved)) {\n\t\t\tthrow(new Error(`Invalid rail format in extended details: ${railResolved}`));\n\t\t}\n\n\t\treturn({ rail: railResolved });\n\t}\n\n\tasync #computeAssetMovementPairSide(pairSideInput: ToValuizable<AssetWithRails>): Promise<{ rails: AssetMovementResolvedRails; location: AssetLocationLike; id: AnchorChainingAsset; }> {\n\t\tconst pairSideResolved = await pairSideInput('object');\n\n\t\tlet location: AssetLocationLike;\n\t\tif (pairSideResolved.location) {\n\t\t\tconst locationRaw = await pairSideResolved.location('string');\n\t\t\tif (!isAssetLocationLike(locationRaw)) {\n\t\t\t\tthrow(new Error(`Invalid location format: ${locationRaw}`));\n\t\t\t}\n\n\t\t\tlocation = locationRaw;\n\t\t} else {\n\t\t\tlocation = `chain:keeta:${this.client.network}`;\n\t\t}\n\n\t\tconst railsResolved = await pairSideResolved.rails('object');\n\n\t\tconst rails: AssetMovementResolvedRails = {\n\t\t\tcommon: await Promise.all((await railsResolved.common?.('array'))?.map(async (commonInput) => {\n\t\t\t\treturn((await this.#computeAssetRails(commonInput)).rail);\n\t\t\t}) ?? []),\n\t\t\tinbound: await Promise.all((await railsResolved.inbound?.('array'))?.map(async (commonInput) => {\n\t\t\t\treturn((await this.#computeAssetRails(commonInput)).rail);\n\t\t\t}) ?? []),\n\t\t\toutbound: await Promise.all((await railsResolved.outbound?.('array'))?.map(async (commonInput) => {\n\t\t\t\treturn((await this.#computeAssetRails(commonInput)).rail);\n\t\t\t}) ?? [])\n\t\t};\n\n\t\tconst id = await pairSideResolved.id('string');\n\t\tif (!isMovableAssetSearchCanonical(id)) {\n\t\t\tthrow(new Error(`Invalid asset id format: ${id}`));\n\t\t}\n\n\t\treturn({\n\t\t\trails: rails,\n\t\t\tlocation: location,\n\t\t\tid: await this.#resolveAssetName(id)\n\t\t});\n\t}\n\n\tasync #computeAssetMovementNodes() {\n\t\tconst assetMovementServices = await this.resolver.lookup('assetMovement', {});\n\n\t\tif (!assetMovementServices) {\n\t\t\treturn([]);\n\t\t}\n\n\t\tconst providerResults = await Promise.all(Object.entries(assetMovementServices).map(async ([ providerID, service ]) => {\n\t\t\tconst supportedAssetsEntries = await service.supportedAssets('array');\n\n\t\t\tif (!supportedAssetsEntries) {\n\t\t\t\tthis.logger?.debug('AnchorGraph::computeAssetMovementNodes', `No supported assets found for provider ${providerID}`);\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tconst pathNodesResult = await Promise.all(supportedAssetsEntries.map(async (assetEntry): Promise<GraphNodeLike[]> => {\n\t\t\t\tconst parsedEntry = await assetEntry('object');\n\n\t\t\t\tconst pathsResolved = await parsedEntry.paths('array');\n\t\t\t\tconst pathPromises = await Promise.allSettled(pathsResolved.map(async (pathResolvedInput): Promise<GraphNodeLike[]> => {\n\t\t\t\t\tconst pathResolved = await pathResolvedInput('object');\n\n\t\t\t\t\tconst pairResolved = await pathResolved.pair('array');\n\n\t\t\t\t\tconst [ fromResolved, toResolved ] = await Promise.all([\n\t\t\t\t\t\tthis.#computeAssetMovementPairSide(pairResolved[0]),\n\t\t\t\t\t\tthis.#computeAssetMovementPairSide(pairResolved[1])\n\t\t\t\t\t]);\n\n\t\t\t\t\tconst pathNodes: GraphNodeLike[] = [];\n\t\t\t\t\tfor (const [ src, dest ] of [\n\t\t\t\t\t\t[ fromResolved, toResolved ],\n\t\t\t\t\t\t[ toResolved, fromResolved ]\n\t\t\t\t\t] as const) {\n\t\t\t\t\t\tfor (const inboundRail of [ ...(src.rails.common ?? []), ...(src.rails.inbound ?? []) ]) {\n\t\t\t\t\t\t\tfor (const outboundRail of [ ...(dest.rails.common ?? []), ...(dest.rails.outbound ?? []) ]) {\n\t\t\t\t\t\t\t\tpathNodes.push({\n\t\t\t\t\t\t\t\t\ttype: 'assetMovement',\n\t\t\t\t\t\t\t\t\tproviderID: providerID,\n\t\t\t\t\t\t\t\t\tfrom: { asset: src.id, location: src.location, rail: inboundRail },\n\t\t\t\t\t\t\t\t\tto: { asset: dest.id, location: dest.location, rail: outboundRail }\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn(pathNodes);\n\t\t\t\t}));\n\n\t\t\t\tconst allPaths = [];\n\n\t\t\t\tfor (const resolved of pathPromises) {\n\t\t\t\t\tif (resolved.status === 'rejected') {\n\t\t\t\t\t\tthis.logger?.debug('AnchorGraph::computeAssetMovementNodes', `error fetching nodes for ... TODO`, resolved.reason);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tallPaths.push(...resolved.value);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn(allPaths);\n\t\t\t}));\n\n\t\t\treturn(pathNodesResult.flat());\n\t\t}));\n\n\t\treturn(providerResults.flat().filter((node): node is GraphNodeLike => !!node));\n\t}\n\n\tasync computeGraphNodes(): Promise<GraphNodeLike[]> {\n\t\tconst receivedNodes = await Promise.all([\n\t\t\tthis.#computeFXNodes(),\n\t\t\tthis.#computeAssetMovementNodes()\n\t\t]);\n\n\t\treturn(receivedNodes.flat());\n\t}\n\n\tasync findPaths(input: AnchorChainingPathInput): Promise<GraphNodeLike[][]> {\n\t\tconst graph = await this.computeGraphNodes();\n\n\t\tconst nodesWithNext: { node: GraphNodeLike, next: number[] }[] = graph.map(function(node) {\n\t\t\treturn({ node, next: [] });\n\t\t});\n\n\t\tfor (const node of nodesWithNext) {\n\t\t\tfor (let secondNodeIdx = 0; secondNodeIdx < nodesWithNext.length; secondNodeIdx++) {\n\t\t\t\tconst nodeJ = nodesWithNext[secondNodeIdx];\n\t\t\t\tif (!nodeJ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// We can ignore chaining one fx anchor to itself\n\t\t\t\tif (node.node.type === 'fx') {\n\t\t\t\t\tif (node.node.type === nodeJ.node.type && node.node.providerID === nodeJ.node.providerID) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nodeSideSupports(node.node.to, nodeJ.node.from)) {\n\t\t\t\t\tnode.next.push(secondNodeIdx);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst paths: GraphNodeLike[][] = [];\n\n\t\tfunction getAssetLocationString(input: GraphNodeLike['to'], includeRail = false) {\n\t\t\tlet railStr = '';\n\t\t\tif (includeRail) {\n\t\t\t\trailStr = `#${input.rail}`;\n\t\t\t}\n\t\t\treturn(`${convertAssetSearchInputToCanonical(input.asset)}@${convertAssetLocationToString(input.location)}${railStr}`)\n\t\t}\n\n\t\tfunction dfs(\n\t\t\tcurrentIndex: number,\n\t\t\ttarget: AnchorChainingAssetAndLocation,\n\t\t\tvisitedAssets = new Set<string>(),\n\t\t\tpath: GraphNodeLike[] = []\n\t\t) {\n\t\t\tconst cur = nodesWithNext[currentIndex];\n\n\t\t\tif (!cur) {\n\t\t\t\tthrow(new Error(`Invalid node index: ${currentIndex}`));\n\t\t\t}\n\n\t\t\tconst assetLocationStr = getAssetLocationString(cur.node.from, true);\n\t\t\tif (visitedAssets.has(assetLocationStr)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvisitedAssets.add(assetLocationStr);\n\n\t\t\tconst newPath = [ ...path, cur.node ];\n\n\t\t\tif (nodeSideSupports(cur.node.to, target)) {\n\t\t\t\tpaths.push(newPath);\n\t\t\t}\n\n\t\t\tfor (const nextIndex of nodesWithNext[currentIndex]?.next ?? []) {\n\t\t\t\tdfs(nextIndex, target, visitedAssets, newPath);\n\t\t\t}\n\n\t\t\tvisitedAssets.delete(assetLocationStr);\n\t\t}\n\n\t\tfor (let index = 0; index < nodesWithNext.length; index++) {\n\t\t\tconst node = nodesWithNext[index];\n\n\t\t\tif (!node) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (nodeSideSupports(node.node.from, input.source)) {\n\t\t\t\tdfs(index, input.destination);\n\t\t\t}\n\t\t}\n\n\t\treturn(paths);\n\t}\n\n\tasync resolveAssets(filter: AnchorChainingResolveAssetsFilter = {}): Promise<AnchorChainingResolveAssetsResult> {\n\t\tconst { from: fromFilterInput, to: toFilterInput, maxStepCount, onlyAllowFXLike } = filter;\n\n\t\tconst keetaNetworkLocation = `chain:keeta:${this.client.network}` satisfies AssetLocationLike;\n\n\t\t// When onlyAllowFXLike, default omitted locations to the Keeta network location\n\t\tconst fromFilter = (onlyAllowFXLike && fromFilterInput !== undefined && fromFilterInput.location === undefined)\n\t\t\t? { ...fromFilterInput, location: keetaNetworkLocation }\n\t\t\t: fromFilterInput;\n\t\tconst toFilter = (onlyAllowFXLike && toFilterInput !== undefined && toFilterInput.location === undefined)\n\t\t\t? { ...toFilterInput, location: keetaNetworkLocation }\n\t\t\t: toFilterInput;\n\n\t\tconst nodes = await this.computeGraphNodes();\n\n\t\t// Build forward (next) and backward (prev) adjacency in a single pass.\n\t\tconst nodesWithAdj: { node: GraphNodeLike; next: number[]; prev: number[] }[] = nodes.map(node => ({ node, next: [], prev: [] }));\n\t\tfor (let i = 0; i < nodesWithAdj.length; i++) {\n\t\t\tfor (let j = 0; j < nodesWithAdj.length; j++) {\n\t\t\t\tconst ni = nodesWithAdj[i];\n\t\t\t\tconst nj = nodesWithAdj[j];\n\t\t\t\tif (!ni || !nj) {\n\t\t\t\t\tthrow(new Error(`Invalid node index during adjacency construction: ${i} or ${j}`));\n\t\t\t\t}\n\t\t\t\tif (ni.node.type === 'fx' && nj.node.type === 'fx' && ni.node.providerID === nj.node.providerID) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (nodeSideSupports(ni.node.to, nj.node.from)) {\n\t\t\t\t\tni.next.push(j);\n\t\t\t\t\tnj.prev.push(i);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst assetLocationKey = (side: { asset: AnchorChainingAsset; location: AssetLocationLike }) => {\n\t\t\treturn(`${convertAssetSearchInputToCanonical(side.asset)}@${convertAssetLocationToString(side.location)}`);\n\t\t};\n\n\t\tconst sideMatchesFilter = (\n\t\t\tside: GraphNodeLike['from' | 'to'],\n\t\t\tf: AnchorChainingListAssetsSideFilter\n\t\t): boolean => {\n\t\t\tif (f.location !== undefined && convertAssetLocationToString(side.location) !== convertAssetLocationToString(f.location)) {\n\t\t\t\treturn(false);\n\t\t\t}\n\t\t\tif (f.asset !== undefined && !isAnchorChainingAssetEqual(side.asset, f.asset)) {\n\t\t\t\treturn(false);\n\t\t\t}\n\t\t\tif (f.rail !== undefined && side.rail !== f.rail) {\n\t\t\t\treturn(false);\n\t\t\t}\n\t\t\treturn(true);\n\t\t};\n\n\t\t// Separate reachable sets and distance maps for backward (from) and forward (to) traversals.\n\t\tconst fromReachable = new Set<string>();\n\t\tconst fromDistances = new Map<string, number>();\n\t\tconst toReachable = new Set<string>();\n\t\tconst toDistances = new Map<string, number>();\n\n\t\tconst makeMarkFn = (reachable: Set<string>, distances: Map<string, number>) =>\n\t\t\t(side: GraphNodeLike['from' | 'to'], depth?: number) => {\n\t\t\t\tconst key = assetLocationKey(side);\n\t\t\t\treachable.add(key);\n\t\t\t\tif (depth !== undefined) {\n\t\t\t\t\tconst existing = distances.get(key);\n\t\t\t\t\tif (existing === undefined || depth < existing) {\n\t\t\t\t\t\tdistances.set(key, depth);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\tconst markFromReachable = makeMarkFn(fromReachable, fromDistances);\n\t\tconst markToReachable = makeMarkFn(toReachable, toDistances);\n\n\t\tconst bfs = (\n\t\t\tstartCondition: (item: (typeof nodesWithAdj)[number]) => boolean,\n\t\t\tadjacency: 'next' | 'prev',\n\t\t\tmarkSide: 'from' | 'to',\n\t\t\tmarkFn: (side: GraphNodeLike['from' | 'to'], depth: number) => void\n\t\t) => {\n\t\t\tconst nodeVisited = new Set<number>();\n\t\t\tconst queue: { nodeIdx: number; depth: number }[] = [];\n\t\t\tfor (let i = 0; i < nodesWithAdj.length; i++) {\n\t\t\t\tconst item = nodesWithAdj[i];\n\t\t\t\tif (!item) {\n\t\t\t\t\tthrow(new Error(`Invalid node index during BFS initialization: ${i}`));\n\t\t\t\t}\n\t\t\t\tif (startCondition(item) && !nodeVisited.has(i)) {\n\t\t\t\t\tnodeVisited.add(i);\n\t\t\t\t\tqueue.push({ nodeIdx: i, depth: 1 });\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile (queue.length > 0) {\n\t\t\t\tconst queueItem = queue.shift();\n\t\t\t\tif (!queueItem) {\n\t\t\t\t\tthrow(new Error(`Unexpected empty queue during BFS processing`));\n\t\t\t\t}\n\t\t\t\tconst { nodeIdx, depth } = queueItem;\n\t\t\t\tconst item = nodesWithAdj[nodeIdx];\n\t\t\t\tif (!item) {\n\t\t\t\t\tthrow(new Error(`Invalid node index during BFS processing: ${nodeIdx}`));\n\t\t\t\t}\n\t\t\t\tif (onlyAllowFXLike && !isFXLikeNode(item.node)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tmarkFn(item.node[markSide], depth);\n\t\t\t\tif (maxStepCount === undefined || depth < maxStepCount) {\n\t\t\t\t\tfor (const neighborIdx of item[adjacency]) {\n\t\t\t\t\t\tif (!nodeVisited.has(neighborIdx)) {\n\t\t\t\t\t\t\tnodeVisited.add(neighborIdx);\n\t\t\t\t\t\t\tqueue.push({ nodeIdx: neighborIdx, depth: depth + 1 });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (fromFilter) {\n\t\t\tbfs(item => sideMatchesFilter(item.node.from, fromFilter), 'next', 'to', markToReachable);\n\t\t}\n\t\tif (toFilter) {\n\t\t\tbfs(item => sideMatchesFilter(item.node.to, toFilter), 'prev', 'from', markFromReachable);\n\t\t}\n\t\tif (!fromFilter && !toFilter) {\n\t\t\tfor (const { node } of nodesWithAdj) {\n\t\t\t\tif (!onlyAllowFXLike || isFXLikeNode(node)) {\n\t\t\t\t\tmarkFromReachable(node.from);\n\t\t\t\t\tmarkFromReachable(node.to);\n\t\t\t\t\tmarkToReachable(node.from);\n\t\t\t\t\tmarkToReachable(node.to);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Second pass: build result maps by collecting inbound/outbound rails for every reachable\n\t\t// (asset, location) pair from ALL graph nodes, not just those on the traversal path.\n\t\tconst buildResultMap = (\n\t\t\treachable: Set<string>,\n\t\t\tdistances: Map<string, number>\n\t\t): Map<string, AnchorChainingAssetInfo> => {\n\t\t\tconst resultMap = new Map<string, AnchorChainingAssetInfo>();\n\t\t\tconst getOrCreate = (side: { asset: AnchorChainingAsset; location: AssetLocationLike }): AnchorChainingAssetInfo => {\n\t\t\t\tconst key = assetLocationKey(side);\n\t\t\t\tlet resultObj = resultMap.get(key);\n\t\t\t\tif (!resultObj) {\n\t\t\t\t\tconst distanceValue = distances.get(key);\n\t\t\t\t\tresultObj = {\n\t\t\t\t\t\tasset: side.asset,\n\t\t\t\t\t\tlocation: side.location,\n\t\t\t\t\t\trails: { inbound: [], outbound: [] },\n\t\t\t\t\t\tdistance: distanceValue !== undefined ? { pathLength: distanceValue } : null\n\t\t\t\t\t};\n\t\t\t\t\tresultMap.set(key, resultObj);\n\t\t\t\t}\n\t\t\t\treturn(resultObj);\n\t\t\t};\n\t\t\tfor (const { node } of nodesWithAdj) {\n\t\t\t\tif (onlyAllowFXLike && !isFXLikeNode(node)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (reachable.has(assetLocationKey(node.to))) {\n\t\t\t\t\tconst entry = getOrCreate(node.to);\n\t\t\t\t\tif (!entry.rails.inbound.includes(node.to.rail)) {\n\t\t\t\t\t\tentry.rails.inbound.push(node.to.rail);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (reachable.has(assetLocationKey(node.from))) {\n\t\t\t\t\tconst entry = getOrCreate(node.from);\n\t\t\t\t\tif (!entry.rails.outbound.includes(node.from.rail)) {\n\t\t\t\t\t\tentry.rails.outbound.push(node.from.rail);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn(resultMap);\n\t\t};\n\n\t\tconst fromResultMap = buildResultMap(fromReachable, fromDistances);\n\t\tconst toResultMap = buildResultMap(toReachable, toDistances);\n\n\t\t// When onlyAllowFXLike, exclude the filter asset from the result set so that\n\t\t// \"what can USDC be swapped to?\" doesn't include USDC itself via a round-trip.\n\t\tif (onlyAllowFXLike) {\n\t\t\tif (fromFilter?.asset !== undefined) {\n\t\t\t\ttoResultMap.delete(assetLocationKey({ asset: fromFilter.asset, location: fromFilter.location ?? keetaNetworkLocation }));\n\t\t\t}\n\t\t\tif (toFilter?.asset !== undefined) {\n\t\t\t\tfromResultMap.delete(assetLocationKey({ asset: toFilter.asset, location: toFilter.location ?? keetaNetworkLocation }));\n\t\t\t}\n\t\t}\n\n\t\tconst filterMap = (\n\t\t\tmap: Map<string, AnchorChainingAssetInfo>,\n\t\t\tf: AnchorChainingListAssetsSideFilter,\n\t\t\trailSide: 'inbound' | 'outbound'\n\t\t): AnchorChainingAssetInfo[] =>\n\t\t\tArray.from(map.values()).filter(info => {\n\t\t\t\tif (f.location !== undefined && convertAssetLocationToString(info.location) !== convertAssetLocationToString(f.location)) {\n\t\t\t\t\treturn(false);\n\t\t\t\t}\n\t\t\t\tif (f.asset !== undefined && !isAnchorChainingAssetEqual(info.asset, f.asset)) {\n\t\t\t\t\treturn(false);\n\t\t\t\t}\n\t\t\t\tif (f.rail !== undefined && !info.rails[railSide].includes(f.rail)) {\n\t\t\t\t\treturn(false);\n\t\t\t\t}\n\t\t\t\treturn(true);\n\t\t\t});\n\n\t\tconst fromAssets = (fromFilter !== undefined && toFilter !== undefined)\n\t\t\t? filterMap(fromResultMap, fromFilter, 'outbound')\n\t\t\t: Array.from(fromResultMap.values());\n\t\tconst toAssets = (fromFilter !== undefined && toFilter !== undefined)\n\t\t\t? filterMap(toResultMap, toFilter, 'inbound')\n\t\t\t: Array.from(toResultMap.values());\n\n\t\treturn({ from: fromAssets, to: toAssets });\n\t}\n\n\tasync listAssets(filter: AnchorChainingListAssetsFilter = {}): Promise<AnchorChainingAssetInfo[]> {\n\t\tconst result = await this.resolveAssets(filter);\n\n\t\tif (filter.from) {\n\t\t\treturn(result.to);\n\t\t} else if (filter.to) {\n\t\t\treturn(result.from);\n\t\t} else {\n\t\t\treturn(result.to);\n\t\t}\n\t}\n}\n\ninterface ComputePlanOptions {\n\toverrides?: AnchorChainingAccountOverrides;\n}\n\nexport class AnchorChainingPath {\n\treadonly request: AnchorChainingPathInput;\n\treadonly path: AnchorChainingStepLike[];\n\treadonly parent: AnchorChaining;\n\n\tconstructor(input: {\n\t\trequest: AnchorChainingPathInput;\n\t\tpath: AnchorChainingStepLike[];\n\t\tparent: AnchorChaining;\n\t}) {\n\t\tthis.request = input.request;\n\t\tthis.path = input.path;\n\t\tthis.parent = input.parent;\n\t}\n\n\tprotected async getAccountForAction(action: GetAccountForActionPayload, overrides?: AnchorChainingAccountOverrides): Promise<Account | undefined> {\n\t\tlet found;\n\n\t\tif (this.parent['client'].account.isAccount()) {\n\t\t\tfound = this.parent['client'].account;\n\t\t} else if (this.parent['client'].signer !== null) {\n\t\t\tfound = this.parent['client'].signer;\n\t\t}\n\n\t\tif (overrides?.account) {\n\t\t\tif (typeof overrides.account === 'function') {\n\t\t\t\tfound = await overrides.account(action);\n\t\t\t} else {\n\t\t\t\tfound = overrides.account;\n\t\t\t}\n\t\t}\n\n\t\treturn(found);\n\t}\n}\n\nexport class AnchorChainingPlan extends AnchorChainingPath {\n\t#_plan: AnchorChainingPathComputedPlan | null = null;\n\n\t#state: AnchorChainingPathState = { status: 'idle' };\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t#listeners = new Map<string, Set<((...args: any[]) => void)>>();\n\n\tprivate constructor(path: AnchorChainingPath) {\n\t\tsuper({ ...path });\n\t}\n\n\tget plan(): AnchorChainingPathComputedPlan {\n\t\tif (!this.#_plan) {\n\t\t\tthrow(new Error(`Steps have not been computed yet`));\n\t\t}\n\n\t\treturn(this.#_plan);\n\t}\n\n\tasync #computePlan(options?: ComputePlanOptions) {\n\t\tif (this.#_plan) {\n\t\t\tthrow(new Error(`Steps have already been computed`));\n\t\t}\n\n\t\tconst sharedClientOptions = {\n\t\t\tresolver: this.parent['resolver'],\n\t\t\t...(this.parent['logger'] ? { logger: this.parent['logger'] } : {})\n\t\t} as const;\n\n\t\tconst fxClient = new KeetaFXAnchorClient(this.parent['client'], sharedClientOptions);\n\n\t\tconst assetMovementClient = new KeetaAssetMovementAnchorClient(this.parent['client'], sharedClientOptions);\n\n\t\tlet affinityAndAmount: { affinity: 'to' | 'from'; amount: bigint } | undefined = undefined;\n\n\t\tif (this.request.source.value !== undefined && this.request.destination.value !== undefined) {\n\t\t\tthrow(new Error('Must have source.value or destination.value but not both'));\n\t\t} else if (this.request.source.value !== undefined) {\n\t\t\taffinityAndAmount = {\n\t\t\t\taffinity: 'from',\n\t\t\t\tamount: this.request.source.value\n\t\t\t}\n\t\t} else if (this.request.destination.value !== undefined) {\n\t\t\taffinityAndAmount = {\n\t\t\t\taffinity: 'to',\n\t\t\t\tamount: this.request.destination.value\n\t\t\t}\n\t\t} else {\n\t\t\tthrow(new Error('Must have source.value or destination.value'));\n\t\t}\n\n\t\tconst { affinity } = affinityAndAmount\n\n\t\tconst findInstruction = <R extends AssetTransferInstructions['type']>(allInstructions: AssetTransferInstructions[], type: R): Extract<AssetTransferInstructions, { type: R }> => {\n\t\t\tconst found = allInstructions.find((instr): instr is Extract<AssetTransferInstructions, { type: R }> => {\n\t\t\t\treturn(instr.type === type);\n\t\t\t});\n\n\t\t\tif (!found) {\n\t\t\t\tthrow(new Error(`Expected to find instruction of type ${type} in next step's instructions`));\n\t\t\t}\n\n\t\t\treturn(found);\n\t\t};\n\n\t\tconst stepPromises: Promise<ChainStepResolution>[] = [];\n\t\tconst resolvingSteps = new Set<number>();\n\t\tconst resolveStep = async (index: number): Promise<ChainStepResolution> => {\n\t\t\tconst step = this.path[index];\n\n\t\t\tif (!step) {\n\t\t\t\tthrow(new Error(`Step ${index} is not defined`));\n\t\t\t}\n\n\t\t\tlet promise: Promise<ChainStepResolution> | undefined = stepPromises[index];\n\n\t\t\tif (!promise) {\n\t\t\t\tresolvingSteps.add(index);\n\n\t\t\t\tpromise = (async (): Promise<ChainStepResolution> => {\n\t\t\t\t\tif (step.type === 'fx') {\n\t\t\t\t\t\tlet amount;\n\n\t\t\t\t\t\tif (affinity === 'from') {\n\t\t\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t\t\tamount = affinityAndAmount.amount;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst previous = await resolveStep(index - 1);\n\t\t\t\t\t\t\t\tamount = previous.valueOut;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (affinity === 'to') {\n\t\t\t\t\t\t\tif (index === (this.path.length - 1)) {\n\t\t\t\t\t\t\t\t// XXX:TODO Move this to destination\n\t\t\t\t\t\t\t\tamount = affinityAndAmount.amount;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst next = await resolveStep(index + 1);\n\t\t\t\t\t\t\t\tamount = next.valueIn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tassertNever(affinity);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst quotesOrEstimates = await fxClient.getQuotesOrEstimates(\n\t\t\t\t\t\t\t{ from: step.from.asset, to: step.to.asset, amount, affinity },\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t{ providerIDs: [ step.providerID ] }\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!quotesOrEstimates?.[0] || quotesOrEstimates.length === 0) {\n\t\t\t\t\t\t\tthrow(new Error(`Could not get FX quote/estimate for provider ${step.providerID}`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst result = quotesOrEstimates[0];\n\n\t\t\t\t\t\tconst convertedAmount = result.isQuote ? result.quote.convertedAmount : result.estimate.convertedAmount;\n\n\t\t\t\t\t\tlet valueIn;\n\t\t\t\t\t\tlet valueOut;\n\n\t\t\t\t\t\tif (affinity === 'to') {\n\t\t\t\t\t\t\tvalueOut = amount;\n\t\t\t\t\t\t\tvalueIn = convertedAmount;\n\t\t\t\t\t\t} else if (affinity === 'from') {\n\t\t\t\t\t\t\tvalueOut = convertedAmount;\n\t\t\t\t\t\t\tvalueIn = amount;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tassertNever(affinity);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn({ type: 'fx', step, valueIn, valueOut, result });\n\t\t\t\t\t} else if (step.type === 'assetMovement') {\n\t\t\t\t\t\tlet recipient;\n\t\t\t\t\t\tlet sendingToType: SendingToType;\n\t\t\t\t\t\tif (index === this.path.length - 1) {\n\t\t\t\t\t\t\trecipient = this.request.destination.recipient;\n\t\t\t\t\t\t\tsendingToType = 'FINAL_DESTINATION';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst nextPathStep = this.path[index + 1];\n\t\t\t\t\t\t\tif (nextPathStep?.type === 'fx') {\n\t\t\t\t\t\t\t\tthrow(new Error(`Cannot currently chain from asset movement to fx step, as fx step does not have recipient information`));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst nextStep = await resolveStep(index + 1);\n\n\t\t\t\t\t\t\tif (nextStep.type === 'assetMovement' || nextStep.type === 'keetaSend') {\n\t\t\t\t\t\t\t\tif (nextStep.usingInstruction.type !== step.to.rail) {\n\t\t\t\t\t\t\t\t\tthrow(new Error(`Next step's usingInstruction type ${nextStep.usingInstruction.type} does not match expected ${step.to.rail} for recipient resolution`));\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst foundInstruction = nextStep.usingInstruction;\n\n\t\t\t\t\t\t\t\tconst isFiatPushRailFoundInstruction = (input: AssetTransferInstructions): input is Extract<AssetTransferInstructions, { type: FiatPushRails; }> => {\n\t\t\t\t\t\t\t\t\treturn(isFiatRail(input.type));\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (foundInstruction.type === 'KEETA_SEND') {\n\t\t\t\t\t\t\t\t\tif (!KeetaNet.lib.Account.isInstance(step.to.asset)) {\n\t\t\t\t\t\t\t\t\t\tthrow(new Error(`Expected asset to be a token account for KEETA_SEND rail`));\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (!step.to.asset.comparePublicKey(foundInstruction.tokenAddress)) {\n\t\t\t\t\t\t\t\t\t\tthrow(new Error(`Recipient token account ${foundInstruction.tokenAddress.toString()} does not match expected ${step.to.asset.publicKeyString.get()}`));\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (foundInstruction.external) {\n\t\t\t\t\t\t\t\t\t\tthrow(new Error(`Expected KEETA_SEND instruction to not have external value`));\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// XXX:TODO assert value here matches\n\n\t\t\t\t\t\t\t\t\tsendingToType = 'NEXT_STEP';\n\t\t\t\t\t\t\t\t\trecipient = KeetaNet.lib.Account.fromPublicKeyString(foundInstruction.sendToAddress);\n\t\t\t\t\t\t\t\t} else if (isFiatPushRailFoundInstruction(foundInstruction)) {\n\t\t\t\t\t\t\t\t\tif (foundInstruction.depositMessage) {\n\t\t\t\t\t\t\t\t\t\tthrow(new Error(`Deposit message outbound is not currently supported for chaining`));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tsendingToType = 'NEXT_STEP';\n\t\t\t\t\t\t\t\t\trecipient = foundInstruction.account;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tthrow(new Error(`Unsupported rail for chaining: ${step.to.rail}`));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (nextStep.type === 'fx') {\n\t\t\t\t\t\t\t\tthrow(new Error(`Cannot currently chain from asset movement to fx step, as fx step does not have recipient information`));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tassertNever(nextStep);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!recipient) {\n\t\t\t\t\t\t\tthrow(new Error(`Recipient must be defined for asset movement step at index ${index}`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst assetPair = { from: step.from.asset, to: step.to.asset };\n\n\t\t\t\t\t\tconst providers = await assetMovementClient.getProvidersForTransfer(\n\t\t\t\t\t\t\t{ asset: assetPair, from: step.from.location, to: step.to.location },\n\t\t\t\t\t\t\t{ providerIDs: [ step.providerID ] }\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!providers?.[0] || providers.length === 0) {\n\t\t\t\t\t\t\tthrow(new Error(`Could not get asset movement provider ${step.providerID}`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet depositValue;\n\n\t\t\t\t\t\tif (affinity === 'to') {\n\t\t\t\t\t\t\tthrow(new Error(`Chaining with affinity 'to' is not currently supported for asset movement steps, as it requires looking up transfer quotes/estimates which is not currently implemented`));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t\t\tdepositValue = affinityAndAmount.amount;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst previous = await resolveStep(index - 1);\n\t\t\t\t\t\t\t\tdepositValue = previous.valueOut;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst transfer = await providers[0].initiateTransfer({\n\t\t\t\t\t\t\taccount: await this.getAccountForAction({\n\t\t\t\t\t\t\t\ttype: 'assetMovement',\n\t\t\t\t\t\t\t\tproviderMethod: 'initiateTransfer',\n\t\t\t\t\t\t\t\tprovider: providers[0]\n\t\t\t\t\t\t\t}, options?.overrides),\n\t\t\t\t\t\t\tasset: assetPair,\n\t\t\t\t\t\t\tfrom: { location: step.from.location },\n\t\t\t\t\t\t\tto: {\n\t\t\t\t\t\t\t\tlocation: step.to.location,\n\t\t\t\t\t\t\t\trecipient: (() => {\n\t\t\t\t\t\t\t\t\tif (KeetaNet.lib.Account.isInstance(recipient)) {\n\t\t\t\t\t\t\t\t\t\treturn(recipient.publicKeyString.get());\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\treturn(recipient);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})()\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tvalue: depositValue\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst usingInstruction = findInstruction(transfer.instructions, step.from.rail);\n\n\t\t\t\t\t\tif (!usingInstruction.totalReceiveAmount) {\n\t\t\t\t\t\t\tthrow(new Error(`totalReceiveAmount must be defined for chaining`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn({\n\t\t\t\t\t\t\ttype: 'assetMovement',\n\t\t\t\t\t\t\tstep,\n\t\t\t\t\t\t\tvalueIn: depositValue,\n\t\t\t\t\t\t\tusingInstruction: usingInstruction,\n\t\t\t\t\t\t\ttransfer: transfer,\n\t\t\t\t\t\t\tsendingTo: sendingToType,\n\t\t\t\t\t\t\tvalueOut: BigInt(usingInstruction.totalReceiveAmount)\n\t\t\t\t\t\t})\n\t\t\t\t\t} else if (step.type === 'keetaSend') {\n\t\t\t\t\t\tif (this.path.length !== 1) {\n\t\t\t\t\t\t\tthrow(new Error(`Direct same-location/same-asset send steps must be the only step in the path`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!KeetaNet.lib.Account.isInstance(step.from.asset) || !KeetaNet.lib.Account.isInstance(step.to.asset)) {\n\t\t\t\t\t\t\tthrow(new Error(`Expected assets to be token accounts for KEETA_SEND rail`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!step.from.asset.comparePublicKey(step.to.asset)) {\n\t\t\t\t\t\t\tthrow(new Error(`For KEETA_SEND step, from and to asset must be the same account`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet keetaRecipientDestination = null;\n\t\t\t\t\t\tif (KeetaNet.lib.Account.isInstance(this.request.destination.recipient)) {\n\t\t\t\t\t\t\tkeetaRecipientDestination = this.request.destination.recipient;\n\t\t\t\t\t\t} else if (typeof this.request.destination.recipient === 'string') {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tkeetaRecipientDestination = KeetaNet.lib.Account.fromPublicKeyString(this.request.destination.recipient);\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t/* ignore errors */\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!keetaRecipientDestination) {\n\t\t\t\t\t\t\tthrow(new Error(`Expected destination recipient to be a public key string for KEETA_SEND step`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn({\n\t\t\t\t\t\t\ttype: 'keetaSend',\n\t\t\t\t\t\t\tstep: null,\n\t\t\t\t\t\t\tvalueIn: affinityAndAmount.amount,\n\t\t\t\t\t\t\tvalueOut: affinityAndAmount.amount,\n\t\t\t\t\t\t\tusingInstruction: {\n\t\t\t\t\t\t\t\ttype: 'KEETA_SEND',\n\t\t\t\t\t\t\t\ttokenAddress: step.to.asset.publicKeyString.get(),\n\t\t\t\t\t\t\t\tsendToAddress: keetaRecipientDestination.publicKeyString.get(),\n\t\t\t\t\t\t\t\ttotalReceiveAmount: affinityAndAmount.amount.toString(),\n\t\t\t\t\t\t\t\tlocation: `chain:keeta:${this.parent['client'].network}`,\n\t\t\t\t\t\t\t\tvalue: String(affinityAndAmount.amount),\n\t\t\t\t\t\t\t\tassetFee: '0'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertNever(step);\n\t\t\t\t\t}\n\t\t\t\t})();\n\n\t\t\t\tpromise.then(() => resolvingSteps.delete(index), () => resolvingSteps.delete(index));\n\t\t\t\tstepPromises[index] = promise;\n\t\t\t} else if (resolvingSteps.has(index)) {\n\t\t\t\tthrow(new Error(`Cyclic dependency detected in resolveStep: step ${index} is already being resolved`));\n\t\t\t}\n\n\t\t\treturn(await promise);\n\t\t}\n\n\t\tconst steps = [];\n\t\tfor (let index = 0; index < this.path.length; index++) {\n\t\t\tsteps.push(await resolveStep(index));\n\t\t}\n\n\t\t// Direct same-location/same-asset send: no provider steps needed.\n\t\tif (steps.length === 0) {\n\t\t\treturn({\n\t\t\t\tsteps: [],\n\t\t\t\ttotalValueIn: affinityAndAmount.amount,\n\t\t\t\ttotalValueOut: affinityAndAmount.amount\n\t\t\t});\n\t\t}\n\n\t\tconst firstStep = steps[0];\n\t\tconst lastStep = steps[steps.length - 1];\n\n\t\tif (!firstStep || !lastStep) {\n\t\t\tthrow(new Error(`Steps array is empty`));\n\t\t}\n\n\t\tif (affinity === 'from') {\n\t\t\tif (firstStep.valueIn !== this.request.source.value) {\n\t\t\t\tthrow(new Error(`Computed valueIn for first step ${firstStep.valueIn} does not match request source value ${this.request.source.value}`));\n\t\t\t}\n\t\t} else if (affinity === 'to') {\n\t\t\tif (lastStep.valueOut !== this.request.destination.value) {\n\t\t\t\tthrow(new Error(`Computed valueOut for last step ${lastStep.valueOut} does not match requested destination value ${this.request.destination.value}`));\n\t\t\t}\n\t\t}\n\n\t\tif (lastStep.valueOut <= 0n) {\n\t\t\tthrow(new Error(`Computed valueOut for last step must be greater than 0, got ${lastStep.valueOut}`));\n\t\t}\n\n\t\treturn({\n\t\t\tsteps,\n\t\t\ttotalValueIn: firstStep.valueIn,\n\t\t\ttotalValueOut: lastStep.valueOut\n\t\t});\n\t}\n\n\tstatic async create(path: AnchorChainingPath, options?: ComputePlanOptions): Promise<AnchorChainingPlan> {\n\t\tconst instance = new this(path);\n\t\tinstance.#_plan = await instance.#computePlan(options);\n\t\treturn(instance);\n\t}\n\n\tget state(): AnchorChainingPathState {\n\t\treturn(this.#state);\n\t}\n\n\ton<E extends keyof AnchorChainingPathEventMap>(event: E, listener: (...args: AnchorChainingPathEventMap[E]) => void): void {\n\t\tlet listenerSet = this.#listeners.get(event);\n\t\tif (!listenerSet) {\n\t\t\tlistenerSet = new Set();\n\t\t\tthis.#listeners.set(event, listenerSet);\n\t\t}\n\t\tlistenerSet.add(listener);\n\t}\n\n\toff<E extends keyof AnchorChainingPathEventMap>(event: E, listener: (...args: AnchorChainingPathEventMap[E]) => void): void {\n\t\tthis.#listeners.get(event)?.delete(listener);\n\t}\n\n\t#setState(state: AnchorChainingPathState): void {\n\t\tthis.#state = state;\n\t\tthis.#emit('stateChange', state);\n\t}\n\n\tget logger(): Logger | undefined {\n\t\treturn(this.parent['logger']);\n\t}\n\n\t#emit<E extends keyof AnchorChainingPathEventMap>(event: E, ...args: AnchorChainingPathEventMap[E]): { sendCount: number; } {\n\t\tlet sendCount = 0;\n\n\t\tfor (const listener of (this.#listeners.get(event) ?? [])) {\n\t\t\ttry {\n\t\t\t\tlistener(...args);\n\t\t\t\tsendCount++;\n\t\t\t} catch (err) {\n\t\t\t\tthis.logger?.debug(`AnchorChainingPath::emit`, `Error in listener for event '${event}'`, err);\n\t\t\t}\n\t\t}\n\n\t\treturn({ sendCount });\n\t}\n\n\tasync #awaitStepCompletion<\n\t\tType extends StepNeededActionEventPayload['type'],\n\t\tRet extends Parameters<Extract<StepNeededActionEventPayload, { action: { type: Type }}>['markCompleted']>\n\t>(step: Pick<Extract<StepNeededActionEventPayload, { type: Type }>, 'action' | 'type'>): Promise<Ret> {\n\t\tlet didComplete = false;\n\n\t\tfunction assertDidNotComplete() {\n\t\t\tif (didComplete) {\n\t\t\t\tthrow(new Error(`Step was already marked as completed or failed`));\n\t\t\t}\n\n\t\t\tdidComplete = true;\n\t\t}\n\n\t\tlet resolveFn: undefined | StepNeededActionEventPayload['markCompleted'];\n\t\tlet rejectFn: undefined | StepNeededActionEventPayload['markFailed'];\n\n\t\tconst promise = new Promise<Ret>(function(resolve, reject) {\n\t\t\tresolveFn = (...args: Ret) => {\n\t\t\t\tassertDidNotComplete();\n\t\t\t\tresolve(args);\n\t\t\t};\n\n\t\t\trejectFn = (error) => {\n\t\t\t\tassertDidNotComplete();\n\n\t\t\t\tlet usingErr = error;\n\t\t\t\tif (!usingErr) {\n\t\t\t\t\tusingErr = new Error(`Step marked as failed without error`);\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n\t\t\t\treject(usingErr);\n\t\t\t}\n\t\t});\n\n\t\tif (!resolveFn || !rejectFn) {\n\t\t\tthrow(new Error(`Failed to create step completion promise`));\n\t\t}\n\n\t\t// Typescript Cannot infer the correct payload type for the stepNeedsAction event, so we have to assert it here. We ensure type safety by constraining the step parameter to the correct action type, which guarantees that the payload will match the expected structure for that action type.\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst { sendCount } = this.#emit('stepNeedsAction', {\n\t\t\t...step,\n\t\t\tmarkCompleted: resolveFn,\n\t\t\tmarkFailed: rejectFn\n\t\t} as Extract<StepNeededActionEventPayload, { action: { type: Type }}>);\n\n\t\tif (sendCount === 0) {\n\t\t\tthrow(new Error(`No listeners for stepNeedsAction event, but a step (actionType=${step.type}) is awaiting completion`));\n\t\t}\n\n\t\treturn(await promise);\n\t}\n\n\tasync #authorizedSend(options: Pick<AnchorChainingPathExecuteOptions, 'requireSendAuth'> | undefined, sendToAddress: string | GenericAccount, value: bigint, token: TokenAddress | string, external?: string): Promise<void> {\n\t\tif (options?.requireSendAuth) {\n\t\t\tawait this.#awaitStepCompletion({\n\t\t\t\ttype: 'keetaSendAuthRequired',\n\t\t\t\taction: {\n\t\t\t\t\tsendToAddress: KeetaNet.lib.Account.toAccount(sendToAddress),\n\t\t\t\t\tvalue,\n\t\t\t\t\ttoken: KeetaNet.lib.Account.toAccount(token).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN),\n\t\t\t\t\t...(external !== undefined ? { external } : {})\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tawait this.parent['client'].send(sendToAddress, value, token, external);\n\t}\n\n\tasync #pollTransferStatus(\n\t\ttransfer: AssetMovementTransfer,\n\t\toptions?: { intervalMs?: number; timeoutMs?: number }\n\t): Promise<Awaited<ReturnType<AssetMovementTransfer['getTransferStatus']>>> {\n\t\tconst intervalMs = options?.intervalMs ?? 2000;\n\t\tconst timeoutMs = options?.timeoutMs ?? 300_000;\n\t\tconst deadline = Date.now() + timeoutMs;\n\n\t\twhile (true) {\n\t\t\tconst status = await transfer.getTransferStatus();\n\t\t\tif (status.transaction.status === 'COMPLETED') {\n\t\t\t\treturn(status);\n\t\t\t}\n\t\t\tif (Date.now() >= deadline) {\n\t\t\t\tthrow(new Error(`Timed out waiting for transfer ${transfer.transferId} to complete`));\n\t\t\t}\n\t\t\tawait KeetaNet.lib.Utils.Helper.asleep(intervalMs);\n\t\t}\n\t}\n\n\tasync #pollExchangeStatus(\n\t\texchange: FXExchange,\n\t\toptions?: { intervalMs?: number; timeoutMs?: number }\n\t): Promise<Awaited<ReturnType<FXExchange['getExchangeStatus']>>> {\n\t\tconst intervalMs = options?.intervalMs ?? 2000;\n\t\tconst timeoutMs = options?.timeoutMs ?? 300_000;\n\t\tconst deadline = Date.now() + timeoutMs;\n\n\t\twhile (true) {\n\t\t\tconst status = await exchange.getExchangeStatus();\n\t\t\tif (status.status === 'completed') {\n\t\t\t\treturn(status);\n\t\t\t}\n\t\t\tif (status.status === 'failed') {\n\t\t\t\tthrow(new Error(`FX exchange ${exchange.exchange.exchangeID} failed`));\n\t\t\t}\n\t\t\tif (Date.now() >= deadline) {\n\t\t\t\tthrow(new Error(`Timed out waiting for FX exchange ${exchange.exchange.exchangeID} to complete`));\n\t\t\t}\n\t\t\tawait KeetaNet.lib.Utils.Helper.asleep(intervalMs);\n\t\t}\n\t}\n\n\tasync execute(options?: { requireSendAuth?: boolean }): Promise<AnchorChainingPathExecuteResult> {\n\t\tif (this.#state.status !== 'idle') {\n\t\t\tthrow(new Error(`Cannot execute: path is already in state \"${this.#state.status}\"`));\n\t\t}\n\n\t\tconst executedSteps: ExecutedStep[] = [];\n\t\tthis.#setState({ status: 'executing', completedSteps: [], currentStepIndex: 0 });\n\n\t\t// Actual output value from each completed step, used for equality checking.\n\t\tlet prevActualValueOut: bigint | null = null;\n\n\t\tlet index = 0;\n\t\ttry {\n\t\t\tlet prev = null;\n\t\t\tfor (index = 0; index < this.plan.steps.length; index++) {\n\t\t\t\tconst onStepCompleted = (step: ExecutedStep) => {\n\t\t\t\t\texecutedSteps.push(step);\n\t\t\t\t\tthis.#emit('stepExecuted', step, index);\n\t\t\t\t}\n\n\t\t\t\tthis.#setState({ status: 'executing', completedSteps: [...executedSteps], currentStepIndex: index });\n\n\t\t\t\tconst step = this.plan.steps[index];\n\n\t\t\t\tif (!step) {\n\t\t\t\t\tthrow(new Error(`Step ${index} is not defined`));\n\t\t\t\t}\n\n\t\t\t\t// Verify the actual output from the previous step matches the expected\n\t\t\t\t// input for this step. A mismatch indicates a provider delivered a\n\t\t\t\t// different amount than was negotiated in computeSteps.\n\t\t\t\tif (index > 0 && prevActualValueOut !== null) {\n\t\t\t\t\tif (prevActualValueOut !== step.valueIn) {\n\t\t\t\t\t\tthrow(new Error(\n\t\t\t\t\t\t\t`Value mismatch at step ${index}: ` +\n\t\t\t\t\t\t\t`expected ${step.valueIn} but previous step produced ${prevActualValueOut}`\n\t\t\t\t\t\t));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (step.type === 'fx') {\n\t\t\t\t\tconst exchange = await step.result.createExchange();\n\t\t\t\t\tawait this.#pollExchangeStatus(exchange);\n\t\t\t\t\tprevActualValueOut = step.valueOut;\n\t\t\t\t\tonStepCompleted({ type: 'fx', plan: step, exchange });\n\t\t\t\t} else if (step.type === 'assetMovement' || step.type === 'keetaSend') {\n\t\t\t\t\tlet userInitiatedTransferRequired;\n\t\t\t\t\tif (prev && prev.type === 'assetMovement') {\n\t\t\t\t\t\tif (prev.sendingTo === 'NEXT_STEP') {\n\t\t\t\t\t\t\tuserInitiatedTransferRequired = false;\n\t\t\t\t\t\t} else if (prev.sendingTo === 'FINAL_DESTINATION') {\n\t\t\t\t\t\t\tthrow(new Error(`Invalid path: step ${index - 1} is sending to final destination, but is followed by another step`));\n\t\t\t\t\t\t} else if (prev.sendingTo === 'SELF') {\n\t\t\t\t\t\t\tuserInitiatedTransferRequired = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tassertNever(prev.sendingTo);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tuserInitiatedTransferRequired = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (userInitiatedTransferRequired) {\n\t\t\t\t\t\tif (step.usingInstruction.type === 'KEETA_SEND') {\n\t\t\t\t\t\t\tawait this.#authorizedSend(\n\t\t\t\t\t\t\t\toptions,\n\t\t\t\t\t\t\t\tstep.usingInstruction.sendToAddress,\n\t\t\t\t\t\t\t\tBigInt(step.usingInstruction.value),\n\t\t\t\t\t\t\t\tKeetaNet.lib.Account.fromPublicKeyString(step.usingInstruction.tokenAddress).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN),\n\t\t\t\t\t\t\t\tstep.usingInstruction.external\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (index === 0) {\n\t\t\t\t\t\t\tif (step.type !== 'assetMovement') {\n\t\t\t\t\t\t\t\tthrow(new Error(`Unexpected asset movement step at index ${index} for user-initiated transfer`));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tawait this.#awaitStepCompletion({\n\t\t\t\t\t\t\t\ttype: 'assetMovementUserExecutionRequired',\n\t\t\t\t\t\t\t\taction: {\n\t\t\t\t\t\t\t\t\tassetMovementTransfer: step.transfer\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow(new Error(`Unsupported instruction type ${step.usingInstruction.type} for user-initiated transfer at step ${index}`));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (step.type === 'assetMovement') {\n\t\t\t\t\t\tconst status = await this.#pollTransferStatus(step.transfer);\n\t\t\t\t\t\tprevActualValueOut = BigInt(status.transaction.to.value);\n\t\t\t\t\t\tonStepCompleted({ type: 'assetMovement', plan: step });\n\t\t\t\t\t} else if (step.type === 'keetaSend') {\n\t\t\t\t\t\t// For a direct Keeta send, we don't have a transfer object to poll, so we optimistically assume it completes successfully after the authorized send. We could optionally add a polling mechanism here if the underlying client provides a way to check the status of a Keeta transfer.\n\t\t\t\t\t\tprevActualValueOut = step.valueIn;\n\t\t\t\t\t\tonStepCompleted({ type: 'keetaSend', plan: step });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertNever(step);\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\tassertNever(step);\n\t\t\t\t}\n\n\t\t\t\tprev = step;\n\t\t\t}\n\n\t\t\t// Direct same-location/same-asset send: the loop ran zero iterations,\n\t\t\t// so just publish the on-chain transfer directly.\n\t\t\tif (this.path.length === 0) {\n\t\t\t\tconst sendValue = this.request.source.value ?? this.request.destination.value;\n\t\t\t\tif (!sendValue) {\n\t\t\t\t\tthrow(new Error(`Direct send requires a value for source or destination`));\n\t\t\t\t}\n\n\t\t\t\tif (!KeetaNet.lib.Account.isInstance(this.request.source.asset)) {\n\t\t\t\t\tthrow(new Error(`Direct send requires a Keeta token address as the source asset`));\n\t\t\t\t}\n\t\t\t\tconst recipient = this.request.destination.recipient;\n\t\t\t\tif (typeof recipient !== 'string') {\n\t\t\t\t\tthrow(new Error(`Direct Keeta send requires a crypto address as the recipient`));\n\t\t\t\t}\n\t\t\t\tawait this.#authorizedSend(options, recipient, sendValue, this.request.source.asset);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error(String(err));\n\t\t\tthis.#setState({ status: 'failed', error, completedSteps: [...executedSteps], failedAtStepIndex: index });\n\t\t\tthis.#emit('failed', error, [...executedSteps], index);\n\t\t\tthrow(error);\n\t\t}\n\n\t\tconst result: AnchorChainingPathExecuteResult = { steps: executedSteps };\n\t\tthis.#setState({ status: 'completed', result });\n\t\tthis.#emit('completed', result);\n\t\treturn(result);\n\t}\n}\n\nexport class AnchorChaining {\n\tprivate client: KeetaNet.UserClient;\n\tprivate resolver: Resolver;\n\treadonly graph: AnchorGraph;\n\tprivate logger?: Logger;\n\n\tconstructor(config: AnchorChainingConfig) {\n\t\tthis.client = config.client;\n\t\tif (config.resolver) {\n\t\t\tthis.resolver = config.resolver;\n\t\t} else {\n\t\t\tthis.resolver = getDefaultResolver(config.client);\n\t\t}\n\t\tthis.graph = new AnchorGraph({ resolver: this.resolver, client: this.client, logger: config.logger });\n\t\tif (config.logger !== undefined) {\n\t\t\tthis.logger = config.logger;\n\t\t}\n\t}\n\n\tasync getPaths(input: AnchorChainingPathInput): Promise<AnchorChainingPath[] | null> {\n\t\t// Direct send: same Keeta location, same asset, same rail no providers needed.\n\t\tconst sourceLocation = toAssetLocation(input.source.location);\n\t\tconst destinationLocation = toAssetLocation(input.destination.location);\n\n\t\tlet foundPaths: AnchorChainingStepLike[][] | null = null;\n\n\t\tif (\n\t\t\tinput.source.rail === 'KEETA_SEND' &&\n\t\t\tinput.destination.rail === 'KEETA_SEND' &&\n\t\t\tconvertAssetLocationToString(sourceLocation) === convertAssetLocationToString(destinationLocation) &&\n\t\t\tisChainLocation(sourceLocation, 'keeta') &&\n\t\t\tisChainLocation(destinationLocation, 'keeta') &&\n\t\t\tisAnchorChainingAssetEqual(input.source.asset, input.destination.asset)\n\t\t) {\n\t\t\tconst fromTo = {\n\t\t\t\tasset: input.source.asset,\n\t\t\t\tlocation: sourceLocation,\n\t\t\t\trail: 'KEETA_SEND'\n\t\t\t} as const;\n\n\t\t\tfoundPaths = [\n\t\t\t\t[{ type: 'keetaSend', from: fromTo, to: fromTo }]\n\t\t\t];\n\t\t} else {\n\t\t\tfoundPaths = await this.graph.findPaths(input);\n\t\t}\n\n\t\tif (foundPaths.length === 0) {\n\t\t\treturn(null);\n\t\t}\n\n\t\tconst retval: AnchorChainingPath[] = [];\n\n\t\tfor (const path of foundPaths) {\n\t\t\tretval.push(new AnchorChainingPath({ request: input, path, parent: this }));\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tasync getPlans(input: AnchorChainingPathInput, options?: ComputePlanOptions): Promise<AnchorChainingPlan[] | null> {\n\t\tconst paths = await this.getPaths(input);\n\n\t\tif (!paths) {\n\t\t\treturn(null);\n\t\t}\n\n\t\tconst result = await Promise.allSettled(paths.map(async function(path) {\n\t\t\treturn(await AnchorChainingPlan.create(path, options));\n\t\t}));\n\n\t\tconst ret = [];\n\n\t\tfor (const plan of result) {\n\t\t\tif (plan.status === 'fulfilled') {\n\t\t\t\tret.push(plan.value);\n\t\t\t} else {\n\t\t\t\tthis.logger?.debug(`AnchorChaining::getPlans`, `Error computing plan for a path:`, plan.reason);\n\t\t\t}\n\t\t}\n\n\t\treturn(ret);\n\t}\n}\n"]}
1
+ {"version":3,"file":"chaining.js","sourceRoot":"","sources":["../../src/lib/chaining.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,4BAA4B,EAAE,kCAAkC,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAE1J,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sDAAsD,CAAC;AAE3F,OAAO,EAAE,UAAU,EAAE,6BAA6B,EAAE,MAAM,EAAE,MAAM,gDAAgD,CAAC;AACnH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,mBAAmB,MAAM,0BAA0B,CAAC;AAC3D,OAAO,8BAA8B,MAAM,sCAAsC,CAAC;AAElF,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAmBjD,CAAC;AAQD,CAAC;AAID,CAAC;AA8HF,SAAS,oBAAoB,CAAC,CAAwB,EAAE,CAAwB;IAC/E,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAElD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,OAAM,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;QAGD,OAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACR,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;AACF,CAAC;AAED,SAAS,0BAA0B,CAAC,CAAsB,EAAE,CAAsB;IACjF,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,OAAM,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;SAAM,IAAI,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACvC,OAAM,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;SAAM,CAAC;QACP,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAoC,EAAE,QAAwC;IACvG,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjC,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAED,IAAI,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,4BAA4B,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrG,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAED,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7D,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAED,OAAM,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,IAAmB;IACxC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACxB,OAAM,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,4BAA4B,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC7D,OAAM,CAAC,OAAO,KAAK,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;AACjE,CAAC;AA2DD,MAAM,WAAW;IAChB,MAAM,CAAsB;IAC5B,QAAQ,CAAW;IACnB,MAAM,CAAsB;IAC5B,eAAe,GAAG,IAAI,GAAG,EAAoF,CAAC;IAE9G,YAAY,IAAuF;QAClG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,eAAe;QACpB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAExD,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,OAAM,CAAC,EAAE,CAAC,CAAC;QACZ,CAAC;QAED,MAAM,eAAe,GAAG,eAAe,IAAI,CAAC,MAAM,CAAC,OAAO,EAA8B,CAAC;QAEzF,MAAM,oBAAoB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAE,UAAU,EAAE,OAAO,CAAE,EAAE,EAAE;YAC/G,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEhD,IAAI,CAAC,WAAW,EAAE,CAAC;gBAClB,OAAM,CAAC,IAAI,CAAC,CAAC;YACd,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,WAAU,SAAS;gBAC3E,MAAM,eAAe,GAAoB,EAAE,CAAC;gBAE5C,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAE9C,MAAM,CAAE,SAAS,EAAE,OAAO,CAAE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBAChD,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC;oBAClC,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC;iBACvB,CAAC,CAAC;gBAEH,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;oBAC9B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC1C,IAAI,CAAC,YAAY,EAAE,CAAC;wBACnB,SAAS;oBACV,CAAC;oBAED,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;oBAEzI,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;wBAC1B,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC;wBACtC,IAAI,CAAC,UAAU,EAAE,CAAC;4BACjB,SAAS;wBACV,CAAC;wBAED,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;wBAErI,IAAI,WAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;4BAC7C,SAAS;wBACV,CAAC;wBAED,eAAe,CAAC,IAAI,CAAC;4BACpB,IAAI,EAAE,IAAI;4BACV,UAAU,EAAE,UAAU;4BACtB,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,EAAE;4BAC3E,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,EAAE;yBACvE,CAAC,CAAC;oBACJ,CAAC;gBACF,CAAC;gBAED,OAAM,CAAC,eAAe,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC,CAAC;YAEJ,OAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC,CAAC;QAEJ,OAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAyB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrF,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAAiC;QACxD,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7D,OAAM,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;QAED,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACJ,OAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;YACtH,CAAC;YAAC,MAAM,CAAC;gBACR,6DAA6D;YAC9D,CAAC;QACF,CAAC;QAED,IAAI,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,KAAK,EAAE,CAAC;YACX,OAAM,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;QAED,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,KAAK,GAAG,IAAI,CAAC;QACd,CAAC;aAAM,IAAI,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,KAAK,GAAG,IAAI,CAAC;QACd,CAAC;aAAM,IAAI,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,KAAK,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;QACjC,CAAC;aAAM,CAAC;YACP,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACxD,IAAI,SAAS,EAAE,CAAC;gBACf,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACzD,CAAC;QACF,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAK,CAAC,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAEtC,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAuD;QAC/E,IAAI,CAAC;YACJ,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;YAEhD,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC3B,MAAK,CAAC,IAAI,KAAK,CAAC,wBAAwB,YAAY,EAAE,CAAC,CAAC,CAAC;YAC1D,CAAC;YAED,OAAM,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACR,kBAAkB;QACnB,CAAC;QAED,MAAM,uBAAuB,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE3D,IAAI,CAAC,uBAAuB,IAAI,OAAO,uBAAuB,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,CAAC;YACvH,MAAK,CAAC,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,CAAC,CAAC,MAAM,IAAI,uBAAuB,CAAC,EAAE,CAAC;YAC1C,MAAK,CAAC,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,uBAAuB,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC;QAEpE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3B,MAAK,CAAC,IAAI,KAAK,CAAC,4CAA4C,YAAY,EAAE,CAAC,CAAC,CAAC;QAC9E,CAAC;QAED,OAAM,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,6BAA6B,CAAC,aAA2C;QAC9E,MAAM,gBAAgB,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAEvD,IAAI,QAA2B,CAAC;QAChC,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC9D,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC;gBACvC,MAAK,CAAC,IAAI,KAAK,CAAC,4BAA4B,WAAW,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC;YAED,QAAQ,GAAG,WAAW,CAAC;QACxB,CAAC;aAAM,CAAC;YACP,QAAQ,GAAG,eAAe,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACjD,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE7D,MAAM,KAAK,GAA+B;YACzC,MAAM,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,aAAa,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;gBAC5F,OAAM,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3D,CAAC,CAAC,IAAI,EAAE,CAAC;YACT,OAAO,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;gBAC9F,OAAM,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3D,CAAC,CAAC,IAAI,EAAE,CAAC;YACT,QAAQ,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;gBAChG,OAAM,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3D,CAAC,CAAC,IAAI,EAAE,CAAC;SACT,CAAC;QAEF,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,6BAA6B,CAAC,EAAE,CAAC,EAAE,CAAC;YACxC,MAAK,CAAC,IAAI,KAAK,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,OAAM,CAAC;YACN,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,QAAQ;YAClB,EAAE,EAAE,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;SACpC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,0BAA0B;QAC/B,MAAM,qBAAqB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QAE9E,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC5B,OAAM,CAAC,EAAE,CAAC,CAAC;QACZ,CAAC;QAED,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAE,UAAU,EAAE,OAAO,CAAE,EAAE,EAAE;YACrH,MAAM,sBAAsB,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAEtE,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC7B,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,wCAAwC,EAAE,0CAA0C,UAAU,EAAE,CAAC,CAAC;gBACrH,OAAM,CAAC,IAAI,CAAC,CAAC;YACd,CAAC;YAED,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,EAA4B,EAAE;gBACnH,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAE/C,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACvD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,iBAAiB,EAA4B,EAAE;oBACrH,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;oBAEvD,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAEtD,MAAM,CAAE,YAAY,EAAE,UAAU,CAAE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;wBACtD,IAAI,CAAC,6BAA6B,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;wBACnD,IAAI,CAAC,6BAA6B,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;qBACnD,CAAC,CAAC;oBAEH,MAAM,SAAS,GAAoB,EAAE,CAAC;oBACtC,KAAK,MAAM,CAAE,GAAG,EAAE,IAAI,CAAE,IAAI;wBAC3B,CAAE,YAAY,EAAE,UAAU,CAAE;wBAC5B,CAAE,UAAU,EAAE,YAAY,CAAE;qBACnB,EAAE,CAAC;wBACZ,KAAK,MAAM,WAAW,IAAI,CAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAE,EAAE,CAAC;4BACzF,KAAK,MAAM,YAAY,IAAI,CAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAE,EAAE,CAAC;gCAC7F,SAAS,CAAC,IAAI,CAAC;oCACd,IAAI,EAAE,eAAe;oCACrB,UAAU,EAAE,UAAU;oCACtB,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;oCAClE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE;iCACnE,CAAC,CAAC;4BACJ,CAAC;wBACF,CAAC;oBAEF,CAAC;oBAED,OAAM,CAAC,SAAS,CAAC,CAAC;gBACnB,CAAC,CAAC,CAAC,CAAC;gBAEJ,MAAM,QAAQ,GAAG,EAAE,CAAC;gBAEpB,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;oBACrC,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;wBACpC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,wCAAwC,EAAE,mCAAmC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;oBACpH,CAAC;yBAAM,CAAC;wBACP,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;oBAClC,CAAC;gBACF,CAAC;gBAED,OAAM,CAAC,QAAQ,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC,CAAC;YAEJ,OAAM,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC,CAAC;QAEJ,OAAM,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAyB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,iBAAiB;QACtB,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACvC,IAAI,CAAC,eAAe,EAAE;YACtB,IAAI,CAAC,0BAA0B,EAAE;SACjC,CAAC,CAAC;QAEH,OAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAA8B;QAC7C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE7C,MAAM,aAAa,GAA8C,KAAK,CAAC,GAAG,CAAC,UAAS,IAAI;YACvF,OAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YAClC,KAAK,IAAI,aAAa,GAAG,CAAC,EAAE,aAAa,GAAG,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC;gBACnF,MAAM,KAAK,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;gBAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;oBACZ,SAAS;gBACV,CAAC;gBAED,iDAAiD;gBACjD,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBAC7B,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;wBAC1F,SAAS;oBACV,CAAC;gBACF,CAAC;gBAED,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC/B,CAAC;YACF,CAAC;QACF,CAAC;QAED,MAAM,KAAK,GAAsB,EAAE,CAAC;QAEpC,SAAS,sBAAsB,CAAC,KAA0B,EAAE,WAAW,GAAG,KAAK;YAC9E,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,IAAI,WAAW,EAAE,CAAC;gBACjB,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC5B,CAAC;YACD,OAAM,CAAC,GAAG,kCAAkC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,4BAA4B,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,OAAO,EAAE,CAAC,CAAA;QACvH,CAAC;QAED,SAAS,GAAG,CACX,YAAoB,EACpB,MAAsC,EACtC,gBAAgB,IAAI,GAAG,EAAU,EACjC,OAAwB,EAAE;YAE1B,MAAM,GAAG,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;YAExC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACV,MAAK,CAAC,IAAI,KAAK,CAAC,uBAAuB,YAAY,EAAE,CAAC,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACrE,IAAI,aAAa,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACzC,OAAO;YACR,CAAC;YAED,aAAa,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAEpC,MAAM,OAAO,GAAG,CAAE,GAAG,IAAI,EAAE,GAAG,CAAC,IAAI,CAAE,CAAC;YAEtC,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,CAAC;YAED,KAAK,MAAM,SAAS,IAAI,aAAa,CAAC,YAAY,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;gBACjE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;YAChD,CAAC;YAED,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACxC,CAAC;QAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YAC3D,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YAElC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACX,SAAS;YACV,CAAC;YAED,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpD,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/B,CAAC;QACF,CAAC;QAED,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAA4C,EAAE;QACjE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;QAE3F,MAAM,oBAAoB,GAAG,eAAe,IAAI,CAAC,MAAM,CAAC,OAAO,EAA8B,CAAC;QAE9F,gFAAgF;QAChF,MAAM,UAAU,GAAG,CAAC,eAAe,IAAI,eAAe,KAAK,SAAS,IAAI,eAAe,CAAC,QAAQ,KAAK,SAAS,CAAC;YAC9G,CAAC,CAAC,EAAE,GAAG,eAAe,EAAE,QAAQ,EAAE,oBAAoB,EAAE;YACxD,CAAC,CAAC,eAAe,CAAC;QACnB,MAAM,QAAQ,GAAG,CAAC,eAAe,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,CAAC,QAAQ,KAAK,SAAS,CAAC;YACxG,CAAC,CAAC,EAAE,GAAG,aAAa,EAAE,QAAQ,EAAE,oBAAoB,EAAE;YACtD,CAAC,CAAC,aAAa,CAAC;QAEjB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE7C,uEAAuE;QACvE,MAAM,YAAY,GAA8D,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAClI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9C,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC3B,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC3B,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;oBAChB,MAAK,CAAC,IAAI,KAAK,CAAC,qDAAqD,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpF,CAAC;gBACD,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;oBACjG,SAAS;gBACV,CAAC;gBACD,IAAI,gBAAgB,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAChD,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAChB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACjB,CAAC;YACF,CAAC;QACF,CAAC;QAED,MAAM,gBAAgB,GAAG,CAAC,IAAiE,EAAE,EAAE;YAC9F,OAAM,CAAC,GAAG,kCAAkC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5G,CAAC,CAAC;QAEF,MAAM,iBAAiB,GAAG,CACzB,IAAkC,EAClC,CAAqC,EAC3B,EAAE;YACZ,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,4BAA4B,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1H,OAAM,CAAC,KAAK,CAAC,CAAC;YACf,CAAC;YACD,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/E,OAAM,CAAC,KAAK,CAAC,CAAC;YACf,CAAC;YACD,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;gBAClD,OAAM,CAAC,KAAK,CAAC,CAAC;YACf,CAAC;YACD,OAAM,CAAC,IAAI,CAAC,CAAC;QACd,CAAC,CAAC;QAEF,6FAA6F;QAC7F,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QACxC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;QAChD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE9C,MAAM,UAAU,GAAG,CAAC,SAAsB,EAAE,SAA8B,EAAE,EAAE,CAC7E,CAAC,IAAkC,EAAE,KAAc,EAAE,EAAE;YACtD,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACnC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACpC,IAAI,QAAQ,KAAK,SAAS,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;oBAChD,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC3B,CAAC;YACF,CAAC;QACF,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAAG,UAAU,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QACnE,MAAM,eAAe,GAAG,UAAU,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAE7D,MAAM,GAAG,GAAG,CACX,cAAgE,EAChE,SAA0B,EAC1B,QAAuB,EACvB,MAAmE,EAClE,EAAE;YACH,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;YACtC,MAAM,KAAK,GAAyC,EAAE,CAAC;YACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;oBACX,MAAK,CAAC,IAAI,KAAK,CAAC,iDAAiD,CAAC,EAAE,CAAC,CAAC,CAAC;gBACxE,CAAC;gBACD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjD,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACnB,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;gBACtC,CAAC;YACF,CAAC;YACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChC,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,MAAK,CAAC,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;gBAClE,CAAC;gBACD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;gBACrC,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;gBACnC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACX,MAAK,CAAC,IAAI,KAAK,CAAC,6CAA6C,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC1E,CAAC;gBACD,IAAI,eAAe,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjD,SAAS;gBACV,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;gBACnC,IAAI,YAAY,KAAK,SAAS,IAAI,KAAK,GAAG,YAAY,EAAE,CAAC;oBACxD,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC3C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;4BACnC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;4BAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;wBACxD,CAAC;oBACF,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC,CAAC;QAEF,IAAI,UAAU,EAAE,CAAC;YAChB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,YAAY,EAAE,CAAC;gBACrC,IAAI,CAAC,eAAe,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5C,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC7B,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC3B,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC3B,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC1B,CAAC;YACF,CAAC;QACF,CAAC;QAED,0FAA0F;QAC1F,qFAAqF;QACrF,MAAM,cAAc,GAAG,CACtB,SAAsB,EACtB,SAA8B,EACS,EAAE;YACzC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmC,CAAC;YAC7D,MAAM,WAAW,GAAG,CAAC,IAAiE,EAA2B,EAAE;gBAClH,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBACnC,IAAI,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACnC,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,MAAM,aAAa,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACzC,SAAS,GAAG;wBACX,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;wBACpC,QAAQ,EAAE,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI;qBAC5E,CAAC;oBACF,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAC/B,CAAC;gBACD,OAAM,CAAC,SAAS,CAAC,CAAC;YACnB,CAAC,CAAC;YACF,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,YAAY,EAAE,CAAC;gBACrC,IAAI,eAAe,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5C,SAAS;gBACV,CAAC;gBACD,IAAI,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBAC9C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACnC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;wBACjD,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;oBACxC,CAAC;gBACF,CAAC;gBACD,IAAI,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;oBAChD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACrC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBACpD,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC3C,CAAC;gBACF,CAAC;YACF,CAAC;YACD,OAAM,CAAC,SAAS,CAAC,CAAC;QACnB,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,cAAc,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QACnE,MAAM,WAAW,GAAG,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAE7D,6EAA6E;QAC7E,+EAA+E;QAC/E,IAAI,eAAe,EAAE,CAAC;YACrB,IAAI,UAAU,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;gBACrC,WAAW,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,oBAAoB,EAAE,CAAC,CAAC,CAAC;YAC1H,CAAC;YACD,IAAI,QAAQ,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;gBACnC,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,oBAAoB,EAAE,CAAC,CAAC,CAAC;YACxH,CAAC;QACF,CAAC;QAED,MAAM,SAAS,GAAG,CACjB,GAAyC,EACzC,CAAqC,EACrC,QAAgC,EACJ,EAAE,CAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YACtC,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,4BAA4B,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1H,OAAM,CAAC,KAAK,CAAC,CAAC;YACf,CAAC;YACD,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/E,OAAM,CAAC,KAAK,CAAC,CAAC;YACf,CAAC;YACD,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpE,OAAM,CAAC,KAAK,CAAC,CAAC;YACf,CAAC;YACD,OAAM,CAAC,IAAI,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEJ,MAAM,UAAU,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,CAAC;YACtE,CAAC,CAAC,SAAS,CAAC,aAAa,EAAE,UAAU,EAAE,UAAU,CAAC;YAClD,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,CAAC;YACpE,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC;YAC7C,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;QAEpC,OAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAyC,EAAE;QAC3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAEhD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,OAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACtB,OAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACP,OAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;IACF,CAAC;CACD;AAMD,MAAM,OAAO,kBAAkB;IACrB,OAAO,CAA0B;IACjC,IAAI,CAA2B;IAC/B,MAAM,CAAiB;IAEhC,YAAY,KAIX;QACA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,CAAC;IAES,KAAK,CAAC,mBAAmB,CAAC,MAAkC,EAAE,SAA0C;QACjH,IAAI,KAAK,CAAC;QAEV,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;YAC/C,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;QACvC,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;QACtC,CAAC;QAED,IAAI,SAAS,EAAE,OAAO,EAAE,CAAC;YACxB,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;gBAC7C,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACP,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC;YAC3B,CAAC;QACF,CAAC;QAED,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;CACD;AAED,MAAM,OAAO,kBAAmB,SAAQ,kBAAkB;IACzD,MAAM,GAA0C,IAAI,CAAC;IAErD,MAAM,GAA4B,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACrD,8DAA8D;IAC9D,UAAU,GAAG,IAAI,GAAG,EAA2C,CAAC;IAEhE,YAAoB,IAAwB;QAC3C,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,IAAI;QACP,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClB,MAAK,CAAC,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;QACtD,CAAC;QAED,OAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAA4B;QAC9C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAK,CAAC,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,mBAAmB,GAAG;YAC3B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1D,CAAC;QAEX,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAC,CAAC;QAErF,MAAM,mBAAmB,GAAG,IAAI,8BAA8B,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAC,CAAC;QAE3G,IAAI,iBAAiB,GAA4D,SAAS,CAAC;QAE3F,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7F,MAAK,CAAC,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC,CAAC;QAC9E,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACpD,iBAAiB,GAAG;gBACnB,QAAQ,EAAE,MAAM;gBAChB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;aACjC,CAAA;QACF,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACzD,iBAAiB,GAAG;gBACnB,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK;aACtC,CAAA;QACF,CAAC;aAAM,CAAC;YACP,MAAK,CAAC,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,iBAAiB,CAAA;QAEtC,MAAM,eAAe,GAAG,CAA8C,eAA4C,EAAE,IAAO,EAAmD,EAAE;YAC/K,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAA4D,EAAE;gBACtG,OAAM,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,KAAK,EAAE,CAAC;gBACZ,MAAK,CAAC,IAAI,KAAK,CAAC,wCAAwC,IAAI,8BAA8B,CAAC,CAAC,CAAC;YAC9F,CAAC;YAED,OAAM,CAAC,KAAK,CAAC,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,YAAY,GAAmC,EAAE,CAAC;QACxD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QACzC,MAAM,WAAW,GAAG,KAAK,EAAE,KAAa,EAAgC,EAAE;YACzE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAE9B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACX,MAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,iBAAiB,CAAC,CAAC,CAAC;YAClD,CAAC;YAED,IAAI,OAAO,GAA6C,YAAY,CAAC,KAAK,CAAC,CAAC;YAE5E,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAE1B,OAAO,GAAG,CAAC,KAAK,IAAkC,EAAE;oBACnD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;wBACxB,IAAI,MAAM,CAAC;wBAEX,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;4BACzB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gCACjB,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC;4BACnC,CAAC;iCAAM,CAAC;gCACP,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gCAC9C,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC;4BAC5B,CAAC;wBACF,CAAC;6BAAM,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;4BAC9B,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;gCACtC,oCAAoC;gCACpC,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC;4BACnC,CAAC;iCAAM,CAAC;gCACP,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gCAC1C,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;4BACvB,CAAC;wBACF,CAAC;6BAAM,CAAC;4BACP,WAAW,CAAC,QAAQ,CAAC,CAAC;wBACvB,CAAC;wBAED,MAAM,iBAAiB,GAAG,MAAM,QAAQ,CAAC,oBAAoB,CAC5D,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAC9D,SAAS,EACT,EAAE,WAAW,EAAE,CAAE,IAAI,CAAC,UAAU,CAAE,EAAE,CACpC,CAAC;wBAEF,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;4BAC/D,MAAK,CAAC,IAAI,KAAK,CAAC,gDAAgD,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;wBACrF,CAAC;wBAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;wBAEpC,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC;wBAExG,IAAI,OAAO,CAAC;wBACZ,IAAI,QAAQ,CAAC;wBAEb,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;4BACvB,QAAQ,GAAG,MAAM,CAAC;4BAClB,OAAO,GAAG,eAAe,CAAC;wBAC3B,CAAC;6BAAM,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;4BAChC,QAAQ,GAAG,eAAe,CAAC;4BAC3B,OAAO,GAAG,MAAM,CAAC;wBAClB,CAAC;6BAAM,CAAC;4BACP,WAAW,CAAC,QAAQ,CAAC,CAAC;wBACvB,CAAC;wBAED,OAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;oBACzD,CAAC;yBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;wBAC1C,IAAI,SAAS,CAAC;wBACd,IAAI,aAA4B,CAAC;wBACjC,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACpC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;4BAC/C,aAAa,GAAG,mBAAmB,CAAC;wBACrC,CAAC;6BAAM,CAAC;4BACP,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;4BAC1C,IAAI,YAAY,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;gCACjC,MAAK,CAAC,IAAI,KAAK,CAAC,uGAAuG,CAAC,CAAC,CAAC;4BAC3H,CAAC;4BAED,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;4BAE9C,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gCACxE,IAAI,QAAQ,CAAC,gBAAgB,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;oCACrD,MAAK,CAAC,IAAI,KAAK,CAAC,qCAAqC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,4BAA4B,IAAI,CAAC,EAAE,CAAC,IAAI,2BAA2B,CAAC,CAAC,CAAC;gCAC1J,CAAC;gCAED,MAAM,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,CAAC;gCAEnD,MAAM,8BAA8B,GAAG,CAAC,KAAgC,EAAyE,EAAE;oCAClJ,OAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gCAChC,CAAC,CAAA;gCAED,IAAI,gBAAgB,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oCAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;wCACrD,MAAK,CAAC,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC,CAAC;oCAC9E,CAAC;oCAED,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,YAAY,CAAC,EAAE,CAAC;wCACpE,MAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,gBAAgB,CAAC,YAAY,CAAC,QAAQ,EAAE,4BAA4B,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;oCACxJ,CAAC;oCAED,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC;wCAC/B,MAAK,CAAC,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC,CAAC;oCAChF,CAAC;oCAED,qCAAqC;oCAErC,aAAa,GAAG,WAAW,CAAC;oCAC5B,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;gCACtF,CAAC;qCAAM,IAAI,8BAA8B,CAAC,gBAAgB,CAAC,EAAE,CAAC;oCAC7D,IAAI,gBAAgB,CAAC,cAAc,EAAE,CAAC;wCACrC,MAAK,CAAC,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC,CAAC;oCACtF,CAAC;oCACD,aAAa,GAAG,WAAW,CAAC;oCAC5B,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC;gCACtC,CAAC;qCAAM,CAAC;oCACP,MAAK,CAAC,IAAI,KAAK,CAAC,kCAAkC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gCACpE,CAAC;4BACF,CAAC;iCAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gCACnC,MAAK,CAAC,IAAI,KAAK,CAAC,uGAAuG,CAAC,CAAC,CAAC;4BAC3H,CAAC;iCAAM,CAAC;gCACP,WAAW,CAAC,QAAQ,CAAC,CAAC;4BACvB,CAAC;wBACF,CAAC;wBAED,IAAI,CAAC,SAAS,EAAE,CAAC;4BAChB,MAAK,CAAC,IAAI,KAAK,CAAC,8DAA8D,KAAK,EAAE,CAAC,CAAC,CAAC;wBACzF,CAAC;wBAED,MAAM,SAAS,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;wBAE/D,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,uBAAuB,CAClE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,EACpE,EAAE,WAAW,EAAE,CAAE,IAAI,CAAC,UAAU,CAAE,EAAE,CACpC,CAAC;wBAEF,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;4BAC/C,MAAK,CAAC,IAAI,KAAK,CAAC,yCAAyC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;wBAC9E,CAAC;wBAED,IAAI,YAAY,CAAC;wBAEjB,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;4BACvB,MAAK,CAAC,IAAI,KAAK,CAAC,yKAAyK,CAAC,CAAC,CAAC;wBAC7L,CAAC;6BAAM,CAAC;4BACP,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gCACjB,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC;4BACzC,CAAC;iCAAM,CAAC;gCACP,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gCAC9C,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC;4BAClC,CAAC;wBACF,CAAC;wBAED,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;4BACpD,OAAO,EAAE,MAAM,IAAI,CAAC,mBAAmB,CAAC;gCACvC,IAAI,EAAE,eAAe;gCACrB,cAAc,EAAE,kBAAkB;gCAClC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;6BACtB,EAAE,OAAO,EAAE,SAAS,CAAC;4BACtB,KAAK,EAAE,SAAS;4BAChB,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;4BACtC,EAAE,EAAE;gCACH,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ;gCAC1B,SAAS,EAAE,CAAC,GAAG,EAAE;oCAChB,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;wCAChD,OAAM,CAAC,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC;oCACzC,CAAC;yCAAM,CAAC;wCACP,OAAM,CAAC,SAAS,CAAC,CAAC;oCACnB,CAAC;gCACF,CAAC,CAAC,EAAE;6BACJ;4BACD,KAAK,EAAE,YAAY;yBACnB,CAAC,CAAC;wBAEH,MAAM,gBAAgB,GAAG,eAAe,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAEhF,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,CAAC;4BAC1C,MAAK,CAAC,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC,CAAC;wBACrE,CAAC;wBAED,OAAM,CAAC;4BACN,IAAI,EAAE,eAAe;4BACrB,IAAI;4BACJ,OAAO,EAAE,YAAY;4BACrB,gBAAgB,EAAE,gBAAgB;4BAClC,QAAQ,EAAE,QAAQ;4BAClB,SAAS,EAAE,aAAa;4BACxB,QAAQ,EAAE,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,CAAC;yBACrD,CAAC,CAAA;oBACH,CAAC;yBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;wBACtC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;4BAC5B,MAAK,CAAC,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC,CAAC;wBAClG,CAAC;wBAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;4BAC1G,MAAK,CAAC,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC,CAAC;wBAC9E,CAAC;wBAED,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;4BACtD,MAAK,CAAC,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC,CAAC;wBACrF,CAAC;wBAED,IAAI,yBAAyB,GAAG,IAAI,CAAC;wBACrC,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;4BACzE,yBAAyB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;wBAChE,CAAC;6BAAM,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;4BACnE,IAAI,CAAC;gCACJ,yBAAyB,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;4BAC1G,CAAC;4BAAC,MAAM,CAAC;gCACR,mBAAmB;4BACpB,CAAC;wBACF,CAAC;wBACD,IAAI,CAAC,yBAAyB,EAAE,CAAC;4BAChC,MAAK,CAAC,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC,CAAC;wBAClG,CAAC;wBAED,OAAM,CAAC;4BACN,IAAI,EAAE,WAAW;4BACjB,IAAI,EAAE,IAAI;4BACV,OAAO,EAAE,iBAAiB,CAAC,MAAM;4BACjC,QAAQ,EAAE,iBAAiB,CAAC,MAAM;4BAClC,gBAAgB,EAAE;gCACjB,IAAI,EAAE,YAAY;gCAClB,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE;gCACjD,aAAa,EAAE,yBAAyB,CAAC,eAAe,CAAC,GAAG,EAAE;gCAC9D,kBAAkB,EAAE,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAE;gCACvD,QAAQ,EAAE,eAAe,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE;gCACxD,KAAK,EAAE,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC;gCACvC,QAAQ,EAAE,GAAG;6BACb;yBACD,CAAC,CAAA;oBACH,CAAC;yBAAM,CAAC;wBACP,WAAW,CAAC,IAAI,CAAC,CAAC;oBACnB,CAAC;gBACF,CAAC,CAAC,EAAE,CAAC;gBAEL,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrF,YAAY,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;YAC/B,CAAC;iBAAM,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtC,MAAK,CAAC,IAAI,KAAK,CAAC,mDAAmD,KAAK,4BAA4B,CAAC,CAAC,CAAC;YACxG,CAAC;YAED,OAAM,CAAC,MAAM,OAAO,CAAC,CAAC;QACvB,CAAC,CAAA;QAED,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,CAAC;QAED,kEAAkE;QAClE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAM,CAAC;gBACN,KAAK,EAAE,EAAE;gBACT,YAAY,EAAE,iBAAiB,CAAC,MAAM;gBACtC,aAAa,EAAE,iBAAiB,CAAC,MAAM;aACvC,CAAC,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEzC,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,MAAK,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,SAAS,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACrD,MAAK,CAAC,IAAI,KAAK,CAAC,mCAAmC,SAAS,CAAC,OAAO,wCAAwC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC3I,CAAC;QACF,CAAC;aAAM,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC9B,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBAC1D,MAAK,CAAC,IAAI,KAAK,CAAC,mCAAmC,QAAQ,CAAC,QAAQ,+CAA+C,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACvJ,CAAC;QACF,CAAC;QAED,IAAI,QAAQ,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC7B,MAAK,CAAC,IAAI,KAAK,CAAC,+DAA+D,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACtG,CAAC;QAED,OAAM,CAAC;YACN,KAAK;YACL,YAAY,EAAE,SAAS,CAAC,OAAO;YAC/B,aAAa,EAAE,QAAQ,CAAC,QAAQ;SAChC,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAwB,EAAE,OAA4B;QACzE,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,QAAQ,CAAC,MAAM,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACvD,OAAM,CAAC,QAAQ,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,KAAK;QACR,OAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IAED,EAAE,CAA6C,KAAQ,EAAE,QAA0D;QAClH,IAAI,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACzC,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG,CAA6C,KAAQ,EAAE,QAA0D;QACnH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,SAAS,CAAC,KAA8B;QACvC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,MAAM;QACT,OAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAA6C,KAAQ,EAAE,GAAG,IAAmC;QACjG,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,KAAK,MAAM,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC;gBACJ,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;gBAClB,SAAS,EAAE,CAAC;YACb,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,0BAA0B,EAAE,gCAAgC,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;YAC/F,CAAC;QACF,CAAC;QAED,OAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAGxB,IAAoF;QACrF,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,SAAS,oBAAoB;YAC5B,IAAI,WAAW,EAAE,CAAC;gBACjB,MAAK,CAAC,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC,CAAC;YACpE,CAAC;YAED,WAAW,GAAG,IAAI,CAAC;QACpB,CAAC;QAED,IAAI,SAAoE,CAAC;QACzE,IAAI,QAAgE,CAAC;QAErE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAM,UAAS,OAAO,EAAE,MAAM;YACxD,SAAS,GAAG,CAAC,GAAG,IAAS,EAAE,EAAE;gBAC5B,oBAAoB,EAAE,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,CAAC;YACf,CAAC,CAAC;YAEF,QAAQ,GAAG,CAAC,KAAK,EAAE,EAAE;gBACpB,oBAAoB,EAAE,CAAC;gBAEvB,IAAI,QAAQ,GAAG,KAAK,CAAC;gBACrB,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACf,QAAQ,GAAG,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBAC7D,CAAC;gBAED,2EAA2E;gBAC3E,MAAM,CAAC,QAAQ,CAAC,CAAC;YAClB,CAAC,CAAA;QACF,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,MAAK,CAAC,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;QAC9D,CAAC;QAED,+RAA+R;QAC/R,yEAAyE;QACzE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;YACnD,GAAG,IAAI;YACP,aAAa,EAAE,SAAS;YACxB,UAAU,EAAE,QAAQ;SACgD,CAAC,CAAC;QAEvE,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACrB,MAAK,CAAC,IAAI,KAAK,CAAC,kEAAkE,IAAI,CAAC,IAAI,0BAA0B,CAAC,CAAC,CAAC;QACzH,CAAC;QAED,OAAM,CAAC,MAAM,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAA8E,EAAE,aAAsC,EAAE,KAAa,EAAE,KAA4B,EAAE,QAAiB;QAC3M,IAAI,OAAO,EAAE,eAAe,EAAE,CAAC;YAC9B,MAAM,IAAI,CAAC,oBAAoB,CAAC;gBAC/B,IAAI,EAAE,uBAAuB;gBAC7B,MAAM,EAAE;oBACP,aAAa,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC;oBAC5D,KAAK;oBACL,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC;oBAC1G,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC/C;aACD,CAAC,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,mBAAmB,CACxB,QAA+B,EAC/B,OAAqD;QAErD,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC;QAC/C,MAAM,SAAS,GAAI,OAAO,EAAE,SAAS,IAAK,OAAO,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YAClD,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAC/C,OAAM,CAAC,MAAM,CAAC,CAAC;YAChB,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC5B,MAAK,CAAC,IAAI,KAAK,CAAC,kCAAkC,QAAQ,CAAC,UAAU,cAAc,CAAC,CAAC,CAAC;YACvF,CAAC;YACD,MAAM,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;IACF,CAAC;IAED,KAAK,CAAC,mBAAmB,CACxB,QAAoB,EACpB,OAAqD;QAErD,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC;QAC/C,MAAM,SAAS,GAAI,OAAO,EAAE,SAAS,IAAK,OAAO,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YAClD,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACnC,OAAM,CAAC,MAAM,CAAC,CAAC;YAChB,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAChC,MAAK,CAAC,IAAI,KAAK,CAAC,eAAe,QAAQ,CAAC,QAAQ,CAAC,UAAU,SAAS,CAAC,CAAC,CAAC;YACxE,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC5B,MAAK,CAAC,IAAI,KAAK,CAAC,qCAAqC,QAAQ,CAAC,QAAQ,CAAC,UAAU,cAAc,CAAC,CAAC,CAAC;YACnG,CAAC;YACD,MAAM,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;IACF,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuC;QACpD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACnC,MAAK,CAAC,IAAI,KAAK,CAAC,6CAA6C,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtF,CAAC;QAED,MAAM,aAAa,GAAmB,EAAE,CAAC;QACzC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAC;QAEjF,4EAA4E;QAC5E,IAAI,kBAAkB,GAAkB,IAAI,CAAC;QAE7C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,CAAC;YACJ,IAAI,IAAI,GAAG,IAAI,CAAC;YAChB,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBACzD,MAAM,eAAe,GAAG,CAAC,IAAkB,EAAE,EAAE;oBAC9C,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACzB,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;gBACzC,CAAC,CAAA;gBAED,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,GAAG,aAAa,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;gBAErG,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAEpC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACX,MAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBAClD,CAAC;gBAED,uEAAuE;gBACvE,mEAAmE;gBACnE,wDAAwD;gBACxD,IAAI,KAAK,GAAG,CAAC,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;oBAC9C,IAAI,kBAAkB,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;wBACzC,MAAK,CAAC,IAAI,KAAK,CACd,0BAA0B,KAAK,IAAI;4BACnC,YAAY,IAAI,CAAC,OAAO,+BAA+B,kBAAkB,EAAE,CAC3E,CAAC,CAAC;oBACJ,CAAC;gBACF,CAAC;gBAED,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBACxB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;oBACpD,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;oBACzC,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC;oBACnC,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACvD,CAAC;qBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBACvE,IAAI,6BAA6B,CAAC;oBAClC,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;wBAC3C,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;4BACpC,6BAA6B,GAAG,KAAK,CAAC;wBACvC,CAAC;6BAAM,IAAI,IAAI,CAAC,SAAS,KAAK,mBAAmB,EAAE,CAAC;4BACnD,MAAK,CAAC,IAAI,KAAK,CAAC,sBAAsB,KAAK,GAAG,CAAC,mEAAmE,CAAC,CAAC,CAAC;wBACtH,CAAC;6BAAM,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;4BACtC,6BAA6B,GAAG,IAAI,CAAC;wBACtC,CAAC;6BAAM,CAAC;4BACP,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBAC7B,CAAC;oBACF,CAAC;yBAAM,CAAC;wBACP,6BAA6B,GAAG,IAAI,CAAC;oBACtC,CAAC;oBAED,IAAI,6BAA6B,EAAE,CAAC;wBACnC,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;4BACjD,MAAM,IAAI,CAAC,eAAe,CACzB,OAAO,EACP,IAAI,CAAC,gBAAgB,CAAC,aAAa,EACnC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EACnC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAC1I,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAC9B,CAAC;wBACH,CAAC;6BAAM,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;4BACxB,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gCACnC,MAAK,CAAC,IAAI,KAAK,CAAC,2CAA2C,KAAK,8BAA8B,CAAC,CAAC,CAAC;4BAClG,CAAC;4BAED,MAAM,IAAI,CAAC,oBAAoB,CAAC;gCAC/B,IAAI,EAAE,oCAAoC;gCAC1C,MAAM,EAAE;oCACP,qBAAqB,EAAE,IAAI,CAAC,QAAQ;iCACpC;6BACD,CAAC,CAAC;wBACJ,CAAC;6BAAM,CAAC;4BACP,MAAK,CAAC,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,gBAAgB,CAAC,IAAI,wCAAwC,KAAK,EAAE,CAAC,CAAC,CAAC;wBAC7H,CAAC;oBACF,CAAC;oBAED,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;wBACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAC7D,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;wBACzD,eAAe,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;oBACxD,CAAC;yBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;wBACtC,uRAAuR;wBACvR,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC;wBAClC,eAAe,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;oBACpD,CAAC;yBAAM,CAAC;wBACP,WAAW,CAAC,IAAI,CAAC,CAAC;oBACnB,CAAC;gBAEF,CAAC;qBAAM,CAAC;oBACP,WAAW,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;gBAED,IAAI,GAAG,IAAI,CAAC;YACb,CAAC;YAED,sEAAsE;YACtE,kDAAkD;YAClD,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC;gBAC9E,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,MAAK,CAAC,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC,CAAC;gBAC5E,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjE,MAAK,CAAC,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC,CAAC;gBACpF,CAAC;gBACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;gBACrD,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;oBACnC,MAAK,CAAC,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC,CAAC;gBAClF,CAAC;gBACD,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtF,CAAC;QACF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,GAAG,aAAa,CAAC,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1G,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,aAAa,CAAC,EAAE,KAAK,CAAC,CAAC;YACvD,MAAK,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAoC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;QACzE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAChC,OAAM,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;CACD;AAED,MAAM,OAAO,cAAc;IAClB,MAAM,CAAsB;IAC5B,QAAQ,CAAW;IAClB,KAAK,CAAc;IACpB,MAAM,CAAU;IAExB,YAAY,MAA4B;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACtG,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,CAAC;IACF,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAA8B;QAC5C,+EAA+E;QAC/E,MAAM,cAAc,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9D,MAAM,mBAAmB,GAAG,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAExE,IAAI,UAAU,GAAsC,IAAI,CAAC;QAEzD,IACC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY;YAClC,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,YAAY;YACvC,4BAA4B,CAAC,cAAc,CAAC,KAAK,4BAA4B,CAAC,mBAAmB,CAAC;YAClG,eAAe,CAAC,cAAc,EAAE,OAAO,CAAC;YACxC,eAAe,CAAC,mBAAmB,EAAE,OAAO,CAAC;YAC7C,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,EACtE,CAAC;YACF,MAAM,MAAM,GAAG;gBACd,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;gBACzB,QAAQ,EAAE,cAAc;gBACxB,IAAI,EAAE,YAAY;aACT,CAAC;YAEX,UAAU,GAAG;gBACZ,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;aACjD,CAAC;QACH,CAAC;aAAM,CAAC;YACP,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAM,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAyB,EAAE,CAAC;QAExC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,OAAM,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAA8B,EAAE,OAA4B;QAC1E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,OAAM,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,WAAU,IAAI;YACpE,OAAM,CAAC,MAAM,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC,CAAC;QAEJ,MAAM,GAAG,GAAG,EAAE,CAAC;QAEf,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACjC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,0BAA0B,EAAE,kCAAkC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACjG,CAAC;QACF,CAAC;QAED,OAAM,CAAC,GAAG,CAAC,CAAC;IACb,CAAC;CACD","sourcesContent":["import type { lib as KeetaNetLib } from '@keetanetwork/keetanet-client';\nimport { KeetaNet } from \"../client/index.js\";\nimport type { AssetLocationLike, AssetTransferInstructions, AssetWithRails, FiatPushRails, MovableAssetSearchCanonical, PickChainLocation, Rail, RailOrRailWithExtendedDetails, RecipientResolved } from \"../services/asset-movement/common.js\";\nimport { convertAssetLocationToString, convertAssetSearchInputToCanonical, isChainLocation, toAssetLocation } from \"../services/asset-movement/common.js\";\nimport type { Resolver } from \"./index.js\";\nimport { getDefaultResolver } from '../config.js';\nimport type { ISOCurrencyCode } from '@keetanetwork/currency-info';\nimport { Currency } from '@keetanetwork/currency-info';\nimport type { Account, GenericAccount, TokenAddress } from '@keetanetwork/keetanet-client/lib/account.js';\nimport { isAssetLocationLike } from '../services/asset-movement/lib/location.generated.js';\nimport type { ToValuizable } from './resolver.js';\nimport { isFiatRail, isMovableAssetSearchCanonical, isRail } from '../services/asset-movement/common.generated.js';\nimport { assertNever } from './utils/never.js';\nimport KeetaFXAnchorClient from '../services/fx/client.js';\nimport KeetaAssetMovementAnchorClient from '../services/asset-movement/client.js';\nimport type { ExternalChainAsset } from './asset.js';\nimport { isExternalChainAsset } from './asset.js';\nimport type { Logger } from './log/index.js';\nimport type { BlockHash } from '@keetanetwork/keetanet-client/lib/block/index.js';\n\ntype FXQuoteOrEstimate = NonNullable<Awaited<ReturnType<KeetaFXAnchorClient['getQuotesOrEstimates']>>>[number];\ntype AssetMovementProvider = NonNullable<Awaited<ReturnType<KeetaAssetMovementAnchorClient['getProvidersForTransfer']>>>[number];\ntype AssetMovementTransfer = Awaited<ReturnType<AssetMovementProvider['initiateTransfer']>>;\ntype FXExchange = Awaited<ReturnType<FXQuoteOrEstimate['createExchange']>>;\n\ninterface ChainStepResolutionBase<Type extends 'fx' | 'assetMovement' | 'keetaSend'> {\n\ttype: Type;\n\tvalueIn: bigint;\n\tvalueOut: bigint;\n\tstep: Type extends 'keetaSend' ? null : Extract<GraphNodeLike, { type: Type }>;\n}\n\ninterface ChainStepResolutionFX extends ChainStepResolutionBase<'fx'> {\n\ttype: 'fx';\n\tresult: FXQuoteOrEstimate;\n};\n\ntype SendingToType = 'SELF' | 'NEXT_STEP' | 'FINAL_DESTINATION';\n\ninterface ChainStepResolutionAssetMovement extends ChainStepResolutionBase<'assetMovement'> {\n\tusingInstruction: AssetTransferInstructions;\n\tsendingTo: SendingToType;\n\ttransfer: AssetMovementTransfer;\n};\n\ninterface ChainStepResolutionKeetaSend extends ChainStepResolutionBase<'keetaSend'> {\n\tusingInstruction: Extract<AssetTransferInstructions, { type: 'KEETA_SEND' }>;\n};\n\nexport type ChainStepResolution = ChainStepResolutionFX | ChainStepResolutionAssetMovement | ChainStepResolutionKeetaSend;\n\ntype AnchorChainingPathComputedPlan = {\n\tsteps: ChainStepResolution[];\n\ttotalValueIn: bigint;\n\ttotalValueOut: bigint;\n};\n\ntype ExecutedStepFX = {\n\ttype: 'fx';\n\tplan: ChainStepResolutionFX;\n\texchange: FXExchange;\n};\n\ntype ExecutedStepAssetMovement = {\n\ttype: 'assetMovement';\n\tplan: ChainStepResolutionAssetMovement;\n};\n\ntype ExecutedStepKeetaSend = {\n\ttype: 'keetaSend';\n\tplan: ChainStepResolutionKeetaSend;\n};\n\n\nexport type ExecutedStep = ExecutedStepFX | ExecutedStepAssetMovement | ExecutedStepKeetaSend;\n\nexport type AnchorChainingPathExecuteResult = {\n\tsteps: ExecutedStep[];\n};\n\nexport type AnchorChainingPathExecuteOptions = {\n\trequireSendAuth?: boolean;\n};\n\nexport type AnchorChainingPathState =\n\t| { status: 'idle' }\n\t| { status: 'executing'; completedSteps: ExecutedStep[]; currentStepIndex: number }\n\t| { status: 'completed'; result: AnchorChainingPathExecuteResult }\n\t| { status: 'failed'; error: Error; completedSteps: ExecutedStep[]; failedAtStepIndex: number };\n\ninterface StepNeededActionEventPayloadBase<ActionType, ActionPayload, CompletedPayload extends readonly unknown[] = []> {\n\ttype: ActionType;\n\n\tmarkCompleted: (...args: CompletedPayload) => void;\n\tmarkFailed: (error?: unknown) => void;\n\n\taction: ActionPayload;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface StepNeededActionEventAssetMovement extends StepNeededActionEventPayloadBase<'assetMovementUserExecutionRequired', { assetMovementTransfer: AssetMovementTransfer; }, []> {}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface StepNeededActionEventKeetaSend extends StepNeededActionEventPayloadBase<'keetaSendAuthRequired', {\n\tsendToAddress: GenericAccount;\n\tvalue: bigint;\n\ttoken: TokenAddress;\n\texternal?: string;\n}, [ { sent: boolean | BlockHash; }]> {}\n\ntype StepNeededActionEventPayload = StepNeededActionEventKeetaSend | StepNeededActionEventAssetMovement;\n\ntype AnchorChainingPathEventMap = {\n\tstateChange: [state: AnchorChainingPathState];\n\tstepExecuted: [step: ExecutedStep, index: number];\n\tcompleted: [result: AnchorChainingPathExecuteResult];\n\tfailed: [error: Error, completedSteps: ExecutedStep[], failedAtStepIndex: number];\n\tstepNeedsAction: [StepNeededActionEventPayload];\n}\n\ninterface AnchorChainingAssetAndLocation<AssetType extends AnchorChainingAsset = AnchorChainingAsset, Location extends AssetLocationLike = AssetLocationLike> {\n\tasset: AssetType;\n\tlocation: Location;\n\trail: Rail;\n\tvalue?: bigint;\n\n}\n\ninterface AnchorChainingDestination extends AnchorChainingAssetAndLocation {\n\trecipient: RecipientResolved;\n}\n\ninterface AnchorChainingPathInput {\n\tsource: AnchorChainingAssetAndLocation;\n\tdestination: AnchorChainingDestination;\n}\n\nexport interface AnchorChainingConfig {\n\tclient: KeetaNet.UserClient;\n\tresolver?: Resolver;\n\tsigner?: InstanceType<typeof KeetaNetLib.Account>;\n\taccount?: InstanceType<typeof KeetaNetLib.Account>;\n\tlogger?: Logger;\n}\n\ninterface BaseGraphNodeLike<Type extends 'fx' | 'assetMovement', AssetType extends AnchorChainingAsset> {\n\ttype: Type;\n\tproviderID: string;\n\n\tfrom: AnchorChainingAssetAndLocation<AssetType>;\n\tto: AnchorChainingAssetAndLocation<AssetType>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface FXGraphNode extends BaseGraphNodeLike<'fx', Exclude<AnchorChainingAsset, ExternalChainAsset>> {}\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface AssetMovementGraphNode extends BaseGraphNodeLike<'assetMovement', AnchorChainingAsset> {}\nexport type GraphNodeLike = FXGraphNode | AssetMovementGraphNode;\n\ntype KeetaLocationLike = Extract<AssetLocationLike, `chain:keeta:${bigint}`> | PickChainLocation<'keeta'>;\ninterface KeetaSendStepLike {\n\ttype: 'keetaSend';\n\n\tproviderID?: null;\n\n\tfrom: AnchorChainingAssetAndLocation<AnchorChainingAsset, KeetaLocationLike>;\n\tto: AnchorChainingAssetAndLocation<AnchorChainingAsset, KeetaLocationLike>;\n}\n\nexport type AnchorChainingStepLike = GraphNodeLike | KeetaSendStepLike;\n\nexport type AnchorChainingAsset = TokenAddress | ISOCurrencyCode | ExternalChainAsset;\n\nfunction areBothTokenAndEqual(a: string | TokenAddress, b: string | TokenAddress): boolean {\n\ttry {\n\t\tconst aParsed = KeetaNet.lib.Account.toAccount(a);\n\t\tconst bParsed = KeetaNet.lib.Account.toAccount(b);\n\n\t\tif (!aParsed.isToken() || !bParsed.isToken()) {\n\t\t\treturn(false);\n\t\t}\n\n\n\t\treturn(aParsed.comparePublicKey(bParsed));\n\t} catch {\n\t\treturn(false);\n\t}\n}\n\nfunction isAnchorChainingAssetEqual(a: AnchorChainingAsset, b: AnchorChainingAsset): boolean {\n\tif (typeof a === 'string' && typeof b === 'string' && a === b) {\n\t\treturn(true);\n\t} else if (areBothTokenAndEqual(a, b)) {\n\t\treturn(true);\n\t} else {\n\t\treturn(false);\n\t}\n}\n\nfunction nodeSideSupports(side: AnchorChainingAssetAndLocation, required: AnchorChainingAssetAndLocation): boolean {\n\tif (side.rail !== required.rail) {\n\t\treturn(false);\n\t}\n\n\tif (convertAssetLocationToString(side.location) !== convertAssetLocationToString(required.location)) {\n\t\treturn(false);\n\t}\n\n\tif (!isAnchorChainingAssetEqual(side.asset, required.asset)) {\n\t\treturn(false);\n\t}\n\n\treturn(true);\n}\n\n/**\n * Returns true for nodes that keep assets on Keeta: FX nodes, plus\n * asset-movement nodes whose from and to share the same Keeta chain location\n * (custodial FX anchors that don't actually move funds off-chain).\n */\nfunction isFXLikeNode(node: GraphNodeLike): boolean {\n\tif (node.type === 'fx') {\n\t\treturn(true);\n\t}\n\tconst fromStr = convertAssetLocationToString(node.from.location);\n\tconst toStr = convertAssetLocationToString(node.to.location);\n\treturn(fromStr === toStr && fromStr.startsWith('chain:keeta:'));\n}\n\ninterface AssetMovementResolvedRails {\n\tcommon: Rail[];\n\tinbound: Rail[];\n\toutbound: Rail[];\n}\n\nexport type AnchorChainingListAssetsSideFilter = {\n\tlocation?: AssetLocationLike | undefined;\n\tasset?: AnchorChainingAsset | undefined;\n\trail?: Rail | undefined;\n};\n\ntype AnchorChainingListAssetsShared = {\n\tmaxStepCount?: number;\n\tonlyAllowFXLike?: boolean;\n};\n\nexport type AnchorChainingListAssetsFilter =\n\t| ({ from: AnchorChainingListAssetsSideFilter; to?: never } & AnchorChainingListAssetsShared)\n\t| ({ to: AnchorChainingListAssetsSideFilter; from?: never } & AnchorChainingListAssetsShared)\n\t| ({ from?: never; to?: never } & AnchorChainingListAssetsShared);\n\nexport type AnchorChainingResolveAssetsFilter = {\n\tfrom?: AnchorChainingListAssetsSideFilter;\n\tto?: AnchorChainingListAssetsSideFilter;\n\tmaxStepCount?: number;\n\tonlyAllowFXLike?: boolean;\n};\n\nexport interface AnchorChainingResolveAssetsResult {\n\tfrom: AnchorChainingAssetInfo[];\n\tto: AnchorChainingAssetInfo[];\n}\n\nexport interface AnchorChainingAssetInfo {\n\tasset: AnchorChainingAsset;\n\tlocation: AssetLocationLike;\n\trails: {\n\t\tinbound: Rail[];\n\t\toutbound: Rail[];\n\t};\n\n\tdistance: {\n\t\tpathLength: number;\n\t} | null;\n}\n\ntype GetAccountForActionPayload = {\n\ttype: 'assetMovement';\n\tproviderMethod: 'initiateTransfer';\n\tprovider: AssetMovementProvider;\n}\n\ninterface AnchorChainingAccountOverrides {\n\taccount?: Account | undefined | ((providerMethodPayload: GetAccountForActionPayload) => Promise<Account> | Account);\n}\n\nclass AnchorGraph {\n\tclient: KeetaNet.UserClient;\n\tresolver: Resolver;\n\tlogger?: Logger | undefined;\n\t#assetNameCache = new Map<MovableAssetSearchCanonical, ISOCurrencyCode | TokenAddress | ExternalChainAsset>();\n\n\tconstructor(args: { client: KeetaNet.UserClient; resolver: Resolver; logger?: Logger | undefined; }) {\n\t\tthis.resolver = args.resolver;\n\t\tthis.client = args.client;\n\t\tthis.logger = args.logger;\n\t}\n\n\tasync #computeFXNodes() {\n\t\tconst fxServices = await this.resolver.lookup('fx', {});\n\n\t\tif (!fxServices) {\n\t\t\treturn([]);\n\t\t}\n\n\t\tconst networkLocation = `chain:keeta:${this.client.network}` satisfies AssetLocationLike;\n\n\t\tconst providerLookupResult = await Promise.all(Object.entries(fxServices).map(async ([ providerID, service ]) => {\n\t\t\tconst fromEntries = await service.from('array');\n\n\t\t\tif (!fromEntries) {\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tconst pathNodes = await Promise.all(fromEntries.map(async function(fromEntry) {\n\t\t\t\tconst pathNodesResult: GraphNodeLike[] = [];\n\n\t\t\t\tconst parsedEntry = await fromEntry('object');\n\n\t\t\t\tconst [ fromCodes, toCodes ] = await Promise.all([\n\t\t\t\t\tparsedEntry.currencyCodes('array'),\n\t\t\t\t\tparsedEntry.to('array')\n\t\t\t\t]);\n\n\t\t\t\tfor (const from of fromCodes) {\n\t\t\t\t\tconst fromResolved = await from('string');\n\t\t\t\t\tif (!fromResolved) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst fromAccount = KeetaNet.lib.Account.fromPublicKeyString(fromResolved).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN);\n\n\t\t\t\t\tfor (const to of toCodes) {\n\t\t\t\t\t\tconst toResolved = await to('string');\n\t\t\t\t\t\tif (!toResolved) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst toAccount = KeetaNet.lib.Account.fromPublicKeyString(toResolved).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN);\n\n\t\t\t\t\t\tif (fromAccount.comparePublicKey(toAccount)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpathNodesResult.push({\n\t\t\t\t\t\t\ttype: 'fx',\n\t\t\t\t\t\t\tproviderID: providerID,\n\t\t\t\t\t\t\tfrom: { asset: fromAccount, location: networkLocation, rail: 'KEETA_SEND' },\n\t\t\t\t\t\t\tto: { asset: toAccount, location: networkLocation, rail: 'KEETA_SEND' }\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn(pathNodesResult);\n\t\t\t}));\n\n\t\t\treturn(pathNodes.flat());\n\t\t}));\n\n\t\treturn(providerLookupResult.flat().filter((node): node is GraphNodeLike => !!node));\n\t}\n\n\tasync #resolveAssetName(name: MovableAssetSearchCanonical): Promise<ISOCurrencyCode | TokenAddress | ExternalChainAsset> {\n\t\tif (KeetaNet.lib.Account.isInstance(name) && name.isToken()) {\n\t\t\treturn(name);\n\t\t}\n\n\t\tif (typeof name === 'string') {\n\t\t\ttry {\n\t\t\t\treturn(KeetaNet.lib.Account.fromPublicKeyString(name).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN));\n\t\t\t} catch {\n\t\t\t\t/* ignore error and continue with other resolution methods */\n\t\t\t}\n\t\t}\n\n\t\tlet found = this.#assetNameCache.get(name);\n\t\tif (found) {\n\t\t\treturn(found);\n\t\t}\n\n\t\tif (isExternalChainAsset(name)) {\n\t\t\tfound = name;\n\t\t} else if (Currency.isCurrencyCode(name)) {\n\t\t\tfound = name;\n\t\t} else if (Currency.isISOCurrencyNumber(name)) {\n\t\t\tfound = new Currency(name).code;\n\t\t} else {\n\t\t\tconst lookupRet = await this.resolver.lookupToken(name);\n\t\t\tif (lookupRet) {\n\t\t\t\tfound = KeetaNet.lib.Account.toAccount(lookupRet.token);\n\t\t\t}\n\t\t}\n\n\t\tif (!found) {\n\t\t\tthrow(new Error(`Unable to resolve asset name: ${name}`));\n\t\t}\n\n\t\tthis.#assetNameCache.set(name, found);\n\n\t\treturn(found);\n\t}\n\n\tasync #computeAssetRails(assetInput: ToValuizable<RailOrRailWithExtendedDetails>): Promise<{ rail: Rail }> {\n\t\ttry {\n\t\t\tconst railResolved = await assetInput('string');\n\n\t\t\tif (!isRail(railResolved)) {\n\t\t\t\tthrow(new Error(`Invalid rail format: ${railResolved}`));\n\t\t\t}\n\n\t\t\treturn({ rail: railResolved });\n\t\t} catch {\n\t\t\t/* ignore error */\n\t\t}\n\n\t\tconst extendedDetailsResolved = await assetInput('object');\n\n\t\tif (!extendedDetailsResolved || typeof extendedDetailsResolved !== 'object' || Array.isArray(extendedDetailsResolved)) {\n\t\t\tthrow(new Error(`Invalid asset format, expected string or object with extended details`));\n\t\t}\n\n\t\tif (!('rail' in extendedDetailsResolved)) {\n\t\t\tthrow(new Error(`Invalid asset format, missing 'rail' field in extended details`));\n\t\t}\n\n\t\tconst railResolved = await extendedDetailsResolved.rail?.('string');\n\n\t\tif (!isRail(railResolved)) {\n\t\t\tthrow(new Error(`Invalid rail format in extended details: ${railResolved}`));\n\t\t}\n\n\t\treturn({ rail: railResolved });\n\t}\n\n\tasync #computeAssetMovementPairSide(pairSideInput: ToValuizable<AssetWithRails>): Promise<{ rails: AssetMovementResolvedRails; location: AssetLocationLike; id: AnchorChainingAsset; }> {\n\t\tconst pairSideResolved = await pairSideInput('object');\n\n\t\tlet location: AssetLocationLike;\n\t\tif (pairSideResolved.location) {\n\t\t\tconst locationRaw = await pairSideResolved.location('string');\n\t\t\tif (!isAssetLocationLike(locationRaw)) {\n\t\t\t\tthrow(new Error(`Invalid location format: ${locationRaw}`));\n\t\t\t}\n\n\t\t\tlocation = locationRaw;\n\t\t} else {\n\t\t\tlocation = `chain:keeta:${this.client.network}`;\n\t\t}\n\n\t\tconst railsResolved = await pairSideResolved.rails('object');\n\n\t\tconst rails: AssetMovementResolvedRails = {\n\t\t\tcommon: await Promise.all((await railsResolved.common?.('array'))?.map(async (commonInput) => {\n\t\t\t\treturn((await this.#computeAssetRails(commonInput)).rail);\n\t\t\t}) ?? []),\n\t\t\tinbound: await Promise.all((await railsResolved.inbound?.('array'))?.map(async (commonInput) => {\n\t\t\t\treturn((await this.#computeAssetRails(commonInput)).rail);\n\t\t\t}) ?? []),\n\t\t\toutbound: await Promise.all((await railsResolved.outbound?.('array'))?.map(async (commonInput) => {\n\t\t\t\treturn((await this.#computeAssetRails(commonInput)).rail);\n\t\t\t}) ?? [])\n\t\t};\n\n\t\tconst id = await pairSideResolved.id('string');\n\t\tif (!isMovableAssetSearchCanonical(id)) {\n\t\t\tthrow(new Error(`Invalid asset id format: ${id}`));\n\t\t}\n\n\t\treturn({\n\t\t\trails: rails,\n\t\t\tlocation: location,\n\t\t\tid: await this.#resolveAssetName(id)\n\t\t});\n\t}\n\n\tasync #computeAssetMovementNodes() {\n\t\tconst assetMovementServices = await this.resolver.lookup('assetMovement', {});\n\n\t\tif (!assetMovementServices) {\n\t\t\treturn([]);\n\t\t}\n\n\t\tconst providerResults = await Promise.all(Object.entries(assetMovementServices).map(async ([ providerID, service ]) => {\n\t\t\tconst supportedAssetsEntries = await service.supportedAssets('array');\n\n\t\t\tif (!supportedAssetsEntries) {\n\t\t\t\tthis.logger?.debug('AnchorGraph::computeAssetMovementNodes', `No supported assets found for provider ${providerID}`);\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tconst pathNodesResult = await Promise.all(supportedAssetsEntries.map(async (assetEntry): Promise<GraphNodeLike[]> => {\n\t\t\t\tconst parsedEntry = await assetEntry('object');\n\n\t\t\t\tconst pathsResolved = await parsedEntry.paths('array');\n\t\t\t\tconst pathPromises = await Promise.allSettled(pathsResolved.map(async (pathResolvedInput): Promise<GraphNodeLike[]> => {\n\t\t\t\t\tconst pathResolved = await pathResolvedInput('object');\n\n\t\t\t\t\tconst pairResolved = await pathResolved.pair('array');\n\n\t\t\t\t\tconst [ fromResolved, toResolved ] = await Promise.all([\n\t\t\t\t\t\tthis.#computeAssetMovementPairSide(pairResolved[0]),\n\t\t\t\t\t\tthis.#computeAssetMovementPairSide(pairResolved[1])\n\t\t\t\t\t]);\n\n\t\t\t\t\tconst pathNodes: GraphNodeLike[] = [];\n\t\t\t\t\tfor (const [ src, dest ] of [\n\t\t\t\t\t\t[ fromResolved, toResolved ],\n\t\t\t\t\t\t[ toResolved, fromResolved ]\n\t\t\t\t\t] as const) {\n\t\t\t\t\t\tfor (const inboundRail of [ ...(src.rails.common ?? []), ...(src.rails.inbound ?? []) ]) {\n\t\t\t\t\t\t\tfor (const outboundRail of [ ...(dest.rails.common ?? []), ...(dest.rails.outbound ?? []) ]) {\n\t\t\t\t\t\t\t\tpathNodes.push({\n\t\t\t\t\t\t\t\t\ttype: 'assetMovement',\n\t\t\t\t\t\t\t\t\tproviderID: providerID,\n\t\t\t\t\t\t\t\t\tfrom: { asset: src.id, location: src.location, rail: inboundRail },\n\t\t\t\t\t\t\t\t\tto: { asset: dest.id, location: dest.location, rail: outboundRail }\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn(pathNodes);\n\t\t\t\t}));\n\n\t\t\t\tconst allPaths = [];\n\n\t\t\t\tfor (const resolved of pathPromises) {\n\t\t\t\t\tif (resolved.status === 'rejected') {\n\t\t\t\t\t\tthis.logger?.debug('AnchorGraph::computeAssetMovementNodes', `error fetching nodes for ... TODO`, resolved.reason);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tallPaths.push(...resolved.value);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn(allPaths);\n\t\t\t}));\n\n\t\t\treturn(pathNodesResult.flat());\n\t\t}));\n\n\t\treturn(providerResults.flat().filter((node): node is GraphNodeLike => !!node));\n\t}\n\n\tasync computeGraphNodes(): Promise<GraphNodeLike[]> {\n\t\tconst receivedNodes = await Promise.all([\n\t\t\tthis.#computeFXNodes(),\n\t\t\tthis.#computeAssetMovementNodes()\n\t\t]);\n\n\t\treturn(receivedNodes.flat());\n\t}\n\n\tasync findPaths(input: AnchorChainingPathInput): Promise<GraphNodeLike[][]> {\n\t\tconst graph = await this.computeGraphNodes();\n\n\t\tconst nodesWithNext: { node: GraphNodeLike, next: number[] }[] = graph.map(function(node) {\n\t\t\treturn({ node, next: [] });\n\t\t});\n\n\t\tfor (const node of nodesWithNext) {\n\t\t\tfor (let secondNodeIdx = 0; secondNodeIdx < nodesWithNext.length; secondNodeIdx++) {\n\t\t\t\tconst nodeJ = nodesWithNext[secondNodeIdx];\n\t\t\t\tif (!nodeJ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// We can ignore chaining one fx anchor to itself\n\t\t\t\tif (node.node.type === 'fx') {\n\t\t\t\t\tif (node.node.type === nodeJ.node.type && node.node.providerID === nodeJ.node.providerID) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nodeSideSupports(node.node.to, nodeJ.node.from)) {\n\t\t\t\t\tnode.next.push(secondNodeIdx);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst paths: GraphNodeLike[][] = [];\n\n\t\tfunction getAssetLocationString(input: GraphNodeLike['to'], includeRail = false) {\n\t\t\tlet railStr = '';\n\t\t\tif (includeRail) {\n\t\t\t\trailStr = `#${input.rail}`;\n\t\t\t}\n\t\t\treturn(`${convertAssetSearchInputToCanonical(input.asset)}@${convertAssetLocationToString(input.location)}${railStr}`)\n\t\t}\n\n\t\tfunction dfs(\n\t\t\tcurrentIndex: number,\n\t\t\ttarget: AnchorChainingAssetAndLocation,\n\t\t\tvisitedAssets = new Set<string>(),\n\t\t\tpath: GraphNodeLike[] = []\n\t\t) {\n\t\t\tconst cur = nodesWithNext[currentIndex];\n\n\t\t\tif (!cur) {\n\t\t\t\tthrow(new Error(`Invalid node index: ${currentIndex}`));\n\t\t\t}\n\n\t\t\tconst assetLocationStr = getAssetLocationString(cur.node.from, true);\n\t\t\tif (visitedAssets.has(assetLocationStr)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvisitedAssets.add(assetLocationStr);\n\n\t\t\tconst newPath = [ ...path, cur.node ];\n\n\t\t\tif (nodeSideSupports(cur.node.to, target)) {\n\t\t\t\tpaths.push(newPath);\n\t\t\t}\n\n\t\t\tfor (const nextIndex of nodesWithNext[currentIndex]?.next ?? []) {\n\t\t\t\tdfs(nextIndex, target, visitedAssets, newPath);\n\t\t\t}\n\n\t\t\tvisitedAssets.delete(assetLocationStr);\n\t\t}\n\n\t\tfor (let index = 0; index < nodesWithNext.length; index++) {\n\t\t\tconst node = nodesWithNext[index];\n\n\t\t\tif (!node) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (nodeSideSupports(node.node.from, input.source)) {\n\t\t\t\tdfs(index, input.destination);\n\t\t\t}\n\t\t}\n\n\t\treturn(paths);\n\t}\n\n\tasync resolveAssets(filter: AnchorChainingResolveAssetsFilter = {}): Promise<AnchorChainingResolveAssetsResult> {\n\t\tconst { from: fromFilterInput, to: toFilterInput, maxStepCount, onlyAllowFXLike } = filter;\n\n\t\tconst keetaNetworkLocation = `chain:keeta:${this.client.network}` satisfies AssetLocationLike;\n\n\t\t// When onlyAllowFXLike, default omitted locations to the Keeta network location\n\t\tconst fromFilter = (onlyAllowFXLike && fromFilterInput !== undefined && fromFilterInput.location === undefined)\n\t\t\t? { ...fromFilterInput, location: keetaNetworkLocation }\n\t\t\t: fromFilterInput;\n\t\tconst toFilter = (onlyAllowFXLike && toFilterInput !== undefined && toFilterInput.location === undefined)\n\t\t\t? { ...toFilterInput, location: keetaNetworkLocation }\n\t\t\t: toFilterInput;\n\n\t\tconst nodes = await this.computeGraphNodes();\n\n\t\t// Build forward (next) and backward (prev) adjacency in a single pass.\n\t\tconst nodesWithAdj: { node: GraphNodeLike; next: number[]; prev: number[] }[] = nodes.map(node => ({ node, next: [], prev: [] }));\n\t\tfor (let i = 0; i < nodesWithAdj.length; i++) {\n\t\t\tfor (let j = 0; j < nodesWithAdj.length; j++) {\n\t\t\t\tconst ni = nodesWithAdj[i];\n\t\t\t\tconst nj = nodesWithAdj[j];\n\t\t\t\tif (!ni || !nj) {\n\t\t\t\t\tthrow(new Error(`Invalid node index during adjacency construction: ${i} or ${j}`));\n\t\t\t\t}\n\t\t\t\tif (ni.node.type === 'fx' && nj.node.type === 'fx' && ni.node.providerID === nj.node.providerID) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (nodeSideSupports(ni.node.to, nj.node.from)) {\n\t\t\t\t\tni.next.push(j);\n\t\t\t\t\tnj.prev.push(i);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst assetLocationKey = (side: { asset: AnchorChainingAsset; location: AssetLocationLike }) => {\n\t\t\treturn(`${convertAssetSearchInputToCanonical(side.asset)}@${convertAssetLocationToString(side.location)}`);\n\t\t};\n\n\t\tconst sideMatchesFilter = (\n\t\t\tside: GraphNodeLike['from' | 'to'],\n\t\t\tf: AnchorChainingListAssetsSideFilter\n\t\t): boolean => {\n\t\t\tif (f.location !== undefined && convertAssetLocationToString(side.location) !== convertAssetLocationToString(f.location)) {\n\t\t\t\treturn(false);\n\t\t\t}\n\t\t\tif (f.asset !== undefined && !isAnchorChainingAssetEqual(side.asset, f.asset)) {\n\t\t\t\treturn(false);\n\t\t\t}\n\t\t\tif (f.rail !== undefined && side.rail !== f.rail) {\n\t\t\t\treturn(false);\n\t\t\t}\n\t\t\treturn(true);\n\t\t};\n\n\t\t// Separate reachable sets and distance maps for backward (from) and forward (to) traversals.\n\t\tconst fromReachable = new Set<string>();\n\t\tconst fromDistances = new Map<string, number>();\n\t\tconst toReachable = new Set<string>();\n\t\tconst toDistances = new Map<string, number>();\n\n\t\tconst makeMarkFn = (reachable: Set<string>, distances: Map<string, number>) =>\n\t\t\t(side: GraphNodeLike['from' | 'to'], depth?: number) => {\n\t\t\t\tconst key = assetLocationKey(side);\n\t\t\t\treachable.add(key);\n\t\t\t\tif (depth !== undefined) {\n\t\t\t\t\tconst existing = distances.get(key);\n\t\t\t\t\tif (existing === undefined || depth < existing) {\n\t\t\t\t\t\tdistances.set(key, depth);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\tconst markFromReachable = makeMarkFn(fromReachable, fromDistances);\n\t\tconst markToReachable = makeMarkFn(toReachable, toDistances);\n\n\t\tconst bfs = (\n\t\t\tstartCondition: (item: (typeof nodesWithAdj)[number]) => boolean,\n\t\t\tadjacency: 'next' | 'prev',\n\t\t\tmarkSide: 'from' | 'to',\n\t\t\tmarkFn: (side: GraphNodeLike['from' | 'to'], depth: number) => void\n\t\t) => {\n\t\t\tconst nodeVisited = new Set<number>();\n\t\t\tconst queue: { nodeIdx: number; depth: number }[] = [];\n\t\t\tfor (let i = 0; i < nodesWithAdj.length; i++) {\n\t\t\t\tconst item = nodesWithAdj[i];\n\t\t\t\tif (!item) {\n\t\t\t\t\tthrow(new Error(`Invalid node index during BFS initialization: ${i}`));\n\t\t\t\t}\n\t\t\t\tif (startCondition(item) && !nodeVisited.has(i)) {\n\t\t\t\t\tnodeVisited.add(i);\n\t\t\t\t\tqueue.push({ nodeIdx: i, depth: 1 });\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile (queue.length > 0) {\n\t\t\t\tconst queueItem = queue.shift();\n\t\t\t\tif (!queueItem) {\n\t\t\t\t\tthrow(new Error(`Unexpected empty queue during BFS processing`));\n\t\t\t\t}\n\t\t\t\tconst { nodeIdx, depth } = queueItem;\n\t\t\t\tconst item = nodesWithAdj[nodeIdx];\n\t\t\t\tif (!item) {\n\t\t\t\t\tthrow(new Error(`Invalid node index during BFS processing: ${nodeIdx}`));\n\t\t\t\t}\n\t\t\t\tif (onlyAllowFXLike && !isFXLikeNode(item.node)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tmarkFn(item.node[markSide], depth);\n\t\t\t\tif (maxStepCount === undefined || depth < maxStepCount) {\n\t\t\t\t\tfor (const neighborIdx of item[adjacency]) {\n\t\t\t\t\t\tif (!nodeVisited.has(neighborIdx)) {\n\t\t\t\t\t\t\tnodeVisited.add(neighborIdx);\n\t\t\t\t\t\t\tqueue.push({ nodeIdx: neighborIdx, depth: depth + 1 });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (fromFilter) {\n\t\t\tbfs(item => sideMatchesFilter(item.node.from, fromFilter), 'next', 'to', markToReachable);\n\t\t}\n\t\tif (toFilter) {\n\t\t\tbfs(item => sideMatchesFilter(item.node.to, toFilter), 'prev', 'from', markFromReachable);\n\t\t}\n\t\tif (!fromFilter && !toFilter) {\n\t\t\tfor (const { node } of nodesWithAdj) {\n\t\t\t\tif (!onlyAllowFXLike || isFXLikeNode(node)) {\n\t\t\t\t\tmarkFromReachable(node.from);\n\t\t\t\t\tmarkFromReachable(node.to);\n\t\t\t\t\tmarkToReachable(node.from);\n\t\t\t\t\tmarkToReachable(node.to);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Second pass: build result maps by collecting inbound/outbound rails for every reachable\n\t\t// (asset, location) pair from ALL graph nodes, not just those on the traversal path.\n\t\tconst buildResultMap = (\n\t\t\treachable: Set<string>,\n\t\t\tdistances: Map<string, number>\n\t\t): Map<string, AnchorChainingAssetInfo> => {\n\t\t\tconst resultMap = new Map<string, AnchorChainingAssetInfo>();\n\t\t\tconst getOrCreate = (side: { asset: AnchorChainingAsset; location: AssetLocationLike }): AnchorChainingAssetInfo => {\n\t\t\t\tconst key = assetLocationKey(side);\n\t\t\t\tlet resultObj = resultMap.get(key);\n\t\t\t\tif (!resultObj) {\n\t\t\t\t\tconst distanceValue = distances.get(key);\n\t\t\t\t\tresultObj = {\n\t\t\t\t\t\tasset: side.asset,\n\t\t\t\t\t\tlocation: side.location,\n\t\t\t\t\t\trails: { inbound: [], outbound: [] },\n\t\t\t\t\t\tdistance: distanceValue !== undefined ? { pathLength: distanceValue } : null\n\t\t\t\t\t};\n\t\t\t\t\tresultMap.set(key, resultObj);\n\t\t\t\t}\n\t\t\t\treturn(resultObj);\n\t\t\t};\n\t\t\tfor (const { node } of nodesWithAdj) {\n\t\t\t\tif (onlyAllowFXLike && !isFXLikeNode(node)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (reachable.has(assetLocationKey(node.to))) {\n\t\t\t\t\tconst entry = getOrCreate(node.to);\n\t\t\t\t\tif (!entry.rails.inbound.includes(node.to.rail)) {\n\t\t\t\t\t\tentry.rails.inbound.push(node.to.rail);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (reachable.has(assetLocationKey(node.from))) {\n\t\t\t\t\tconst entry = getOrCreate(node.from);\n\t\t\t\t\tif (!entry.rails.outbound.includes(node.from.rail)) {\n\t\t\t\t\t\tentry.rails.outbound.push(node.from.rail);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn(resultMap);\n\t\t};\n\n\t\tconst fromResultMap = buildResultMap(fromReachable, fromDistances);\n\t\tconst toResultMap = buildResultMap(toReachable, toDistances);\n\n\t\t// When onlyAllowFXLike, exclude the filter asset from the result set so that\n\t\t// \"what can USDC be swapped to?\" doesn't include USDC itself via a round-trip.\n\t\tif (onlyAllowFXLike) {\n\t\t\tif (fromFilter?.asset !== undefined) {\n\t\t\t\ttoResultMap.delete(assetLocationKey({ asset: fromFilter.asset, location: fromFilter.location ?? keetaNetworkLocation }));\n\t\t\t}\n\t\t\tif (toFilter?.asset !== undefined) {\n\t\t\t\tfromResultMap.delete(assetLocationKey({ asset: toFilter.asset, location: toFilter.location ?? keetaNetworkLocation }));\n\t\t\t}\n\t\t}\n\n\t\tconst filterMap = (\n\t\t\tmap: Map<string, AnchorChainingAssetInfo>,\n\t\t\tf: AnchorChainingListAssetsSideFilter,\n\t\t\trailSide: 'inbound' | 'outbound'\n\t\t): AnchorChainingAssetInfo[] =>\n\t\t\tArray.from(map.values()).filter(info => {\n\t\t\t\tif (f.location !== undefined && convertAssetLocationToString(info.location) !== convertAssetLocationToString(f.location)) {\n\t\t\t\t\treturn(false);\n\t\t\t\t}\n\t\t\t\tif (f.asset !== undefined && !isAnchorChainingAssetEqual(info.asset, f.asset)) {\n\t\t\t\t\treturn(false);\n\t\t\t\t}\n\t\t\t\tif (f.rail !== undefined && !info.rails[railSide].includes(f.rail)) {\n\t\t\t\t\treturn(false);\n\t\t\t\t}\n\t\t\t\treturn(true);\n\t\t\t});\n\n\t\tconst fromAssets = (fromFilter !== undefined && toFilter !== undefined)\n\t\t\t? filterMap(fromResultMap, fromFilter, 'outbound')\n\t\t\t: Array.from(fromResultMap.values());\n\t\tconst toAssets = (fromFilter !== undefined && toFilter !== undefined)\n\t\t\t? filterMap(toResultMap, toFilter, 'inbound')\n\t\t\t: Array.from(toResultMap.values());\n\n\t\treturn({ from: fromAssets, to: toAssets });\n\t}\n\n\tasync listAssets(filter: AnchorChainingListAssetsFilter = {}): Promise<AnchorChainingAssetInfo[]> {\n\t\tconst result = await this.resolveAssets(filter);\n\n\t\tif (filter.from) {\n\t\t\treturn(result.to);\n\t\t} else if (filter.to) {\n\t\t\treturn(result.from);\n\t\t} else {\n\t\t\treturn(result.to);\n\t\t}\n\t}\n}\n\ninterface ComputePlanOptions {\n\toverrides?: AnchorChainingAccountOverrides;\n}\n\nexport class AnchorChainingPath {\n\treadonly request: AnchorChainingPathInput;\n\treadonly path: AnchorChainingStepLike[];\n\treadonly parent: AnchorChaining;\n\n\tconstructor(input: {\n\t\trequest: AnchorChainingPathInput;\n\t\tpath: AnchorChainingStepLike[];\n\t\tparent: AnchorChaining;\n\t}) {\n\t\tthis.request = input.request;\n\t\tthis.path = input.path;\n\t\tthis.parent = input.parent;\n\t}\n\n\tprotected async getAccountForAction(action: GetAccountForActionPayload, overrides?: AnchorChainingAccountOverrides): Promise<Account | undefined> {\n\t\tlet found;\n\n\t\tif (this.parent['client'].account.isAccount()) {\n\t\t\tfound = this.parent['client'].account;\n\t\t} else if (this.parent['client'].signer !== null) {\n\t\t\tfound = this.parent['client'].signer;\n\t\t}\n\n\t\tif (overrides?.account) {\n\t\t\tif (typeof overrides.account === 'function') {\n\t\t\t\tfound = await overrides.account(action);\n\t\t\t} else {\n\t\t\t\tfound = overrides.account;\n\t\t\t}\n\t\t}\n\n\t\treturn(found);\n\t}\n}\n\nexport class AnchorChainingPlan extends AnchorChainingPath {\n\t#_plan: AnchorChainingPathComputedPlan | null = null;\n\n\t#state: AnchorChainingPathState = { status: 'idle' };\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t#listeners = new Map<string, Set<((...args: any[]) => void)>>();\n\n\tprivate constructor(path: AnchorChainingPath) {\n\t\tsuper({ ...path });\n\t}\n\n\tget plan(): AnchorChainingPathComputedPlan {\n\t\tif (!this.#_plan) {\n\t\t\tthrow(new Error(`Steps have not been computed yet`));\n\t\t}\n\n\t\treturn(this.#_plan);\n\t}\n\n\tasync #computePlan(options?: ComputePlanOptions) {\n\t\tif (this.#_plan) {\n\t\t\tthrow(new Error(`Steps have already been computed`));\n\t\t}\n\n\t\tconst sharedClientOptions = {\n\t\t\tresolver: this.parent['resolver'],\n\t\t\t...(this.parent['logger'] ? { logger: this.parent['logger'] } : {})\n\t\t} as const;\n\n\t\tconst fxClient = new KeetaFXAnchorClient(this.parent['client'], sharedClientOptions);\n\n\t\tconst assetMovementClient = new KeetaAssetMovementAnchorClient(this.parent['client'], sharedClientOptions);\n\n\t\tlet affinityAndAmount: { affinity: 'to' | 'from'; amount: bigint } | undefined = undefined;\n\n\t\tif (this.request.source.value !== undefined && this.request.destination.value !== undefined) {\n\t\t\tthrow(new Error('Must have source.value or destination.value but not both'));\n\t\t} else if (this.request.source.value !== undefined) {\n\t\t\taffinityAndAmount = {\n\t\t\t\taffinity: 'from',\n\t\t\t\tamount: this.request.source.value\n\t\t\t}\n\t\t} else if (this.request.destination.value !== undefined) {\n\t\t\taffinityAndAmount = {\n\t\t\t\taffinity: 'to',\n\t\t\t\tamount: this.request.destination.value\n\t\t\t}\n\t\t} else {\n\t\t\tthrow(new Error('Must have source.value or destination.value'));\n\t\t}\n\n\t\tconst { affinity } = affinityAndAmount\n\n\t\tconst findInstruction = <R extends AssetTransferInstructions['type']>(allInstructions: AssetTransferInstructions[], type: R): Extract<AssetTransferInstructions, { type: R }> => {\n\t\t\tconst found = allInstructions.find((instr): instr is Extract<AssetTransferInstructions, { type: R }> => {\n\t\t\t\treturn(instr.type === type);\n\t\t\t});\n\n\t\t\tif (!found) {\n\t\t\t\tthrow(new Error(`Expected to find instruction of type ${type} in next step's instructions`));\n\t\t\t}\n\n\t\t\treturn(found);\n\t\t};\n\n\t\tconst stepPromises: Promise<ChainStepResolution>[] = [];\n\t\tconst resolvingSteps = new Set<number>();\n\t\tconst resolveStep = async (index: number): Promise<ChainStepResolution> => {\n\t\t\tconst step = this.path[index];\n\n\t\t\tif (!step) {\n\t\t\t\tthrow(new Error(`Step ${index} is not defined`));\n\t\t\t}\n\n\t\t\tlet promise: Promise<ChainStepResolution> | undefined = stepPromises[index];\n\n\t\t\tif (!promise) {\n\t\t\t\tresolvingSteps.add(index);\n\n\t\t\t\tpromise = (async (): Promise<ChainStepResolution> => {\n\t\t\t\t\tif (step.type === 'fx') {\n\t\t\t\t\t\tlet amount;\n\n\t\t\t\t\t\tif (affinity === 'from') {\n\t\t\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t\t\tamount = affinityAndAmount.amount;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst previous = await resolveStep(index - 1);\n\t\t\t\t\t\t\t\tamount = previous.valueOut;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (affinity === 'to') {\n\t\t\t\t\t\t\tif (index === (this.path.length - 1)) {\n\t\t\t\t\t\t\t\t// XXX:TODO Move this to destination\n\t\t\t\t\t\t\t\tamount = affinityAndAmount.amount;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst next = await resolveStep(index + 1);\n\t\t\t\t\t\t\t\tamount = next.valueIn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tassertNever(affinity);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst quotesOrEstimates = await fxClient.getQuotesOrEstimates(\n\t\t\t\t\t\t\t{ from: step.from.asset, to: step.to.asset, amount, affinity },\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t{ providerIDs: [ step.providerID ] }\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!quotesOrEstimates?.[0] || quotesOrEstimates.length === 0) {\n\t\t\t\t\t\t\tthrow(new Error(`Could not get FX quote/estimate for provider ${step.providerID}`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst result = quotesOrEstimates[0];\n\n\t\t\t\t\t\tconst convertedAmount = result.isQuote ? result.quote.convertedAmount : result.estimate.convertedAmount;\n\n\t\t\t\t\t\tlet valueIn;\n\t\t\t\t\t\tlet valueOut;\n\n\t\t\t\t\t\tif (affinity === 'to') {\n\t\t\t\t\t\t\tvalueOut = amount;\n\t\t\t\t\t\t\tvalueIn = convertedAmount;\n\t\t\t\t\t\t} else if (affinity === 'from') {\n\t\t\t\t\t\t\tvalueOut = convertedAmount;\n\t\t\t\t\t\t\tvalueIn = amount;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tassertNever(affinity);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn({ type: 'fx', step, valueIn, valueOut, result });\n\t\t\t\t\t} else if (step.type === 'assetMovement') {\n\t\t\t\t\t\tlet recipient;\n\t\t\t\t\t\tlet sendingToType: SendingToType;\n\t\t\t\t\t\tif (index === this.path.length - 1) {\n\t\t\t\t\t\t\trecipient = this.request.destination.recipient;\n\t\t\t\t\t\t\tsendingToType = 'FINAL_DESTINATION';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst nextPathStep = this.path[index + 1];\n\t\t\t\t\t\t\tif (nextPathStep?.type === 'fx') {\n\t\t\t\t\t\t\t\tthrow(new Error(`Cannot currently chain from asset movement to fx step, as fx step does not have recipient information`));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst nextStep = await resolveStep(index + 1);\n\n\t\t\t\t\t\t\tif (nextStep.type === 'assetMovement' || nextStep.type === 'keetaSend') {\n\t\t\t\t\t\t\t\tif (nextStep.usingInstruction.type !== step.to.rail) {\n\t\t\t\t\t\t\t\t\tthrow(new Error(`Next step's usingInstruction type ${nextStep.usingInstruction.type} does not match expected ${step.to.rail} for recipient resolution`));\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst foundInstruction = nextStep.usingInstruction;\n\n\t\t\t\t\t\t\t\tconst isFiatPushRailFoundInstruction = (input: AssetTransferInstructions): input is Extract<AssetTransferInstructions, { type: FiatPushRails; }> => {\n\t\t\t\t\t\t\t\t\treturn(isFiatRail(input.type));\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (foundInstruction.type === 'KEETA_SEND') {\n\t\t\t\t\t\t\t\t\tif (!KeetaNet.lib.Account.isInstance(step.to.asset)) {\n\t\t\t\t\t\t\t\t\t\tthrow(new Error(`Expected asset to be a token account for KEETA_SEND rail`));\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (!step.to.asset.comparePublicKey(foundInstruction.tokenAddress)) {\n\t\t\t\t\t\t\t\t\t\tthrow(new Error(`Recipient token account ${foundInstruction.tokenAddress.toString()} does not match expected ${step.to.asset.publicKeyString.get()}`));\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (foundInstruction.external) {\n\t\t\t\t\t\t\t\t\t\tthrow(new Error(`Expected KEETA_SEND instruction to not have external value`));\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// XXX:TODO assert value here matches\n\n\t\t\t\t\t\t\t\t\tsendingToType = 'NEXT_STEP';\n\t\t\t\t\t\t\t\t\trecipient = KeetaNet.lib.Account.fromPublicKeyString(foundInstruction.sendToAddress);\n\t\t\t\t\t\t\t\t} else if (isFiatPushRailFoundInstruction(foundInstruction)) {\n\t\t\t\t\t\t\t\t\tif (foundInstruction.depositMessage) {\n\t\t\t\t\t\t\t\t\t\tthrow(new Error(`Deposit message outbound is not currently supported for chaining`));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tsendingToType = 'NEXT_STEP';\n\t\t\t\t\t\t\t\t\trecipient = foundInstruction.account;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tthrow(new Error(`Unsupported rail for chaining: ${step.to.rail}`));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (nextStep.type === 'fx') {\n\t\t\t\t\t\t\t\tthrow(new Error(`Cannot currently chain from asset movement to fx step, as fx step does not have recipient information`));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tassertNever(nextStep);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!recipient) {\n\t\t\t\t\t\t\tthrow(new Error(`Recipient must be defined for asset movement step at index ${index}`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst assetPair = { from: step.from.asset, to: step.to.asset };\n\n\t\t\t\t\t\tconst providers = await assetMovementClient.getProvidersForTransfer(\n\t\t\t\t\t\t\t{ asset: assetPair, from: step.from.location, to: step.to.location },\n\t\t\t\t\t\t\t{ providerIDs: [ step.providerID ] }\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!providers?.[0] || providers.length === 0) {\n\t\t\t\t\t\t\tthrow(new Error(`Could not get asset movement provider ${step.providerID}`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet depositValue;\n\n\t\t\t\t\t\tif (affinity === 'to') {\n\t\t\t\t\t\t\tthrow(new Error(`Chaining with affinity 'to' is not currently supported for asset movement steps, as it requires looking up transfer quotes/estimates which is not currently implemented`));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t\t\tdepositValue = affinityAndAmount.amount;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst previous = await resolveStep(index - 1);\n\t\t\t\t\t\t\t\tdepositValue = previous.valueOut;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst transfer = await providers[0].initiateTransfer({\n\t\t\t\t\t\t\taccount: await this.getAccountForAction({\n\t\t\t\t\t\t\t\ttype: 'assetMovement',\n\t\t\t\t\t\t\t\tproviderMethod: 'initiateTransfer',\n\t\t\t\t\t\t\t\tprovider: providers[0]\n\t\t\t\t\t\t\t}, options?.overrides),\n\t\t\t\t\t\t\tasset: assetPair,\n\t\t\t\t\t\t\tfrom: { location: step.from.location },\n\t\t\t\t\t\t\tto: {\n\t\t\t\t\t\t\t\tlocation: step.to.location,\n\t\t\t\t\t\t\t\trecipient: (() => {\n\t\t\t\t\t\t\t\t\tif (KeetaNet.lib.Account.isInstance(recipient)) {\n\t\t\t\t\t\t\t\t\t\treturn(recipient.publicKeyString.get());\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\treturn(recipient);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})()\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tvalue: depositValue\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst usingInstruction = findInstruction(transfer.instructions, step.from.rail);\n\n\t\t\t\t\t\tif (!usingInstruction.totalReceiveAmount) {\n\t\t\t\t\t\t\tthrow(new Error(`totalReceiveAmount must be defined for chaining`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn({\n\t\t\t\t\t\t\ttype: 'assetMovement',\n\t\t\t\t\t\t\tstep,\n\t\t\t\t\t\t\tvalueIn: depositValue,\n\t\t\t\t\t\t\tusingInstruction: usingInstruction,\n\t\t\t\t\t\t\ttransfer: transfer,\n\t\t\t\t\t\t\tsendingTo: sendingToType,\n\t\t\t\t\t\t\tvalueOut: BigInt(usingInstruction.totalReceiveAmount)\n\t\t\t\t\t\t})\n\t\t\t\t\t} else if (step.type === 'keetaSend') {\n\t\t\t\t\t\tif (this.path.length !== 1) {\n\t\t\t\t\t\t\tthrow(new Error(`Direct same-location/same-asset send steps must be the only step in the path`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!KeetaNet.lib.Account.isInstance(step.from.asset) || !KeetaNet.lib.Account.isInstance(step.to.asset)) {\n\t\t\t\t\t\t\tthrow(new Error(`Expected assets to be token accounts for KEETA_SEND rail`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!step.from.asset.comparePublicKey(step.to.asset)) {\n\t\t\t\t\t\t\tthrow(new Error(`For KEETA_SEND step, from and to asset must be the same account`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet keetaRecipientDestination = null;\n\t\t\t\t\t\tif (KeetaNet.lib.Account.isInstance(this.request.destination.recipient)) {\n\t\t\t\t\t\t\tkeetaRecipientDestination = this.request.destination.recipient;\n\t\t\t\t\t\t} else if (typeof this.request.destination.recipient === 'string') {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tkeetaRecipientDestination = KeetaNet.lib.Account.fromPublicKeyString(this.request.destination.recipient);\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t/* ignore errors */\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!keetaRecipientDestination) {\n\t\t\t\t\t\t\tthrow(new Error(`Expected destination recipient to be a public key string for KEETA_SEND step`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn({\n\t\t\t\t\t\t\ttype: 'keetaSend',\n\t\t\t\t\t\t\tstep: null,\n\t\t\t\t\t\t\tvalueIn: affinityAndAmount.amount,\n\t\t\t\t\t\t\tvalueOut: affinityAndAmount.amount,\n\t\t\t\t\t\t\tusingInstruction: {\n\t\t\t\t\t\t\t\ttype: 'KEETA_SEND',\n\t\t\t\t\t\t\t\ttokenAddress: step.to.asset.publicKeyString.get(),\n\t\t\t\t\t\t\t\tsendToAddress: keetaRecipientDestination.publicKeyString.get(),\n\t\t\t\t\t\t\t\ttotalReceiveAmount: affinityAndAmount.amount.toString(),\n\t\t\t\t\t\t\t\tlocation: `chain:keeta:${this.parent['client'].network}`,\n\t\t\t\t\t\t\t\tvalue: String(affinityAndAmount.amount),\n\t\t\t\t\t\t\t\tassetFee: '0'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertNever(step);\n\t\t\t\t\t}\n\t\t\t\t})();\n\n\t\t\t\tpromise.then(() => resolvingSteps.delete(index), () => resolvingSteps.delete(index));\n\t\t\t\tstepPromises[index] = promise;\n\t\t\t} else if (resolvingSteps.has(index)) {\n\t\t\t\tthrow(new Error(`Cyclic dependency detected in resolveStep: step ${index} is already being resolved`));\n\t\t\t}\n\n\t\t\treturn(await promise);\n\t\t}\n\n\t\tconst steps = [];\n\t\tfor (let index = 0; index < this.path.length; index++) {\n\t\t\tsteps.push(await resolveStep(index));\n\t\t}\n\n\t\t// Direct same-location/same-asset send: no provider steps needed.\n\t\tif (steps.length === 0) {\n\t\t\treturn({\n\t\t\t\tsteps: [],\n\t\t\t\ttotalValueIn: affinityAndAmount.amount,\n\t\t\t\ttotalValueOut: affinityAndAmount.amount\n\t\t\t});\n\t\t}\n\n\t\tconst firstStep = steps[0];\n\t\tconst lastStep = steps[steps.length - 1];\n\n\t\tif (!firstStep || !lastStep) {\n\t\t\tthrow(new Error(`Steps array is empty`));\n\t\t}\n\n\t\tif (affinity === 'from') {\n\t\t\tif (firstStep.valueIn !== this.request.source.value) {\n\t\t\t\tthrow(new Error(`Computed valueIn for first step ${firstStep.valueIn} does not match request source value ${this.request.source.value}`));\n\t\t\t}\n\t\t} else if (affinity === 'to') {\n\t\t\tif (lastStep.valueOut !== this.request.destination.value) {\n\t\t\t\tthrow(new Error(`Computed valueOut for last step ${lastStep.valueOut} does not match requested destination value ${this.request.destination.value}`));\n\t\t\t}\n\t\t}\n\n\t\tif (lastStep.valueOut <= 0n) {\n\t\t\tthrow(new Error(`Computed valueOut for last step must be greater than 0, got ${lastStep.valueOut}`));\n\t\t}\n\n\t\treturn({\n\t\t\tsteps,\n\t\t\ttotalValueIn: firstStep.valueIn,\n\t\t\ttotalValueOut: lastStep.valueOut\n\t\t});\n\t}\n\n\tstatic async create(path: AnchorChainingPath, options?: ComputePlanOptions): Promise<AnchorChainingPlan> {\n\t\tconst instance = new this(path);\n\t\tinstance.#_plan = await instance.#computePlan(options);\n\t\treturn(instance);\n\t}\n\n\tget state(): AnchorChainingPathState {\n\t\treturn(this.#state);\n\t}\n\n\ton<E extends keyof AnchorChainingPathEventMap>(event: E, listener: (...args: AnchorChainingPathEventMap[E]) => void): void {\n\t\tlet listenerSet = this.#listeners.get(event);\n\t\tif (!listenerSet) {\n\t\t\tlistenerSet = new Set();\n\t\t\tthis.#listeners.set(event, listenerSet);\n\t\t}\n\t\tlistenerSet.add(listener);\n\t}\n\n\toff<E extends keyof AnchorChainingPathEventMap>(event: E, listener: (...args: AnchorChainingPathEventMap[E]) => void): void {\n\t\tthis.#listeners.get(event)?.delete(listener);\n\t}\n\n\t#setState(state: AnchorChainingPathState): void {\n\t\tthis.#state = state;\n\t\tthis.#emit('stateChange', state);\n\t}\n\n\tget logger(): Logger | undefined {\n\t\treturn(this.parent['logger']);\n\t}\n\n\t#emit<E extends keyof AnchorChainingPathEventMap>(event: E, ...args: AnchorChainingPathEventMap[E]): { sendCount: number; } {\n\t\tlet sendCount = 0;\n\n\t\tfor (const listener of (this.#listeners.get(event) ?? [])) {\n\t\t\ttry {\n\t\t\t\tlistener(...args);\n\t\t\t\tsendCount++;\n\t\t\t} catch (err) {\n\t\t\t\tthis.logger?.debug(`AnchorChainingPath::emit`, `Error in listener for event '${event}'`, err);\n\t\t\t}\n\t\t}\n\n\t\treturn({ sendCount });\n\t}\n\n\tasync #awaitStepCompletion<\n\t\tType extends StepNeededActionEventPayload['type'],\n\t\tRet extends Parameters<Extract<StepNeededActionEventPayload, { action: { type: Type }}>['markCompleted']>\n\t>(step: Pick<Extract<StepNeededActionEventPayload, { type: Type }>, 'action' | 'type'>): Promise<Ret> {\n\t\tlet didComplete = false;\n\n\t\tfunction assertDidNotComplete() {\n\t\t\tif (didComplete) {\n\t\t\t\tthrow(new Error(`Step was already marked as completed or failed`));\n\t\t\t}\n\n\t\t\tdidComplete = true;\n\t\t}\n\n\t\tlet resolveFn: undefined | StepNeededActionEventPayload['markCompleted'];\n\t\tlet rejectFn: undefined | StepNeededActionEventPayload['markFailed'];\n\n\t\tconst promise = new Promise<Ret>(function(resolve, reject) {\n\t\t\tresolveFn = (...args: Ret) => {\n\t\t\t\tassertDidNotComplete();\n\t\t\t\tresolve(args);\n\t\t\t};\n\n\t\t\trejectFn = (error) => {\n\t\t\t\tassertDidNotComplete();\n\n\t\t\t\tlet usingErr = error;\n\t\t\t\tif (!usingErr) {\n\t\t\t\t\tusingErr = new Error(`Step marked as failed without error`);\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n\t\t\t\treject(usingErr);\n\t\t\t}\n\t\t});\n\n\t\tif (!resolveFn || !rejectFn) {\n\t\t\tthrow(new Error(`Failed to create step completion promise`));\n\t\t}\n\n\t\t// Typescript Cannot infer the correct payload type for the stepNeedsAction event, so we have to assert it here. We ensure type safety by constraining the step parameter to the correct action type, which guarantees that the payload will match the expected structure for that action type.\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst { sendCount } = this.#emit('stepNeedsAction', {\n\t\t\t...step,\n\t\t\tmarkCompleted: resolveFn,\n\t\t\tmarkFailed: rejectFn\n\t\t} as Extract<StepNeededActionEventPayload, { action: { type: Type }}>);\n\n\t\tif (sendCount === 0) {\n\t\t\tthrow(new Error(`No listeners for stepNeedsAction event, but a step (actionType=${step.type}) is awaiting completion`));\n\t\t}\n\n\t\treturn(await promise);\n\t}\n\n\tasync #authorizedSend(options: Pick<AnchorChainingPathExecuteOptions, 'requireSendAuth'> | undefined, sendToAddress: string | GenericAccount, value: bigint, token: TokenAddress | string, external?: string): Promise<void> {\n\t\tif (options?.requireSendAuth) {\n\t\t\tawait this.#awaitStepCompletion({\n\t\t\t\ttype: 'keetaSendAuthRequired',\n\t\t\t\taction: {\n\t\t\t\t\tsendToAddress: KeetaNet.lib.Account.toAccount(sendToAddress),\n\t\t\t\t\tvalue,\n\t\t\t\t\ttoken: KeetaNet.lib.Account.toAccount(token).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN),\n\t\t\t\t\t...(external !== undefined ? { external } : {})\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tawait this.parent['client'].send(sendToAddress, value, token, external);\n\t}\n\n\tasync #pollTransferStatus(\n\t\ttransfer: AssetMovementTransfer,\n\t\toptions?: { intervalMs?: number; timeoutMs?: number }\n\t): Promise<Awaited<ReturnType<AssetMovementTransfer['getTransferStatus']>>> {\n\t\tconst intervalMs = options?.intervalMs ?? 2000;\n\t\tconst timeoutMs = options?.timeoutMs ?? 300_000;\n\t\tconst deadline = Date.now() + timeoutMs;\n\n\t\twhile (true) {\n\t\t\tconst status = await transfer.getTransferStatus();\n\t\t\tif (status.transaction.status === 'COMPLETED') {\n\t\t\t\treturn(status);\n\t\t\t}\n\t\t\tif (Date.now() >= deadline) {\n\t\t\t\tthrow(new Error(`Timed out waiting for transfer ${transfer.transferId} to complete`));\n\t\t\t}\n\t\t\tawait KeetaNet.lib.Utils.Helper.asleep(intervalMs);\n\t\t}\n\t}\n\n\tasync #pollExchangeStatus(\n\t\texchange: FXExchange,\n\t\toptions?: { intervalMs?: number; timeoutMs?: number }\n\t): Promise<Awaited<ReturnType<FXExchange['getExchangeStatus']>>> {\n\t\tconst intervalMs = options?.intervalMs ?? 2000;\n\t\tconst timeoutMs = options?.timeoutMs ?? 300_000;\n\t\tconst deadline = Date.now() + timeoutMs;\n\n\t\twhile (true) {\n\t\t\tconst status = await exchange.getExchangeStatus();\n\t\t\tif (status.status === 'completed') {\n\t\t\t\treturn(status);\n\t\t\t}\n\t\t\tif (status.status === 'failed') {\n\t\t\t\tthrow(new Error(`FX exchange ${exchange.exchange.exchangeID} failed`));\n\t\t\t}\n\t\t\tif (Date.now() >= deadline) {\n\t\t\t\tthrow(new Error(`Timed out waiting for FX exchange ${exchange.exchange.exchangeID} to complete`));\n\t\t\t}\n\t\t\tawait KeetaNet.lib.Utils.Helper.asleep(intervalMs);\n\t\t}\n\t}\n\n\tasync execute(options?: { requireSendAuth?: boolean }): Promise<AnchorChainingPathExecuteResult> {\n\t\tif (this.#state.status !== 'idle') {\n\t\t\tthrow(new Error(`Cannot execute: path is already in state \"${this.#state.status}\"`));\n\t\t}\n\n\t\tconst executedSteps: ExecutedStep[] = [];\n\t\tthis.#setState({ status: 'executing', completedSteps: [], currentStepIndex: 0 });\n\n\t\t// Actual output value from each completed step, used for equality checking.\n\t\tlet prevActualValueOut: bigint | null = null;\n\n\t\tlet index = 0;\n\t\ttry {\n\t\t\tlet prev = null;\n\t\t\tfor (index = 0; index < this.plan.steps.length; index++) {\n\t\t\t\tconst onStepCompleted = (step: ExecutedStep) => {\n\t\t\t\t\texecutedSteps.push(step);\n\t\t\t\t\tthis.#emit('stepExecuted', step, index);\n\t\t\t\t}\n\n\t\t\t\tthis.#setState({ status: 'executing', completedSteps: [...executedSteps], currentStepIndex: index });\n\n\t\t\t\tconst step = this.plan.steps[index];\n\n\t\t\t\tif (!step) {\n\t\t\t\t\tthrow(new Error(`Step ${index} is not defined`));\n\t\t\t\t}\n\n\t\t\t\t// Verify the actual output from the previous step matches the expected\n\t\t\t\t// input for this step. A mismatch indicates a provider delivered a\n\t\t\t\t// different amount than was negotiated in computeSteps.\n\t\t\t\tif (index > 0 && prevActualValueOut !== null) {\n\t\t\t\t\tif (prevActualValueOut !== step.valueIn) {\n\t\t\t\t\t\tthrow(new Error(\n\t\t\t\t\t\t\t`Value mismatch at step ${index}: ` +\n\t\t\t\t\t\t\t`expected ${step.valueIn} but previous step produced ${prevActualValueOut}`\n\t\t\t\t\t\t));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (step.type === 'fx') {\n\t\t\t\t\tconst exchange = await step.result.createExchange();\n\t\t\t\t\tawait this.#pollExchangeStatus(exchange);\n\t\t\t\t\tprevActualValueOut = step.valueOut;\n\t\t\t\t\tonStepCompleted({ type: 'fx', plan: step, exchange });\n\t\t\t\t} else if (step.type === 'assetMovement' || step.type === 'keetaSend') {\n\t\t\t\t\tlet userInitiatedTransferRequired;\n\t\t\t\t\tif (prev && prev.type === 'assetMovement') {\n\t\t\t\t\t\tif (prev.sendingTo === 'NEXT_STEP') {\n\t\t\t\t\t\t\tuserInitiatedTransferRequired = false;\n\t\t\t\t\t\t} else if (prev.sendingTo === 'FINAL_DESTINATION') {\n\t\t\t\t\t\t\tthrow(new Error(`Invalid path: step ${index - 1} is sending to final destination, but is followed by another step`));\n\t\t\t\t\t\t} else if (prev.sendingTo === 'SELF') {\n\t\t\t\t\t\t\tuserInitiatedTransferRequired = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tassertNever(prev.sendingTo);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tuserInitiatedTransferRequired = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (userInitiatedTransferRequired) {\n\t\t\t\t\t\tif (step.usingInstruction.type === 'KEETA_SEND') {\n\t\t\t\t\t\t\tawait this.#authorizedSend(\n\t\t\t\t\t\t\t\toptions,\n\t\t\t\t\t\t\t\tstep.usingInstruction.sendToAddress,\n\t\t\t\t\t\t\t\tBigInt(step.usingInstruction.value),\n\t\t\t\t\t\t\t\tKeetaNet.lib.Account.fromPublicKeyString(step.usingInstruction.tokenAddress).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN),\n\t\t\t\t\t\t\t\tstep.usingInstruction.external\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (index === 0) {\n\t\t\t\t\t\t\tif (step.type !== 'assetMovement') {\n\t\t\t\t\t\t\t\tthrow(new Error(`Unexpected asset movement step at index ${index} for user-initiated transfer`));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tawait this.#awaitStepCompletion({\n\t\t\t\t\t\t\t\ttype: 'assetMovementUserExecutionRequired',\n\t\t\t\t\t\t\t\taction: {\n\t\t\t\t\t\t\t\t\tassetMovementTransfer: step.transfer\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow(new Error(`Unsupported instruction type ${step.usingInstruction.type} for user-initiated transfer at step ${index}`));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (step.type === 'assetMovement') {\n\t\t\t\t\t\tconst status = await this.#pollTransferStatus(step.transfer);\n\t\t\t\t\t\tprevActualValueOut = BigInt(status.transaction.to.value);\n\t\t\t\t\t\tonStepCompleted({ type: 'assetMovement', plan: step });\n\t\t\t\t\t} else if (step.type === 'keetaSend') {\n\t\t\t\t\t\t// For a direct Keeta send, we don't have a transfer object to poll, so we optimistically assume it completes successfully after the authorized send. We could optionally add a polling mechanism here if the underlying client provides a way to check the status of a Keeta transfer.\n\t\t\t\t\t\tprevActualValueOut = step.valueIn;\n\t\t\t\t\t\tonStepCompleted({ type: 'keetaSend', plan: step });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertNever(step);\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\tassertNever(step);\n\t\t\t\t}\n\n\t\t\t\tprev = step;\n\t\t\t}\n\n\t\t\t// Direct same-location/same-asset send: the loop ran zero iterations,\n\t\t\t// so just publish the on-chain transfer directly.\n\t\t\tif (this.path.length === 0) {\n\t\t\t\tconst sendValue = this.request.source.value ?? this.request.destination.value;\n\t\t\t\tif (!sendValue) {\n\t\t\t\t\tthrow(new Error(`Direct send requires a value for source or destination`));\n\t\t\t\t}\n\n\t\t\t\tif (!KeetaNet.lib.Account.isInstance(this.request.source.asset)) {\n\t\t\t\t\tthrow(new Error(`Direct send requires a Keeta token address as the source asset`));\n\t\t\t\t}\n\t\t\t\tconst recipient = this.request.destination.recipient;\n\t\t\t\tif (typeof recipient !== 'string') {\n\t\t\t\t\tthrow(new Error(`Direct Keeta send requires a crypto address as the recipient`));\n\t\t\t\t}\n\t\t\t\tawait this.#authorizedSend(options, recipient, sendValue, this.request.source.asset);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error(String(err));\n\t\t\tthis.#setState({ status: 'failed', error, completedSteps: [...executedSteps], failedAtStepIndex: index });\n\t\t\tthis.#emit('failed', error, [...executedSteps], index);\n\t\t\tthrow(error);\n\t\t}\n\n\t\tconst result: AnchorChainingPathExecuteResult = { steps: executedSteps };\n\t\tthis.#setState({ status: 'completed', result });\n\t\tthis.#emit('completed', result);\n\t\treturn(result);\n\t}\n}\n\nexport class AnchorChaining {\n\tprivate client: KeetaNet.UserClient;\n\tprivate resolver: Resolver;\n\treadonly graph: AnchorGraph;\n\tprivate logger?: Logger;\n\n\tconstructor(config: AnchorChainingConfig) {\n\t\tthis.client = config.client;\n\t\tif (config.resolver) {\n\t\t\tthis.resolver = config.resolver;\n\t\t} else {\n\t\t\tthis.resolver = getDefaultResolver(config.client);\n\t\t}\n\t\tthis.graph = new AnchorGraph({ resolver: this.resolver, client: this.client, logger: config.logger });\n\t\tif (config.logger !== undefined) {\n\t\t\tthis.logger = config.logger;\n\t\t}\n\t}\n\n\tasync getPaths(input: AnchorChainingPathInput): Promise<AnchorChainingPath[] | null> {\n\t\t// Direct send: same Keeta location, same asset, same rail no providers needed.\n\t\tconst sourceLocation = toAssetLocation(input.source.location);\n\t\tconst destinationLocation = toAssetLocation(input.destination.location);\n\n\t\tlet foundPaths: AnchorChainingStepLike[][] | null = null;\n\n\t\tif (\n\t\t\tinput.source.rail === 'KEETA_SEND' &&\n\t\t\tinput.destination.rail === 'KEETA_SEND' &&\n\t\t\tconvertAssetLocationToString(sourceLocation) === convertAssetLocationToString(destinationLocation) &&\n\t\t\tisChainLocation(sourceLocation, 'keeta') &&\n\t\t\tisChainLocation(destinationLocation, 'keeta') &&\n\t\t\tisAnchorChainingAssetEqual(input.source.asset, input.destination.asset)\n\t\t) {\n\t\t\tconst fromTo = {\n\t\t\t\tasset: input.source.asset,\n\t\t\t\tlocation: sourceLocation,\n\t\t\t\trail: 'KEETA_SEND'\n\t\t\t} as const;\n\n\t\t\tfoundPaths = [\n\t\t\t\t[{ type: 'keetaSend', from: fromTo, to: fromTo }]\n\t\t\t];\n\t\t} else {\n\t\t\tfoundPaths = await this.graph.findPaths(input);\n\t\t}\n\n\t\tif (foundPaths.length === 0) {\n\t\t\treturn(null);\n\t\t}\n\n\t\tconst retval: AnchorChainingPath[] = [];\n\n\t\tfor (const path of foundPaths) {\n\t\t\tretval.push(new AnchorChainingPath({ request: input, path, parent: this }));\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tasync getPlans(input: AnchorChainingPathInput, options?: ComputePlanOptions): Promise<AnchorChainingPlan[] | null> {\n\t\tconst paths = await this.getPaths(input);\n\n\t\tif (!paths) {\n\t\t\treturn(null);\n\t\t}\n\n\t\tconst result = await Promise.allSettled(paths.map(async function(path) {\n\t\t\treturn(await AnchorChainingPlan.create(path, options));\n\t\t}));\n\n\t\tconst ret = [];\n\n\t\tfor (const plan of result) {\n\t\t\tif (plan.status === 'fulfilled') {\n\t\t\t\tret.push(plan.value);\n\t\t\t} else {\n\t\t\t\tthis.logger?.debug(`AnchorChaining::getPlans`, `Error computing plan for a path:`, plan.reason);\n\t\t\t}\n\t\t}\n\n\t\treturn(ret);\n\t}\n}\n"]}