@bitgo-beta/sdk-coin-canton 1.0.1-beta.84 → 1.0.1-beta.840
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/canton.d.ts +13 -1
- package/dist/src/canton.d.ts.map +1 -1
- package/dist/src/canton.js +276 -10
- package/dist/src/cantonToken.d.ts +19 -0
- package/dist/src/cantonToken.d.ts.map +1 -0
- package/dist/src/cantonToken.js +52 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/lib/allocationAllocateBuilder.d.ts +126 -0
- package/dist/src/lib/allocationAllocateBuilder.d.ts.map +1 -0
- package/dist/src/lib/allocationAllocateBuilder.js +248 -0
- package/dist/src/lib/allocationAllocateWithdrawnBuilder.d.ts +67 -0
- package/dist/src/lib/allocationAllocateWithdrawnBuilder.d.ts.map +1 -0
- package/dist/src/lib/allocationAllocateWithdrawnBuilder.js +130 -0
- package/dist/src/lib/allocationRejectBuilder.d.ts +51 -0
- package/dist/src/lib/allocationRejectBuilder.d.ts.map +1 -0
- package/dist/src/lib/allocationRejectBuilder.js +107 -0
- package/dist/src/lib/allocationRequestBuilder.d.ts +116 -0
- package/dist/src/lib/allocationRequestBuilder.d.ts.map +1 -0
- package/dist/src/lib/allocationRequestBuilder.js +243 -0
- package/dist/src/lib/amount.d.ts +8 -0
- package/dist/src/lib/amount.d.ts.map +1 -0
- package/dist/src/lib/amount.js +33 -0
- package/dist/src/lib/cantonCommandBuilder.d.ts +72 -0
- package/dist/src/lib/cantonCommandBuilder.d.ts.map +1 -0
- package/dist/src/lib/cantonCommandBuilder.js +173 -0
- package/dist/src/lib/clearSigning.d.ts +58 -0
- package/dist/src/lib/clearSigning.d.ts.map +1 -0
- package/dist/src/lib/clearSigning.js +66 -0
- package/dist/src/lib/cosignDelegationAcceptBuilder.d.ts +56 -0
- package/dist/src/lib/cosignDelegationAcceptBuilder.d.ts.map +1 -0
- package/dist/src/lib/cosignDelegationAcceptBuilder.js +112 -0
- package/dist/src/lib/cosignDelegationProposalBuilder.d.ts +60 -0
- package/dist/src/lib/cosignDelegationProposalBuilder.d.ts.map +1 -0
- package/dist/src/lib/cosignDelegationProposalBuilder.js +111 -0
- package/dist/src/lib/endInvestorOnboardingOfferBuilder.d.ts +58 -0
- package/dist/src/lib/endInvestorOnboardingOfferBuilder.d.ts.map +1 -0
- package/dist/src/lib/endInvestorOnboardingOfferBuilder.js +112 -0
- package/dist/src/lib/iface.d.ts +135 -2
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +3 -1
- package/dist/src/lib/index.d.ts +13 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +29 -2
- package/dist/src/lib/messages/cantonBaseMessage.d.ts +16 -0
- package/dist/src/lib/messages/cantonBaseMessage.d.ts.map +1 -0
- package/dist/src/lib/messages/cantonBaseMessage.js +28 -0
- package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessage.d.ts +14 -0
- package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessage.d.ts.map +1 -0
- package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessage.js +23 -0
- package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessageBuilder.d.ts +17 -0
- package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessageBuilder.d.ts.map +1 -0
- package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessageBuilder.js +25 -0
- package/dist/src/lib/messages/cantonSignTopology/index.d.ts +3 -0
- package/dist/src/lib/messages/cantonSignTopology/index.d.ts.map +1 -0
- package/dist/src/lib/messages/cantonSignTopology/index.js +19 -0
- package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessage.d.ts +13 -0
- package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessage.d.ts.map +1 -0
- package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessage.js +22 -0
- package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessageBuilder.d.ts +14 -0
- package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessageBuilder.d.ts.map +1 -0
- package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessageBuilder.js +22 -0
- package/dist/src/lib/messages/cantonSignTransaction/index.d.ts +3 -0
- package/dist/src/lib/messages/cantonSignTransaction/index.d.ts.map +1 -0
- package/dist/src/lib/messages/cantonSignTransaction/index.js +19 -0
- package/dist/src/lib/messages/index.d.ts +5 -0
- package/dist/src/lib/messages/index.d.ts.map +1 -0
- package/dist/src/lib/messages/index.js +21 -0
- package/dist/src/lib/messages/messageBuilderFactory.d.ts +7 -0
- package/dist/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/messages/messageBuilderFactory.js +23 -0
- package/dist/src/lib/oneStepPreApprovalBuilder.d.ts +8 -0
- package/dist/src/lib/oneStepPreApprovalBuilder.d.ts.map +1 -1
- package/dist/src/lib/oneStepPreApprovalBuilder.js +15 -1
- package/dist/src/lib/resourcesInterface.d.ts +1 -1
- package/dist/src/lib/resourcesInterface.d.ts.map +1 -1
- package/dist/src/lib/resourcesInterface.js +1 -1
- package/dist/src/lib/transaction/transaction.d.ts +16 -1
- package/dist/src/lib/transaction/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction/transaction.js +272 -19
- package/dist/src/lib/transactionBuilderFactory.d.ts +22 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +78 -1
- package/dist/src/lib/transferAcknowledgeBuilder.d.ts +4 -4
- package/dist/src/lib/transferAcknowledgeBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferAcknowledgeBuilder.js +5 -7
- package/dist/src/lib/transferBuilder.d.ts +84 -2
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +164 -2
- package/dist/src/lib/transferOfferWithdrawnBuilder.d.ts +67 -0
- package/dist/src/lib/transferOfferWithdrawnBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferOfferWithdrawnBuilder.js +130 -0
- package/dist/src/lib/transferPreapprovalCancelBuilder.d.ts +68 -0
- package/dist/src/lib/transferPreapprovalCancelBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferPreapprovalCancelBuilder.js +124 -0
- package/dist/src/lib/utils.d.ts +45 -3
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +843 -66
- package/dist/src/lib/walletInitBuilder.d.ts +2 -1
- package/dist/src/lib/walletInitBuilder.d.ts.map +1 -1
- package/dist/src/lib/walletInitBuilder.js +4 -1
- package/dist/src/register.d.ts +2 -0
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +19 -2
- package/dist/test/integration/canton.integration.js +120 -3
- package/dist/test/integration/canton.token.integration.d.ts +2 -0
- package/dist/test/integration/canton.token.integration.d.ts.map +1 -0
- package/dist/test/integration/canton.token.integration.js +51 -0
- package/dist/test/resources.d.ts +271 -1
- package/dist/test/resources.d.ts.map +1 -1
- package/dist/test/resources.js +277 -6
- package/dist/test/unit/builder/allocationAllocate/allocationAllocateBuilder.d.ts +2 -0
- package/dist/test/unit/builder/allocationAllocate/allocationAllocateBuilder.d.ts.map +1 -0
- package/dist/test/unit/builder/allocationAllocate/allocationAllocateBuilder.js +368 -0
- package/dist/test/unit/builder/allocationAllocateWithdrawn/allocationAllocateWithdrawnBuilder.d.ts +2 -0
- package/dist/test/unit/builder/allocationAllocateWithdrawn/allocationAllocateWithdrawnBuilder.d.ts.map +1 -0
- package/dist/test/unit/builder/allocationAllocateWithdrawn/allocationAllocateWithdrawnBuilder.js +133 -0
- package/dist/test/unit/builder/allocationReject/allocationRejectBuilder.d.ts +2 -0
- package/dist/test/unit/builder/allocationReject/allocationRejectBuilder.d.ts.map +1 -0
- package/dist/test/unit/builder/allocationReject/allocationRejectBuilder.js +121 -0
- package/dist/test/unit/builder/allocationRequest/allocationRequestBuilder.d.ts +2 -0
- package/dist/test/unit/builder/allocationRequest/allocationRequestBuilder.d.ts.map +1 -0
- package/dist/test/unit/builder/allocationRequest/allocationRequestBuilder.js +437 -0
- package/dist/test/unit/builder/cantonCommand/cantonCommandBuilder.d.ts +2 -0
- package/dist/test/unit/builder/cantonCommand/cantonCommandBuilder.d.ts.map +1 -0
- package/dist/test/unit/builder/cantonCommand/cantonCommandBuilder.js +340 -0
- package/dist/test/unit/builder/cosignDelegationAccept/cosignDelegationAcceptBuilder.d.ts +2 -0
- package/dist/test/unit/builder/cosignDelegationAccept/cosignDelegationAcceptBuilder.d.ts.map +1 -0
- package/dist/test/unit/builder/cosignDelegationAccept/cosignDelegationAcceptBuilder.js +116 -0
- package/dist/test/unit/builder/cosignDelegationProposal/cosignDelegationProposalBuilder.d.ts +2 -0
- package/dist/test/unit/builder/cosignDelegationProposal/cosignDelegationProposalBuilder.d.ts.map +1 -0
- package/dist/test/unit/builder/cosignDelegationProposal/cosignDelegationProposalBuilder.js +74 -0
- package/dist/test/unit/builder/endInvestorOnboardingOffer/endInvestorOnboardingOfferBuilder.d.ts +2 -0
- package/dist/test/unit/builder/endInvestorOnboardingOffer/endInvestorOnboardingOfferBuilder.d.ts.map +1 -0
- package/dist/test/unit/builder/endInvestorOnboardingOffer/endInvestorOnboardingOfferBuilder.js +116 -0
- package/dist/test/unit/builder/oneStepEnablement/oneStepEnablementBuilder.js +20 -1
- package/dist/test/unit/builder/transfer/transferBuilder.d.ts +2 -0
- package/dist/test/unit/builder/transfer/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/builder/transfer/transferBuilder.js +100 -0
- package/dist/test/unit/builder/transferAccept/transferAcceptBuilder.js +64 -1
- package/dist/test/unit/builder/transferAcknowledge/transferAcknowledgeBuilder.js +34 -1
- package/dist/test/unit/builder/transferOfferWithdrawn/transferOfferWithdrawnBuilder.d.ts +2 -0
- package/dist/test/unit/builder/transferOfferWithdrawn/transferOfferWithdrawnBuilder.d.ts.map +1 -0
- package/dist/test/unit/builder/transferOfferWithdrawn/transferOfferWithdrawnBuilder.js +64 -0
- package/dist/test/unit/builder/transferPreapprovalCancel/transferPreapprovalCancelBuilder.d.ts +2 -0
- package/dist/test/unit/builder/transferPreapprovalCancel/transferPreapprovalCancelBuilder.d.ts.map +1 -0
- package/dist/test/unit/builder/transferPreapprovalCancel/transferPreapprovalCancelBuilder.js +74 -0
- package/dist/test/unit/builder/transferReject/transferRejectBuilder.js +40 -1
- package/dist/test/unit/canton.d.ts +2 -0
- package/dist/test/unit/canton.d.ts.map +1 -0
- package/dist/test/unit/canton.js +853 -0
- package/dist/test/unit/index.d.ts +5 -0
- package/dist/test/unit/index.d.ts.map +1 -1
- package/dist/test/unit/index.js +6 -1
- package/dist/test/unit/messages/cantonSignTopologyMessage.d.ts +2 -0
- package/dist/test/unit/messages/cantonSignTopologyMessage.d.ts.map +1 -0
- package/dist/test/unit/messages/cantonSignTopologyMessage.js +46 -0
- package/dist/test/unit/messages/cantonSignTransactionMessage.d.ts +2 -0
- package/dist/test/unit/messages/cantonSignTransactionMessage.d.ts.map +1 -0
- package/dist/test/unit/messages/cantonSignTransactionMessage.js +48 -0
- package/dist/test/unit/messages/clearSigning.d.ts +2 -0
- package/dist/test/unit/messages/clearSigning.d.ts.map +1 -0
- package/dist/test/unit/messages/clearSigning.js +72 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/messages/messageBuilderFactory.js +52 -0
- package/dist/test/unit/register.d.ts +2 -0
- package/dist/test/unit/register.d.ts.map +1 -0
- package/dist/test/unit/register.js +65 -0
- package/dist/test/unit/utils.js +400 -9
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
package/dist/src/canton.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AuditDecryptedKeyParams, BaseCoin, BitGoBase, KeyPair, MPCAlgorithm, MultisigType, ParsedTransaction, ParseTransactionOptions,
|
|
1
|
+
import { AuditDecryptedKeyParams, BaseCoin, BitGoBase, CantonCommandParams, KeyPair, MPCAlgorithm, MultisigType, ParsedTransaction, ParseTransactionOptions, PopulatedIntent, PrebuildTransactionWithIntentOptions, SignedTransaction, SignTransactionOptions, TokenEnablementConfig, TransactionExplanation as BaseTransactionExplanation, TransactionParams, TransactionType, TssVerifyAddressOptions, VerifyTransactionOptions } from '@bitgo-beta/sdk-core';
|
|
2
2
|
import { BaseCoin as StaticsBaseCoin } from '@bitgo-beta/statics';
|
|
3
3
|
export interface TransactionExplanation extends BaseTransactionExplanation {
|
|
4
4
|
type: TransactionType;
|
|
@@ -6,6 +6,9 @@ export interface TransactionExplanation extends BaseTransactionExplanation {
|
|
|
6
6
|
export interface ExplainTransactionOptions {
|
|
7
7
|
txHex: string;
|
|
8
8
|
}
|
|
9
|
+
export interface CantonTransactionParams extends TransactionParams {
|
|
10
|
+
cantonCommandParams?: CantonCommandParams;
|
|
11
|
+
}
|
|
9
12
|
export declare class Canton extends BaseCoin {
|
|
10
13
|
protected readonly _staticsCoin: Readonly<StaticsBaseCoin>;
|
|
11
14
|
protected constructor(bitgo: BitGoBase, staticsCoin?: Readonly<StaticsBaseCoin>);
|
|
@@ -21,6 +24,8 @@ export declare class Canton extends BaseCoin {
|
|
|
21
24
|
getFullName(): string;
|
|
22
25
|
/** @inheritDoc */
|
|
23
26
|
supportsTss(): boolean;
|
|
27
|
+
/** @inheritDoc */
|
|
28
|
+
supportsMessageSigning(): boolean;
|
|
24
29
|
/** inherited doc */
|
|
25
30
|
getDefaultMultisigType(): MultisigType;
|
|
26
31
|
/** inherited doc */
|
|
@@ -28,6 +33,8 @@ export declare class Canton extends BaseCoin {
|
|
|
28
33
|
getMPCAlgorithm(): MPCAlgorithm;
|
|
29
34
|
/** @inheritDoc */
|
|
30
35
|
verifyTransaction(params: VerifyTransactionOptions): Promise<boolean>;
|
|
36
|
+
private verifyCantonCommandTransaction;
|
|
37
|
+
private relativeSkipPaths;
|
|
31
38
|
/** @inheritDoc */
|
|
32
39
|
isWalletAddress(params: TssVerifyAddressOptions): Promise<boolean>;
|
|
33
40
|
/** @inheritDoc */
|
|
@@ -41,8 +48,13 @@ export declare class Canton extends BaseCoin {
|
|
|
41
48
|
/** @inheritDoc */
|
|
42
49
|
isValidAddress(address: string): boolean;
|
|
43
50
|
/** @inheritDoc */
|
|
51
|
+
getTokenEnablementConfig(): TokenEnablementConfig;
|
|
52
|
+
getAddressFromPublicKey(publicKeyHex: string): string;
|
|
53
|
+
/** @inheritDoc */
|
|
44
54
|
signTransaction(params: SignTransactionOptions): Promise<SignedTransaction>;
|
|
45
55
|
/** @inheritDoc */
|
|
46
56
|
auditDecryptedKey({ multiSigType, prv, publicKey }: AuditDecryptedKeyParams): void;
|
|
57
|
+
/** @inheritDoc */
|
|
58
|
+
setCoinSpecificFieldsInIntent(intent: PopulatedIntent, params: PrebuildTransactionWithIntentOptions): void;
|
|
47
59
|
}
|
|
48
60
|
//# sourceMappingURL=canton.d.ts.map
|
package/dist/src/canton.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canton.d.ts","sourceRoot":"","sources":["../../src/canton.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,QAAQ,
|
|
1
|
+
{"version":3,"file":"canton.d.ts","sourceRoot":"","sources":["../../src/canton.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,QAAQ,EAER,SAAS,EAET,mBAAmB,EAMnB,OAAO,EACP,YAAY,EACZ,YAAY,EAEZ,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,oCAAoC,EACpC,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,IAAI,0BAA0B,EACpD,iBAAiB,EACjB,eAAe,EACf,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAS,MAAM,qBAAqB,CAAC;AAOzE,MAAM,WAAW,sBAAuB,SAAQ,0BAA0B;IACxE,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAED,qBAAa,MAAO,SAAQ,QAAQ;IAClC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAE3D,SAAS,aAAa,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAU/E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ;IAI1F,OAAO,CAAC,UAAU;IAIlB,kBAAkB;IACX,aAAa,IAAI,MAAM;IAI9B,kBAAkB;IACX,QAAQ,IAAI,MAAM;IAIzB,kBAAkB;IACX,SAAS,IAAI,MAAM;IAI1B,kBAAkB;IACX,WAAW,IAAI,MAAM;IAI5B,kBAAkB;IAClB,WAAW,IAAI,OAAO;IAItB,kBAAkB;IAClB,sBAAsB,IAAI,OAAO;IAIjC,oBAAoB;IACpB,sBAAsB,IAAI,YAAY;IAItC,oBAAoB;IACpB,uCAAuC,IAAI,OAAO;IAIlD,eAAe,IAAI,YAAY;IAI/B,kBAAkB;IACZ,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC;IA6H3E,OAAO,CAAC,8BAA8B;IAoItC,OAAO,CAAC,iBAAiB;IAWzB,kBAAkB;IACZ,eAAe,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBxE,kBAAkB;IACZ,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAcnF,kBAAkB;IAClB,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAYvC,kBAAkB;IAClB,kBAAkB,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAatF,kBAAkB;IAClB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIhC,kBAAkB;IAClB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMxC,kBAAkB;IAClB,wBAAwB,IAAI,qBAAqB;IAOjD,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAKrD,kBAAkB;IAClB,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI3E,kBAAkB;IAClB,iBAAiB,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,uBAAuB,GAAG,IAAI;IAOlF,kBAAkB;IAClB,6BAA6B,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,oCAAoC,GAAG,IAAI;CAsC3G"}
|
package/dist/src/canton.js
CHANGED
|
@@ -44,6 +44,10 @@ class Canton extends sdk_core_1.BaseCoin {
|
|
|
44
44
|
supportsTss() {
|
|
45
45
|
return true;
|
|
46
46
|
}
|
|
47
|
+
/** @inheritDoc */
|
|
48
|
+
supportsMessageSigning() {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
47
51
|
/** inherited doc */
|
|
48
52
|
getDefaultMultisigType() {
|
|
49
53
|
return sdk_core_1.multisigTypes.tss;
|
|
@@ -58,31 +62,243 @@ class Canton extends sdk_core_1.BaseCoin {
|
|
|
58
62
|
/** @inheritDoc */
|
|
59
63
|
async verifyTransaction(params) {
|
|
60
64
|
const coinConfig = statics_1.coins.get(this.getChain());
|
|
61
|
-
|
|
62
|
-
const { txPrebuild: txPrebuild } = params;
|
|
65
|
+
const { txPrebuild: txPrebuild, txParams } = params;
|
|
63
66
|
const rawTx = txPrebuild.txHex;
|
|
64
67
|
if (!rawTx) {
|
|
65
68
|
throw new Error('missing required tx prebuild property txHex');
|
|
66
69
|
}
|
|
67
70
|
const txBuilder = new lib_1.TransactionBuilderFactory(coinConfig).from(rawTx);
|
|
68
71
|
const transaction = txBuilder.transaction;
|
|
72
|
+
const explainedTx = transaction.explainTransaction();
|
|
69
73
|
switch (transaction.type) {
|
|
70
|
-
case sdk_core_1.TransactionType.WalletInitialization:
|
|
71
|
-
|
|
74
|
+
case sdk_core_1.TransactionType.WalletInitialization:
|
|
75
|
+
case sdk_core_1.TransactionType.TransferAccept:
|
|
76
|
+
case sdk_core_1.TransactionType.TransferReject:
|
|
77
|
+
case sdk_core_1.TransactionType.TransferAcknowledge:
|
|
78
|
+
case sdk_core_1.TransactionType.TransferOfferWithdrawn:
|
|
79
|
+
case sdk_core_1.TransactionType.CosignDelegationAccept:
|
|
80
|
+
case sdk_core_1.TransactionType.CosignDelegationProposal:
|
|
81
|
+
case sdk_core_1.TransactionType.AllocationAllocate:
|
|
82
|
+
case sdk_core_1.TransactionType.AllocationRequest:
|
|
83
|
+
case sdk_core_1.TransactionType.AllocationReject:
|
|
84
|
+
case sdk_core_1.TransactionType.EndInvestorOnboardingOffer:
|
|
85
|
+
case sdk_core_1.TransactionType.AllocationAllocateWithdrawn:
|
|
86
|
+
// There is no recipient info to verify for these transaction types, so always return true.
|
|
87
|
+
return true;
|
|
88
|
+
case sdk_core_1.TransactionType.CantonCommand:
|
|
89
|
+
return this.verifyCantonCommandTransaction(transaction, txParams.cantonCommandParams);
|
|
90
|
+
case sdk_core_1.TransactionType.OneStepPreApproval:
|
|
91
|
+
// Canton is always a TSS wallet. The SDK's buildTokenEnablements passes enableTokens
|
|
92
|
+
// through unchanged for TSS wallets (no conversion to recipients), so txParams.enableTokens
|
|
93
|
+
// is the only source of user intent here.
|
|
94
|
+
//
|
|
95
|
+
// Receiver validation: the receiver of a OneStepPreApproval is always the wallet's root address.
|
|
96
|
+
// We use enableToken.address if explicitly provided, otherwise fall back to
|
|
97
|
+
// wallet.coinSpecific().rootAddress (the Canton party ID stored at wallet creation time).
|
|
98
|
+
// Token name validation: checked when the token is resolvable from statics.
|
|
99
|
+
if (txParams.type === 'enabletoken' &&
|
|
100
|
+
txParams.enableTokens !== undefined &&
|
|
101
|
+
txParams.enableTokens.length > 0) {
|
|
102
|
+
const txData = transaction.toJson();
|
|
103
|
+
const enableToken = txParams.enableTokens[0];
|
|
104
|
+
const walletRootAddress = params.wallet?.coinSpecific?.()?.rootAddress;
|
|
105
|
+
const expectedReceiver = enableToken.address ?? walletRootAddress;
|
|
106
|
+
if (expectedReceiver) {
|
|
107
|
+
// Strip ?memoId suffix if present in the stored address
|
|
108
|
+
const [expectedReceiverBase] = expectedReceiver.split('?memoId=');
|
|
109
|
+
if (txData.receiver !== expectedReceiverBase) {
|
|
110
|
+
throw new Error(`OneStepPreApproval receiver mismatch: expected '${expectedReceiverBase}', got '${txData.receiver}'`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (txData.token !== undefined && txData.token !== enableToken.name) {
|
|
114
|
+
throw new Error(`OneStepPreApproval token name mismatch: expected '${enableToken.name}', got '${txData.token}'`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return true;
|
|
118
|
+
case sdk_core_1.TransactionType.TransferPreapprovalCancel:
|
|
119
|
+
// Mirrors OneStepPreApproval's receiver/token validation above, opposite direction.
|
|
120
|
+
// The cancel is self-service (the wallet's own party exercises the choice on its own
|
|
121
|
+
// TransferPreapproval), so sender === receiver on the parsed transaction; both must match
|
|
122
|
+
// the wallet's rootAddress (or the explicit enableToken.address, if provided).
|
|
123
|
+
if (txParams.type === 'disabletoken' &&
|
|
124
|
+
txParams.enableTokens !== undefined &&
|
|
125
|
+
txParams.enableTokens.length > 0) {
|
|
126
|
+
const txData = transaction.toJson();
|
|
127
|
+
const disableToken = txParams.enableTokens[0];
|
|
128
|
+
const walletRootAddress = params.wallet?.coinSpecific?.()?.rootAddress;
|
|
129
|
+
const expectedParty = disableToken.address ?? walletRootAddress;
|
|
130
|
+
if (expectedParty) {
|
|
131
|
+
const [expectedPartyBase] = expectedParty.split('?memoId=');
|
|
132
|
+
if (txData.receiver !== expectedPartyBase) {
|
|
133
|
+
throw new Error(`TransferPreapprovalCancel receiver mismatch: expected '${expectedPartyBase}', got '${txData.receiver}'`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (txData.token !== undefined && txData.token !== disableToken.name) {
|
|
137
|
+
throw new Error(`TransferPreapprovalCancel token name mismatch: expected '${disableToken.name}', got '${txData.token}'`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return true;
|
|
141
|
+
case sdk_core_1.TransactionType.Send:
|
|
142
|
+
if (txParams.recipients !== undefined) {
|
|
143
|
+
const filteredRecipients = txParams.recipients?.map((recipient) => {
|
|
144
|
+
const { address, amount, tokenName } = recipient;
|
|
145
|
+
const [addressPart, memoId] = address.split('?memoId=');
|
|
146
|
+
return {
|
|
147
|
+
address: addressPart,
|
|
148
|
+
amount,
|
|
149
|
+
...(memoId && { memo: memoId }),
|
|
150
|
+
...(tokenName && { tokenName }),
|
|
151
|
+
};
|
|
152
|
+
});
|
|
153
|
+
const filteredOutputs = explainedTx.outputs?.map((output) => {
|
|
154
|
+
const { address, amount, tokenName, memo } = output;
|
|
155
|
+
return {
|
|
156
|
+
address,
|
|
157
|
+
amount,
|
|
158
|
+
...(memo && { memo }),
|
|
159
|
+
...(tokenName && { tokenName }),
|
|
160
|
+
};
|
|
161
|
+
});
|
|
162
|
+
if (JSON.stringify(filteredRecipients) !== JSON.stringify(filteredOutputs)) {
|
|
163
|
+
throw new Error('Tx outputs do not match with expected txParams recipients');
|
|
164
|
+
}
|
|
165
|
+
}
|
|
72
166
|
return true;
|
|
73
|
-
}
|
|
74
167
|
default: {
|
|
75
168
|
throw new Error(`unknown transaction type, ${transaction.type}`);
|
|
76
169
|
}
|
|
77
170
|
}
|
|
78
171
|
}
|
|
172
|
+
verifyCantonCommandTransaction(transaction, userParams) {
|
|
173
|
+
if (!userParams) {
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
const cantonTx = transaction;
|
|
177
|
+
const rawPrepared = cantonTx.prepareCommand?.preparedTransaction;
|
|
178
|
+
if (!rawPrepared) {
|
|
179
|
+
throw new Error('CantonCommand verifyTransaction: missing preparedTransaction protobuf on tx prebuild');
|
|
180
|
+
}
|
|
181
|
+
const decodedCommand = utils_1.default.extractCantonCommandInfo(rawPrepared);
|
|
182
|
+
const userCommand = userParams.command;
|
|
183
|
+
// Input shape is enforced by mpcUtils at build time; here we resolve which branch is present.
|
|
184
|
+
const hasCreate = 'CreateCommand' in userCommand && utils_1.default.isPlainObject(userCommand.CreateCommand);
|
|
185
|
+
const hasExercise = 'ExerciseCommand' in userCommand && utils_1.default.isPlainObject(userCommand.ExerciseCommand);
|
|
186
|
+
if (!hasCreate && !hasExercise) {
|
|
187
|
+
throw new Error(`CantonCommand verifyTransaction: command must contain a CreateCommand or ExerciseCommand wrapper`);
|
|
188
|
+
}
|
|
189
|
+
if (hasCreate && hasExercise) {
|
|
190
|
+
throw new Error(`CantonCommand verifyTransaction: command must contain exactly one of CreateCommand or ExerciseCommand, not both`);
|
|
191
|
+
}
|
|
192
|
+
const userKind = hasCreate ? 'CreateCommand' : 'ExerciseCommand';
|
|
193
|
+
if (decodedCommand.kind !== userKind) {
|
|
194
|
+
throw new Error(`CantonCommand verifyTransaction: command kind mismatch — expected ${userKind}, got ${decodedCommand.kind}`);
|
|
195
|
+
}
|
|
196
|
+
const userInner = userKind === 'CreateCommand'
|
|
197
|
+
? userCommand.CreateCommand
|
|
198
|
+
: userCommand.ExerciseCommand;
|
|
199
|
+
if (!userInner?.templateId) {
|
|
200
|
+
throw new Error(`CantonCommand verifyTransaction: ${userKind}.templateId must be a non-empty string`);
|
|
201
|
+
}
|
|
202
|
+
// templateId (moduleName + entityName; package id is mutable, so ignored)
|
|
203
|
+
const parsed = utils_1.default.parseCantonTemplateId(userInner.templateId);
|
|
204
|
+
if (!parsed) {
|
|
205
|
+
throw new Error(`CantonCommand verifyTransaction: invalid user templateId '${userInner.templateId}' — expected format 'Pkg:Module:Entity'`);
|
|
206
|
+
}
|
|
207
|
+
if (decodedCommand.templateId.moduleName !== parsed.moduleName ||
|
|
208
|
+
decodedCommand.templateId.entityName !== parsed.entityName) {
|
|
209
|
+
throw new Error(`CantonCommand verifyTransaction: templateId mismatch — expected '${parsed.moduleName}:${parsed.entityName}', got '${decodedCommand.templateId.moduleName}:${decodedCommand.templateId.entityName}'`);
|
|
210
|
+
}
|
|
211
|
+
// Build the inject-as skip set once for use across the contractId and argument checks
|
|
212
|
+
const skipPaths = utils_1.default.normalizeInjectAs(userParams.resolveContracts);
|
|
213
|
+
// metadata.submitterInfo.actAs must contain exactly the same parties as the user's actAs
|
|
214
|
+
if (!Array.isArray(userParams.actAs) || userParams.actAs.length === 0) {
|
|
215
|
+
throw new Error(`CantonCommand verifyTransaction: actAs must be a non-empty array of party IDs`);
|
|
216
|
+
}
|
|
217
|
+
if (!userParams.actAs.every((p) => typeof p === 'string' && p.trim() !== '')) {
|
|
218
|
+
throw new Error(`CantonCommand verifyTransaction: all actAs entries must be non-empty strings`);
|
|
219
|
+
}
|
|
220
|
+
const submitterActAs = cantonTx.cantonCommandActAsParties ?? [];
|
|
221
|
+
if (!utils_1.default.sameElements(submitterActAs, userParams.actAs)) {
|
|
222
|
+
throw new Error(`CantonCommand verifyTransaction: submitterInfo.actAs [${submitterActAs.join(', ')}] does not match user actAs [${userParams.actAs.join(', ')}]`);
|
|
223
|
+
}
|
|
224
|
+
if (userKind === 'ExerciseCommand') {
|
|
225
|
+
const exerciseInner = userInner;
|
|
226
|
+
// choice id
|
|
227
|
+
if (decodedCommand.choice !== exerciseInner.choice) {
|
|
228
|
+
throw new Error(`CantonCommand verifyTransaction: choice mismatch — expected '${exerciseInner.choice}', got '${decodedCommand.choice ?? ''}'`);
|
|
229
|
+
}
|
|
230
|
+
// every on-chain actingParty must be in the user's actAs (prevents privilege escalation)
|
|
231
|
+
const onChainActors = decodedCommand.actingParties ?? [];
|
|
232
|
+
for (const actor of onChainActors) {
|
|
233
|
+
if (!userParams.actAs.includes(actor)) {
|
|
234
|
+
throw new Error(`CantonCommand verifyTransaction: unauthorized acting party '${actor}' on root exercise (not in user actAs)`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// contractId — skip when absent/empty or when IMS will inject it via resolveContracts
|
|
238
|
+
if (exerciseInner.contractId !== undefined &&
|
|
239
|
+
exerciseInner.contractId !== '' &&
|
|
240
|
+
!skipPaths.has('ExerciseCommand.contractId')) {
|
|
241
|
+
if (decodedCommand.contractId !== exerciseInner.contractId) {
|
|
242
|
+
throw new Error(`CantonCommand verifyTransaction: contractId mismatch — expected '${exerciseInner.contractId}', got '${decodedCommand.contractId ?? ''}'`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// deep argument compare
|
|
246
|
+
const argumentSkipPaths = this.relativeSkipPaths(skipPaths, 'ExerciseCommand.choiceArgument.');
|
|
247
|
+
utils_1.default.assertDeepCantonMatch(exerciseInner.choiceArgument, decodedCommand.argument, argumentSkipPaths);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
const createInner = userInner;
|
|
251
|
+
// deep argument compare
|
|
252
|
+
const argumentSkipPaths = this.relativeSkipPaths(skipPaths, 'CreateCommand.createArguments.');
|
|
253
|
+
utils_1.default.assertDeepCantonMatch(createInner.createArguments, decodedCommand.argument, argumentSkipPaths);
|
|
254
|
+
}
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
relativeSkipPaths(skipPaths, prefix) {
|
|
258
|
+
const out = new Set();
|
|
259
|
+
for (const p of skipPaths) {
|
|
260
|
+
if (p.startsWith(prefix)) {
|
|
261
|
+
const stripped = p.slice(prefix.length);
|
|
262
|
+
if (stripped)
|
|
263
|
+
out.add(stripped);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return out;
|
|
267
|
+
}
|
|
79
268
|
/** @inheritDoc */
|
|
80
|
-
isWalletAddress(params) {
|
|
81
|
-
|
|
269
|
+
async isWalletAddress(params) {
|
|
270
|
+
// TODO: refactor this and use the `verifyEddsaMemoBasedWalletAddress` once published from sdk-core
|
|
271
|
+
// https://bitgoinc.atlassian.net/browse/COIN-6347
|
|
272
|
+
const { keychains, address: newAddress, index } = params;
|
|
273
|
+
const [addressPart, memoId] = newAddress.split('?memoId=');
|
|
274
|
+
if (!this.isValidAddress(addressPart)) {
|
|
275
|
+
throw new sdk_core_1.InvalidAddressError(`invalid address: ${newAddress}`);
|
|
276
|
+
}
|
|
277
|
+
if (memoId && memoId !== `${index}`) {
|
|
278
|
+
throw new sdk_core_1.InvalidAddressError(`invalid memoId index: ${memoId}`);
|
|
279
|
+
}
|
|
280
|
+
const commonKeychain = (0, sdk_core_1.extractCommonKeychain)(keychains);
|
|
281
|
+
const MPC = await sdk_core_1.EDDSAMethods.getInitializedMpcInstance();
|
|
282
|
+
const derivationPath = 'm/0';
|
|
283
|
+
const derivedPublicKey = MPC.deriveUnhardened(commonKeychain, derivationPath).slice(0, 64);
|
|
284
|
+
const publicKeyBase64 = Buffer.from(derivedPublicKey, 'hex').toString('base64');
|
|
285
|
+
const rootAddressFingerprint = utils_1.default.getAddressFromPublicKey(publicKeyBase64);
|
|
286
|
+
const rootAddress = `${rootAddressFingerprint.slice(0, 5)}::${rootAddressFingerprint}`;
|
|
287
|
+
return addressPart === rootAddress;
|
|
82
288
|
}
|
|
83
289
|
/** @inheritDoc */
|
|
84
|
-
parseTransaction(params) {
|
|
85
|
-
|
|
290
|
+
async parseTransaction(params) {
|
|
291
|
+
const txHex = params.txHex;
|
|
292
|
+
if (!txHex) {
|
|
293
|
+
// Message-only signing requests (e.g. CANTON_SIGN_TRANSACTION, CANTON_SIGN_TOPOLOGY)
|
|
294
|
+
// have no transaction hex to parse — return an empty result.
|
|
295
|
+
return {};
|
|
296
|
+
}
|
|
297
|
+
const transactionExplanation = await this.explainTransaction({ txHex });
|
|
298
|
+
if (!transactionExplanation) {
|
|
299
|
+
throw new Error('Invalid transaction');
|
|
300
|
+
}
|
|
301
|
+
return transactionExplanation;
|
|
86
302
|
}
|
|
87
303
|
/** @inheritDoc */
|
|
88
304
|
generateKeyPair(seed) {
|
|
@@ -121,6 +337,17 @@ class Canton extends sdk_core_1.BaseCoin {
|
|
|
121
337
|
return utils_1.default.isValidAddress(address);
|
|
122
338
|
}
|
|
123
339
|
/** @inheritDoc */
|
|
340
|
+
getTokenEnablementConfig() {
|
|
341
|
+
return {
|
|
342
|
+
requiresTokenEnablement: true,
|
|
343
|
+
supportsMultipleTokenEnablements: false,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
getAddressFromPublicKey(publicKeyHex) {
|
|
347
|
+
const publicKeyBase64 = Buffer.from(publicKeyHex, 'hex').toString('base64');
|
|
348
|
+
return utils_1.default.getAddressFromPublicKey(publicKeyBase64);
|
|
349
|
+
}
|
|
350
|
+
/** @inheritDoc */
|
|
124
351
|
signTransaction(params) {
|
|
125
352
|
throw new Error('Method not implemented.');
|
|
126
353
|
}
|
|
@@ -131,6 +358,45 @@ class Canton extends sdk_core_1.BaseCoin {
|
|
|
131
358
|
}
|
|
132
359
|
(0, sdk_lib_mpc_1.auditEddsaPrivateKey)(prv, publicKey ?? '');
|
|
133
360
|
}
|
|
361
|
+
/** @inheritDoc */
|
|
362
|
+
setCoinSpecificFieldsInIntent(intent, params) {
|
|
363
|
+
if (params.txRequestId) {
|
|
364
|
+
intent.txRequestId = params.txRequestId;
|
|
365
|
+
}
|
|
366
|
+
if (params.transferOfferId) {
|
|
367
|
+
intent.transferOfferId = params.transferOfferId;
|
|
368
|
+
}
|
|
369
|
+
if (params.unspents) {
|
|
370
|
+
intent.unspents = params.unspents;
|
|
371
|
+
}
|
|
372
|
+
if (params.cantonCommandParams) {
|
|
373
|
+
intent.cantonCommandParams = params.cantonCommandParams;
|
|
374
|
+
}
|
|
375
|
+
if (params.endInvestorPartyId) {
|
|
376
|
+
intent.endInvestorPartyId = params.endInvestorPartyId;
|
|
377
|
+
}
|
|
378
|
+
if (params.reason) {
|
|
379
|
+
intent.reason = params.reason;
|
|
380
|
+
}
|
|
381
|
+
if (params.operator) {
|
|
382
|
+
intent.operator = params.operator;
|
|
383
|
+
}
|
|
384
|
+
if (params.provider) {
|
|
385
|
+
intent.provider = params.provider;
|
|
386
|
+
}
|
|
387
|
+
if (params.compliance) {
|
|
388
|
+
intent.compliance = params.compliance;
|
|
389
|
+
}
|
|
390
|
+
if (params.registrar) {
|
|
391
|
+
intent.registrar = params.registrar;
|
|
392
|
+
}
|
|
393
|
+
if (params.clientOnboarder) {
|
|
394
|
+
intent.clientOnboarder = params.clientOnboarder;
|
|
395
|
+
}
|
|
396
|
+
if (params.expirationIso) {
|
|
397
|
+
intent.expirationIso = params.expirationIso;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
134
400
|
}
|
|
135
401
|
exports.Canton = Canton;
|
|
136
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NhbnRvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFpQjhCO0FBQzlCLHlEQUErRDtBQUMvRCxpREFBeUU7QUFDekUsK0JBQWtEO0FBQ2xELDJDQUF5RDtBQUN6RCx3REFBZ0M7QUFVaEMsTUFBYSxNQUFPLFNBQVEsbUJBQVE7SUFHbEMsWUFBc0IsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFYixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFnQixFQUFFLFdBQXVDO1FBQzdFLE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTyxVQUFVO1FBQ2hCLE9BQU8sSUFBSSwrQkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELGtCQUFrQjtJQUNYLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCO0lBQ1gsUUFBUTtRQUNiLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxrQkFBa0I7SUFDWCxTQUFTO1FBQ2QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELGtCQUFrQjtJQUNYLFdBQVc7UUFDaEIsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLHNC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LE9BQU8sZUFBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsY0FBYyxDQUFDLE9BQWU7UUFDNUIsMkRBQTJEO1FBQzNELHVFQUF1RTtRQUN2RSxPQUFPLGVBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixlQUFlLENBQUMsTUFBOEI7UUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsaUJBQWlCLENBQUMsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBMkI7UUFDekUsSUFBSSxZQUFZLEtBQUssd0JBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELElBQUEsa0NBQW9CLEVBQUMsR0FBRyxFQUFFLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0Y7QUEvSUQsd0JBK0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMsXG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIEtleVBhaXIsXG4gIE1QQ0FsZ29yaXRobSxcbiAgTXVsdGlzaWdUeXBlLFxuICBtdWx0aXNpZ1R5cGVzLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvblR5cGUsXG4gIFRzc1ZlcmlmeUFkZHJlc3NPcHRpb25zLFxuICBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gYXMgQmFzZVRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIEJhc2VUcmFuc2FjdGlvbixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgYXVkaXRFZGRzYVByaXZhdGVLZXkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstbGliLW1wYyc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi9saWInO1xuaW1wb3J0IHsgS2V5UGFpciBhcyBDYW50b25LZXlQYWlyIH0gZnJvbSAnLi9saWIva2V5UGFpcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi9saWIvdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gIHR5cGU6IFRyYW5zYWN0aW9uVHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgdHhIZXg6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIENhbnRvbiBleHRlbmRzIEJhc2VDb2luIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9zdGF0aWNzQ29pbjogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KSB7XG4gICAgc3VwZXIoYml0Z28pO1xuXG4gICAgaWYgKCFzdGF0aWNzQ29pbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBzdGF0aWNzQ29pbicpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXRpY3NDb2luID0gc3RhdGljc0NvaW47XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KTogQmFzZUNvaW4ge1xuICAgIHJldHVybiBuZXcgQ2FudG9uKGJpdGdvLCBzdGF0aWNzQ29pbik7XG4gIH1cblxuICBwcml2YXRlIGdldEJ1aWxkZXIoKTogVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0QmFzZUZhY3RvcigpOiBudW1iZXIge1xuICAgIHJldHVybiAxZTEwO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnY2FudG9uJztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0RmFtaWx5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdjYW50b24nO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnQ2FudG9uJztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBzdXBwb3J0c1RzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBpbmhlcml0ZWQgZG9jICovXG4gIGdldERlZmF1bHRNdWx0aXNpZ1R5cGUoKTogTXVsdGlzaWdUeXBlIHtcbiAgICByZXR1cm4gbXVsdGlzaWdUeXBlcy50c3M7XG4gIH1cblxuICAvKiogaW5oZXJpdGVkIGRvYyAqL1xuICByZXF1aXJlc1dhbGxldEluaXRpYWxpemF0aW9uVHJhbnNhY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRNUENBbGdvcml0aG0oKTogTVBDQWxnb3JpdGhtIHtcbiAgICByZXR1cm4gJ2VkZHNhJztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvaW5Db25maWcgPSBjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKTtcbiAgICAvLyBleHRyYWN0IGB0eFBhcmFtc2Agd2hlbiB2ZXJpZnlpbmcgb3RoZXIgdHJhbnNhY3Rpb24gdHlwZXNcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQ6IHR4UHJlYnVpbGQgfSA9IHBhcmFtcztcbiAgICBjb25zdCByYXdUeCA9IHR4UHJlYnVpbGQudHhIZXg7XG4gICAgaWYgKCFyYXdUeCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHR4IHByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gICAgfVxuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5Db25maWcpLmZyb20ocmF3VHgpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdHhCdWlsZGVyLnRyYW5zYWN0aW9uO1xuICAgIHN3aXRjaCAodHJhbnNhY3Rpb24udHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb246IHtcbiAgICAgICAgLy8gdGhlcmUgaXMgbm8gaW5wdXQgZm9yIHRoaXMgdHlwZSBvZiB0cmFuc2FjdGlvbiwgc28gYWx3YXlzIHJldHVybiB0cnVlXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gdHJhbnNhY3Rpb24gdHlwZSwgJHt0cmFuc2FjdGlvbi50eXBlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBUc3NWZXJpZnlBZGRyZXNzT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGdlbmVyYXRlS2V5UGFpcihzZWVkPzogQnVmZmVyKTogS2V5UGFpciB7XG4gICAgY29uc3Qga2V5UGFpciA9IHNlZWQgPyBuZXcgQ2FudG9uS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgQ2FudG9uS2V5UGFpcigpO1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJ2IGluIGtleSBnZW5lcmF0aW9uLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcHViOiBrZXlzLnB1YixcbiAgICAgIHBydjoga2V5cy5wcnYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBleHBsYWluVHJhbnNhY3Rpb24ocGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxUcmFuc2FjdGlvbkV4cGxhbmF0aW9uPiB7XG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0QnVpbGRlcigpO1xuICAgIGxldCByZWJ1aWx0VHJhbnNhY3Rpb246IEJhc2VUcmFuc2FjdGlvbjtcbiAgICBjb25zdCB0eFJhdyA9IHBhcmFtcy50eEhleDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4UmF3KTtcbiAgICAgIHJlYnVpbHRUcmFuc2FjdGlvbiA9IHR4QnVpbGRlci50cmFuc2FjdGlvbjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlYnVpbHRUcmFuc2FjdGlvbi5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkocHViKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBjYW50b24gYWRkcmVzc2VzIGFyZSBvZiB0aGUgZm9ybSwgcGFydHlIaW50OjpmaW5nZXJwcmludFxuICAgIC8vIHdoZXJlIHBhcnR5SGludCBpcyBvZiBsZW5ndGggNSBhbmQgZmluZ2VycHJpbnQgaXMgNjggY2hhcmFjdGVycyBsb25nXG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHsgbXVsdGlTaWdUeXBlLCBwcnYsIHB1YmxpY0tleSB9OiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyk6IHZvaWQge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgIT09IG11bHRpc2lnVHlwZXMudHNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG11bHRpU2lnVHlwZScpO1xuICAgIH1cbiAgICBhdWRpdEVkZHNhUHJpdmF0ZUtleShwcnYsIHB1YmxpY0tleSA/PyAnJyk7XG4gIH1cbn1cbiJdfQ==
|
|
402
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NhbnRvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREE0QjhCO0FBQzlCLHlEQUErRDtBQUMvRCxpREFBeUU7QUFDekUsK0JBQWtEO0FBQ2xELDJDQUF5RDtBQUd6RCx3REFBZ0M7QUFjaEMsTUFBYSxNQUFPLFNBQVEsbUJBQVE7SUFHbEMsWUFBc0IsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFYixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFnQixFQUFFLFdBQXVDO1FBQzdFLE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTyxVQUFVO1FBQ2hCLE9BQU8sSUFBSSwrQkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELGtCQUFrQjtJQUNYLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCO0lBQ1gsUUFBUTtRQUNiLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxrQkFBa0I7SUFDWCxTQUFTO1FBQ2QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELGtCQUFrQjtJQUNYLFdBQVc7UUFDaEIsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLHNC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QUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQixNQUFNLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDcEMsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDckIsTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMzQixNQUFNLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7UUFDbEQsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBM2RELHdCQTJkQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxuICBCYXNlQ29pbixcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBCaXRHb0Jhc2UsXG4gIENhbnRvbkNvbW1hbmQsXG4gIENhbnRvbkNvbW1hbmRQYXJhbXMsXG4gIENhbnRvbkNyZWF0ZUNvbW1hbmQsXG4gIENhbnRvbkV4ZXJjaXNlQ29tbWFuZCxcbiAgRUREU0FNZXRob2RzLFxuICBleHRyYWN0Q29tbW9uS2V5Y2hhaW4sXG4gIEludmFsaWRBZGRyZXNzRXJyb3IsXG4gIEtleVBhaXIsXG4gIE1QQ0FsZ29yaXRobSxcbiAgTXVsdGlzaWdUeXBlLFxuICBtdWx0aXNpZ1R5cGVzLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFBvcHVsYXRlZEludGVudCxcbiAgUHJlYnVpbGRUcmFuc2FjdGlvbldpdGhJbnRlbnRPcHRpb25zLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgVG9rZW5FbmFibGVtZW50Q29uZmlnLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIGFzIEJhc2VUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBUcmFuc2FjdGlvblBhcmFtcyxcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBUc3NWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBhdWRpdEVkZHNhUHJpdmF0ZUtleSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiwgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuL2xpYic7XG5pbXBvcnQgeyBLZXlQYWlyIGFzIENhbnRvbktleVBhaXIgfSBmcm9tICcuL2xpYi9rZXlQYWlyJztcbmltcG9ydCB7IENhbnRvbkNvbW1hbmRLaW5kLCBUeERhdGEgfSBmcm9tICcuL2xpYi9pZmFjZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vbGliL3RyYW5zYWN0aW9uL3RyYW5zYWN0aW9uJztcbmltcG9ydCB1dGlscyBmcm9tICcuL2xpYi91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgdHlwZTogVHJhbnNhY3Rpb25UeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eEhleDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbnRvblRyYW5zYWN0aW9uUGFyYW1zIGV4dGVuZHMgVHJhbnNhY3Rpb25QYXJhbXMge1xuICBjYW50b25Db21tYW5kUGFyYW1zPzogQ2FudG9uQ29tbWFuZFBhcmFtcztcbn1cblxuZXhwb3J0IGNsYXNzIENhbnRvbiBleHRlbmRzIEJhc2VDb2luIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9zdGF0aWNzQ29pbjogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KSB7XG4gICAgc3VwZXIoYml0Z28pO1xuXG4gICAgaWYgKCFzdGF0aWNzQ29pbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBzdGF0aWNzQ29pbicpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXRpY3NDb2luID0gc3RhdGljc0NvaW47XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KTogQmFzZUNvaW4ge1xuICAgIHJldHVybiBuZXcgQ2FudG9uKGJpdGdvLCBzdGF0aWNzQ29pbik7XG4gIH1cblxuICBwcml2YXRlIGdldEJ1aWxkZXIoKTogVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0QmFzZUZhY3RvcigpOiBudW1iZXIge1xuICAgIHJldHVybiAxZTEwO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnY2FudG9uJztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwdWJsaWMgZ2V0RmFtaWx5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdjYW50b24nO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnQ2FudG9uJztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBzdXBwb3J0c1RzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBzdXBwb3J0c01lc3NhZ2VTaWduaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIGluaGVyaXRlZCBkb2MgKi9cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLnRzcztcbiAgfVxuXG4gIC8qKiBpbmhlcml0ZWQgZG9jICovXG4gIHJlcXVpcmVzV2FsbGV0SW5pdGlhbGl6YXRpb25UcmFuc2FjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiAnZWRkc2EnO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGFzeW5jIHZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtczogVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29pbkNvbmZpZyA9IGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpO1xuICAgIGNvbnN0IHsgdHhQcmVidWlsZDogdHhQcmVidWlsZCwgdHhQYXJhbXMgfSA9IHBhcmFtcztcbiAgICBjb25zdCByYXdUeCA9IHR4UHJlYnVpbGQudHhIZXg7XG4gICAgaWYgKCFyYXdUeCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHR4IHByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gICAgfVxuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5Db25maWcpLmZyb20ocmF3VHgpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdHhCdWlsZGVyLnRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IGV4cGxhaW5lZFR4ID0gdHJhbnNhY3Rpb24uZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgc3dpdGNoICh0cmFuc2FjdGlvbi50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbjpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyQWNjZXB0OlxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXJSZWplY3Q6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5UcmFuc2ZlckFja25vd2xlZGdlOlxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXJPZmZlcldpdGhkcmF3bjpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkNvc2lnbkRlbGVnYXRpb25BY2NlcHQ6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5Db3NpZ25EZWxlZ2F0aW9uUHJvcG9zYWw6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BbGxvY2F0aW9uQWxsb2NhdGU6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BbGxvY2F0aW9uUmVxdWVzdDpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFsbG9jYXRpb25SZWplY3Q6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5FbmRJbnZlc3Rvck9uYm9hcmRpbmdPZmZlcjpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3bjpcbiAgICAgICAgLy8gVGhlcmUgaXMgbm8gcmVjaXBpZW50IGluZm8gdG8gdmVyaWZ5IGZvciB0aGVzZSB0cmFuc2FjdGlvbiB0eXBlcywgc28gYWx3YXlzIHJldHVybiB0cnVlLlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkNhbnRvbkNvbW1hbmQ6XG4gICAgICAgIHJldHVybiB0aGlzLnZlcmlmeUNhbnRvbkNvbW1hbmRUcmFuc2FjdGlvbihcbiAgICAgICAgICB0cmFuc2FjdGlvbixcbiAgICAgICAgICAodHhQYXJhbXMgYXMgQ2FudG9uVHJhbnNhY3Rpb25QYXJhbXMpLmNhbnRvbkNvbW1hbmRQYXJhbXNcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLk9uZVN0ZXBQcmVBcHByb3ZhbDpcbiAgICAgICAgLy8gQ2FudG9uIGlzIGFsd2F5cyBhIFRTUyB3YWxsZXQuIFRoZSBTREsncyBidWlsZFRva2VuRW5hYmxlbWVudHMgcGFzc2VzIGVuYWJsZVRva2Vuc1xuICAgICAgICAvLyB0aHJvdWdoIHVuY2hhbmdlZCBmb3IgVFNTIHdhbGxldHMgKG5vIGNvbnZlcnNpb24gdG8gcmVjaXBpZW50cyksIHNvIHR4UGFyYW1zLmVuYWJsZVRva2Vuc1xuICAgICAgICAvLyBpcyB0aGUgb25seSBzb3VyY2Ugb2YgdXNlciBpbnRlbnQgaGVyZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gUmVjZWl2ZXIgdmFsaWRhdGlvbjogdGhlIHJlY2VpdmVyIG9mIGEgT25lU3RlcFByZUFwcHJvdmFsIGlzIGFsd2F5cyB0aGUgd2FsbGV0J3Mgcm9vdCBhZGRyZXNzLlxuICAgICAgICAvLyBXZSB1c2UgZW5hYmxlVG9rZW4uYWRkcmVzcyBpZiBleHBsaWNpdGx5IHByb3ZpZGVkLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvXG4gICAgICAgIC8vIHdhbGxldC5jb2luU3BlY2lmaWMoKS5yb290QWRkcmVzcyAodGhlIENhbnRvbiBwYXJ0eSBJRCBzdG9yZWQgYXQgd2FsbGV0IGNyZWF0aW9uIHRpbWUpLlxuICAgICAgICAvLyBUb2tlbiBuYW1lIHZhbGlkYXRpb246IGNoZWNrZWQgd2hlbiB0aGUgdG9rZW4gaXMgcmVzb2x2YWJsZSBmcm9tIHN0YXRpY3MuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eFBhcmFtcy50eXBlID09PSAnZW5hYmxldG9rZW4nICYmXG4gICAgICAgICAgdHhQYXJhbXMuZW5hYmxlVG9rZW5zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICB0eFBhcmFtcy5lbmFibGVUb2tlbnMubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCB0eERhdGEgPSB0cmFuc2FjdGlvbi50b0pzb24oKSBhcyBUeERhdGE7XG4gICAgICAgICAgY29uc3QgZW5hYmxlVG9rZW4gPSB0eFBhcmFtcy5lbmFibGVUb2tlbnNbMF07XG4gICAgICAgICAgY29uc3Qgd2FsbGV0Um9vdEFkZHJlc3MgPSBwYXJhbXMud2FsbGV0Py5jb2luU3BlY2lmaWM/LigpPy5yb290QWRkcmVzcztcbiAgICAgICAgICBjb25zdCBleHBlY3RlZFJlY2VpdmVyID0gZW5hYmxlVG9rZW4uYWRkcmVzcyA/PyB3YWxsZXRSb290QWRkcmVzcztcbiAgICAgICAgICBpZiAoZXhwZWN0ZWRSZWNlaXZlcikge1xuICAgICAgICAgICAgLy8gU3RyaXAgP21lbW9JZCBzdWZmaXggaWYgcHJlc2VudCBpbiB0aGUgc3RvcmVkIGFkZHJlc3NcbiAgICAgICAgICAgIGNvbnN0IFtleHBlY3RlZFJlY2VpdmVyQmFzZV0gPSBleHBlY3RlZFJlY2VpdmVyLnNwbGl0KCc/bWVtb0lkPScpO1xuICAgICAgICAgICAgaWYgKHR4RGF0YS5yZWNlaXZlciAhPT0gZXhwZWN0ZWRSZWNlaXZlckJhc2UpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBPbmVTdGVwUHJlQXBwcm92YWwgcmVjZWl2ZXIgbWlzbWF0Y2g6IGV4cGVjdGVkICcke2V4cGVjdGVkUmVjZWl2ZXJCYXNlfScsIGdvdCAnJHt0eERhdGEucmVjZWl2ZXJ9J2BcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR4RGF0YS50b2tlbiAhPT0gdW5kZWZpbmVkICYmIHR4RGF0YS50b2tlbiAhPT0gZW5hYmxlVG9rZW4ubmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgT25lU3RlcFByZUFwcHJvdmFsIHRva2VuIG5hbWUgbWlzbWF0Y2g6IGV4cGVjdGVkICcke2VuYWJsZVRva2VuLm5hbWV9JywgZ290ICcke3R4RGF0YS50b2tlbn0nYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5UcmFuc2ZlclByZWFwcHJvdmFsQ2FuY2VsOlxuICAgICAgICAvLyBNaXJyb3JzIE9uZVN0ZXBQcmVBcHByb3ZhbCdzIHJlY2VpdmVyL3Rva2VuIHZhbGlkYXRpb24gYWJvdmUsIG9wcG9zaXRlIGRpcmVjdGlvbi5cbiAgICAgICAgLy8gVGhlIGNhbmNlbCBpcyBzZWxmLXNlcnZpY2UgKHRoZSB3YWxsZXQncyBvd24gcGFydHkgZXhlcmNpc2VzIHRoZSBjaG9pY2Ugb24gaXRzIG93blxuICAgICAgICAvLyBUcmFuc2ZlclByZWFwcHJvdmFsKSwgc28gc2VuZGVyID09PSByZWNlaXZlciBvbiB0aGUgcGFyc2VkIHRyYW5zYWN0aW9uOyBib3RoIG11c3QgbWF0Y2hcbiAgICAgICAgLy8gdGhlIHdhbGxldCdzIHJvb3RBZGRyZXNzIChvciB0aGUgZXhwbGljaXQgZW5hYmxlVG9rZW4uYWRkcmVzcywgaWYgcHJvdmlkZWQpLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdHhQYXJhbXMudHlwZSA9PT0gJ2Rpc2FibGV0b2tlbicgJiZcbiAgICAgICAgICB0eFBhcmFtcy5lbmFibGVUb2tlbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIHR4UGFyYW1zLmVuYWJsZVRva2Vucy5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHR4RGF0YSA9IHRyYW5zYWN0aW9uLnRvSnNvbigpIGFzIFR4RGF0YTtcbiAgICAgICAgICBjb25zdCBkaXNhYmxlVG9rZW4gPSB0eFBhcmFtcy5lbmFibGVUb2tlbnNbMF07XG4gICAgICAgICAgY29uc3Qgd2FsbGV0Um9vdEFkZHJlc3MgPSBwYXJhbXMud2FsbGV0Py5jb2luU3BlY2lmaWM/LigpPy5yb290QWRkcmVzcztcbiAgICAgICAgICBjb25zdCBleHBlY3RlZFBhcnR5ID0gZGlzYWJsZVRva2VuLmFkZHJlc3MgPz8gd2FsbGV0Um9vdEFkZHJlc3M7XG4gICAgICAgICAgaWYgKGV4cGVjdGVkUGFydHkpIHtcbiAgICAgICAgICAgIGNvbnN0IFtleHBlY3RlZFBhcnR5QmFzZV0gPSBleHBlY3RlZFBhcnR5LnNwbGl0KCc/bWVtb0lkPScpO1xuICAgICAgICAgICAgaWYgKHR4RGF0YS5yZWNlaXZlciAhPT0gZXhwZWN0ZWRQYXJ0eUJhc2UpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBUcmFuc2ZlclByZWFwcHJvdmFsQ2FuY2VsIHJlY2VpdmVyIG1pc21hdGNoOiBleHBlY3RlZCAnJHtleHBlY3RlZFBhcnR5QmFzZX0nLCBnb3QgJyR7dHhEYXRhLnJlY2VpdmVyfSdgXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eERhdGEudG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0eERhdGEudG9rZW4gIT09IGRpc2FibGVUb2tlbi5uYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBUcmFuc2ZlclByZWFwcHJvdmFsQ2FuY2VsIHRva2VuIG5hbWUgbWlzbWF0Y2g6IGV4cGVjdGVkICcke2Rpc2FibGVUb2tlbi5uYW1lfScsIGdvdCAnJHt0eERhdGEudG9rZW59J2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU2VuZDpcbiAgICAgICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGZpbHRlcmVkUmVjaXBpZW50cyA9IHR4UGFyYW1zLnJlY2lwaWVudHM/Lm1hcCgocmVjaXBpZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGFkZHJlc3MsIGFtb3VudCwgdG9rZW5OYW1lIH0gPSByZWNpcGllbnQ7XG4gICAgICAgICAgICBjb25zdCBbYWRkcmVzc1BhcnQsIG1lbW9JZF0gPSBhZGRyZXNzLnNwbGl0KCc/bWVtb0lkPScpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogYWRkcmVzc1BhcnQsXG4gICAgICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICAgICAgLi4uKG1lbW9JZCAmJiB7IG1lbW86IG1lbW9JZCB9KSxcbiAgICAgICAgICAgICAgLi4uKHRva2VuTmFtZSAmJiB7IHRva2VuTmFtZSB9KSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgZmlsdGVyZWRPdXRwdXRzID0gZXhwbGFpbmVkVHgub3V0cHV0cz8ubWFwKChvdXRwdXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgYWRkcmVzcywgYW1vdW50LCB0b2tlbk5hbWUsIG1lbW8gfSA9IG91dHB1dDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICAgICAgLi4uKG1lbW8gJiYgeyBtZW1vIH0pLFxuICAgICAgICAgICAgICAuLi4odG9rZW5OYW1lICYmIHsgdG9rZW5OYW1lIH0pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoZmlsdGVyZWRSZWNpcGllbnRzKSAhPT0gSlNPTi5zdHJpbmdpZnkoZmlsdGVyZWRPdXRwdXRzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCBvdXRwdXRzIGRvIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudHMnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biB0cmFuc2FjdGlvbiB0eXBlLCAke3RyYW5zYWN0aW9uLnR5cGV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2ZXJpZnlDYW50b25Db21tYW5kVHJhbnNhY3Rpb24oXG4gICAgdHJhbnNhY3Rpb246IEJhc2VUcmFuc2FjdGlvbixcbiAgICB1c2VyUGFyYW1zOiBDYW50b25Db21tYW5kUGFyYW1zIHwgdW5kZWZpbmVkXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghdXNlclBhcmFtcykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2FudG9uVHggPSB0cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbjtcbiAgICBjb25zdCByYXdQcmVwYXJlZCA9IGNhbnRvblR4LnByZXBhcmVDb21tYW5kPy5wcmVwYXJlZFRyYW5zYWN0aW9uO1xuICAgIGlmICghcmF3UHJlcGFyZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FudG9uQ29tbWFuZCB2ZXJpZnlUcmFuc2FjdGlvbjogbWlzc2luZyBwcmVwYXJlZFRyYW5zYWN0aW9uIHByb3RvYnVmIG9uIHR4IHByZWJ1aWxkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjb2RlZENvbW1hbmQgPSB1dGlscy5leHRyYWN0Q2FudG9uQ29tbWFuZEluZm8ocmF3UHJlcGFyZWQpO1xuICAgIGNvbnN0IHVzZXJDb21tYW5kID0gdXNlclBhcmFtcy5jb21tYW5kIGFzIFBhcnRpYWw8Q2FudG9uQ29tbWFuZD47XG5cbiAgICAvLyBJbnB1dCBzaGFwZSBpcyBlbmZvcmNlZCBieSBtcGNVdGlscyBhdCBidWlsZCB0aW1lOyBoZXJlIHdlIHJlc29sdmUgd2hpY2ggYnJhbmNoIGlzIHByZXNlbnQuXG4gICAgY29uc3QgaGFzQ3JlYXRlID0gJ0NyZWF0ZUNvbW1hbmQnIGluIHVzZXJDb21tYW5kICYmIHV0aWxzLmlzUGxhaW5PYmplY3QodXNlckNvbW1hbmQuQ3JlYXRlQ29tbWFuZCk7XG4gICAgY29uc3QgaGFzRXhlcmNpc2UgPSAnRXhlcmNpc2VDb21tYW5kJyBpbiB1c2VyQ29tbWFuZCAmJiB1dGlscy5pc1BsYWluT2JqZWN0KHVzZXJDb21tYW5kLkV4ZXJjaXNlQ29tbWFuZCk7XG4gICAgaWYgKCFoYXNDcmVhdGUgJiYgIWhhc0V4ZXJjaXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW50b25Db21tYW5kIHZlcmlmeVRyYW5zYWN0aW9uOiBjb21tYW5kIG11c3QgY29udGFpbiBhIENyZWF0ZUNvbW1hbmQgb3IgRXhlcmNpc2VDb21tYW5kIHdyYXBwZXJgXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoaGFzQ3JlYXRlICYmIGhhc0V4ZXJjaXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW50b25Db21tYW5kIHZlcmlmeVRyYW5zYWN0aW9uOiBjb21tYW5kIG11c3QgY29udGFpbiBleGFjdGx5IG9uZSBvZiBDcmVhdGVDb21tYW5kIG9yIEV4ZXJjaXNlQ29tbWFuZCwgbm90IGJvdGhgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB1c2VyS2luZDogQ2FudG9uQ29tbWFuZEtpbmQgPSBoYXNDcmVhdGUgPyAnQ3JlYXRlQ29tbWFuZCcgOiAnRXhlcmNpc2VDb21tYW5kJztcbiAgICBpZiAoZGVjb2RlZENvbW1hbmQua2luZCAhPT0gdXNlcktpbmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbnRvbkNvbW1hbmQgdmVyaWZ5VHJhbnNhY3Rpb246IGNvbW1hbmQga2luZCBtaXNtYXRjaCDigJQgZXhwZWN0ZWQgJHt1c2VyS2luZH0sIGdvdCAke2RlY29kZWRDb21tYW5kLmtpbmR9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VySW5uZXIgPVxuICAgICAgdXNlcktpbmQgPT09ICdDcmVhdGVDb21tYW5kJ1xuICAgICAgICA/ICh1c2VyQ29tbWFuZCBhcyBDYW50b25DcmVhdGVDb21tYW5kKS5DcmVhdGVDb21tYW5kXG4gICAgICAgIDogKHVzZXJDb21tYW5kIGFzIENhbnRvbkV4ZXJjaXNlQ29tbWFuZCkuRXhlcmNpc2VDb21tYW5kO1xuXG4gICAgaWYgKCF1c2VySW5uZXI/LnRlbXBsYXRlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FudG9uQ29tbWFuZCB2ZXJpZnlUcmFuc2FjdGlvbjogJHt1c2VyS2luZH0udGVtcGxhdGVJZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ2ApO1xuICAgIH1cblxuICAgIC8vIHRlbXBsYXRlSWQgKG1vZHVsZU5hbWUgKyBlbnRpdHlOYW1lOyBwYWNrYWdlIGlkIGlzIG11dGFibGUsIHNvIGlnbm9yZWQpXG4gICAgY29uc3QgcGFyc2VkID0gdXRpbHMucGFyc2VDYW50b25UZW1wbGF0ZUlkKHVzZXJJbm5lci50ZW1wbGF0ZUlkKTtcbiAgICBpZiAoIXBhcnNlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2FudG9uQ29tbWFuZCB2ZXJpZnlUcmFuc2FjdGlvbjogaW52YWxpZCB1c2VyIHRlbXBsYXRlSWQgJyR7dXNlcklubmVyLnRlbXBsYXRlSWR9JyDigJQgZXhwZWN0ZWQgZm9ybWF0ICdQa2c6TW9kdWxlOkVudGl0eSdgXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkZWNvZGVkQ29tbWFuZC50ZW1wbGF0ZUlkLm1vZHVsZU5hbWUgIT09IHBhcnNlZC5tb2R1bGVOYW1lIHx8XG4gICAgICBkZWNvZGVkQ29tbWFuZC50ZW1wbGF0ZUlkLmVudGl0eU5hbWUgIT09IHBhcnNlZC5lbnRpdHlOYW1lXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW50b25Db21tYW5kIHZlcmlmeVRyYW5zYWN0aW9uOiB0ZW1wbGF0ZUlkIG1pc21hdGNoIOKAlCBleHBlY3RlZCAnJHtwYXJzZWQubW9kdWxlTmFtZX06JHtwYXJzZWQuZW50aXR5TmFtZX0nLCBnb3QgJyR7ZGVjb2RlZENvbW1hbmQudGVtcGxhdGVJZC5tb2R1bGVOYW1lfToke2RlY29kZWRDb21tYW5kLnRlbXBsYXRlSWQuZW50aXR5TmFtZX0nYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCB0aGUgaW5qZWN0LWFzIHNraXAgc2V0IG9uY2UgZm9yIHVzZSBhY3Jvc3MgdGhlIGNvbnRyYWN0SWQgYW5kIGFyZ3VtZW50IGNoZWNrc1xuICAgIGNvbnN0IHNraXBQYXRocyA9IHV0aWxzLm5vcm1hbGl6ZUluamVjdEFzKHVzZXJQYXJhbXMucmVzb2x2ZUNvbnRyYWN0cyk7XG5cbiAgICAvLyBtZXRhZGF0YS5zdWJtaXR0ZXJJbmZvLmFjdEFzIG11c3QgY29udGFpbiBleGFjdGx5IHRoZSBzYW1lIHBhcnRpZXMgYXMgdGhlIHVzZXIncyBhY3RBc1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh1c2VyUGFyYW1zLmFjdEFzKSB8fCB1c2VyUGFyYW1zLmFjdEFzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW50b25Db21tYW5kIHZlcmlmeVRyYW5zYWN0aW9uOiBhY3RBcyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5IG9mIHBhcnR5IElEc2ApO1xuICAgIH1cbiAgICBpZiAoIXVzZXJQYXJhbXMuYWN0QXMuZXZlcnkoKHApID0+IHR5cGVvZiBwID09PSAnc3RyaW5nJyAmJiBwLnRyaW0oKSAhPT0gJycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbnRvbkNvbW1hbmQgdmVyaWZ5VHJhbnNhY3Rpb246IGFsbCBhY3RBcyBlbnRyaWVzIG11c3QgYmUgbm9uLWVtcHR5IHN0cmluZ3NgKTtcbiAgICB9XG4gICAgY29uc3Qgc3VibWl0dGVyQWN0QXMgPSBjYW50b25UeC5jYW50b25Db21tYW5kQWN0QXNQYXJ0aWVzID8/IFtdO1xuICAgIGlmICghdXRpbHMuc2FtZUVsZW1lbnRzKHN1Ym1pdHRlckFjdEFzLCB1c2VyUGFyYW1zLmFjdEFzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2FudG9uQ29tbWFuZCB2ZXJpZnlUcmFuc2FjdGlvbjogc3VibWl0dGVySW5mby5hY3RBcyBbJHtzdWJtaXR0ZXJBY3RBcy5qb2luKFxuICAgICAgICAgICcsICdcbiAgICAgICAgKX1dIGRvZXMgbm90IG1hdGNoIHVzZXIgYWN0QXMgWyR7dXNlclBhcmFtcy5hY3RBcy5qb2luKCcsICcpfV1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh1c2VyS2luZCA9PT0gJ0V4ZXJjaXNlQ29tbWFuZCcpIHtcbiAgICAgIGNvbnN0IGV4ZXJjaXNlSW5uZXIgPSB1c2VySW5uZXIgYXMgQ2FudG9uRXhlcmNpc2VDb21tYW5kWydFeGVyY2lzZUNvbW1hbmQnXTtcblxuICAgICAgLy8gY2hvaWNlIGlkXG4gICAgICBpZiAoZGVjb2RlZENvbW1hbmQuY2hvaWNlICE9PSBleGVyY2lzZUlubmVyLmNob2ljZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbnRvbkNvbW1hbmQgdmVyaWZ5VHJhbnNhY3Rpb246IGNob2ljZSBtaXNtYXRjaCDigJQgZXhwZWN0ZWQgJyR7ZXhlcmNpc2VJbm5lci5jaG9pY2V9JywgZ290ICcke1xuICAgICAgICAgICAgZGVjb2RlZENvbW1hbmQuY2hvaWNlID8/ICcnXG4gICAgICAgICAgfSdgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIGV2ZXJ5IG9uLWNoYWluIGFjdGluZ1BhcnR5IG11c3QgYmUgaW4gdGhlIHVzZXIncyBhY3RBcyAocHJldmVudHMgcHJpdmlsZWdlIGVzY2FsYXRpb24pXG4gICAgICBjb25zdCBvbkNoYWluQWN0b3JzID0gZGVjb2RlZENvbW1hbmQuYWN0aW5nUGFydGllcyA/PyBbXTtcbiAgICAgIGZvciAoY29uc3QgYWN0b3Igb2Ygb25DaGFpbkFjdG9ycykge1xuICAgICAgICBpZiAoIXVzZXJQYXJhbXMuYWN0QXMuaW5jbHVkZXMoYWN0b3IpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbnRvbkNvbW1hbmQgdmVyaWZ5VHJhbnNhY3Rpb246IHVuYXV0aG9yaXplZCBhY3RpbmcgcGFydHkgJyR7YWN0b3J9JyBvbiByb290IGV4ZXJjaXNlIChub3QgaW4gdXNlciBhY3RBcylgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBjb250cmFjdElkIOKAlCBza2lwIHdoZW4gYWJzZW50L2VtcHR5IG9yIHdoZW4gSU1TIHdpbGwgaW5qZWN0IGl0IHZpYSByZXNvbHZlQ29udHJhY3RzXG4gICAgICBpZiAoXG4gICAgICAgIGV4ZXJjaXNlSW5uZXIuY29udHJhY3RJZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIGV4ZXJjaXNlSW5uZXIuY29udHJhY3RJZCAhPT0gJycgJiZcbiAgICAgICAgIXNraXBQYXRocy5oYXMoJ0V4ZXJjaXNlQ29tbWFuZC5jb250cmFjdElkJylcbiAgICAgICkge1xuICAgICAgICBpZiAoZGVjb2RlZENvbW1hbmQuY29udHJhY3RJZCAhPT0gZXhlcmNpc2VJbm5lci5jb250cmFjdElkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbnRvbkNvbW1hbmQgdmVyaWZ5VHJhbnNhY3Rpb246IGNvbnRyYWN0SWQgbWlzbWF0Y2gg4oCUIGV4cGVjdGVkICcke2V4ZXJjaXNlSW5uZXIuY29udHJhY3RJZH0nLCBnb3QgJyR7XG4gICAgICAgICAgICAgIGRlY29kZWRDb21tYW5kLmNvbnRyYWN0SWQgPz8gJydcbiAgICAgICAgICAgIH0nYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZGVlcCBhcmd1bWVudCBjb21wYXJlXG4gICAgICBjb25zdCBhcmd1bWVudFNraXBQYXRocyA9IHRoaXMucmVsYXRpdmVTa2lwUGF0aHMoc2tpcFBhdGhzLCAnRXhlcmNpc2VDb21tYW5kLmNob2ljZUFyZ3VtZW50LicpO1xuICAgICAgdXRpbHMuYXNzZXJ0RGVlcENhbnRvbk1hdGNoKGV4ZXJjaXNlSW5uZXIuY2hvaWNlQXJndW1lbnQsIGRlY29kZWRDb21tYW5kLmFyZ3VtZW50LCBhcmd1bWVudFNraXBQYXRocyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNyZWF0ZUlubmVyID0gdXNlcklubmVyIGFzIENhbnRvbkNyZWF0ZUNvbW1hbmRbJ0NyZWF0ZUNvbW1hbmQnXTtcblxuICAgICAgLy8gZGVlcCBhcmd1bWVudCBjb21wYXJlXG4gICAgICBjb25zdCBhcmd1bWVudFNraXBQYXRocyA9IHRoaXMucmVsYXRpdmVTa2lwUGF0aHMoc2tpcFBhdGhzLCAnQ3JlYXRlQ29tbWFuZC5jcmVhdGVBcmd1bWVudHMuJyk7XG4gICAgICB1dGlscy5hc3NlcnREZWVwQ2FudG9uTWF0Y2goY3JlYXRlSW5uZXIuY3JlYXRlQXJndW1lbnRzLCBkZWNvZGVkQ29tbWFuZC5hcmd1bWVudCwgYXJndW1lbnRTa2lwUGF0aHMpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSByZWxhdGl2ZVNraXBQYXRocyhza2lwUGF0aHM6IFNldDxzdHJpbmc+LCBwcmVmaXg6IHN0cmluZyk6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHAgb2Ygc2tpcFBhdGhzKSB7XG4gICAgICBpZiAocC5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgICAgY29uc3Qgc3RyaXBwZWQgPSBwLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICBpZiAoc3RyaXBwZWQpIG91dC5hZGQoc3RyaXBwZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGFzeW5jIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFRzc1ZlcmlmeUFkZHJlc3NPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gVE9ETzogcmVmYWN0b3IgdGhpcyBhbmQgdXNlIHRoZSBgdmVyaWZ5RWRkc2FNZW1vQmFzZWRXYWxsZXRBZGRyZXNzYCBvbmNlIHB1Ymxpc2hlZCBmcm9tIHNkay1jb3JlXG4gICAgLy8gaHR0cHM6Ly9iaXRnb2luYy5hdGxhc3NpYW4ubmV0L2Jyb3dzZS9DT0lOLTYzNDdcbiAgICBjb25zdCB7IGtleWNoYWlucywgYWRkcmVzczogbmV3QWRkcmVzcywgaW5kZXggfSA9IHBhcmFtcztcbiAgICBjb25zdCBbYWRkcmVzc1BhcnQsIG1lbW9JZF0gPSBuZXdBZGRyZXNzLnNwbGl0KCc/bWVtb0lkPScpO1xuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzUGFydCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKGBpbnZhbGlkIGFkZHJlc3M6ICR7bmV3QWRkcmVzc31gKTtcbiAgICB9XG4gICAgaWYgKG1lbW9JZCAmJiBtZW1vSWQgIT09IGAke2luZGV4fWApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKGBpbnZhbGlkIG1lbW9JZCBpbmRleDogJHttZW1vSWR9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbW1vbktleWNoYWluID0gZXh0cmFjdENvbW1vbktleWNoYWluKGtleWNoYWlucyk7XG4gICAgY29uc3QgTVBDID0gYXdhaXQgRUREU0FNZXRob2RzLmdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9ICdtLzAnO1xuICAgIGNvbnN0IGRlcml2ZWRQdWJsaWNLZXkgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXljaGFpbiwgZGVyaXZhdGlvblBhdGgpLnNsaWNlKDAsIDY0KTtcbiAgICBjb25zdCBwdWJsaWNLZXlCYXNlNjQgPSBCdWZmZXIuZnJvbShkZXJpdmVkUHVibGljS2V5LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHJvb3RBZGRyZXNzRmluZ2VycHJpbnQgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXlCYXNlNjQpO1xuICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gYCR7cm9vdEFkZHJlc3NGaW5nZXJwcmludC5zbGljZSgwLCA1KX06OiR7cm9vdEFkZHJlc3NGaW5nZXJwcmludH1gO1xuICAgIHJldHVybiBhZGRyZXNzUGFydCA9PT0gcm9vdEFkZHJlc3M7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYXN5bmMgcGFyc2VUcmFuc2FjdGlvbihwYXJhbXM6IFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxQYXJzZWRUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4SGV4ID0gcGFyYW1zLnR4SGV4IGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXR4SGV4KSB7XG4gICAgICAvLyBNZXNzYWdlLW9ubHkgc2lnbmluZyByZXF1ZXN0cyAoZS5nLiBDQU5UT05fU0lHTl9UUkFOU0FDVElPTiwgQ0FOVE9OX1NJR05fVE9QT0xPR1kpXG4gICAgICAvLyBoYXZlIG5vIHRyYW5zYWN0aW9uIGhleCB0byBwYXJzZSDigJQgcmV0dXJuIGFuIGVtcHR5IHJlc3VsdC5cbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHsgdHhIZXggfSk7XG4gICAgaWYgKCF0cmFuc2FjdGlvbkV4cGxhbmF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uRXhwbGFuYXRpb24gYXMgdW5rbm93biBhcyBQYXJzZWRUcmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBnZW5lcmF0ZUtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IENhbnRvbktleVBhaXIoeyBzZWVkIH0pIDogbmV3IENhbnRvbktleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRLZXlzKCk7XG4gICAgaWYgKCFrZXlzLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBydiBpbiBrZXkgZ2VuZXJhdGlvbi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1Yjoga2V5cy5wdWIsXG4gICAgICBwcnY6IGtleXMucHJ2LFxuICAgIH07XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKHBhcmFtczogRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8VHJhbnNhY3Rpb25FeHBsYW5hdGlvbj4ge1xuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldEJ1aWxkZXIoKTtcbiAgICBsZXQgcmVidWlsdFRyYW5zYWN0aW9uOiBCYXNlVHJhbnNhY3Rpb247XG4gICAgY29uc3QgdHhSYXcgPSBwYXJhbXMudHhIZXg7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0eFJhdyk7XG4gICAgICByZWJ1aWx0VHJhbnNhY3Rpb24gPSB0eEJ1aWxkZXIudHJhbnNhY3Rpb247XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiByZWJ1aWx0VHJhbnNhY3Rpb24uZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1dGlscy5pc1ZhbGlkUHVibGljS2V5KHB1Yik7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gY2FudG9uIGFkZHJlc3NlcyBhcmUgb2YgdGhlIGZvcm0sIHBhcnR5SGludDo6ZmluZ2VycHJpbnRcbiAgICAvLyB3aGVyZSBwYXJ0eUhpbnQgaXMgb2YgbGVuZ3RoIDUgYW5kIGZpbmdlcnByaW50IGlzIDY4IGNoYXJhY3RlcnMgbG9uZ1xuICAgIHJldHVybiB1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBnZXRUb2tlbkVuYWJsZW1lbnRDb25maWcoKTogVG9rZW5FbmFibGVtZW50Q29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQ6IHRydWUsXG4gICAgICBzdXBwb3J0c011bHRpcGxlVG9rZW5FbmFibGVtZW50czogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIGdldEFkZHJlc3NGcm9tUHVibGljS2V5KHB1YmxpY0tleUhleDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwdWJsaWNLZXlCYXNlNjQgPSBCdWZmZXIuZnJvbShwdWJsaWNLZXlIZXgsICdoZXgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgcmV0dXJuIHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KHB1YmxpY0tleUJhc2U2NCk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgc2lnblRyYW5zYWN0aW9uKHBhcmFtczogU2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYXVkaXREZWNyeXB0ZWRLZXkoeyBtdWx0aVNpZ1R5cGUsIHBydiwgcHVibGljS2V5IH06IEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zKTogdm9pZCB7XG4gICAgaWYgKG11bHRpU2lnVHlwZSAhPT0gbXVsdGlzaWdUeXBlcy50c3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgbXVsdGlTaWdUeXBlJyk7XG4gICAgfVxuICAgIGF1ZGl0RWRkc2FQcml2YXRlS2V5KHBydiwgcHVibGljS2V5ID8/ICcnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBzZXRDb2luU3BlY2lmaWNGaWVsZHNJbkludGVudChpbnRlbnQ6IFBvcHVsYXRlZEludGVudCwgcGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkKSB7XG4gICAgICBpbnRlbnQudHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhSZXF1ZXN0SWQ7XG4gICAgfVxuICAgIGlmIChwYXJhbXMudHJhbnNmZXJPZmZlcklkKSB7XG4gICAgICBpbnRlbnQudHJhbnNmZXJPZmZlcklkID0gcGFyYW1zLnRyYW5zZmVyT2ZmZXJJZDtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy51bnNwZW50cykge1xuICAgICAgaW50ZW50LnVuc3BlbnRzID0gcGFyYW1zLnVuc3BlbnRzO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmNhbnRvbkNvbW1hbmRQYXJhbXMpIHtcbiAgICAgIGludGVudC5jYW50b25Db21tYW5kUGFyYW1zID0gcGFyYW1zLmNhbnRvbkNvbW1hbmRQYXJhbXM7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZW5kSW52ZXN0b3JQYXJ0eUlkKSB7XG4gICAgICBpbnRlbnQuZW5kSW52ZXN0b3JQYXJ0eUlkID0gcGFyYW1zLmVuZEludmVzdG9yUGFydHlJZDtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5yZWFzb24pIHtcbiAgICAgIGludGVudC5yZWFzb24gPSBwYXJhbXMucmVhc29uO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLm9wZXJhdG9yKSB7XG4gICAgICBpbnRlbnQub3BlcmF0b3IgPSBwYXJhbXMub3BlcmF0b3I7XG4gICAgfVxuICAgIGlmIChwYXJhbXMucHJvdmlkZXIpIHtcbiAgICAgIGludGVudC5wcm92aWRlciA9IHBhcmFtcy5wcm92aWRlcjtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5jb21wbGlhbmNlKSB7XG4gICAgICBpbnRlbnQuY29tcGxpYW5jZSA9IHBhcmFtcy5jb21wbGlhbmNlO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLnJlZ2lzdHJhcikge1xuICAgICAgaW50ZW50LnJlZ2lzdHJhciA9IHBhcmFtcy5yZWdpc3RyYXI7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuY2xpZW50T25ib2FyZGVyKSB7XG4gICAgICBpbnRlbnQuY2xpZW50T25ib2FyZGVyID0gcGFyYW1zLmNsaWVudE9uYm9hcmRlcjtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5leHBpcmF0aW9uSXNvKSB7XG4gICAgICBpbnRlbnQuZXhwaXJhdGlvbklzbyA9IHBhcmFtcy5leHBpcmF0aW9uSXNvO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { BitGoBase, CoinConstructor, NamedCoinConstructor } from '@bitgo-beta/sdk-core';
|
|
2
|
+
import { CantonTokenConfig } from '@bitgo-beta/statics';
|
|
3
|
+
import { Canton } from './canton';
|
|
4
|
+
export declare class CantonToken extends Canton {
|
|
5
|
+
readonly tokenConfig: CantonTokenConfig;
|
|
6
|
+
constructor(bitgo: BitGoBase, tokenConfig: CantonTokenConfig);
|
|
7
|
+
static createTokenConstructor(config: CantonTokenConfig): CoinConstructor;
|
|
8
|
+
static createTokenConstructors(tokenConfig?: CantonTokenConfig[]): NamedCoinConstructor[];
|
|
9
|
+
get name(): string;
|
|
10
|
+
get coin(): string;
|
|
11
|
+
get baseUrl(): string;
|
|
12
|
+
get contractAddress(): string;
|
|
13
|
+
get decimalPlaces(): number;
|
|
14
|
+
getChain(): string;
|
|
15
|
+
getBaseChain(): string;
|
|
16
|
+
getFullName(): string;
|
|
17
|
+
getBaseFactor(): number;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=cantonToken.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cantonToken.d.ts","sourceRoot":"","sources":["../../src/cantonToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAS,iBAAiB,EAAuB,MAAM,qBAAqB,CAAC;AAEpF,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,qBAAa,WAAY,SAAQ,MAAM;IACrC,SAAgB,WAAW,EAAE,iBAAiB,CAAC;gBAEnC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB;IAM5D,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe;IAIzE,MAAM,CAAC,uBAAuB,CAC5B,WAAW,GAAE,iBAAiB,EAAuE,GACpG,oBAAoB,EAAE;IASzB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,QAAQ,IAAI,MAAM;IAIlB,YAAY,IAAI,MAAM;IAItB,WAAW,IAAI,MAAM;IAIrB,aAAa,IAAI,MAAM;CAGxB"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CantonToken = void 0;
|
|
4
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
5
|
+
const canton_1 = require("./canton");
|
|
6
|
+
class CantonToken extends canton_1.Canton {
|
|
7
|
+
constructor(bitgo, tokenConfig) {
|
|
8
|
+
const staticsCoin = tokenConfig.network === statics_1.NetworkType.MAINNET ? statics_1.coins.get('canton') : statics_1.coins.get('tcanton');
|
|
9
|
+
super(bitgo, staticsCoin);
|
|
10
|
+
this.tokenConfig = tokenConfig;
|
|
11
|
+
}
|
|
12
|
+
static createTokenConstructor(config) {
|
|
13
|
+
return (bitgo) => new CantonToken(bitgo, config);
|
|
14
|
+
}
|
|
15
|
+
static createTokenConstructors(tokenConfig = [...statics_1.tokens.bitcoin.canton.tokens, ...statics_1.tokens.testnet.canton.tokens]) {
|
|
16
|
+
const tokensCtors = [];
|
|
17
|
+
for (const token of tokenConfig) {
|
|
18
|
+
const tokenConstructor = CantonToken.createTokenConstructor(token);
|
|
19
|
+
tokensCtors.push({ name: token.type, coinConstructor: tokenConstructor });
|
|
20
|
+
}
|
|
21
|
+
return tokensCtors;
|
|
22
|
+
}
|
|
23
|
+
get name() {
|
|
24
|
+
return this.tokenConfig.name;
|
|
25
|
+
}
|
|
26
|
+
get coin() {
|
|
27
|
+
return this.tokenConfig.coin;
|
|
28
|
+
}
|
|
29
|
+
get baseUrl() {
|
|
30
|
+
return this.tokenConfig.baseUrl;
|
|
31
|
+
}
|
|
32
|
+
get contractAddress() {
|
|
33
|
+
return this.tokenConfig.contractAddress;
|
|
34
|
+
}
|
|
35
|
+
get decimalPlaces() {
|
|
36
|
+
return this.tokenConfig.decimalPlaces;
|
|
37
|
+
}
|
|
38
|
+
getChain() {
|
|
39
|
+
return this.tokenConfig.type;
|
|
40
|
+
}
|
|
41
|
+
getBaseChain() {
|
|
42
|
+
return this.coin;
|
|
43
|
+
}
|
|
44
|
+
getFullName() {
|
|
45
|
+
return 'Canton Token';
|
|
46
|
+
}
|
|
47
|
+
getBaseFactor() {
|
|
48
|
+
return Math.pow(10, this.tokenConfig.decimalPlaces);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.CantonToken = CantonToken;
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudG9uVG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2FudG9uVG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsaURBQW9GO0FBRXBGLHFDQUFrQztBQUVsQyxNQUFhLFdBQVksU0FBUSxlQUFNO0lBR3JDLFlBQVksS0FBZ0IsRUFBRSxXQUE4QjtRQUMxRCxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxLQUFLLHFCQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdHLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVELE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxNQUF5QjtRQUNyRCxPQUFPLENBQUMsS0FBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxXQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxNQUFNLENBQUMsdUJBQXVCLENBQzVCLGNBQW1DLENBQUMsR0FBRyxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsZ0JBQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUVyRyxNQUFNLFdBQVcsR0FBMkIsRUFBRSxDQUFDO1FBQy9DLEtBQUssTUFBTSxLQUFLLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEMsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkUsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztJQUN4QyxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0Y7QUEzREQsa0NBMkRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQml0R29CYXNlLCBDb2luQ29uc3RydWN0b3IsIE5hbWVkQ29pbkNvbnN0cnVjdG9yIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMsIENhbnRvblRva2VuQ29uZmlnLCBOZXR3b3JrVHlwZSwgdG9rZW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5cbmltcG9ydCB7IENhbnRvbiB9IGZyb20gJy4vY2FudG9uJztcblxuZXhwb3J0IGNsYXNzIENhbnRvblRva2VuIGV4dGVuZHMgQ2FudG9uIHtcbiAgcHVibGljIHJlYWRvbmx5IHRva2VuQ29uZmlnOiBDYW50b25Ub2tlbkNvbmZpZztcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCB0b2tlbkNvbmZpZzogQ2FudG9uVG9rZW5Db25maWcpIHtcbiAgICBjb25zdCBzdGF0aWNzQ29pbiA9IHRva2VuQ29uZmlnLm5ldHdvcmsgPT09IE5ldHdvcmtUeXBlLk1BSU5ORVQgPyBjb2lucy5nZXQoJ2NhbnRvbicpIDogY29pbnMuZ2V0KCd0Y2FudG9uJyk7XG4gICAgc3VwZXIoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgICB0aGlzLnRva2VuQ29uZmlnID0gdG9rZW5Db25maWc7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVG9rZW5Db25zdHJ1Y3Rvcihjb25maWc6IENhbnRvblRva2VuQ29uZmlnKTogQ29pbkNvbnN0cnVjdG9yIHtcbiAgICByZXR1cm4gKGJpdGdvOiBCaXRHb0Jhc2UpID0+IG5ldyBDYW50b25Ub2tlbihiaXRnbywgY29uZmlnKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVUb2tlbkNvbnN0cnVjdG9ycyhcbiAgICB0b2tlbkNvbmZpZzogQ2FudG9uVG9rZW5Db25maWdbXSA9IFsuLi50b2tlbnMuYml0Y29pbi5jYW50b24udG9rZW5zLCAuLi50b2tlbnMudGVzdG5ldC5jYW50b24udG9rZW5zXVxuICApOiBOYW1lZENvaW5Db25zdHJ1Y3RvcltdIHtcbiAgICBjb25zdCB0b2tlbnNDdG9yczogTmFtZWRDb2luQ29uc3RydWN0b3JbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5Db25maWcpIHtcbiAgICAgIGNvbnN0IHRva2VuQ29uc3RydWN0b3IgPSBDYW50b25Ub2tlbi5jcmVhdGVUb2tlbkNvbnN0cnVjdG9yKHRva2VuKTtcbiAgICAgIHRva2Vuc0N0b3JzLnB1c2goeyBuYW1lOiB0b2tlbi50eXBlLCBjb2luQ29uc3RydWN0b3I6IHRva2VuQ29uc3RydWN0b3IgfSk7XG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNDdG9ycztcbiAgfVxuXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcubmFtZTtcbiAgfVxuXG4gIGdldCBjb2luKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcuY29pbjtcbiAgfVxuXG4gIGdldCBiYXNlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcuYmFzZVVybDtcbiAgfVxuXG4gIGdldCBjb250cmFjdEFkZHJlc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5jb250cmFjdEFkZHJlc3M7XG4gIH1cblxuICBnZXQgZGVjaW1hbFBsYWNlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLmRlY2ltYWxQbGFjZXM7XG4gIH1cblxuICBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLnR5cGU7XG4gIH1cblxuICBnZXRCYXNlQ2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb2luO1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ0NhbnRvbiBUb2tlbic7XG4gIH1cblxuICBnZXRCYXNlRmFjdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLnRva2VuQ29uZmlnLmRlY2ltYWxQbGFjZXMpO1xuICB9XG59XG4iXX0=
|
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -18,4 +18,5 @@ __exportStar(require("./lib"), exports);
|
|
|
18
18
|
__exportStar(require("./canton"), exports);
|
|
19
19
|
__exportStar(require("./tcanton"), exports);
|
|
20
20
|
__exportStar(require("./register"), exports);
|
|
21
|
-
|
|
21
|
+
__exportStar(require("./cantonToken"), exports);
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHdDQUFzQjtBQUN0QiwyQ0FBeUI7QUFDekIsNENBQTBCO0FBQzFCLDZDQUEyQjtBQUMzQixnREFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYic7XG5leHBvcnQgKiBmcm9tICcuL2NhbnRvbic7XG5leHBvcnQgKiBmcm9tICcuL3RjYW50b24nO1xuZXhwb3J0ICogZnJvbSAnLi9yZWdpc3Rlcic7XG5leHBvcnQgKiBmcm9tICcuL2NhbnRvblRva2VuJztcbiJdfQ==
|