@bitgo-beta/sdk-coin-flrp 1.0.0-alpha.12 → 1.0.0-alpha.13
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/lib/atomicTransactionBuilder.d.ts +7 -10
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +89 -155
- package/dist/src/lib/constants.d.ts +1 -160
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +3 -213
- package/dist/src/lib/exportInCTxBuilder.d.ts +1 -1
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/exportInCTxBuilder.js +17 -46
- package/dist/src/lib/exportInPTxBuilder.d.ts +1 -1
- package/dist/src/lib/exportInPTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/exportInPTxBuilder.js +6 -70
- package/dist/src/lib/index.d.ts +0 -5
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +2 -11
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +13 -14
- package/dist/src/lib/utils.d.ts +0 -2
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +12 -23
- package/dist/test/unit/lib/exportTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportTxBuilder.js +45 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/dist/src/lib/delegatorTxBuilder.d.ts +0 -58
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/delegatorTxBuilder.js +0 -224
- package/dist/src/lib/importInCTxBuilder.d.ts +0 -67
- package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/importInCTxBuilder.js +0 -403
- package/dist/src/lib/importInPTxBuilder.d.ts +0 -73
- package/dist/src/lib/importInPTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/importInPTxBuilder.js +0 -464
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +0 -81
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +0 -248
- package/dist/src/lib/transactionBuilder.d.ts +0 -85
- package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilder.js +0 -167
- package/dist/src/lib/types.d.ts +0 -78
- package/dist/src/lib/types.d.ts.map +0 -1
- package/dist/src/lib/types.js +0 -5
- package/dist/src/lib/validatorTxBuilder.d.ts +0 -40
- package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/validatorTxBuilder.js +0 -180
- package/dist/test/unit/delegatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/delegatorTxBuilder.test.js +0 -233
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/exportInCTxBuilder.js +0 -584
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/exportInPTxBuilder.js +0 -377
- package/dist/test/unit/lib/importInCTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/importInCTxBuilder.js +0 -257
- package/dist/test/unit/lib/importInPTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/importInPTxBuilder.js +0 -500
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +0 -271
- package/dist/test/unit/transactionBuilder.test.d.ts +0 -2
- package/dist/test/unit/transactionBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder.test.js +0 -114
- package/dist/test/unit/validatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/validatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/validatorTxBuilder.test.js +0 -293
|
@@ -27,16 +27,10 @@ export declare abstract class AtomicTransactionBuilder {
|
|
|
27
27
|
};
|
|
28
28
|
hasCredentials: boolean;
|
|
29
29
|
_tx?: unknown;
|
|
30
|
-
_signature?: unknown;
|
|
31
30
|
setTransaction: (tx: unknown) => void;
|
|
32
31
|
};
|
|
33
32
|
constructor(coinConfig: Readonly<CoinConfig>);
|
|
34
33
|
protected abstract get transactionType(): TransactionType;
|
|
35
|
-
/**
|
|
36
|
-
* Get the asset ID for Flare network transactions
|
|
37
|
-
* @returns Buffer containing the asset ID
|
|
38
|
-
*/
|
|
39
|
-
protected getAssetId(): Buffer;
|
|
40
34
|
validateAmount(amount: bigint): void;
|
|
41
35
|
/**
|
|
42
36
|
* Validates that credentials array is properly formed
|
|
@@ -79,17 +73,20 @@ export declare abstract class AtomicTransactionBuilder {
|
|
|
79
73
|
*/
|
|
80
74
|
initBuilder(_tx: unknown): this;
|
|
81
75
|
/**
|
|
82
|
-
* Sign transaction with private key
|
|
76
|
+
* Sign transaction with private key (placeholder implementation)
|
|
77
|
+
* TODO: Implement proper FlareJS signing
|
|
83
78
|
*/
|
|
84
|
-
sign(
|
|
79
|
+
sign(_params: {
|
|
85
80
|
key: string;
|
|
86
81
|
}): this;
|
|
87
82
|
/**
|
|
88
|
-
* Build the transaction
|
|
83
|
+
* Build the transaction (placeholder implementation)
|
|
84
|
+
* TODO: Implement proper FlareJS transaction building
|
|
89
85
|
*/
|
|
90
86
|
build(): Promise<BaseTransaction>;
|
|
91
87
|
/**
|
|
92
|
-
* Parse and explain a transaction from hex
|
|
88
|
+
* Parse and explain a transaction from hex (placeholder implementation)
|
|
89
|
+
* TODO: Implement proper FlareJS transaction parsing
|
|
93
90
|
*/
|
|
94
91
|
explainTransaction(): TransactionExplanation;
|
|
95
92
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atomicTransactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/atomicTransactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAyB,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAa,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACrG,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"atomicTransactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/atomicTransactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAyB,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAa,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACrG,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAKjE;;;;GAIG;AACH,8BAAsB,wBAAwB;IAC5C,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IAErD,SAAS,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAE/C,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,CAAM;IAExC,SAAS,CAAC,WAAW,EAAE;QACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,GAAG,EAAE,MAAM,EAAE,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACvD,cAAc,EAAE,OAAO,CAAC;QACxB,GAAG,CAAC,EAAE,OAAO,CAAC;QACd,cAAc,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC;KACvC,CAcC;gBAEU,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI5C,SAAS,CAAC,QAAQ,KAAK,eAAe,IAAI,eAAe,CAAC;IAE1D,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMpC;;;OAGG;IACH,SAAS,CAAC,mBAAmB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI;IAY9D;;;;;;;;;OASG;IACH,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG;QAC1C,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC5B,OAAO,EAAE,kBAAkB,EAAE,CAAC;QAC9B,WAAW,EAAE,UAAU,EAAE,CAAC;KAC3B;IAmED;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAKpC;;;;;;;OAOG;IACH,SAAS,CAAC,qBAAqB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,UAAU;IAmDxF;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAI/B;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAOpC;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,eAAe,CAAC;IAuCvC;;;OAGG;IACH,kBAAkB,IAAI,sBAAsB;CAe7C"}
|
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.AtomicTransactionBuilder = void 0;
|
|
4
4
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
5
5
|
const flarejs_1 = require("@flarenetwork/flarejs");
|
|
6
|
-
|
|
7
|
-
const
|
|
6
|
+
// Constants for signature handling
|
|
7
|
+
const SECP256K1_SIGNATURE_LENGTH = 65;
|
|
8
8
|
/**
|
|
9
9
|
* Flare P-chain atomic transaction builder with FlareJS credential support.
|
|
10
10
|
* This provides the foundation for building Flare P-chain transactions with proper
|
|
@@ -15,14 +15,14 @@ class AtomicTransactionBuilder {
|
|
|
15
15
|
this._utxos = [];
|
|
16
16
|
this.transaction = {
|
|
17
17
|
_network: {},
|
|
18
|
-
_networkID:
|
|
19
|
-
_blockchainID: Buffer.alloc(
|
|
20
|
-
_assetId: Buffer.alloc(
|
|
18
|
+
_networkID: 0,
|
|
19
|
+
_blockchainID: Buffer.alloc(0),
|
|
20
|
+
_assetId: Buffer.alloc(0),
|
|
21
21
|
_fromAddresses: [],
|
|
22
22
|
_to: [],
|
|
23
|
-
_locktime:
|
|
24
|
-
_threshold:
|
|
25
|
-
_fee: { fee:
|
|
23
|
+
_locktime: 0n,
|
|
24
|
+
_threshold: 1,
|
|
25
|
+
_fee: { fee: '0' },
|
|
26
26
|
hasCredentials: false,
|
|
27
27
|
setTransaction: function (_tx) {
|
|
28
28
|
this._tx = _tx;
|
|
@@ -30,23 +30,9 @@ class AtomicTransactionBuilder {
|
|
|
30
30
|
};
|
|
31
31
|
this._coinConfig = coinConfig;
|
|
32
32
|
}
|
|
33
|
-
/**
|
|
34
|
-
* Get the asset ID for Flare network transactions
|
|
35
|
-
* @returns Buffer containing the asset ID
|
|
36
|
-
*/
|
|
37
|
-
getAssetId() {
|
|
38
|
-
// Use the asset ID from transaction if already set
|
|
39
|
-
if (this.transaction._assetId && this.transaction._assetId.length > 0) {
|
|
40
|
-
return this.transaction._assetId;
|
|
41
|
-
}
|
|
42
|
-
// For native FLR transactions, return zero-filled buffer as placeholder
|
|
43
|
-
// In a real implementation, this would be obtained from the network configuration
|
|
44
|
-
// or FlareJS API to get the actual native asset ID
|
|
45
|
-
return Buffer.alloc(constants_1.ASSET_ID_LENGTH);
|
|
46
|
-
}
|
|
47
33
|
validateAmount(amount) {
|
|
48
|
-
if (amount <=
|
|
49
|
-
throw new sdk_core_1.BuildTransactionError(
|
|
34
|
+
if (amount <= 0n) {
|
|
35
|
+
throw new sdk_core_1.BuildTransactionError('Amount must be positive');
|
|
50
36
|
}
|
|
51
37
|
}
|
|
52
38
|
/**
|
|
@@ -55,7 +41,7 @@ class AtomicTransactionBuilder {
|
|
|
55
41
|
*/
|
|
56
42
|
validateCredentials(credentials) {
|
|
57
43
|
if (!Array.isArray(credentials)) {
|
|
58
|
-
throw new sdk_core_1.BuildTransactionError(
|
|
44
|
+
throw new sdk_core_1.BuildTransactionError('Credentials must be an array');
|
|
59
45
|
}
|
|
60
46
|
credentials.forEach((credential, index) => {
|
|
61
47
|
if (!(credential instanceof flarejs_1.Credential)) {
|
|
@@ -74,8 +60,8 @@ class AtomicTransactionBuilder {
|
|
|
74
60
|
* @returns Object containing TransferableInput[], TransferableOutput[], and Credential[]
|
|
75
61
|
*/
|
|
76
62
|
createInputOutput(total) {
|
|
77
|
-
if (!this._utxos || this._utxos.length ===
|
|
78
|
-
throw new sdk_core_1.BuildTransactionError(
|
|
63
|
+
if (!this._utxos || this._utxos.length === 0) {
|
|
64
|
+
throw new sdk_core_1.BuildTransactionError('UTXOs are required for creating inputs and outputs');
|
|
79
65
|
}
|
|
80
66
|
const inputs = [];
|
|
81
67
|
const outputs = [];
|
|
@@ -99,6 +85,9 @@ class AtomicTransactionBuilder {
|
|
|
99
85
|
if (inputSum >= total) {
|
|
100
86
|
break; // We have enough inputs
|
|
101
87
|
}
|
|
88
|
+
// TODO: Create proper FlareJS TransferableInput once type issues are resolved
|
|
89
|
+
// For now, we create a placeholder that demonstrates the structure
|
|
90
|
+
// The actual FlareJS integration will need proper UTXOID handling
|
|
102
91
|
// Track input sum
|
|
103
92
|
inputSum += utxoAmount;
|
|
104
93
|
// Track address indices for signature ordering (mimics AVAX pattern)
|
|
@@ -111,19 +100,6 @@ class AtomicTransactionBuilder {
|
|
|
111
100
|
}
|
|
112
101
|
// Store address indices on the UTXO for credential creation
|
|
113
102
|
utxo.addressesIndex = addressIndexArray;
|
|
114
|
-
// Create TransferableInput for atomic transactions
|
|
115
|
-
const transferableInput = {
|
|
116
|
-
txID: Buffer.from(utxo.txid || constants_1.AMOUNT_STRING_ZERO.repeat(constants_1.TRANSACTION_ID_HEX_LENGTH), constants_1.HEX_ENCODING),
|
|
117
|
-
outputIndex: parseInt(utxo.outputidx || constants_1.AMOUNT_STRING_ZERO, constants_1.DECIMAL_RADIX),
|
|
118
|
-
assetID: this.getAssetId(),
|
|
119
|
-
input: {
|
|
120
|
-
amount: utxoAmount,
|
|
121
|
-
addressIndices: addressIndexArray,
|
|
122
|
-
threshold: utxo.threshold,
|
|
123
|
-
},
|
|
124
|
-
};
|
|
125
|
-
// Store the input (type assertion for compatibility)
|
|
126
|
-
inputs.push(transferableInput);
|
|
127
103
|
// Create credential with placeholder signatures
|
|
128
104
|
// In a real implementation, these would be actual signatures
|
|
129
105
|
const signatures = Array.from({ length: utxo.threshold }, () => '');
|
|
@@ -134,22 +110,8 @@ class AtomicTransactionBuilder {
|
|
|
134
110
|
if (inputSum < total) {
|
|
135
111
|
throw new sdk_core_1.BuildTransactionError(`Insufficient funds: need ${total}, have ${inputSum}`);
|
|
136
112
|
}
|
|
137
|
-
// Create change output if we have excess input
|
|
138
|
-
|
|
139
|
-
const changeAmount = inputSum - total;
|
|
140
|
-
// Create change output for atomic transactions
|
|
141
|
-
const changeOutput = {
|
|
142
|
-
assetID: this.getAssetId(),
|
|
143
|
-
output: {
|
|
144
|
-
amount: changeAmount,
|
|
145
|
-
addresses: this.transaction._fromAddresses,
|
|
146
|
-
threshold: 1,
|
|
147
|
-
locktime: 0n,
|
|
148
|
-
},
|
|
149
|
-
};
|
|
150
|
-
// Add the change output (type assertion for compatibility)
|
|
151
|
-
outputs.push(changeOutput);
|
|
152
|
-
}
|
|
113
|
+
// TODO: Create change output if we have excess input
|
|
114
|
+
// The TransferableOutput creation will be implemented once FlareJS types are resolved
|
|
153
115
|
return { inputs, outputs, credentials };
|
|
154
116
|
}
|
|
155
117
|
/**
|
|
@@ -172,41 +134,41 @@ class AtomicTransactionBuilder {
|
|
|
172
134
|
*/
|
|
173
135
|
createFlareCredential(_credentialId, signatures) {
|
|
174
136
|
if (!Array.isArray(signatures)) {
|
|
175
|
-
throw new sdk_core_1.BuildTransactionError(
|
|
137
|
+
throw new sdk_core_1.BuildTransactionError('Signatures must be an array');
|
|
176
138
|
}
|
|
177
|
-
if (signatures.length ===
|
|
178
|
-
throw new sdk_core_1.BuildTransactionError(
|
|
139
|
+
if (signatures.length === 0) {
|
|
140
|
+
throw new sdk_core_1.BuildTransactionError('Signatures array cannot be empty');
|
|
179
141
|
}
|
|
180
142
|
const sigs = signatures.map((sig, index) => {
|
|
181
143
|
// Handle empty/placeholder signatures
|
|
182
144
|
if (!sig || sig.length === 0) {
|
|
183
|
-
return new flarejs_1.Signature(new Uint8Array(
|
|
145
|
+
return new flarejs_1.Signature(new Uint8Array(SECP256K1_SIGNATURE_LENGTH));
|
|
184
146
|
}
|
|
185
147
|
// Validate hex string format
|
|
186
|
-
const cleanSig = sig.startsWith(
|
|
187
|
-
if (
|
|
148
|
+
const cleanSig = sig.startsWith('0x') ? sig.slice(2) : sig;
|
|
149
|
+
if (!/^[0-9a-fA-F]*$/.test(cleanSig)) {
|
|
188
150
|
throw new sdk_core_1.BuildTransactionError(`Invalid hex signature at index ${index}: contains non-hex characters`);
|
|
189
151
|
}
|
|
190
152
|
// Convert to buffer and validate length
|
|
191
|
-
const sigBuffer = Buffer.from(cleanSig,
|
|
192
|
-
if (sigBuffer.length >
|
|
193
|
-
throw new sdk_core_1.BuildTransactionError(`Signature too long at index ${index}: ${sigBuffer.length} bytes (max ${
|
|
153
|
+
const sigBuffer = Buffer.from(cleanSig, 'hex');
|
|
154
|
+
if (sigBuffer.length > SECP256K1_SIGNATURE_LENGTH) {
|
|
155
|
+
throw new sdk_core_1.BuildTransactionError(`Signature too long at index ${index}: ${sigBuffer.length} bytes (max ${SECP256K1_SIGNATURE_LENGTH})`);
|
|
194
156
|
}
|
|
195
157
|
// Create fixed-length buffer and copy signature data
|
|
196
|
-
const fixedLengthBuffer = Buffer.alloc(
|
|
158
|
+
const fixedLengthBuffer = Buffer.alloc(SECP256K1_SIGNATURE_LENGTH);
|
|
197
159
|
sigBuffer.copy(fixedLengthBuffer);
|
|
198
160
|
try {
|
|
199
161
|
return new flarejs_1.Signature(new Uint8Array(fixedLengthBuffer));
|
|
200
162
|
}
|
|
201
163
|
catch (error) {
|
|
202
|
-
throw new sdk_core_1.BuildTransactionError(`Failed to create signature at index ${index}: ${error instanceof Error ? error.message :
|
|
164
|
+
throw new sdk_core_1.BuildTransactionError(`Failed to create signature at index ${index}: ${error instanceof Error ? error.message : 'unknown error'}`);
|
|
203
165
|
}
|
|
204
166
|
});
|
|
205
167
|
try {
|
|
206
168
|
return new flarejs_1.Credential(sigs);
|
|
207
169
|
}
|
|
208
170
|
catch (error) {
|
|
209
|
-
throw new sdk_core_1.BuildTransactionError(
|
|
171
|
+
throw new sdk_core_1.BuildTransactionError(`Failed to create credential: ${error instanceof Error ? error.message : 'unknown error'}`);
|
|
210
172
|
}
|
|
211
173
|
}
|
|
212
174
|
/**
|
|
@@ -216,103 +178,75 @@ class AtomicTransactionBuilder {
|
|
|
216
178
|
return this;
|
|
217
179
|
}
|
|
218
180
|
/**
|
|
219
|
-
* Sign transaction with private key
|
|
181
|
+
* Sign transaction with private key (placeholder implementation)
|
|
182
|
+
* TODO: Implement proper FlareJS signing
|
|
220
183
|
*/
|
|
221
|
-
sign(
|
|
222
|
-
// FlareJS signing
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_INVALID_PRIVATE_KEY);
|
|
227
|
-
}
|
|
228
|
-
// Create signature structure
|
|
229
|
-
const signature = {
|
|
230
|
-
privateKey: params.key,
|
|
231
|
-
signingMethod: constants_1.SIGNING_METHOD,
|
|
232
|
-
};
|
|
233
|
-
// Store signature for FlareJS compatibility
|
|
234
|
-
this.transaction._signature = signature;
|
|
235
|
-
this.transaction.hasCredentials = true;
|
|
236
|
-
return this;
|
|
237
|
-
}
|
|
238
|
-
catch (error) {
|
|
239
|
-
throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_FLAREJS_SIGNING_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
|
|
240
|
-
}
|
|
184
|
+
sign(_params) {
|
|
185
|
+
// TODO: Implement FlareJS signing
|
|
186
|
+
// For now, just mark as having credentials
|
|
187
|
+
this.transaction.hasCredentials = true;
|
|
188
|
+
return this;
|
|
241
189
|
}
|
|
242
190
|
/**
|
|
243
|
-
* Build the transaction
|
|
191
|
+
* Build the transaction (placeholder implementation)
|
|
192
|
+
* TODO: Implement proper FlareJS transaction building
|
|
244
193
|
*/
|
|
245
194
|
async build() {
|
|
246
|
-
//
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
_type: this.transactionType,
|
|
258
|
-
signature: [],
|
|
259
|
-
fromAddresses: this.transaction._fromAddresses,
|
|
260
|
-
validationErrors: [],
|
|
261
|
-
// FlareJS methods with atomic support
|
|
262
|
-
toBroadcastFormat: () => `${constants_1.TRANSACTION_ID_PREFIX}${Date.now()}`,
|
|
263
|
-
toJson: () => ({
|
|
264
|
-
type: this.transactionType,
|
|
265
|
-
}),
|
|
266
|
-
explainTransaction: () => ({
|
|
267
|
-
type: this.transactionType,
|
|
268
|
-
inputs: [],
|
|
269
|
-
outputs: [],
|
|
270
|
-
outputAmount: constants_1.AMOUNT_STRING_ZERO,
|
|
271
|
-
rewardAddresses: [],
|
|
272
|
-
id: `${constants_1.FLARE_ATOMIC_PREFIX}${Date.now()}`,
|
|
273
|
-
changeOutputs: [],
|
|
274
|
-
changeAmount: constants_1.AMOUNT_STRING_ZERO,
|
|
275
|
-
fee: { fee: this.transaction._fee.fee },
|
|
276
|
-
}),
|
|
277
|
-
isTransactionForCChain: false,
|
|
278
|
-
loadInputsAndOutputs: () => {
|
|
279
|
-
/* FlareJS atomic transaction loading */
|
|
280
|
-
},
|
|
281
|
-
inputs: () => [],
|
|
282
|
-
outputs: () => [],
|
|
283
|
-
fee: () => ({ fee: this.transaction._fee.fee }),
|
|
284
|
-
feeRate: () => 0,
|
|
285
|
-
id: () => `${constants_1.FLARE_ATOMIC_PREFIX}${Date.now()}`,
|
|
286
|
-
type: this.transactionType,
|
|
287
|
-
};
|
|
288
|
-
return transaction;
|
|
289
|
-
}
|
|
290
|
-
catch (error) {
|
|
291
|
-
throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_ENHANCED_BUILD_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Parse and explain a transaction from hex using FlareJS compatibility
|
|
296
|
-
*/
|
|
297
|
-
explainTransaction() {
|
|
298
|
-
// FlareJS transaction parsing with atomic support
|
|
299
|
-
try {
|
|
300
|
-
return {
|
|
195
|
+
// TODO: Create actual FlareJS UnsignedTx
|
|
196
|
+
// For now, return a mock transaction that satisfies the interface
|
|
197
|
+
const mockTransaction = {
|
|
198
|
+
_id: 'mock-transaction-id',
|
|
199
|
+
_inputs: [],
|
|
200
|
+
_outputs: [],
|
|
201
|
+
_type: this.transactionType,
|
|
202
|
+
signature: [],
|
|
203
|
+
toBroadcastFormat: () => 'mock-tx-hex',
|
|
204
|
+
toJson: () => ({}),
|
|
205
|
+
explainTransaction: () => ({
|
|
301
206
|
type: this.transactionType,
|
|
302
207
|
inputs: [],
|
|
303
208
|
outputs: [],
|
|
304
|
-
outputAmount:
|
|
209
|
+
outputAmount: '0',
|
|
305
210
|
rewardAddresses: [],
|
|
306
|
-
id:
|
|
211
|
+
id: 'mock-transaction-id',
|
|
307
212
|
changeOutputs: [],
|
|
308
|
-
changeAmount:
|
|
309
|
-
fee: { fee:
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
213
|
+
changeAmount: '0',
|
|
214
|
+
fee: { fee: '0' },
|
|
215
|
+
}),
|
|
216
|
+
isTransactionForCChain: false,
|
|
217
|
+
fromAddresses: [],
|
|
218
|
+
validationErrors: [],
|
|
219
|
+
loadInputsAndOutputs: () => {
|
|
220
|
+
/* placeholder */
|
|
221
|
+
},
|
|
222
|
+
inputs: () => [],
|
|
223
|
+
outputs: () => [],
|
|
224
|
+
fee: () => ({ fee: '0' }),
|
|
225
|
+
feeRate: () => 0,
|
|
226
|
+
id: () => 'mock-transaction-id',
|
|
227
|
+
type: this.transactionType,
|
|
228
|
+
};
|
|
229
|
+
return mockTransaction;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Parse and explain a transaction from hex (placeholder implementation)
|
|
233
|
+
* TODO: Implement proper FlareJS transaction parsing
|
|
234
|
+
*/
|
|
235
|
+
explainTransaction() {
|
|
236
|
+
// TODO: Parse actual FlareJS transaction
|
|
237
|
+
// For now, return basic explanation
|
|
238
|
+
return {
|
|
239
|
+
type: this.transactionType,
|
|
240
|
+
inputs: [],
|
|
241
|
+
outputs: [],
|
|
242
|
+
outputAmount: '0',
|
|
243
|
+
rewardAddresses: [],
|
|
244
|
+
id: 'mock-transaction-id',
|
|
245
|
+
changeOutputs: [],
|
|
246
|
+
changeAmount: '0',
|
|
247
|
+
fee: { fee: '0' },
|
|
248
|
+
};
|
|
315
249
|
}
|
|
316
250
|
}
|
|
317
251
|
exports.AtomicTransactionBuilder = AtomicTransactionBuilder;
|
|
318
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbURBQStGO0FBQy9GLG1EQUFxRztBQUVyRywyQ0FnQ3FCO0FBQ3JCLG1DQUFpRDtBQUVqRDs7OztHQUlHO0FBQ0gsTUFBc0Isd0JBQXdCO0lBcUM1QyxZQUFZLFVBQWdDO1FBaENsQyxXQUFNLEdBQXFCLEVBQUUsQ0FBQztRQUU5QixnQkFBVyxHQWNqQjtZQUNGLFFBQVEsRUFBRSxFQUFFO1lBQ1osVUFBVSxFQUFFLDhCQUFrQjtZQUM5QixhQUFhLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBaUIsQ0FBQztZQUM5QyxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBaUIsQ0FBQztZQUN6QyxjQUFjLEVBQUUsRUFBRTtZQUNsQixHQUFHLEVBQUUsRUFBRTtZQUNQLFNBQVMsRUFBRSw0QkFBZ0I7WUFDM0IsVUFBVSxFQUFFLDZCQUFpQjtZQUM3QixJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsOEJBQWtCLEVBQUU7WUFDakMsY0FBYyxFQUFFLEtBQUs7WUFDckIsY0FBYyxFQUFFLFVBQVUsR0FBWTtnQkFDcEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDakIsQ0FBQztTQUNGLENBQUM7UUFHQSxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBSUQ7OztPQUdHO0lBQ08sVUFBVTtRQUNsQixtREFBbUQ7UUFDbkQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUNuQyxDQUFDO1FBRUQsd0VBQXdFO1FBQ3hFLGtGQUFrRjtRQUNsRixtREFBbUQ7UUFDbkQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLDJCQUFlLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQWM7UUFDM0IsSUFBSSxNQUFNLElBQUksdUJBQVcsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxpQ0FBcUIsQ0FBQyxDQUFDO1FBQ3pELENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ08sbUJBQW1CLENBQUMsV0FBeUI7UUFDckQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsbUNBQXVCLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsQ0FBQyxVQUFVLFlBQVksb0JBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQywrQkFBK0IsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMxRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ08saUJBQWlCLENBQUMsS0FBYTtRQUt2QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyx1QkFBVyxFQUFFLENBQUM7WUFDdkQsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGdDQUFvQixDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUF3QixFQUFFLENBQUM7UUFDdkMsTUFBTSxPQUFPLEdBQXlCLEVBQUUsQ0FBQztRQUN6QyxNQUFNLFdBQVcsR0FBaUIsRUFBRSxDQUFDO1FBRXJDLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNsQixNQUFNLGNBQWMsR0FBa0MsRUFBRSxDQUFDO1FBQ3pELElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBRXpCLHNFQUFzRTtRQUN0RSxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNqRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakMsSUFBSSxPQUFPLEdBQUcsT0FBTztnQkFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksT0FBTyxHQUFHLE9BQU87Z0JBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEMsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQztRQUVILGlEQUFpRDtRQUNqRCxLQUFLLE1BQU0sSUFBSSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQy9CLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFdkMsSUFBSSxRQUFRLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sQ0FBQyx3QkFBd0I7WUFDakMsQ0FBQztZQUVELGtCQUFrQjtZQUNsQixRQUFRLElBQUksVUFBVSxDQUFDO1lBRXZCLHFFQUFxRTtZQUNyRSxNQUFNLGlCQUFpQixHQUFhLEVBQUUsQ0FBQztZQUN2QyxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxFQUFFLENBQUM7b0JBQ2pDLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUMvQyxDQUFDO2dCQUNELGlCQUFpQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBRUQsNERBQTREO1lBQzVELElBQUksQ0FBQyxjQUFjLEdBQUcsaUJBQWlCLENBQUM7WUFFeEMsbURBQW1EO1lBQ25ELE1BQU0saUJBQWlCLEdBQUc7Z0JBQ3hCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksOEJBQWtCLENBQUMsTUFBTSxDQUFDLHFDQUF5QixDQUFDLEVBQUUsd0JBQVksQ0FBQztnQkFDbEcsV0FBVyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLDhCQUFrQixFQUFFLHlCQUFhLENBQUM7Z0JBQzFFLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUMxQixLQUFLLEVBQUU7b0JBQ0wsTUFBTSxFQUFFLFVBQVU7b0JBQ2xCLGNBQWMsRUFBRSxpQkFBaUI7b0JBQ2pDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztpQkFDMUI7YUFDRixDQUFDO1lBRUYscURBQXFEO1lBQ3JELE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlELENBQUMsQ0FBQztZQUUvRCxnREFBZ0Q7WUFDaEQsNkRBQTZEO1lBQzdELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDN0QsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBRUQsK0JBQStCO1FBQy9CLElBQUksUUFBUSxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyw0QkFBNEIsS0FBSyxVQUFVLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDekYsQ0FBQztRQUVELHNEQUFzRDtRQUN0RCxJQUFJLFFBQVEsR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUNyQixNQUFNLFlBQVksR0FBRyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBRXRDLCtDQUErQztZQUMvQyxNQUFNLFlBQVksR0FBRztnQkFDbkIsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQzFCLE1BQU0sRUFBRTtvQkFDTixNQUFNLEVBQUUsWUFBWTtvQkFDcEIsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYztvQkFDMUMsU0FBUyxFQUFFLENBQUM7b0JBQ1osUUFBUSxFQUFFLEVBQUU7aUJBQ2I7YUFDRixDQUFDO1lBRUYsMkRBQTJEO1lBQzNELE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBNkMsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsS0FBdUI7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNPLHFCQUFxQixDQUFDLGFBQXFCLEVBQUUsVUFBb0I7UUFDekUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksZ0NBQXFCLENBQUMsa0NBQXNCLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBRUQsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLHVCQUFXLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksZ0NBQXFCLENBQUMsa0NBQXNCLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN6QyxzQ0FBc0M7WUFDdEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM3QixPQUFPLElBQUksbUJBQVMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxzQ0FBMEIsQ0FBQyxDQUFDLENBQUM7WUFDbkUsQ0FBQztZQUVELDZCQUE2QjtZQUM3QixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLHNCQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyw2QkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDakYsSUFBSSxDQUFDLElBQUEsOEJBQXNCLEdBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGtDQUFrQyxLQUFLLCtCQUErQixDQUFDLENBQUM7WUFDMUcsQ0FBQztZQUVELHdDQUF3QztZQUN4QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSx3QkFBWSxDQUFDLENBQUM7WUFDdEQsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLHNDQUEwQixFQUFFLENBQUM7Z0JBQ2xELE1BQU0sSUFBSSxnQ0FBcUIsQ0FDN0IsK0JBQStCLEtBQUssS0FBSyxTQUFTLENBQUMsTUFBTSxlQUFlLHNDQUEwQixHQUFHLENBQ3RHLENBQUM7WUFDSixDQUFDO1lBRUQscURBQXFEO1lBQ3JELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBMEIsQ0FBQyxDQUFDO1lBQ25FLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUVsQyxJQUFJLENBQUM7Z0JBQ0gsT0FBTyxJQUFJLG1CQUFTLENBQUMsSUFBSSxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1lBQzFELENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sSUFBSSxnQ0FBcUIsQ0FDN0IsdUNBQXVDLEtBQUssS0FBSyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyx5QkFBYSxFQUFFLENBQzFHLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUM7WUFDSCxPQUFPLElBQUksb0JBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxnQ0FBcUIsQ0FDN0IsR0FBRywwQ0FBOEIsS0FBSyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyx5QkFBYSxFQUFFLENBQy9GLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVyxDQUFDLEdBQVk7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLENBQUMsTUFBdUI7UUFDMUIsaUVBQWlFO1FBQ2pFLElBQUksQ0FBQztZQUNILDJEQUEyRDtZQUMzRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxrQ0FBc0IsRUFBRSxDQUFDO2dCQUM5RCxNQUFNLElBQUksZ0NBQXFCLENBQUMscUNBQXlCLENBQUMsQ0FBQztZQUM3RCxDQUFDO1lBRUQsNkJBQTZCO1lBQzdCLE1BQU0sU0FBUyxHQUFHO2dCQUNoQixVQUFVLEVBQUUsTUFBTSxDQUFDLEdBQUc7Z0JBQ3RCLGFBQWEsRUFBRSwwQkFBYzthQUM5QixDQUFDO1lBRUYsNENBQTRDO1lBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUN4QyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFFdkMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxnQ0FBcUIsQ0FDN0IsR0FBRyx3Q0FBNEIsS0FBSyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyx5QkFBYSxFQUFFLENBQzdGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFDVCw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDO1lBQ0gsb0NBQW9DO1lBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxNQUFNLElBQUksZ0NBQXFCLENBQUMsc0NBQTBCLENBQUMsQ0FBQztZQUM5RCxDQUFDO1lBRUQsMkRBQTJEO1lBQzNELE1BQU0sV0FBVyxHQUFHO2dCQUNsQixHQUFHLEVBQUUsR0FBRyxpQ0FBcUIsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQzVDLE9BQU8sRUFBRSxFQUFFO2dCQUNYLFFBQVEsRUFBRSxFQUFFO2dCQUNaLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZTtnQkFDM0IsU0FBUyxFQUFFLEVBQWM7Z0JBRXpCLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWM7Z0JBQzlDLGdCQUFnQixFQUFFLEVBQUU7Z0JBRXBCLHNDQUFzQztnQkFDdEMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxpQ0FBcUIsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2hFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO29CQUNiLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZTtpQkFDM0IsQ0FBQztnQkFFRixrQkFBa0IsRUFBRSxHQUEyQixFQUFFLENBQUMsQ0FBQztvQkFDakQsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlO29CQUMxQixNQUFNLEVBQUUsRUFBRTtvQkFDVixPQUFPLEVBQUUsRUFBRTtvQkFDWCxZQUFZLEVBQUUsOEJBQWtCO29CQUNoQyxlQUFlLEVBQUUsRUFBRTtvQkFDbkIsRUFBRSxFQUFFLEdBQUcsK0JBQW1CLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUN6QyxhQUFhLEVBQUUsRUFBRTtvQkFDakIsWUFBWSxFQUFFLDhCQUFrQjtvQkFDaEMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtpQkFDeEMsQ0FBQztnQkFFRixzQkFBc0IsRUFBRSxLQUFLO2dCQUM3QixvQkFBb0IsRUFBRSxHQUFHLEVBQUU7b0JBQ3pCLHdDQUF3QztnQkFDMUMsQ0FBQztnQkFDRCxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRTtnQkFDaEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7Z0JBQ2pCLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUMvQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDaEIsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsK0JBQW1CLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUMvQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWU7YUFDRyxDQUFDO1lBRWhDLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLGdDQUFxQixDQUM3QixHQUFHLHVDQUEyQixLQUFLLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLHlCQUFhLEVBQUUsQ0FDNUYsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxrQkFBa0I7UUFDaEIsa0RBQWtEO1FBQ2xELElBQUksQ0FBQztZQUNILE9BQU87Z0JBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlO2dCQUMxQixNQUFNLEVBQUUsRUFBRTtnQkFDVixPQUFPLEVBQUUsRUFBRTtnQkFDWCxZQUFZLEVBQUUsOEJBQWtCO2dCQUNoQyxlQUFlLEVBQUUsRUFBRTtnQkFDbkIsRUFBRSxFQUFFLEdBQUcsc0NBQTBCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNoRCxhQUFhLEVBQUUsRUFBRTtnQkFDakIsWUFBWSxFQUFFLDhCQUFrQjtnQkFDaEMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTthQUN4QyxDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksZ0NBQXFCLENBQzdCLEdBQUcsdUNBQTJCLEtBQUssS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMseUJBQWEsRUFBRSxDQUM1RixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQTFYRCw0REEwWEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSwgQmFzZVRyYW5zYWN0aW9uIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQ3JlZGVudGlhbCwgU2lnbmF0dXJlLCBUcmFuc2ZlcmFibGVJbnB1dCwgVHJhbnNmZXJhYmxlT3V0cHV0IH0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sIERlY29kZWRVdHhvT2JqIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQge1xuICBBU1NFVF9JRF9MRU5HVEgsXG4gIFRSQU5TQUNUSU9OX0lEX0hFWF9MRU5HVEgsXG4gIFBSSVZBVEVfS0VZX0hFWF9MRU5HVEgsXG4gIFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RILFxuICBUUkFOU0FDVElPTl9JRF9QUkVGSVgsXG4gIERFRkFVTFRfTkVUV09SS19JRCxcbiAgRU1QVFlfQlVGRkVSX1NJWkUsXG4gIEhFWF9QUkVGSVgsXG4gIEhFWF9QUkVGSVhfTEVOR1RILFxuICBERUNJTUFMX1JBRElYLFxuICBTSUdOSU5HX01FVEhPRCxcbiAgQU1PVU5UX1NUUklOR19aRVJPLFxuICBERUZBVUxUX0xPQ0tUSU1FLFxuICBERUZBVUxUX1RIUkVTSE9MRCxcbiAgWkVST19CSUdJTlQsXG4gIFpFUk9fTlVNQkVSLFxuICBFUlJPUl9BTU9VTlRfUE9TSVRJVkUsXG4gIEVSUk9SX0NSRURFTlRJQUxTX0FSUkFZLFxuICBFUlJPUl9VVFhPU19SRVFVSVJFRCxcbiAgRVJST1JfU0lHTkFUVVJFU19BUlJBWSxcbiAgRVJST1JfU0lHTkFUVVJFU19FTVBUWSxcbiAgRVJST1JfSU5WQUxJRF9QUklWQVRFX0tFWSxcbiAgRVJST1JfVVRYT1NfUkVRVUlSRURfQlVJTEQsXG4gIEVSUk9SX0VOSEFOQ0VEX0JVSUxEX0ZBSUxFRCxcbiAgRVJST1JfRU5IQU5DRURfUEFSU0VfRkFJTEVELFxuICBFUlJPUl9GTEFSRUpTX1NJR05JTkdfRkFJTEVELFxuICBFUlJPUl9DUkVBVEVfQ1JFREVOVElBTF9GQUlMRUQsXG4gIEVSUk9SX1VOS05PV04sXG4gIEZMQVJFX0FUT01JQ19QUkVGSVgsXG4gIEZMQVJFX0FUT01JQ19QQVJTRURfUFJFRklYLFxuICBIRVhfRU5DT0RJTkcsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IGNyZWF0ZUZsZXhpYmxlSGV4UmVnZXggfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBGbGFyZSBQLWNoYWluIGF0b21pYyB0cmFuc2FjdGlvbiBidWlsZGVyIHdpdGggRmxhcmVKUyBjcmVkZW50aWFsIHN1cHBvcnQuXG4gKiBUaGlzIHByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBidWlsZGluZyBGbGFyZSBQLWNoYWluIHRyYW5zYWN0aW9ucyB3aXRoIHByb3BlclxuICogY3JlZGVudGlhbCBoYW5kbGluZyB1c2luZyBGbGFyZUpTIENyZWRlbnRpYWwgYW5kIFNpZ25hdHVyZSBjbGFzc2VzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPjtcbiAgLy8gRXh0ZXJuYWwgY2hhaW4gaWQgKGRlc3RpbmF0aW9uKSBmb3IgZXhwb3J0IHRyYW5zYWN0aW9uc1xuICBwcm90ZWN0ZWQgX2V4dGVybmFsQ2hhaW5JZDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBfdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXTtcblxuICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IHtcbiAgICBfbmV0d29yazogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgX25ldHdvcmtJRDogbnVtYmVyO1xuICAgIF9ibG9ja2NoYWluSUQ6IEJ1ZmZlcjtcbiAgICBfYXNzZXRJZDogQnVmZmVyO1xuICAgIF9mcm9tQWRkcmVzc2VzOiBzdHJpbmdbXTtcbiAgICBfdG86IHN0cmluZ1tdO1xuICAgIF9sb2NrdGltZTogYmlnaW50O1xuICAgIF90aHJlc2hvbGQ6IG51bWJlcjtcbiAgICBfZmVlOiB7IGZlZTogc3RyaW5nOyBmZWVSYXRlPzogc3RyaW5nOyBzaXplPzogbnVtYmVyIH07XG4gICAgaGFzQ3JlZGVudGlhbHM6IGJvb2xlYW47XG4gICAgX3R4PzogdW5rbm93bjtcbiAgICBfc2lnbmF0dXJlPzogdW5rbm93bjtcbiAgICBzZXRUcmFuc2FjdGlvbjogKHR4OiB1bmtub3duKSA9PiB2b2lkO1xuICB9ID0ge1xuICAgIF9uZXR3b3JrOiB7fSxcbiAgICBfbmV0d29ya0lEOiBERUZBVUxUX05FVFdPUktfSUQsXG4gICAgX2Jsb2NrY2hhaW5JRDogQnVmZmVyLmFsbG9jKEVNUFRZX0JVRkZFUl9TSVpFKSxcbiAgICBfYXNzZXRJZDogQnVmZmVyLmFsbG9jKEVNUFRZX0JVRkZFUl9TSVpFKSxcbiAgICBfZnJvbUFkZHJlc3NlczogW10sXG4gICAgX3RvOiBbXSxcbiAgICBfbG9ja3RpbWU6IERFRkFVTFRfTE9DS1RJTUUsXG4gICAgX3RocmVzaG9sZDogREVGQVVMVF9USFJFU0hPTEQsXG4gICAgX2ZlZTogeyBmZWU6IEFNT1VOVF9TVFJJTkdfWkVSTyB9LFxuICAgIGhhc0NyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICBzZXRUcmFuc2FjdGlvbjogZnVuY3Rpb24gKF90eDogdW5rbm93bikge1xuICAgICAgdGhpcy5fdHggPSBfdHg7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHRoaXMuX2NvaW5Db25maWcgPSBjb2luQ29uZmlnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFzc2V0IElEIGZvciBGbGFyZSBuZXR3b3JrIHRyYW5zYWN0aW9uc1xuICAgKiBAcmV0dXJucyBCdWZmZXIgY29udGFpbmluZyB0aGUgYXNzZXQgSURcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBc3NldElkKCk6IEJ1ZmZlciB7XG4gICAgLy8gVXNlIHRoZSBhc3NldCBJRCBmcm9tIHRyYW5zYWN0aW9uIGlmIGFscmVhZHkgc2V0XG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQgJiYgdGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZDtcbiAgICB9XG5cbiAgICAvLyBGb3IgbmF0aXZlIEZMUiB0cmFuc2FjdGlvbnMsIHJldHVybiB6ZXJvLWZpbGxlZCBidWZmZXIgYXMgcGxhY2Vob2xkZXJcbiAgICAvLyBJbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHRoaXMgd291bGQgYmUgb2J0YWluZWQgZnJvbSB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uXG4gICAgLy8gb3IgRmxhcmVKUyBBUEkgdG8gZ2V0IHRoZSBhY3R1YWwgbmF0aXZlIGFzc2V0IElEXG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYyhBU1NFVF9JRF9MRU5HVEgpO1xuICB9XG5cbiAgdmFsaWRhdGVBbW91bnQoYW1vdW50OiBiaWdpbnQpOiB2b2lkIHtcbiAgICBpZiAoYW1vdW50IDw9IFpFUk9fQklHSU5UKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX0FNT1VOVF9QT1NJVElWRSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IGNyZWRlbnRpYWxzIGFycmF5IGlzIHByb3Blcmx5IGZvcm1lZFxuICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgLSBBcnJheSBvZiBjcmVkZW50aWFscyB0byB2YWxpZGF0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlQ3JlZGVudGlhbHMoY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXSk6IHZvaWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShjcmVkZW50aWFscykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfQ1JFREVOVElBTFNfQVJSQVkpO1xuICAgIH1cblxuICAgIGNyZWRlbnRpYWxzLmZvckVhY2goKGNyZWRlbnRpYWwsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIShjcmVkZW50aWFsIGluc3RhbmNlb2YgQ3JlZGVudGlhbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBjcmVkZW50aWFsIGF0IGluZGV4ICR7aW5kZXh9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBpbnB1dHMsIG91dHB1dHMsIGFuZCBjcmVkZW50aWFscyBmb3IgRmxhcmUgUC1jaGFpbiBhdG9taWMgdHJhbnNhY3Rpb25zLlxuICAgKiBCYXNlZCBvbiBBVkFYIFAtY2hhaW4gaW1wbGVtZW50YXRpb24gYWRhcHRlZCBmb3IgRmxhcmVKUy5cbiAgICpcbiAgICogTm90ZTogVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW1wbGVtZW50YXRpb24gdGhhdCBjcmVhdGVzIHRoZSBjb3JlIHN0cnVjdHVyZS5cbiAgICogVGhlIEZsYXJlSlMgdHlwZSBzeXN0ZW0gaW50ZWdyYXRpb24gd2lsbCBiZSByZWZpbmVkIGluIGZ1dHVyZSBpdGVyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gdG90YWwgLSBUb3RhbCBhbW91bnQgbmVlZGVkIGluY2x1ZGluZyBmZWVzXG4gICAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIFRyYW5zZmVyYWJsZUlucHV0W10sIFRyYW5zZmVyYWJsZU91dHB1dFtdLCBhbmQgQ3JlZGVudGlhbFtdXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlSW5wdXRPdXRwdXQodG90YWw6IGJpZ2ludCk6IHtcbiAgICBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAgb3V0cHV0czogVHJhbnNmZXJhYmxlT3V0cHV0W107XG4gICAgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgfSB7XG4gICAgaWYgKCF0aGlzLl91dHhvcyB8fCB0aGlzLl91dHhvcy5sZW5ndGggPT09IFpFUk9fTlVNQkVSKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX1VUWE9TX1JFUVVJUkVEKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXTtcbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXSA9IFtdO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10gPSBbXTtcblxuICAgIGxldCBpbnB1dFN1bSA9IDBuO1xuICAgIGNvbnN0IGFkZHJlc3NJbmRpY2VzOiB7IFthZGRyZXNzOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgIGxldCBuZXh0QWRkcmVzc0luZGV4ID0gMDtcblxuICAgIC8vIFNvcnQgVVRYT3MgYnkgYW1vdW50IGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yIG9wdGltYWwgY29pbiBzZWxlY3Rpb25cbiAgICBjb25zdCBzb3J0ZWRVdHhvcyA9IFsuLi50aGlzLl91dHhvc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYW1vdW50QSA9IEJpZ0ludChhLmFtb3VudCk7XG4gICAgICBjb25zdCBhbW91bnRCID0gQmlnSW50KGIuYW1vdW50KTtcbiAgICAgIGlmIChhbW91bnRBID4gYW1vdW50QikgcmV0dXJuIC0xO1xuICAgICAgaWYgKGFtb3VudEEgPCBhbW91bnRCKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgLy8gUHJvY2VzcyBVVFhPcyB0byBjcmVhdGUgaW5wdXRzIGFuZCBjcmVkZW50aWFsc1xuICAgIGZvciAoY29uc3QgdXR4byBvZiBzb3J0ZWRVdHhvcykge1xuICAgICAgY29uc3QgdXR4b0Ftb3VudCA9IEJpZ0ludCh1dHhvLmFtb3VudCk7XG5cbiAgICAgIGlmIChpbnB1dFN1bSA+PSB0b3RhbCkge1xuICAgICAgICBicmVhazsgLy8gV2UgaGF2ZSBlbm91Z2ggaW5wdXRzXG4gICAgICB9XG5cbiAgICAgIC8vIFRyYWNrIGlucHV0IHN1bVxuICAgICAgaW5wdXRTdW0gKz0gdXR4b0Ftb3VudDtcblxuICAgICAgLy8gVHJhY2sgYWRkcmVzcyBpbmRpY2VzIGZvciBzaWduYXR1cmUgb3JkZXJpbmcgKG1pbWljcyBBVkFYIHBhdHRlcm4pXG4gICAgICBjb25zdCBhZGRyZXNzSW5kZXhBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiB1dHhvLmFkZHJlc3Nlcykge1xuICAgICAgICBpZiAoIShhZGRyZXNzIGluIGFkZHJlc3NJbmRpY2VzKSkge1xuICAgICAgICAgIGFkZHJlc3NJbmRpY2VzW2FkZHJlc3NdID0gbmV4dEFkZHJlc3NJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGFkZHJlc3NJbmRleEFycmF5LnB1c2goYWRkcmVzc0luZGljZXNbYWRkcmVzc10pO1xuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSBhZGRyZXNzIGluZGljZXMgb24gdGhlIFVUWE8gZm9yIGNyZWRlbnRpYWwgY3JlYXRpb25cbiAgICAgIHV0eG8uYWRkcmVzc2VzSW5kZXggPSBhZGRyZXNzSW5kZXhBcnJheTtcblxuICAgICAgLy8gQ3JlYXRlIFRyYW5zZmVyYWJsZUlucHV0IGZvciBhdG9taWMgdHJhbnNhY3Rpb25zXG4gICAgICBjb25zdCB0cmFuc2ZlcmFibGVJbnB1dCA9IHtcbiAgICAgICAgdHhJRDogQnVmZmVyLmZyb20odXR4by50eGlkIHx8IEFNT1VOVF9TVFJJTkdfWkVSTy5yZXBlYXQoVFJBTlNBQ1RJT05fSURfSEVYX0xFTkdUSCksIEhFWF9FTkNPRElORyksXG4gICAgICAgIG91dHB1dEluZGV4OiBwYXJzZUludCh1dHhvLm91dHB1dGlkeCB8fCBBTU9VTlRfU1RSSU5HX1pFUk8sIERFQ0lNQUxfUkFESVgpLFxuICAgICAgICBhc3NldElEOiB0aGlzLmdldEFzc2V0SWQoKSxcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBhbW91bnQ6IHV0eG9BbW91bnQsXG4gICAgICAgICAgYWRkcmVzc0luZGljZXM6IGFkZHJlc3NJbmRleEFycmF5LFxuICAgICAgICAgIHRocmVzaG9sZDogdXR4by50aHJlc2hvbGQsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBTdG9yZSB0aGUgaW5wdXQgKHR5cGUgYXNzZXJ0aW9uIGZvciBjb21wYXRpYmlsaXR5KVxuICAgICAgaW5wdXRzLnB1c2godHJhbnNmZXJhYmxlSW5wdXQgYXMgdW5rbm93biBhcyBUcmFuc2ZlcmFibGVJbnB1dCk7XG5cbiAgICAgIC8vIENyZWF0ZSBjcmVkZW50aWFsIHdpdGggcGxhY2Vob2xkZXIgc2lnbmF0dXJlc1xuICAgICAgLy8gSW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCB0aGVzZSB3b3VsZCBiZSBhY3R1YWwgc2lnbmF0dXJlc1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHV0eG8udGhyZXNob2xkIH0sICgpID0+ICcnKTtcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWwgPSB0aGlzLmNyZWF0ZUZsYXJlQ3JlZGVudGlhbCgwLCBzaWduYXR1cmVzKTtcbiAgICAgIGNyZWRlbnRpYWxzLnB1c2goY3JlZGVudGlhbCk7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5IHdlIGhhdmUgZW5vdWdoIGlucHV0c1xuICAgIGlmIChpbnB1dFN1bSA8IHRvdGFsKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnN1ZmZpY2llbnQgZnVuZHM6IG5lZWQgJHt0b3RhbH0sIGhhdmUgJHtpbnB1dFN1bX1gKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY2hhbmdlIG91dHB1dCBpZiB3ZSBoYXZlIGV4Y2VzcyBpbnB1dCBhbW91bnRcbiAgICBpZiAoaW5wdXRTdW0gPiB0b3RhbCkge1xuICAgICAgY29uc3QgY2hhbmdlQW1vdW50ID0gaW5wdXRTdW0gLSB0b3RhbDtcblxuICAgICAgLy8gQ3JlYXRlIGNoYW5nZSBvdXRwdXQgZm9yIGF0b21pYyB0cmFuc2FjdGlvbnNcbiAgICAgIGNvbnN0IGNoYW5nZU91dHB1dCA9IHtcbiAgICAgICAgYXNzZXRJRDogdGhpcy5nZXRBc3NldElkKCksXG4gICAgICAgIG91dHB1dDoge1xuICAgICAgICAgIGFtb3VudDogY2hhbmdlQW1vdW50LFxuICAgICAgICAgIGFkZHJlc3NlczogdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgICAgbG9ja3RpbWU6IDBuLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgLy8gQWRkIHRoZSBjaGFuZ2Ugb3V0cHV0ICh0eXBlIGFzc2VydGlvbiBmb3IgY29tcGF0aWJpbGl0eSlcbiAgICAgIG91dHB1dHMucHVzaChjaGFuZ2VPdXRwdXQgYXMgdW5rbm93biBhcyBUcmFuc2ZlcmFibGVPdXRwdXQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGlucHV0cywgb3V0cHV0cywgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgVVRYT3MgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBpcyByZXF1aXJlZCBmb3IgY3JlYXRpbmcgaW5wdXRzIGFuZCBvdXRwdXRzLlxuICAgKlxuICAgKiBAcGFyYW0gdXR4b3MgLSBBcnJheSBvZiBkZWNvZGVkIFVUWE8gb2JqZWN0c1xuICAgKiBAcmV0dXJucyB0aGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICB1dHhvcyh1dHhvczogRGVjb2RlZFV0eG9PYmpbXSk6IHRoaXMge1xuICAgIHRoaXMuX3V0eG9zID0gdXR4b3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRmxhcmUgZXF1aXZhbGVudCBvZiBBdmFsYW5jaGUncyBTZWxlY3RDcmVkZW50aWFsQ2xhc3NcbiAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgd2l0aCB0aGUgcHJvdmlkZWQgc2lnbmF0dXJlc1xuICAgKlxuICAgKiBAcGFyYW0gY3JlZGVudGlhbElkIC0gVGhlIGNyZWRlbnRpYWwgSUQgKG5vdCB1c2VkIGluIEZsYXJlSlMgYnV0IGtlcHQgZm9yIGNvbXBhdGliaWxpdHkpXG4gICAqIEBwYXJhbSBzaWduYXR1cmVzIC0gQXJyYXkgb2Ygc2lnbmF0dXJlIGhleCBzdHJpbmdzIG9yIGVtcHR5IHN0cmluZ3MgZm9yIHBsYWNlaG9sZGVyc1xuICAgKiBAcmV0dXJucyBDcmVkZW50aWFsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlRmxhcmVDcmVkZW50aWFsKF9jcmVkZW50aWFsSWQ6IG51bWJlciwgc2lnbmF0dXJlczogc3RyaW5nW10pOiBDcmVkZW50aWFsIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2lnbmF0dXJlcykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfU0lHTkFUVVJFU19BUlJBWSk7XG4gICAgfVxuXG4gICAgaWYgKHNpZ25hdHVyZXMubGVuZ3RoID09PSBaRVJPX05VTUJFUikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9TSUdOQVRVUkVTX0VNUFRZKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWdzID0gc2lnbmF0dXJlcy5tYXAoKHNpZywgaW5kZXgpID0+IHtcbiAgICAgIC8vIEhhbmRsZSBlbXB0eS9wbGFjZWhvbGRlciBzaWduYXR1cmVzXG4gICAgICBpZiAoIXNpZyB8fCBzaWcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKG5ldyBVaW50OEFycmF5KFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGhleCBzdHJpbmcgZm9ybWF0XG4gICAgICBjb25zdCBjbGVhblNpZyA9IHNpZy5zdGFydHNXaXRoKEhFWF9QUkVGSVgpID8gc2lnLnNsaWNlKEhFWF9QUkVGSVhfTEVOR1RIKSA6IHNpZztcbiAgICAgIGlmICghY3JlYXRlRmxleGlibGVIZXhSZWdleCgpLnRlc3QoY2xlYW5TaWcpKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgaGV4IHNpZ25hdHVyZSBhdCBpbmRleCAke2luZGV4fTogY29udGFpbnMgbm9uLWhleCBjaGFyYWN0ZXJzYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnQgdG8gYnVmZmVyIGFuZCB2YWxpZGF0ZSBsZW5ndGhcbiAgICAgIGNvbnN0IHNpZ0J1ZmZlciA9IEJ1ZmZlci5mcm9tKGNsZWFuU2lnLCBIRVhfRU5DT0RJTkcpO1xuICAgICAgaWYgKHNpZ0J1ZmZlci5sZW5ndGggPiBTRUNQMjU2SzFfU0lHTkFUVVJFX0xFTkdUSCkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgIGBTaWduYXR1cmUgdG9vIGxvbmcgYXQgaW5kZXggJHtpbmRleH06ICR7c2lnQnVmZmVyLmxlbmd0aH0gYnl0ZXMgKG1heCAke1NFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIfSlgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBmaXhlZC1sZW5ndGggYnVmZmVyIGFuZCBjb3B5IHNpZ25hdHVyZSBkYXRhXG4gICAgICBjb25zdCBmaXhlZExlbmd0aEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhTRUNQMjU2SzFfU0lHTkFUVVJFX0xFTkdUSCk7XG4gICAgICBzaWdCdWZmZXIuY29weShmaXhlZExlbmd0aEJ1ZmZlcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKG5ldyBVaW50OEFycmF5KGZpeGVkTGVuZ3RoQnVmZmVyKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIHNpZ25hdHVyZSBhdCBpbmRleCAke2luZGV4fTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgQ3JlZGVudGlhbChzaWdzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYCR7RVJST1JfQ1JFQVRFX0NSRURFTlRJQUxfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmFzZSBpbml0QnVpbGRlciB1c2VkIGJ5IGNvbmNyZXRlIGJ1aWxkZXJzLiBGb3Igbm93IGp1c3QgcmV0dXJucyB0aGlzIHNvIGZsdWVudCBBUEkgd29ya3MuXG4gICAqL1xuICBpbml0QnVpbGRlcihfdHg6IHVua25vd24pOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIHRyYW5zYWN0aW9uIHdpdGggcHJpdmF0ZSBrZXkgdXNpbmcgRmxhcmVKUyBjb21wYXRpYmlsaXR5XG4gICAqL1xuICBzaWduKHBhcmFtczogeyBrZXk6IHN0cmluZyB9KTogdGhpcyB7XG4gICAgLy8gRmxhcmVKUyBzaWduaW5nIGltcGxlbWVudGF0aW9uIHdpdGggYXRvbWljIHRyYW5zYWN0aW9uIHN1cHBvcnRcbiAgICB0cnkge1xuICAgICAgLy8gVmFsaWRhdGUgcHJpdmF0ZSBrZXkgZm9ybWF0IChwbGFjZWhvbGRlciBpbXBsZW1lbnRhdGlvbilcbiAgICAgIGlmICghcGFyYW1zLmtleSB8fCBwYXJhbXMua2V5Lmxlbmd0aCA8IFBSSVZBVEVfS0VZX0hFWF9MRU5HVEgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9JTlZBTElEX1BSSVZBVEVfS0VZKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHNpZ25hdHVyZSBzdHJ1Y3R1cmVcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHtcbiAgICAgICAgcHJpdmF0ZUtleTogcGFyYW1zLmtleSxcbiAgICAgICAgc2lnbmluZ01ldGhvZDogU0lHTklOR19NRVRIT0QsXG4gICAgICB9O1xuXG4gICAgICAvLyBTdG9yZSBzaWduYXR1cmUgZm9yIEZsYXJlSlMgY29tcGF0aWJpbGl0eVxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fc2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuICAgICAgdGhpcy50cmFuc2FjdGlvbi5oYXNDcmVkZW50aWFscyA9IHRydWU7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgJHtFUlJPUl9GTEFSRUpTX1NJR05JTkdfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIHRyYW5zYWN0aW9uIHVzaW5nIEZsYXJlSlMgY29tcGF0aWJpbGl0eVxuICAgKi9cbiAgYXN5bmMgYnVpbGQoKTogUHJvbWlzZTxCYXNlVHJhbnNhY3Rpb24+IHtcbiAgICAvLyBGbGFyZUpTIFVuc2lnbmVkVHggY3JlYXRpb24gd2l0aCBhdG9taWMgdHJhbnNhY3Rpb24gc3VwcG9ydFxuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSB0cmFuc2FjdGlvbiByZXF1aXJlbWVudHNcbiAgICAgIGlmICghdGhpcy5fdXR4b3MgfHwgdGhpcy5fdXR4b3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfVVRYT1NfUkVRVUlSRURfQlVJTEQpO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgRmxhcmVKUyB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUgd2l0aCBhdG9taWMgc3VwcG9ydFxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB7XG4gICAgICAgIF9pZDogYCR7VFJBTlNBQ1RJT05fSURfUFJFRklYfSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICBfaW5wdXRzOiBbXSxcbiAgICAgICAgX291dHB1dHM6IFtdLFxuICAgICAgICBfdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICAgIHNpZ25hdHVyZTogW10gYXMgc3RyaW5nW10sXG5cbiAgICAgICAgZnJvbUFkZHJlc3NlczogdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyxcbiAgICAgICAgdmFsaWRhdGlvbkVycm9yczogW10sXG5cbiAgICAgICAgLy8gRmxhcmVKUyBtZXRob2RzIHdpdGggYXRvbWljIHN1cHBvcnRcbiAgICAgICAgdG9Ccm9hZGNhc3RGb3JtYXQ6ICgpID0+IGAke1RSQU5TQUNUSU9OX0lEX1BSRUZJWH0ke0RhdGUubm93KCl9YCxcbiAgICAgICAgdG9Kc29uOiAoKSA9PiAoe1xuICAgICAgICAgIHR5cGU6IHRoaXMudHJhbnNhY3Rpb25UeXBlLFxuICAgICAgICB9KSxcblxuICAgICAgICBleHBsYWluVHJhbnNhY3Rpb246ICgpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0+ICh7XG4gICAgICAgICAgdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICAgICAgaW5wdXRzOiBbXSxcbiAgICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgICBvdXRwdXRBbW91bnQ6IEFNT1VOVF9TVFJJTkdfWkVSTyxcbiAgICAgICAgICByZXdhcmRBZGRyZXNzZXM6IFtdLFxuICAgICAgICAgIGlkOiBgJHtGTEFSRV9BVE9NSUNfUFJFRklYfSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICAgIGNoYW5nZUFtb3VudDogQU1PVU5UX1NUUklOR19aRVJPLFxuICAgICAgICAgIGZlZTogeyBmZWU6IHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgfSxcbiAgICAgICAgfSksXG5cbiAgICAgICAgaXNUcmFuc2FjdGlvbkZvckNDaGFpbjogZmFsc2UsXG4gICAgICAgIGxvYWRJbnB1dHNBbmRPdXRwdXRzOiAoKSA9PiB7XG4gICAgICAgICAgLyogRmxhcmVKUyBhdG9taWMgdHJhbnNhY3Rpb24gbG9hZGluZyAqL1xuICAgICAgICB9LFxuICAgICAgICBpbnB1dHM6ICgpID0+IFtdLFxuICAgICAgICBvdXRwdXRzOiAoKSA9PiBbXSxcbiAgICAgICAgZmVlOiAoKSA9PiAoeyBmZWU6IHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgfSksXG4gICAgICAgIGZlZVJhdGU6ICgpID0+IDAsXG4gICAgICAgIGlkOiAoKSA9PiBgJHtGTEFSRV9BVE9NSUNfUFJFRklYfSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICB0eXBlOiB0aGlzLnRyYW5zYWN0aW9uVHlwZSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBCYXNlVHJhbnNhY3Rpb247XG5cbiAgICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYCR7RVJST1JfRU5IQU5DRURfQlVJTERfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYW5kIGV4cGxhaW4gYSB0cmFuc2FjdGlvbiBmcm9tIGhleCB1c2luZyBGbGFyZUpTIGNvbXBhdGliaWxpdHlcbiAgICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICAvLyBGbGFyZUpTIHRyYW5zYWN0aW9uIHBhcnNpbmcgd2l0aCBhdG9taWMgc3VwcG9ydFxuICAgIHRyeSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiB0aGlzLnRyYW5zYWN0aW9uVHlwZSxcbiAgICAgICAgaW5wdXRzOiBbXSxcbiAgICAgICAgb3V0cHV0czogW10sXG4gICAgICAgIG91dHB1dEFtb3VudDogQU1PVU5UX1NUUklOR19aRVJPLFxuICAgICAgICByZXdhcmRBZGRyZXNzZXM6IFtdLFxuICAgICAgICBpZDogYCR7RkxBUkVfQVRPTUlDX1BBUlNFRF9QUkVGSVh9JHtEYXRlLm5vdygpfWAsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6IEFNT1VOVF9TVFJJTkdfWkVSTyxcbiAgICAgICAgZmVlOiB7IGZlZTogdGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZSB9LFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYCR7RVJST1JfRU5IQU5DRURfUEFSU0VfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
252
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbURBQStGO0FBQy9GLG1EQUFxRztBQUdyRyxtQ0FBbUM7QUFDbkMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUM7QUFFdEM7Ozs7R0FJRztBQUNILE1BQXNCLHdCQUF3QjtJQW9DNUMsWUFBWSxVQUFnQztRQS9CbEMsV0FBTSxHQUFxQixFQUFFLENBQUM7UUFFOUIsZ0JBQVcsR0FhakI7WUFDRixRQUFRLEVBQUUsRUFBRTtZQUNaLFVBQVUsRUFBRSxDQUFDO1lBQ2IsYUFBYSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzlCLFFBQVEsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN6QixjQUFjLEVBQUUsRUFBRTtZQUNsQixHQUFHLEVBQUUsRUFBRTtZQUNQLFNBQVMsRUFBRSxFQUFFO1lBQ2IsVUFBVSxFQUFFLENBQUM7WUFDYixJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO1lBQ2xCLGNBQWMsRUFBRSxLQUFLO1lBQ3JCLGNBQWMsRUFBRSxVQUFVLEdBQVk7Z0JBQ3BDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQ2pCLENBQUM7U0FDRixDQUFDO1FBR0EsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7SUFDaEMsQ0FBQztJQUlELGNBQWMsQ0FBQyxNQUFjO1FBQzNCLElBQUksTUFBTSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ08sbUJBQW1CLENBQUMsV0FBeUI7UUFDckQsSUFBSSxDQUFDLEtBQUss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RyxFQUFFO2FBQ2xCLENBQUM7WUFDRixzQkFBc0IsRUFBRSxLQUFLO1lBQzdCLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLGdCQUFnQixFQUFFLEVBQUU7WUFDcEIsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO2dCQUN6QixpQkFBaUI7WUFDbkIsQ0FBQztZQUNELE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO1lBQ2hCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO1lBQ2pCLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ2hCLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxxQkFBcUI7WUFDL0IsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlO1NBQ0csQ0FBQztRQUVoQyxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsa0JBQWtCO1FBQ2hCLHlDQUF5QztRQUN6QyxvQ0FBb0M7UUFDcEMsT0FBTztZQUNMLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZTtZQUMxQixNQUFNLEVBQUUsRUFBRTtZQUNWLE9BQU8sRUFBRSxFQUFFO1lBQ1gsWUFBWSxFQUFFLEdBQUc7WUFDakIsZUFBZSxFQUFFLEVBQUU7WUFDbkIsRUFBRSxFQUFFLHFCQUFxQjtZQUN6QixhQUFhLEVBQUUsRUFBRTtZQUNqQixZQUFZLEVBQUUsR0FBRztZQUNqQixHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO1NBQ2xCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF2U0QsNERBdVNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBUcmFuc2FjdGlvblR5cGUsIEJhc2VUcmFuc2FjdGlvbiB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IENyZWRlbnRpYWwsIFNpZ25hdHVyZSwgVHJhbnNmZXJhYmxlSW5wdXQsIFRyYW5zZmVyYWJsZU91dHB1dCB9IGZyb20gJ0BmbGFyZW5ldHdvcmsvZmxhcmVqcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLCBEZWNvZGVkVXR4b09iaiB9IGZyb20gJy4vaWZhY2UnO1xuXG4vLyBDb25zdGFudHMgZm9yIHNpZ25hdHVyZSBoYW5kbGluZ1xuY29uc3QgU0VDUDI1NksxX1NJR05BVFVSRV9MRU5HVEggPSA2NTtcblxuLyoqXG4gKiBGbGFyZSBQLWNoYWluIGF0b21pYyB0cmFuc2FjdGlvbiBidWlsZGVyIHdpdGggRmxhcmVKUyBjcmVkZW50aWFsIHN1cHBvcnQuXG4gKiBUaGlzIHByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBidWlsZGluZyBGbGFyZSBQLWNoYWluIHRyYW5zYWN0aW9ucyB3aXRoIHByb3BlclxuICogY3JlZGVudGlhbCBoYW5kbGluZyB1c2luZyBGbGFyZUpTIENyZWRlbnRpYWwgYW5kIFNpZ25hdHVyZSBjbGFzc2VzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPjtcbiAgLy8gRXh0ZXJuYWwgY2hhaW4gaWQgKGRlc3RpbmF0aW9uKSBmb3IgZXhwb3J0IHRyYW5zYWN0aW9uc1xuICBwcm90ZWN0ZWQgX2V4dGVybmFsQ2hhaW5JZDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBfdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXTtcblxuICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IHtcbiAgICBfbmV0d29yazogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgX25ldHdvcmtJRDogbnVtYmVyO1xuICAgIF9ibG9ja2NoYWluSUQ6IEJ1ZmZlcjtcbiAgICBfYXNzZXRJZDogQnVmZmVyO1xuICAgIF9mcm9tQWRkcmVzc2VzOiBzdHJpbmdbXTtcbiAgICBfdG86IHN0cmluZ1tdO1xuICAgIF9sb2NrdGltZTogYmlnaW50O1xuICAgIF90aHJlc2hvbGQ6IG51bWJlcjtcbiAgICBfZmVlOiB7IGZlZTogc3RyaW5nOyBmZWVSYXRlPzogc3RyaW5nOyBzaXplPzogbnVtYmVyIH07XG4gICAgaGFzQ3JlZGVudGlhbHM6IGJvb2xlYW47XG4gICAgX3R4PzogdW5rbm93bjtcbiAgICBzZXRUcmFuc2FjdGlvbjogKHR4OiB1bmtub3duKSA9PiB2b2lkO1xuICB9ID0ge1xuICAgIF9uZXR3b3JrOiB7fSxcbiAgICBfbmV0d29ya0lEOiAwLFxuICAgIF9ibG9ja2NoYWluSUQ6IEJ1ZmZlci5hbGxvYygwKSxcbiAgICBfYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLFxuICAgIF9mcm9tQWRkcmVzc2VzOiBbXSxcbiAgICBfdG86IFtdLFxuICAgIF9sb2NrdGltZTogMG4sXG4gICAgX3RocmVzaG9sZDogMSxcbiAgICBfZmVlOiB7IGZlZTogJzAnIH0sXG4gICAgaGFzQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgIHNldFRyYW5zYWN0aW9uOiBmdW5jdGlvbiAoX3R4OiB1bmtub3duKSB7XG4gICAgICB0aGlzLl90eCA9IF90eDtcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgdGhpcy5fY29pbkNvbmZpZyA9IGNvaW5Db25maWc7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGU7XG5cbiAgdmFsaWRhdGVBbW91bnQoYW1vdW50OiBiaWdpbnQpOiB2b2lkIHtcbiAgICBpZiAoYW1vdW50IDw9IDBuKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdBbW91bnQgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCBjcmVkZW50aWFscyBhcnJheSBpcyBwcm9wZXJseSBmb3JtZWRcbiAgICogQHBhcmFtIGNyZWRlbnRpYWxzIC0gQXJyYXkgb2YgY3JlZGVudGlhbHMgdG8gdmFsaWRhdGVcbiAgICovXG4gIHByb3RlY3RlZCB2YWxpZGF0ZUNyZWRlbnRpYWxzKGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10pOiB2b2lkIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY3JlZGVudGlhbHMpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdDcmVkZW50aWFscyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgY3JlZGVudGlhbHMuZm9yRWFjaCgoY3JlZGVudGlhbCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghKGNyZWRlbnRpYWwgaW5zdGFuY2VvZiBDcmVkZW50aWFsKSkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIGNyZWRlbnRpYWwgYXQgaW5kZXggJHtpbmRleH1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGlucHV0cywgb3V0cHV0cywgYW5kIGNyZWRlbnRpYWxzIGZvciBGbGFyZSBQLWNoYWluIGF0b21pYyB0cmFuc2FjdGlvbnMuXG4gICAqIEJhc2VkIG9uIEFWQVggUC1jaGFpbiBpbXBsZW1lbnRhdGlvbiBhZGFwdGVkIGZvciBGbGFyZUpTLlxuICAgKlxuICAgKiBOb3RlOiBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbXBsZW1lbnRhdGlvbiB0aGF0IGNyZWF0ZXMgdGhlIGNvcmUgc3RydWN0dXJlLlxuICAgKiBUaGUgRmxhcmVKUyB0eXBlIHN5c3RlbSBpbnRlZ3JhdGlvbiB3aWxsIGJlIHJlZmluZWQgaW4gZnV0dXJlIGl0ZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB0b3RhbCAtIFRvdGFsIGFtb3VudCBuZWVkZWQgaW5jbHVkaW5nIGZlZXNcbiAgICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgVHJhbnNmZXJhYmxlSW5wdXRbXSwgVHJhbnNmZXJhYmxlT3V0cHV0W10sIGFuZCBDcmVkZW50aWFsW11cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVJbnB1dE91dHB1dCh0b3RhbDogYmlnaW50KToge1xuICAgIGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICBvdXRwdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXTtcbiAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICB9IHtcbiAgICBpZiAoIXRoaXMuX3V0eG9zIHx8IHRoaXMuX3V0eG9zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVVRYT3MgYXJlIHJlcXVpcmVkIGZvciBjcmVhdGluZyBpbnB1dHMgYW5kIG91dHB1dHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXTtcbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXSA9IFtdO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10gPSBbXTtcblxuICAgIGxldCBpbnB1dFN1bSA9IDBuO1xuICAgIGNvbnN0IGFkZHJlc3NJbmRpY2VzOiB7IFthZGRyZXNzOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgIGxldCBuZXh0QWRkcmVzc0luZGV4ID0gMDtcblxuICAgIC8vIFNvcnQgVVRYT3MgYnkgYW1vdW50IGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yIG9wdGltYWwgY29pbiBzZWxlY3Rpb25cbiAgICBjb25zdCBzb3J0ZWRVdHhvcyA9IFsuLi50aGlzLl91dHhvc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYW1vdW50QSA9IEJpZ0ludChhLmFtb3VudCk7XG4gICAgICBjb25zdCBhbW91bnRCID0gQmlnSW50KGIuYW1vdW50KTtcbiAgICAgIGlmIChhbW91bnRBID4gYW1vdW50QikgcmV0dXJuIC0xO1xuICAgICAgaWYgKGFtb3VudEEgPCBhbW91bnRCKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgLy8gUHJvY2VzcyBVVFhPcyB0byBjcmVhdGUgaW5wdXRzIGFuZCBjcmVkZW50aWFsc1xuICAgIGZvciAoY29uc3QgdXR4byBvZiBzb3J0ZWRVdHhvcykge1xuICAgICAgY29uc3QgdXR4b0Ftb3VudCA9IEJpZ0ludCh1dHhvLmFtb3VudCk7XG5cbiAgICAgIGlmIChpbnB1dFN1bSA+PSB0b3RhbCkge1xuICAgICAgICBicmVhazsgLy8gV2UgaGF2ZSBlbm91Z2ggaW5wdXRzXG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IENyZWF0ZSBwcm9wZXIgRmxhcmVKUyBUcmFuc2ZlcmFibGVJbnB1dCBvbmNlIHR5cGUgaXNzdWVzIGFyZSByZXNvbHZlZFxuICAgICAgLy8gRm9yIG5vdywgd2UgY3JlYXRlIGEgcGxhY2Vob2xkZXIgdGhhdCBkZW1vbnN0cmF0ZXMgdGhlIHN0cnVjdHVyZVxuICAgICAgLy8gVGhlIGFjdHVhbCBGbGFyZUpTIGludGVncmF0aW9uIHdpbGwgbmVlZCBwcm9wZXIgVVRYT0lEIGhhbmRsaW5nXG5cbiAgICAgIC8vIFRyYWNrIGlucHV0IHN1bVxuICAgICAgaW5wdXRTdW0gKz0gdXR4b0Ftb3VudDtcblxuICAgICAgLy8gVHJhY2sgYWRkcmVzcyBpbmRpY2VzIGZvciBzaWduYXR1cmUgb3JkZXJpbmcgKG1pbWljcyBBVkFYIHBhdHRlcm4pXG4gICAgICBjb25zdCBhZGRyZXNzSW5kZXhBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiB1dHhvLmFkZHJlc3Nlcykge1xuICAgICAgICBpZiAoIShhZGRyZXNzIGluIGFkZHJlc3NJbmRpY2VzKSkge1xuICAgICAgICAgIGFkZHJlc3NJbmRpY2VzW2FkZHJlc3NdID0gbmV4dEFkZHJlc3NJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGFkZHJlc3NJbmRleEFycmF5LnB1c2goYWRkcmVzc0luZGljZXNbYWRkcmVzc10pO1xuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSBhZGRyZXNzIGluZGljZXMgb24gdGhlIFVUWE8gZm9yIGNyZWRlbnRpYWwgY3JlYXRpb25cbiAgICAgIHV0eG8uYWRkcmVzc2VzSW5kZXggPSBhZGRyZXNzSW5kZXhBcnJheTtcblxuICAgICAgLy8gQ3JlYXRlIGNyZWRlbnRpYWwgd2l0aCBwbGFjZWhvbGRlciBzaWduYXR1cmVzXG4gICAgICAvLyBJbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHRoZXNlIHdvdWxkIGJlIGFjdHVhbCBzaWduYXR1cmVzXG4gICAgICBjb25zdCBzaWduYXR1cmVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdXR4by50aHJlc2hvbGQgfSwgKCkgPT4gJycpO1xuICAgICAgY29uc3QgY3JlZGVudGlhbCA9IHRoaXMuY3JlYXRlRmxhcmVDcmVkZW50aWFsKDAsIHNpZ25hdHVyZXMpO1xuICAgICAgY3JlZGVudGlhbHMucHVzaChjcmVkZW50aWFsKTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgd2UgaGF2ZSBlbm91Z2ggaW5wdXRzXG4gICAgaWYgKGlucHV0U3VtIDwgdG90YWwpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEluc3VmZmljaWVudCBmdW5kczogbmVlZCAke3RvdGFsfSwgaGF2ZSAke2lucHV0U3VtfWApO1xuICAgIH1cblxuICAgIC8vIFRPRE86IENyZWF0ZSBjaGFuZ2Ugb3V0cHV0IGlmIHdlIGhhdmUgZXhjZXNzIGlucHV0XG4gICAgLy8gVGhlIFRyYW5zZmVyYWJsZU91dHB1dCBjcmVhdGlvbiB3aWxsIGJlIGltcGxlbWVudGVkIG9uY2UgRmxhcmVKUyB0eXBlcyBhcmUgcmVzb2x2ZWRcblxuICAgIHJldHVybiB7IGlucHV0cywgb3V0cHV0cywgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgVVRYT3MgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBpcyByZXF1aXJlZCBmb3IgY3JlYXRpbmcgaW5wdXRzIGFuZCBvdXRwdXRzLlxuICAgKlxuICAgKiBAcGFyYW0gdXR4b3MgLSBBcnJheSBvZiBkZWNvZGVkIFVUWE8gb2JqZWN0c1xuICAgKiBAcmV0dXJucyB0aGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICB1dHhvcyh1dHhvczogRGVjb2RlZFV0eG9PYmpbXSk6IHRoaXMge1xuICAgIHRoaXMuX3V0eG9zID0gdXR4b3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRmxhcmUgZXF1aXZhbGVudCBvZiBBdmFsYW5jaGUncyBTZWxlY3RDcmVkZW50aWFsQ2xhc3NcbiAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgd2l0aCB0aGUgcHJvdmlkZWQgc2lnbmF0dXJlc1xuICAgKlxuICAgKiBAcGFyYW0gY3JlZGVudGlhbElkIC0gVGhlIGNyZWRlbnRpYWwgSUQgKG5vdCB1c2VkIGluIEZsYXJlSlMgYnV0IGtlcHQgZm9yIGNvbXBhdGliaWxpdHkpXG4gICAqIEBwYXJhbSBzaWduYXR1cmVzIC0gQXJyYXkgb2Ygc2lnbmF0dXJlIGhleCBzdHJpbmdzIG9yIGVtcHR5IHN0cmluZ3MgZm9yIHBsYWNlaG9sZGVyc1xuICAgKiBAcmV0dXJucyBDcmVkZW50aWFsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlRmxhcmVDcmVkZW50aWFsKF9jcmVkZW50aWFsSWQ6IG51bWJlciwgc2lnbmF0dXJlczogc3RyaW5nW10pOiBDcmVkZW50aWFsIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2lnbmF0dXJlcykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1NpZ25hdHVyZXMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChzaWduYXR1cmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignU2lnbmF0dXJlcyBhcnJheSBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWdzID0gc2lnbmF0dXJlcy5tYXAoKHNpZywgaW5kZXgpID0+IHtcbiAgICAgIC8vIEhhbmRsZSBlbXB0eS9wbGFjZWhvbGRlciBzaWduYXR1cmVzXG4gICAgICBpZiAoIXNpZyB8fCBzaWcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKG5ldyBVaW50OEFycmF5KFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGhleCBzdHJpbmcgZm9ybWF0XG4gICAgICBjb25zdCBjbGVhblNpZyA9IHNpZy5zdGFydHNXaXRoKCcweCcpID8gc2lnLnNsaWNlKDIpIDogc2lnO1xuICAgICAgaWYgKCEvXlswLTlhLWZBLUZdKiQvLnRlc3QoY2xlYW5TaWcpKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgaGV4IHNpZ25hdHVyZSBhdCBpbmRleCAke2luZGV4fTogY29udGFpbnMgbm9uLWhleCBjaGFyYWN0ZXJzYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnQgdG8gYnVmZmVyIGFuZCB2YWxpZGF0ZSBsZW5ndGhcbiAgICAgIGNvbnN0IHNpZ0J1ZmZlciA9IEJ1ZmZlci5mcm9tKGNsZWFuU2lnLCAnaGV4Jyk7XG4gICAgICBpZiAoc2lnQnVmZmVyLmxlbmd0aCA+IFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgYFNpZ25hdHVyZSB0b28gbG9uZyBhdCBpbmRleCAke2luZGV4fTogJHtzaWdCdWZmZXIubGVuZ3RofSBieXRlcyAobWF4ICR7U0VDUDI1NksxX1NJR05BVFVSRV9MRU5HVEh9KWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGZpeGVkLWxlbmd0aCBidWZmZXIgYW5kIGNvcHkgc2lnbmF0dXJlIGRhdGFcbiAgICAgIGNvbnN0IGZpeGVkTGVuZ3RoQnVmZmVyID0gQnVmZmVyLmFsbG9jKFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKTtcbiAgICAgIHNpZ0J1ZmZlci5jb3B5KGZpeGVkTGVuZ3RoQnVmZmVyKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYXR1cmUobmV3IFVpbnQ4QXJyYXkoZml4ZWRMZW5ndGhCdWZmZXIpKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgc2lnbmF0dXJlIGF0IGluZGV4ICR7aW5kZXh9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IENyZWRlbnRpYWwoc2lncyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIGNyZWRlbnRpYWw6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmFzZSBpbml0QnVpbGRlciB1c2VkIGJ5IGNvbmNyZXRlIGJ1aWxkZXJzLiBGb3Igbm93IGp1c3QgcmV0dXJucyB0aGlzIHNvIGZsdWVudCBBUEkgd29ya3MuXG4gICAqL1xuICBpbml0QnVpbGRlcihfdHg6IHVua25vd24pOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIHRyYW5zYWN0aW9uIHdpdGggcHJpdmF0ZSBrZXkgKHBsYWNlaG9sZGVyIGltcGxlbWVudGF0aW9uKVxuICAgKiBUT0RPOiBJbXBsZW1lbnQgcHJvcGVyIEZsYXJlSlMgc2lnbmluZ1xuICAgKi9cbiAgc2lnbihfcGFyYW1zOiB7IGtleTogc3RyaW5nIH0pOiB0aGlzIHtcbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgRmxhcmVKUyBzaWduaW5nXG4gICAgLy8gRm9yIG5vdywganVzdCBtYXJrIGFzIGhhdmluZyBjcmVkZW50aWFsc1xuICAgIHRoaXMudHJhbnNhY3Rpb24uaGFzQ3JlZGVudGlhbHMgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSB0cmFuc2FjdGlvbiAocGxhY2Vob2xkZXIgaW1wbGVtZW50YXRpb24pXG4gICAqIFRPRE86IEltcGxlbWVudCBwcm9wZXIgRmxhcmVKUyB0cmFuc2FjdGlvbiBidWlsZGluZ1xuICAgKi9cbiAgYXN5bmMgYnVpbGQoKTogUHJvbWlzZTxCYXNlVHJhbnNhY3Rpb24+IHtcbiAgICAvLyBUT0RPOiBDcmVhdGUgYWN0dWFsIEZsYXJlSlMgVW5zaWduZWRUeFxuICAgIC8vIEZvciBub3csIHJldHVybiBhIG1vY2sgdHJhbnNhY3Rpb24gdGhhdCBzYXRpc2ZpZXMgdGhlIGludGVyZmFjZVxuICAgIGNvbnN0IG1vY2tUcmFuc2FjdGlvbiA9IHtcbiAgICAgIF9pZDogJ21vY2stdHJhbnNhY3Rpb24taWQnLFxuICAgICAgX2lucHV0czogW10sXG4gICAgICBfb3V0cHV0czogW10sXG4gICAgICBfdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICBzaWduYXR1cmU6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgdG9Ccm9hZGNhc3RGb3JtYXQ6ICgpID0+ICdtb2NrLXR4LWhleCcsXG4gICAgICB0b0pzb246ICgpID0+ICh7fSksXG4gICAgICBleHBsYWluVHJhbnNhY3Rpb246ICgpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0+ICh7XG4gICAgICAgIHR5cGU6IHRoaXMudHJhbnNhY3Rpb25UeXBlLFxuICAgICAgICBpbnB1dHM6IFtdLFxuICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMCcsXG4gICAgICAgIHJld2FyZEFkZHJlc3NlczogW10sXG4gICAgICAgIGlkOiAnbW9jay10cmFuc2FjdGlvbi1pZCcsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgZmVlOiB7IGZlZTogJzAnIH0sXG4gICAgICB9KSxcbiAgICAgIGlzVHJhbnNhY3Rpb25Gb3JDQ2hhaW46IGZhbHNlLFxuICAgICAgZnJvbUFkZHJlc3NlczogW10sXG4gICAgICB2YWxpZGF0aW9uRXJyb3JzOiBbXSxcbiAgICAgIGxvYWRJbnB1dHNBbmRPdXRwdXRzOiAoKSA9PiB7XG4gICAgICAgIC8qIHBsYWNlaG9sZGVyICovXG4gICAgICB9LFxuICAgICAgaW5wdXRzOiAoKSA9PiBbXSxcbiAgICAgIG91dHB1dHM6ICgpID0+IFtdLFxuICAgICAgZmVlOiAoKSA9PiAoeyBmZWU6ICcwJyB9KSxcbiAgICAgIGZlZVJhdGU6ICgpID0+IDAsXG4gICAgICBpZDogKCkgPT4gJ21vY2stdHJhbnNhY3Rpb24taWQnLFxuICAgICAgdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgfSBhcyB1bmtub3duIGFzIEJhc2VUcmFuc2FjdGlvbjtcblxuICAgIHJldHVybiBtb2NrVHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYW5kIGV4cGxhaW4gYSB0cmFuc2FjdGlvbiBmcm9tIGhleCAocGxhY2Vob2xkZXIgaW1wbGVtZW50YXRpb24pXG4gICAqIFRPRE86IEltcGxlbWVudCBwcm9wZXIgRmxhcmVKUyB0cmFuc2FjdGlvbiBwYXJzaW5nXG4gICAqL1xuICBleHBsYWluVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgLy8gVE9ETzogUGFyc2UgYWN0dWFsIEZsYXJlSlMgdHJhbnNhY3Rpb25cbiAgICAvLyBGb3Igbm93LCByZXR1cm4gYmFzaWMgZXhwbGFuYXRpb25cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICBpbnB1dHM6IFtdLFxuICAgICAgb3V0cHV0czogW10sXG4gICAgICBvdXRwdXRBbW91bnQ6ICcwJyxcbiAgICAgIHJld2FyZEFkZHJlc3NlczogW10sXG4gICAgICBpZDogJ21vY2stdHJhbnNhY3Rpb24taWQnLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgIGZlZTogeyBmZWU6ICcwJyB9LFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|