@witnet/solidity 3.0.4 → 3.0.5
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/LICENSE +2 -2
- package/build/contracts/Bech32.json +1 -1
- package/build/contracts/Clonable.json +1 -1
- package/build/contracts/Context.json +1 -1
- package/build/contracts/Create3.json +1 -1
- package/build/contracts/ERC165.json +1 -1
- package/build/contracts/Escrowable.json +1 -1
- package/build/contracts/IChainlinkAggregatorV3.json +1 -1
- package/build/contracts/IERC165.json +1 -1
- package/build/contracts/IERC20.json +1 -1
- package/build/contracts/IERC2362.json +1 -1
- package/build/contracts/IPythChainlinkAggregatorV3.json +1 -1
- package/build/contracts/IWitAppliance.json +1 -1
- package/build/contracts/IWitOracle.json +1 -1
- package/build/contracts/IWitOracleAppliance.json +1 -1
- package/build/contracts/IWitOracleConsumer.json +1 -1
- package/build/contracts/IWitOracleConsumerLegacy.json +1 -1
- package/build/contracts/IWitOracleLegacy.json +1 -1
- package/build/contracts/IWitOracleQueriable.json +1 -1
- package/build/contracts/IWitOracleQueriableConsumer.json +1 -1
- package/build/contracts/IWitOracleQueriableEvents.json +1 -1
- package/build/contracts/IWitOracleQueriableExperimental.json +1 -1
- package/build/contracts/IWitOracleQueriableTrustableReporter.json +1 -1
- package/build/contracts/IWitOracleQueriableTrustlessReporter.json +1 -1
- package/build/contracts/IWitOracleRadonRegistry.json +1 -1
- package/build/contracts/IWitOracleRadonRegistryEvents.json +1 -1
- package/build/contracts/IWitOracleRadonRegistryLegacy.json +1 -1
- package/build/contracts/IWitOracleRadonRequestFactory.json +1 -1
- package/build/contracts/IWitOracleRadonRequestModal.json +1 -1
- package/build/contracts/IWitOracleRadonRequestTemplate.json +1 -1
- package/build/contracts/IWitOracleRequest.json +1 -1
- package/build/contracts/IWitOracleRequestFactory.json +1 -1
- package/build/contracts/IWitOracleRequestFactoryEvents.json +1 -1
- package/build/contracts/IWitOracleRequestTemplate.json +1 -1
- package/build/contracts/IWitOracleTrustableAdmin.json +1 -1
- package/build/contracts/IWitOracleTrustless.json +1 -1
- package/build/contracts/IWitPriceFeeds.json +1 -1
- package/build/contracts/IWitPriceFeedsAdmin.json +1 -1
- package/build/contracts/IWitPriceFeedsConsumer.json +1 -1
- package/build/contracts/IWitPriceFeedsEvents.json +1 -1
- package/build/contracts/IWitPriceFeedsLegacy.json +1 -1
- package/build/contracts/IWitPriceFeedsLegacyAdmin.json +1 -1
- package/build/contracts/IWitPriceFeedsLegacySolver.json +1 -1
- package/build/contracts/IWitPriceFeedsLegacySolverFactory.json +1 -1
- package/build/contracts/IWitPriceFeedsTypes.json +1 -1
- package/build/contracts/IWitPyth.json +1 -1
- package/build/contracts/IWitPythChainlinkAggregator.json +1 -1
- package/build/contracts/IWitPythErrors.json +1 -1
- package/build/contracts/IWitPythEvents.json +1 -1
- package/build/contracts/IWitPythReporter.json +1 -1
- package/build/contracts/IWitRandomness.json +1 -1
- package/build/contracts/IWitRandomnessAdmin.json +1 -1
- package/build/contracts/IWitRandomnessAdminV2.json +1 -1
- package/build/contracts/IWitRandomnessConsumer.json +1 -1
- package/build/contracts/IWitRandomnessEvents.json +1 -1
- package/build/contracts/IWitRandomnessLegacy.json +1 -1
- package/build/contracts/IWitRandomnessTypes.json +1 -1
- package/build/contracts/Initializable.json +1 -1
- package/build/contracts/OVM_GasPriceOracle.json +1 -1
- package/build/contracts/Ownable.json +1 -1
- package/build/contracts/Ownable2Step.json +1 -1
- package/build/contracts/Payable.json +1 -1
- package/build/contracts/Proxiable.json +1 -1
- package/build/contracts/ReentrancyGuard.json +1 -1
- package/build/contracts/Secp256k1.json +1 -1
- package/build/contracts/Slices.json +1 -1
- package/build/contracts/TestBech32.json +1 -1
- package/build/contracts/TestSecp256k1.json +1 -1
- package/build/contracts/Upgradeable.json +1 -1
- package/build/contracts/UsingWitOracle.json +1 -1
- package/build/contracts/UsingWitPriceFeeds.json +1 -1
- package/build/contracts/UsingWitRandomness.json +1 -1
- package/build/contracts/WitOracle.json +2 -13
- package/build/contracts/WitOracleBasePushOnly.json +1 -1
- package/build/contracts/WitOracleBasePushOnlyTrustable.json +1 -1
- package/build/contracts/WitOracleBasePushOnlyTrustless.json +1 -1
- package/build/contracts/WitOracleBasePushOnlyUpgradable.json +1 -1
- package/build/contracts/WitOracleBaseQueriable.json +1 -1
- package/build/contracts/WitOracleBaseQueriableTrustable.json +1 -1
- package/build/contracts/WitOracleBaseQueriableTrustless.json +1 -1
- package/build/contracts/WitOracleBaseQueriableUpgradable.json +1 -1
- package/build/contracts/WitOracleDataLib.json +2 -254
- package/build/contracts/WitOraclePushOnly.json +1 -1
- package/build/contracts/WitOracleRadonEncodingLib.json +2 -13
- package/build/contracts/WitOracleRadonRegistry.json +2 -13
- package/build/contracts/WitOracleRadonRegistryBase.json +1 -1
- package/build/contracts/WitOracleRadonRegistryBaseUpgradable.json +1 -1
- package/build/contracts/WitOracleRadonRegistryData.json +1 -1
- package/build/contracts/WitOracleRadonRegistryDefaultV21.json +1 -1
- package/build/contracts/WitOracleRadonRegistryUpgradableDefault.json +2 -17
- package/build/contracts/WitOracleRadonRegistryUpgradableNoSha256.json +1 -1
- package/build/contracts/WitOracleRadonRegistryUpgradableZkSync.json +1 -1
- package/build/contracts/WitOracleRadonRequestFactory.json +2 -13
- package/build/contracts/WitOracleRadonRequestFactoryBase.json +1 -1
- package/build/contracts/WitOracleRadonRequestFactoryBaseUpgradable.json +1 -1
- package/build/contracts/WitOracleRadonRequestFactoryModals.json +2 -13
- package/build/contracts/WitOracleRadonRequestFactoryModalsDefault.json +2 -13
- package/build/contracts/WitOracleRadonRequestFactoryTemplates.json +2 -13
- package/build/contracts/WitOracleRadonRequestFactoryTemplatesDefault.json +2 -13
- package/build/contracts/WitOracleRadonRequestFactoryUpgradableConfluxCore.json +1 -1
- package/build/contracts/WitOracleRadonRequestFactoryUpgradableDefault.json +2 -13
- package/build/contracts/WitOracleResultStatusLib.json +2 -14
- package/build/contracts/WitOracleTrustableDefault.json +2 -259
- package/build/contracts/WitOracleTrustableExperimental.json +1 -1
- package/build/contracts/WitOracleTrustableObscuro.json +1 -1
- package/build/contracts/WitOracleTrustableOvm2.json +1 -1
- package/build/contracts/WitOracleTrustablePushOnly.json +1 -1
- package/build/contracts/WitOracleTrustableReef.json +1 -1
- package/build/contracts/WitOracleTrustableZkSync.json +1 -1
- package/build/contracts/WitOracleTrustlessDataLib.json +1 -1
- package/build/contracts/WitOracleTrustlessDefaultV22.json +1 -1
- package/build/contracts/WitOracleTrustlessUpgradableDefault.json +1 -1
- package/build/contracts/WitPriceFeeds.json +2 -13
- package/build/contracts/WitPriceFeedsDataLib.json +2 -14
- package/build/contracts/WitPriceFeedsLegacy.json +2 -8
- package/build/contracts/WitPriceFeedsLegacyDataLib.json +2 -84
- package/build/contracts/WitPriceFeedsLegacyUpgradable.json +1 -1
- package/build/contracts/WitPriceFeedsLegacyUpgradableBypass.json +2 -80
- package/build/contracts/WitPriceFeedsSolverBase.json +1 -1
- package/build/contracts/WitPriceFeedsV3.json +1 -1
- package/build/contracts/WitPriceFeedsV3Upgradable.json +2 -17
- package/build/contracts/WitPythChainlinkAggregator.json +1 -1
- package/build/contracts/WitRandomness.json +2 -13
- package/build/contracts/WitRandomnessLegacy.json +1 -1
- package/build/contracts/WitRandomnessV3.json +2 -13
- package/build/contracts/WitRngConsumer.json +1 -1
- package/build/contracts/Witnet.json +1 -1
- package/build/contracts/WitnetBuffer.json +1 -1
- package/build/contracts/WitnetCBOR.json +1 -1
- package/build/contracts/WitnetDeployer.json +2 -13
- package/build/contracts/WitnetDeployerConfluxCore.json +1 -1
- package/build/contracts/WitnetDeployerDeferred.json +1 -1
- package/build/contracts/WitnetDeployerMeter.json +1 -1
- package/build/contracts/WitnetProxy.json +2 -9
- package/build/contracts/WitnetUpgradableBase.json +1 -1
- package/{migrations → dist/migrations}/addresses.json +1 -25
- package/{migrations → dist/migrations}/constructorArgs.json +1 -6
- package/dist/migrations/settings/artifacts.d.ts +95 -0
- package/dist/migrations/settings/artifacts.d.ts.map +1 -0
- package/dist/migrations/settings/artifacts.js +80 -0
- package/dist/migrations/settings/networks.d.ts +593 -0
- package/dist/migrations/settings/networks.d.ts.map +1 -0
- package/dist/migrations/settings/networks.js +593 -0
- package/dist/src/bin/helpers.cjs +350 -0
- package/dist/src/bin/helpers.d.cts +76 -0
- package/dist/src/bin/helpers.d.cts.map +1 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +33 -0
- package/dist/src/lib/types.d.ts +99 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +18 -0
- package/dist/src/lib/utils.d.ts +22 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +267 -0
- package/dist/src/lib/wrappers/ContractWrapper.d.ts +47 -0
- package/dist/src/lib/wrappers/ContractWrapper.d.ts.map +1 -0
- package/dist/src/lib/wrappers/ContractWrapper.js +81 -0
- package/dist/src/lib/wrappers/WitAppliance.d.ts +7 -0
- package/dist/src/lib/wrappers/WitAppliance.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitAppliance.js +17 -0
- package/dist/src/lib/wrappers/WitArtifact.d.ts +6 -0
- package/dist/src/lib/wrappers/WitArtifact.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitArtifact.js +16 -0
- package/dist/src/lib/wrappers/WitOracle.d.ts +105 -0
- package/dist/src/lib/wrappers/WitOracle.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitOracle.js +217 -0
- package/dist/src/lib/wrappers/WitOracleConsumer.d.ts +16 -0
- package/dist/src/lib/wrappers/WitOracleConsumer.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitOracleConsumer.js +30 -0
- package/dist/src/lib/wrappers/WitOracleRadonRegistry.d.ts +102 -0
- package/dist/src/lib/wrappers/WitOracleRadonRegistry.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitOracleRadonRegistry.js +140 -0
- package/dist/src/lib/wrappers/WitOracleRadonRequestFactory.d.ts +81 -0
- package/dist/src/lib/wrappers/WitOracleRadonRequestFactory.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitOracleRadonRequestFactory.js +257 -0
- package/dist/src/lib/wrappers/WitPriceFeeds.d.ts +91 -0
- package/dist/src/lib/wrappers/WitPriceFeeds.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitPriceFeeds.js +356 -0
- package/dist/src/lib/wrappers/WitPriceFeedsLegacy.d.ts +14 -0
- package/dist/src/lib/wrappers/WitPriceFeedsLegacy.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitPriceFeedsLegacy.js +64 -0
- package/dist/src/lib/wrappers/WitRandomness.d.ts +55 -0
- package/dist/src/lib/wrappers/WitRandomness.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitRandomness.js +165 -0
- package/dist/src/lib/wrappers.d.ts +8 -0
- package/dist/src/lib/wrappers.d.ts.map +1 -0
- package/dist/src/lib/wrappers.js +8 -0
- package/package.json +78 -54
- package/scripts/clean.cjs +21 -0
- package/scripts/eth-create2.cjs +38 -0
- package/scripts/eth-create3.cjs +45 -0
- package/scripts/postinstall.cjs +9 -0
- package/scripts/prepare.cjs +27 -0
- package/scripts/vanity2gen.cjs +121 -0
- package/scripts/vanity3gen.cjs +84 -0
- package/scripts/verify-proxies.cjs +50 -0
- package/scripts/verify-truffle.cjs +69 -0
- package/scripts/verify.js +95 -0
- package/scripts/wof-acls.js +17 -0
- package/src/bin/bots/bridge.cjs +0 -0
- package/src/bin/bots/randomizer.cjs +290 -0
- package/src/bin/bots/reporter.cjs +0 -0
- package/src/bin/cli/accounts.cjs +47 -0
- package/src/bin/cli/assets.cjs +466 -0
- package/src/bin/cli/framework.cjs +100 -0
- package/src/bin/cli/gateway.cjs +26 -0
- package/src/bin/cli/networks.cjs +63 -0
- package/src/bin/cli/priceFeeds.cjs +170 -0
- package/src/bin/cli/queries.cjs +217 -0
- package/src/bin/cli/randomness.cjs +367 -0
- package/src/bin/cli/reports.cjs +272 -0
- package/src/bin/cli/wizard.cjs +352 -0
- package/src/bin/helpers.cjs +388 -0
- package/src/bin/index.cjs +407 -0
- package/settings/artifacts.js +0 -71
- package/settings/index.js +0 -49
- package/settings/networks.js +0 -593
- package/settings/solidity.js +0 -11
- package/settings/specs.js +0 -102
- package/src/index.js +0 -96
- package/src/utils.js +0 -305
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { Witnet } from "@witnet/sdk";
|
|
2
|
+
import { type ContractTransactionReceipt, type TransactionReceipt } from "ethers";
|
|
3
|
+
import { type DataPushReport, type PriceFeed, PriceFeedMappers, PriceFeedOracles, type PriceFeedUpdate, type PriceFeedUpdateConditions } from "../types.js";
|
|
4
|
+
import { WitAppliance } from "./WitAppliance.js";
|
|
5
|
+
import type { WitOracle } from "./WitOracle.js";
|
|
6
|
+
export declare class WitPriceFeeds extends WitAppliance {
|
|
7
|
+
protected constructor(witOracle: WitOracle, at: string);
|
|
8
|
+
static at(witOracle: WitOracle, target: string): Promise<WitPriceFeeds>;
|
|
9
|
+
createChainlinkAggregator(id4: Witnet.HexString, options?: {
|
|
10
|
+
evmConfirmations?: number;
|
|
11
|
+
evmGasPrice?: bigint;
|
|
12
|
+
evmTimeout?: number;
|
|
13
|
+
onTransaction?: (txHash: Witnet.Hash) => any;
|
|
14
|
+
onTransactionReceipt?: (receipt: TransactionReceipt | null) => any;
|
|
15
|
+
}): Promise<ContractTransactionReceipt | TransactionReceipt | null>;
|
|
16
|
+
pushDataReport(report: DataPushReport, options?: {
|
|
17
|
+
confirmations?: number;
|
|
18
|
+
gasPrice?: bigint;
|
|
19
|
+
gasLimit?: bigint;
|
|
20
|
+
maxGasPrice?: bigint;
|
|
21
|
+
timeout?: number;
|
|
22
|
+
onTransaction?: (txHash: string) => any;
|
|
23
|
+
onTransactionReceipt?: (receipt: TransactionReceipt | null) => any;
|
|
24
|
+
}): Promise<ContractTransactionReceipt | TransactionReceipt | null>;
|
|
25
|
+
settlePriceFeedRadonHash(caption: string, decimals: number, radHash: Witnet.HexString, options?: {
|
|
26
|
+
evmConfirmations?: number;
|
|
27
|
+
evmGasPrice?: bigint;
|
|
28
|
+
evmTimeout?: number;
|
|
29
|
+
onTransaction?: (txHash: Witnet.Hash) => any;
|
|
30
|
+
onTransactionReceipt?: (receipt: TransactionReceipt | null) => any;
|
|
31
|
+
}): Promise<ContractTransactionReceipt | TransactionReceipt | null>;
|
|
32
|
+
settlePriceFeedOracle(caption: string, decimals: number, oracle: PriceFeedOracles | string, target: Witnet.HexString, sources?: Witnet.HexString, options?: {
|
|
33
|
+
evmConfirmations?: number;
|
|
34
|
+
evmGasPrice?: bigint;
|
|
35
|
+
evmTimeout?: number;
|
|
36
|
+
onTransaction?: (txHash: Witnet.Hash) => any;
|
|
37
|
+
onTransactionReceipt?: (receipt: TransactionReceipt | null) => any;
|
|
38
|
+
}): Promise<ContractTransactionReceipt | TransactionReceipt | null>;
|
|
39
|
+
settlePriceFeedMapper(caption: string, decimals: number, mapper: PriceFeedMappers | string, dependencies: string[], options?: {
|
|
40
|
+
evmConfirmations?: number;
|
|
41
|
+
evmGasPrice?: bigint;
|
|
42
|
+
evmTimeout?: number;
|
|
43
|
+
onTransaction?: (txHash: Witnet.Hash) => any;
|
|
44
|
+
onTransactionReceipt?: (receipt: TransactionReceipt | null) => any;
|
|
45
|
+
}): Promise<ContractTransactionReceipt | TransactionReceipt | null>;
|
|
46
|
+
removePriceFeed(caption: string, options?: {
|
|
47
|
+
evmConfirmations?: number;
|
|
48
|
+
evmGasPrice?: bigint;
|
|
49
|
+
evmTimeout?: number;
|
|
50
|
+
onTransaction?: (txHash: Witnet.Hash) => any;
|
|
51
|
+
onTransactionReceipt?: (receipt: TransactionReceipt | null) => any;
|
|
52
|
+
}): Promise<ContractTransactionReceipt | TransactionReceipt | null>;
|
|
53
|
+
settleDefaultUpdateConditions(conditions: PriceFeedUpdateConditions, options?: {
|
|
54
|
+
evmConfirmations?: number;
|
|
55
|
+
evmGasPrice?: bigint;
|
|
56
|
+
evmTimeout?: number;
|
|
57
|
+
onTransaction?: (txHash: Witnet.Hash) => any;
|
|
58
|
+
onTransactionReceipt?: (receipt: TransactionReceipt | null) => any;
|
|
59
|
+
}): Promise<ContractTransactionReceipt | TransactionReceipt | null>;
|
|
60
|
+
settlePriceFeedUpdateConditions(caption: string, conditions: PriceFeedUpdateConditions, options?: {
|
|
61
|
+
evmConfirmations?: number;
|
|
62
|
+
evmGasPrice?: bigint;
|
|
63
|
+
evmTimeout?: number;
|
|
64
|
+
onTransaction?: (txHash: Witnet.Hash) => any;
|
|
65
|
+
onTransactionReceipt?: (receipt: TransactionReceipt | null) => any;
|
|
66
|
+
}): Promise<ContractTransactionReceipt | TransactionReceipt | null>;
|
|
67
|
+
clone(curator: string, options?: {
|
|
68
|
+
evmConfirmations?: number;
|
|
69
|
+
evmGasPrice?: bigint;
|
|
70
|
+
evmTimeout?: number;
|
|
71
|
+
onTransaction?: (TxHash: Witnet.Hash) => any;
|
|
72
|
+
onTransactionReceipt?: (receipt: TransactionReceipt | null) => any;
|
|
73
|
+
}): Promise<ContractTransactionReceipt | TransactionReceipt | null>;
|
|
74
|
+
getDefaultUpdateConditions(): Promise<PriceFeedUpdateConditions>;
|
|
75
|
+
determineChainlinkAggregatorAddress(id4: Witnet.HexString): Promise<string>;
|
|
76
|
+
getEvmClonableBase(): Promise<string>;
|
|
77
|
+
getEvmConsumer(): Promise<Witnet.HexString>;
|
|
78
|
+
getEvmCurator(): Promise<Witnet.HexString>;
|
|
79
|
+
getEvmFootprint(): Promise<string>;
|
|
80
|
+
getId4(caption: string): Promise<Witnet.HexString>;
|
|
81
|
+
getPrice(id4: Witnet.HexString): Promise<PriceFeedUpdate>;
|
|
82
|
+
getPriceNotOlderThan(id4: Witnet.HexString, age: number): Promise<PriceFeedUpdate>;
|
|
83
|
+
getPriceUnsafe(id4: Witnet.HexString): Promise<PriceFeedUpdate>;
|
|
84
|
+
isCaptionSupported(caption: string): Promise<boolean>;
|
|
85
|
+
lookupPriceFeed(id4: Witnet.HexString): Promise<PriceFeed>;
|
|
86
|
+
lookupPriceFeedCaption(id4: Witnet.HexString): Promise<string>;
|
|
87
|
+
lookupPriceFeedExponent(id4: Witnet.HexString): Promise<number>;
|
|
88
|
+
lookupPriceFeedID(id4: Witnet.HexString): Promise<Witnet.Hash>;
|
|
89
|
+
lookupPriceFeeds(): Promise<Array<PriceFeed>>;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=WitPriceFeeds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WitPriceFeeds.d.ts","sourceRoot":"","sources":["../../../../src/lib/wrappers/WitPriceFeeds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { AbiCoder, formatUnits, } from "ethers";
|
|
2
|
+
import { PriceFeedMappers, PriceFeedOracles, } from "../types.js";
|
|
3
|
+
import { abiEncodeDataPushReport, abiEncodePriceFeedUpdateConditions, } from "../utils.js";
|
|
4
|
+
import { WitAppliance } from "./WitAppliance.js";
|
|
5
|
+
export class WitPriceFeeds extends WitAppliance {
|
|
6
|
+
constructor(witOracle, at) {
|
|
7
|
+
super(witOracle, "WitPriceFeeds", at);
|
|
8
|
+
}
|
|
9
|
+
static async at(witOracle, target) {
|
|
10
|
+
const priceFeeds = new WitPriceFeeds(witOracle, target);
|
|
11
|
+
let oracleAddr;
|
|
12
|
+
try {
|
|
13
|
+
oracleAddr = await priceFeeds.contract.witOracle.staticCall();
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
oracleAddr = await priceFeeds.provider
|
|
17
|
+
.call({
|
|
18
|
+
to: target,
|
|
19
|
+
data: "0x46d1d21a", // funcSig for 'witnet()'
|
|
20
|
+
})
|
|
21
|
+
.then((result) => AbiCoder.defaultAbiCoder().decode(["address"], result))
|
|
22
|
+
.then((result) => result.toString());
|
|
23
|
+
}
|
|
24
|
+
if (oracleAddr !== witOracle.address) {
|
|
25
|
+
throw new Error(`${WitPriceFeeds.constructor.name} at ${target}: mismatching Wit/Oracle address (${oracleAddr})`);
|
|
26
|
+
}
|
|
27
|
+
return priceFeeds;
|
|
28
|
+
}
|
|
29
|
+
async createChainlinkAggregator(id4, options) {
|
|
30
|
+
const evmTransaction = await this.contract.createChainlinkAggregator.populateTransaction(id4);
|
|
31
|
+
evmTransaction.gasPrice = options?.evmGasPrice || evmTransaction?.gasPrice;
|
|
32
|
+
return this.signer
|
|
33
|
+
.sendTransaction(evmTransaction)
|
|
34
|
+
.then((response) => {
|
|
35
|
+
if (options?.onTransaction) {
|
|
36
|
+
options.onTransaction(response.hash);
|
|
37
|
+
}
|
|
38
|
+
return response.wait(options?.evmConfirmations || 1, options?.evmTimeout);
|
|
39
|
+
})
|
|
40
|
+
.then((receipt) => {
|
|
41
|
+
if (options?.onTransactionReceipt) {
|
|
42
|
+
options.onTransactionReceipt(receipt);
|
|
43
|
+
}
|
|
44
|
+
return receipt;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async pushDataReport(report, options) {
|
|
48
|
+
return this.contract.pushDataReport
|
|
49
|
+
.populateTransaction(abiEncodeDataPushReport(report), report?.evm_proof)
|
|
50
|
+
.then((tx) => {
|
|
51
|
+
if (!options?.gasPrice && tx?.gasPrice && options?.maxGasPrice) {
|
|
52
|
+
if (tx.gasPrice > options.maxGasPrice) {
|
|
53
|
+
throw new Error(`${this.constructor.name}: network gas price too high: ${formatUnits(tx.gasPrice, 9)} > ${formatUnits(options.maxGasPrice, 9)} gwei`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
tx.gasPrice = options?.gasPrice || tx?.gasPrice;
|
|
57
|
+
tx.gasLimit = options?.gasLimit || tx?.gasLimit;
|
|
58
|
+
return this.signer.sendTransaction(tx);
|
|
59
|
+
})
|
|
60
|
+
.then((response) => {
|
|
61
|
+
if (options?.onTransaction) {
|
|
62
|
+
options.onTransaction(response.hash);
|
|
63
|
+
}
|
|
64
|
+
return response.wait(options?.confirmations || 1, options?.timeout);
|
|
65
|
+
})
|
|
66
|
+
.then((receipt) => {
|
|
67
|
+
if (options?.onTransactionReceipt) {
|
|
68
|
+
options.onTransactionReceipt(receipt);
|
|
69
|
+
}
|
|
70
|
+
return receipt;
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
async settlePriceFeedRadonHash(caption, decimals, radHash, options) {
|
|
74
|
+
const evmTransaction = await this.contract.settlePriceFeedRadonHash.populateTransaction(caption, decimals, radHash);
|
|
75
|
+
evmTransaction.gasPrice = options?.evmGasPrice || evmTransaction?.gasPrice;
|
|
76
|
+
return this.signer
|
|
77
|
+
.sendTransaction(evmTransaction)
|
|
78
|
+
.then((response) => {
|
|
79
|
+
if (options?.onTransaction) {
|
|
80
|
+
options.onTransaction(response.hash);
|
|
81
|
+
}
|
|
82
|
+
return response.wait(options?.evmConfirmations || 1, options?.evmTimeout);
|
|
83
|
+
})
|
|
84
|
+
.then((receipt) => {
|
|
85
|
+
if (options?.onTransactionReceipt) {
|
|
86
|
+
options.onTransactionReceipt(receipt);
|
|
87
|
+
}
|
|
88
|
+
return receipt;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
async settlePriceFeedOracle(caption, decimals, oracle, target, sources, options) {
|
|
92
|
+
const evmTransaction = await this.contract.settlePriceFeedOracle.populateTransaction(caption, decimals, typeof oracle === "string"
|
|
93
|
+
? Object.values(PriceFeedOracles).indexOf(oracle)
|
|
94
|
+
: oracle, target, sources ||
|
|
95
|
+
"0x0000000000000000000000000000000000000000000000000000000000000000");
|
|
96
|
+
evmTransaction.gasPrice = options?.evmGasPrice || evmTransaction?.gasPrice;
|
|
97
|
+
return this.signer
|
|
98
|
+
.sendTransaction(evmTransaction)
|
|
99
|
+
.then((response) => {
|
|
100
|
+
if (options?.onTransaction) {
|
|
101
|
+
options.onTransaction(response.hash);
|
|
102
|
+
}
|
|
103
|
+
return response.wait(options?.evmConfirmations || 1, options?.evmTimeout);
|
|
104
|
+
})
|
|
105
|
+
.then((receipt) => {
|
|
106
|
+
if (options?.onTransactionReceipt) {
|
|
107
|
+
options.onTransactionReceipt(receipt);
|
|
108
|
+
}
|
|
109
|
+
return receipt;
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
async settlePriceFeedMapper(caption, decimals, mapper, dependencies, options) {
|
|
113
|
+
const evmTransaction = await this.contract.settlePriceFeedMapper.populateTransaction(caption, decimals, typeof mapper === "string"
|
|
114
|
+
? Object.values(PriceFeedMappers).indexOf(mapper)
|
|
115
|
+
: mapper, dependencies);
|
|
116
|
+
evmTransaction.gasPrice = options?.evmGasPrice || evmTransaction?.gasPrice;
|
|
117
|
+
return this.signer
|
|
118
|
+
.sendTransaction(evmTransaction)
|
|
119
|
+
.then((response) => {
|
|
120
|
+
if (options?.onTransaction) {
|
|
121
|
+
options.onTransaction(response.hash);
|
|
122
|
+
}
|
|
123
|
+
return response.wait(options?.evmConfirmations || 1, options?.evmTimeout);
|
|
124
|
+
})
|
|
125
|
+
.then((receipt) => {
|
|
126
|
+
if (options?.onTransactionReceipt) {
|
|
127
|
+
options.onTransactionReceipt(receipt);
|
|
128
|
+
}
|
|
129
|
+
return receipt;
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
async removePriceFeed(caption, options) {
|
|
133
|
+
const evmTransaction = await this.contract.removePriceFeed.populateTransaction(caption, true);
|
|
134
|
+
evmTransaction.gasPrice = options?.evmGasPrice || evmTransaction?.gasPrice;
|
|
135
|
+
return this.signer
|
|
136
|
+
.sendTransaction(evmTransaction)
|
|
137
|
+
.then((response) => {
|
|
138
|
+
if (options?.onTransaction) {
|
|
139
|
+
options.onTransaction(response.hash);
|
|
140
|
+
}
|
|
141
|
+
return response.wait(options?.evmConfirmations || 1, options?.evmTimeout);
|
|
142
|
+
})
|
|
143
|
+
.then((receipt) => {
|
|
144
|
+
if (options?.onTransactionReceipt) {
|
|
145
|
+
options.onTransactionReceipt(receipt);
|
|
146
|
+
}
|
|
147
|
+
return receipt;
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
async settleDefaultUpdateConditions(conditions, options) {
|
|
151
|
+
const evmTransaction = await this.contract.settleDefaultUpdateConditions.populateTransaction(abiEncodePriceFeedUpdateConditions(conditions));
|
|
152
|
+
evmTransaction.gasPrice = options?.evmGasPrice || evmTransaction?.gasPrice;
|
|
153
|
+
return this.signer
|
|
154
|
+
.sendTransaction(evmTransaction)
|
|
155
|
+
.then((response) => {
|
|
156
|
+
if (options?.onTransaction) {
|
|
157
|
+
options.onTransaction(response.hash);
|
|
158
|
+
}
|
|
159
|
+
return response.wait(options?.evmConfirmations || 1, options?.evmTimeout);
|
|
160
|
+
})
|
|
161
|
+
.then((receipt) => {
|
|
162
|
+
if (options?.onTransactionReceipt) {
|
|
163
|
+
options.onTransactionReceipt(receipt);
|
|
164
|
+
}
|
|
165
|
+
return receipt;
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
async settlePriceFeedUpdateConditions(caption, conditions, options) {
|
|
169
|
+
const evmTransaction = await this.contract.settlePriceFeedUpdateConditions.populateTransaction(caption, abiEncodePriceFeedUpdateConditions(conditions));
|
|
170
|
+
evmTransaction.gasPrice = options?.evmGasPrice || evmTransaction?.gasPrice;
|
|
171
|
+
return this.signer
|
|
172
|
+
.sendTransaction(evmTransaction)
|
|
173
|
+
.then((response) => {
|
|
174
|
+
if (options?.onTransaction) {
|
|
175
|
+
options.onTransaction(response.hash);
|
|
176
|
+
}
|
|
177
|
+
return response.wait(options?.evmConfirmations || 1, options?.evmTimeout);
|
|
178
|
+
})
|
|
179
|
+
.then((receipt) => {
|
|
180
|
+
if (options?.onTransactionReceipt) {
|
|
181
|
+
options.onTransactionReceipt(receipt);
|
|
182
|
+
}
|
|
183
|
+
return receipt;
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
async clone(curator, options) {
|
|
187
|
+
const tx = await this.contract.clone.populateTransaction(curator);
|
|
188
|
+
tx.gasPrice = options?.evmGasPrice || tx?.gasPrice;
|
|
189
|
+
return this.signer
|
|
190
|
+
.sendTransaction(tx)
|
|
191
|
+
.then((response) => {
|
|
192
|
+
if (options?.onTransaction) {
|
|
193
|
+
options.onTransaction(response.hash);
|
|
194
|
+
}
|
|
195
|
+
return response.wait(options?.evmConfirmations || 1, options?.evmTimeout);
|
|
196
|
+
})
|
|
197
|
+
.then((receipt) => {
|
|
198
|
+
if (options?.onTransactionReceipt) {
|
|
199
|
+
options.onTransactionReceipt(receipt);
|
|
200
|
+
}
|
|
201
|
+
return receipt;
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
async getDefaultUpdateConditions() {
|
|
205
|
+
return this.contract.defaultUpdateConditions.staticCall();
|
|
206
|
+
}
|
|
207
|
+
async determineChainlinkAggregatorAddress(id4) {
|
|
208
|
+
return this.contract.createChainlinkAggregator.staticCall(id4);
|
|
209
|
+
}
|
|
210
|
+
async getEvmClonableBase() {
|
|
211
|
+
return this.contract.base.staticCall();
|
|
212
|
+
}
|
|
213
|
+
async getEvmConsumer() {
|
|
214
|
+
return this.contract.consumer.staticCall();
|
|
215
|
+
}
|
|
216
|
+
async getEvmCurator() {
|
|
217
|
+
return this.contract.owner.staticCall();
|
|
218
|
+
}
|
|
219
|
+
async getEvmFootprint() {
|
|
220
|
+
return this.contract.footprint.staticCall();
|
|
221
|
+
}
|
|
222
|
+
async getId4(caption) {
|
|
223
|
+
return this.contract.hash.staticCall(caption).then((id) => id.slice(0, 10));
|
|
224
|
+
}
|
|
225
|
+
async getPrice(id4) {
|
|
226
|
+
return this.contract
|
|
227
|
+
.getFunction("getPrice(bytes4)")
|
|
228
|
+
.staticCall(id4)
|
|
229
|
+
.then((result) => ({
|
|
230
|
+
price: Number(result.price) / 10 ** Number(-result.exponent),
|
|
231
|
+
deltaPrice: Number(result.deltaPrice) / 10 ** Number(-result.exponent),
|
|
232
|
+
exponent: Number(result.exponent),
|
|
233
|
+
timestamp: Number(result.timestamp),
|
|
234
|
+
trail: result.trail,
|
|
235
|
+
}));
|
|
236
|
+
}
|
|
237
|
+
async getPriceNotOlderThan(id4, age) {
|
|
238
|
+
return this.contract
|
|
239
|
+
.getFunction("getPriceNotOlderThan(bytes4,uint24)")
|
|
240
|
+
.staticCall(id4, age)
|
|
241
|
+
.then((result) => ({
|
|
242
|
+
price: Number(result.price) / 10 ** Number(-result.exponent),
|
|
243
|
+
deltaPrice: Number(result.deltaPrice) / 10 ** Number(-result.exponent),
|
|
244
|
+
exponent: Number(result.exponent),
|
|
245
|
+
timestamp: Number(result.timestamp),
|
|
246
|
+
trail: result.trail,
|
|
247
|
+
}));
|
|
248
|
+
}
|
|
249
|
+
async getPriceUnsafe(id4) {
|
|
250
|
+
return this.contract
|
|
251
|
+
.getFunction("getPriceUnsafe(bytes4)")
|
|
252
|
+
.staticCall(id4)
|
|
253
|
+
.then((result) => ({
|
|
254
|
+
price: Number(result.price) / 10 ** Number(-result.exponent),
|
|
255
|
+
deltaPrice: Number(result.deltaPrice) / 10 ** Number(-result.exponent),
|
|
256
|
+
exponent: Number(result.exponent),
|
|
257
|
+
timestamp: Number(result.timestamp),
|
|
258
|
+
trail: result.trail,
|
|
259
|
+
}));
|
|
260
|
+
}
|
|
261
|
+
async isCaptionSupported(caption) {
|
|
262
|
+
return this.contract.supportsCaption.staticCall(caption);
|
|
263
|
+
}
|
|
264
|
+
async lookupPriceFeed(id4) {
|
|
265
|
+
return this.contract.lookupPriceFeed
|
|
266
|
+
.staticCall(id4)
|
|
267
|
+
.then((result) => ({
|
|
268
|
+
id: result.id,
|
|
269
|
+
id4: result.id.slice(0, 10),
|
|
270
|
+
exponent: Number(result.exponent),
|
|
271
|
+
symbol: result.symbol,
|
|
272
|
+
...(result.mapper.class !== 0n
|
|
273
|
+
? {
|
|
274
|
+
mapper: {
|
|
275
|
+
class: PriceFeedMappers[result.mapper.class],
|
|
276
|
+
deps: result.mapper.deps,
|
|
277
|
+
},
|
|
278
|
+
}
|
|
279
|
+
: {
|
|
280
|
+
oracle: {
|
|
281
|
+
class: PriceFeedOracles[result.oracle.class],
|
|
282
|
+
target: result.oracle.target,
|
|
283
|
+
sources: result.oracle.sources,
|
|
284
|
+
},
|
|
285
|
+
}),
|
|
286
|
+
updateConditions: {
|
|
287
|
+
callbackGas: Number(result.updateConditions.callbackGas),
|
|
288
|
+
computeEMA: result.updateConditions.computeEma,
|
|
289
|
+
cooldownSecs: Number(result.updateConditions.cooldownSecs),
|
|
290
|
+
heartbeatSecs: Number(result.updateConditions.heartbeatSecs),
|
|
291
|
+
maxDeviationPercentage: Number(result.updateConditions.maxDeviation1000) / 10,
|
|
292
|
+
minWitnesses: Number(result.updateConditions.minWitnesses),
|
|
293
|
+
},
|
|
294
|
+
lastUpdate: {
|
|
295
|
+
price: Number(result.lastUpdate.price) /
|
|
296
|
+
10 ** Number(-result.lastUpdate.exponent),
|
|
297
|
+
deltaPrice: Number(result.lastUpdate.deltaPrice) /
|
|
298
|
+
10 ** Number(-result.lastUpdate.exponent),
|
|
299
|
+
exponent: Number(result.lastUpdate.exponent),
|
|
300
|
+
timestamp: Number(result.lastUpdate.timestamp),
|
|
301
|
+
trail: result.lastUpdate.trail,
|
|
302
|
+
},
|
|
303
|
+
}));
|
|
304
|
+
}
|
|
305
|
+
async lookupPriceFeedCaption(id4) {
|
|
306
|
+
return this.contract.lookupSymbol.staticCall(id4);
|
|
307
|
+
}
|
|
308
|
+
async lookupPriceFeedExponent(id4) {
|
|
309
|
+
return this.contract.lookupPriceFeedExponent
|
|
310
|
+
.staticCall(id4)
|
|
311
|
+
.then((result) => Number(result));
|
|
312
|
+
}
|
|
313
|
+
async lookupPriceFeedID(id4) {
|
|
314
|
+
return this.contract.lookupPriceFeedID.staticCall(id4);
|
|
315
|
+
}
|
|
316
|
+
async lookupPriceFeeds() {
|
|
317
|
+
return this.contract.lookupPriceFeeds.staticCall().then((results) => results.map((result) => ({
|
|
318
|
+
id: result.id,
|
|
319
|
+
id4: result.id.slice(0, 10),
|
|
320
|
+
exponent: Number(result.exponent),
|
|
321
|
+
symbol: result.symbol,
|
|
322
|
+
...(result.mapper.class !== 0n
|
|
323
|
+
? {
|
|
324
|
+
mapper: {
|
|
325
|
+
class: PriceFeedMappers[result.mapper.class],
|
|
326
|
+
deps: result.mapper.deps,
|
|
327
|
+
},
|
|
328
|
+
}
|
|
329
|
+
: {
|
|
330
|
+
oracle: {
|
|
331
|
+
class: PriceFeedOracles[result.oracle.class],
|
|
332
|
+
target: result.oracle.target,
|
|
333
|
+
sources: result.oracle.sources,
|
|
334
|
+
},
|
|
335
|
+
}),
|
|
336
|
+
updateConditions: {
|
|
337
|
+
callbackGas: Number(result.updateConditions.callbackGas),
|
|
338
|
+
computeEMA: result.updateConditions.computeEma,
|
|
339
|
+
cooldownSecs: Number(result.updateConditions.cooldownSecs),
|
|
340
|
+
heartbeatSecs: Number(result.updateConditions.heartbeatSecs),
|
|
341
|
+
maxDeviationPercentage: Number(result.updateConditions.maxDeviation1000) / 10,
|
|
342
|
+
minWitnesses: Number(result.updateConditions.minWitnesses),
|
|
343
|
+
},
|
|
344
|
+
lastUpdate: {
|
|
345
|
+
price: Number(result.lastUpdate.price) /
|
|
346
|
+
10 ** Number(-result.lastUpdate.exponent),
|
|
347
|
+
deltaPrice: Number(result.lastUpdate.deltaPrice) /
|
|
348
|
+
10 ** Number(-result.lastUpdate.exponent),
|
|
349
|
+
exponent: Number(result.lastUpdate.exponent),
|
|
350
|
+
timestamp: BigInt(result.lastUpdate.timestamp),
|
|
351
|
+
trail: result.lastUpdate.trail,
|
|
352
|
+
},
|
|
353
|
+
})));
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2l0UHJpY2VGZWVkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvd3JhcHBlcnMvV2l0UHJpY2VGZWVkcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ04sUUFBUSxFQUdSLFdBQVcsR0FFWCxNQUFNLFFBQVEsQ0FBQTtBQUNmLE9BQU8sRUFHTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEdBR2hCLE1BQU0sYUFBYSxDQUFBO0FBQ3BCLE9BQU8sRUFDTix1QkFBdUIsRUFDdkIsa0NBQWtDLEdBQ2xDLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUdoRCxNQUFNLE9BQU8sYUFBYyxTQUFRLFlBQVk7SUFDOUMsWUFBc0IsU0FBb0IsRUFBRSxFQUFVO1FBQ3JELEtBQUssQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ3RDLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDZCxTQUFvQixFQUNwQixNQUFjO1FBRWQsTUFBTSxVQUFVLEdBQUcsSUFBSSxhQUFhLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3ZELElBQUksVUFBVSxDQUFBO1FBQ2QsSUFBSSxDQUFDO1lBQ0osVUFBVSxHQUFHLE1BQU0sVUFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDOUQsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNSLFVBQVUsR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRO2lCQUNwQyxJQUFJLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLE1BQU07Z0JBQ1YsSUFBSSxFQUFFLFlBQVksRUFBRSx5QkFBeUI7YUFDN0MsQ0FBQztpQkFDRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUNoQixRQUFRLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxDQUFDLENB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QyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUM7YUFDMUQ7WUFDRCxVQUFVLEVBQUU7Z0JBQ1gsS0FBSyxFQUNKLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztvQkFDL0IsRUFBRSxJQUFJLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO2dCQUMxQyxVQUFVLEVBQ1QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO29CQUNwQyxFQUFFLElBQUksTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7Z0JBQzFDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7Z0JBQzVDLFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7Z0JBQzlDLEtBQUssRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUs7YUFDOUI7U0FDRCxDQUFDLENBQUMsQ0FDSCxDQUFBO0lBQ0YsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBXaXRuZXQgfSBmcm9tIFwiQHdpdG5ldC9zZGtcIlxuaW1wb3J0IHtcblx0QWJpQ29kZXIsXG5cdHR5cGUgQ29udHJhY3RUcmFuc2FjdGlvbixcblx0dHlwZSBDb250cmFjdFRyYW5zYWN0aW9uUmVjZWlwdCxcblx0Zm9ybWF0VW5pdHMsXG5cdHR5cGUgVHJhbnNhY3Rpb25SZWNlaXB0LFxufSBmcm9tIFwiZXRoZXJzXCJcbmltcG9ydCB7XG5cdHR5cGUgRGF0YVB1c2hSZXBvcnQsXG5cdHR5cGUgUHJpY2VGZWVkLFxuXHRQcmljZUZlZWRNYXBwZXJzLFxuXHRQcmljZUZlZWRPcmFjbGVzLFxuXHR0eXBlIFByaWNlRmVlZFVwZGF0ZSxcblx0dHlwZSBQcmljZUZlZWRVcGRhdGVDb25kaXRpb25zLFxufSBmcm9tIFwiLi4vdHlwZXMuanNcIlxuaW1wb3J0IHtcblx0YWJpRW5jb2RlRGF0YVB1c2hSZXBvcnQsXG5cdGFiaUVuY29kZVByaWNlRmVlZFVwZGF0ZUNvbmRpdGlvbnMsXG59IGZyb20gXCIuLi91dGlscy5qc1wiXG5cbmltcG9ydCB7IFdpdEFwcGxpYW5jZSB9IGZyb20gXCIuL1dpdEFwcGxpYW5jZS5qc1wiXG5pbXBvcnQgdHlwZSB7IFdpdE9yYWNsZSB9IGZyb20gXCIuL1dpdE9yYWNsZS5qc1wiXG5cbmV4cG9ydCBjbGFzcyBXaXRQcmljZUZlZWRzIGV4dGVuZHMgV2l0QXBwbGlhbmNlIHtcblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yKHdpdE9yYWNsZTogV2l0T3JhY2xlLCBhdDogc3RyaW5nKSB7XG5cdFx0c3VwZXIod2l0T3JhY2xlLCBcIldpdFByaWNlRmVlZHNcIiwgYXQpXG5cdH1cblxuXHRzdGF0aWMgYXN5bmMgYXQoXG5cdFx0d2l0T3JhY2xlOiBXaXRPcmFjbGUsXG5cdFx0dGFyZ2V0OiBzdHJpbmcsXG5cdCk6IFByb21pc2U8V2l0UHJpY2VGZWVkcz4ge1xuXHRcdGNvbnN0IHByaWNlRmVlZHMgPSBuZXcgV2l0UHJpY2VGZWVkcyh3aXRPcmFjbGUsIHRhcmdldClcblx0XHRsZXQgb3JhY2xlQWRkclxuXHRcdHRyeSB7XG5cdFx0XHRvcmFjbGVBZGRyID0gYXdhaXQgcHJpY2VGZWVkcy5jb250cmFjdC53aXRPcmFjbGUuc3RhdGljQ2FsbCgpXG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRvcmFjbGVBZGRyID0gYXdhaXQgcHJpY2VGZWVkcy5wcm92aWRlclxuXHRcdFx0XHQuY2FsbCh7XG5cdFx0XHRcdFx0dG86IHRhcmdldCxcblx0XHRcdFx0XHRkYXRhOiBcIjB4NDZkMWQyMWFcIiwgLy8gZnVuY1NpZyBmb3IgJ3dpdG5ldCgpJ1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbigocmVzdWx0KSA9PlxuXHRcdFx0XHRcdEFiaUNvZGVyLmRlZmF1bHRBYmlDb2RlcigpLmRlY29kZShbXCJhZGRyZXNzXCJdLCByZXN1bHQpLFxuXHRcdFx0XHQpXG5cdFx0XHRcdC50aGVuKChyZXN1bHQpID0+IHJlc3VsdC50b1N0cmluZygpKVxuXHRcdH1cblx0XHRpZiAob3JhY2xlQWRkciAhPT0gd2l0T3JhY2xlLmFkZHJlc3MpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YCR7V2l0UHJpY2VGZWVkcy5jb25zdHJ1Y3Rvci5uYW1lfSBhdCAke3RhcmdldH06IG1pc21hdGNoaW5nIFdpdC9PcmFjbGUgYWRkcmVzcyAoJHtvcmFjbGVBZGRyfSlgLFxuXHRcdFx0KVxuXHRcdH1cblx0XHRyZXR1cm4gcHJpY2VGZWVkc1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGNyZWF0ZUNoYWlubGlua0FnZ3JlZ2F0b3IoXG5cdFx0aWQ0OiBXaXRuZXQuSGV4U3RyaW5nLFxuXHRcdG9wdGlvbnM/OiB7XG5cdFx0XHRldm1Db25maXJtYXRpb25zPzogbnVtYmVyXG5cdFx0XHRldm1HYXNQcmljZT86IGJpZ2ludFxuXHRcdFx0ZXZtVGltZW91dD86IG51bWJlclxuXHRcdFx0b25UcmFuc2FjdGlvbj86ICh0eEhhc2g6IFdpdG5ldC5IYXNoKSA9PiBhbnlcblx0XHRcdG9uVHJhbnNhY3Rpb25SZWNlaXB0PzogKHJlY2VpcHQ6IFRyYW5zYWN0aW9uUmVjZWlwdCB8IG51bGwpID0+IGFueVxuXHRcdH0sXG5cdCk6IFByb21pc2U8Q29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsPiB7XG5cdFx0Y29uc3QgZXZtVHJhbnNhY3Rpb246IENvbnRyYWN0VHJhbnNhY3Rpb24gPVxuXHRcdFx0YXdhaXQgdGhpcy5jb250cmFjdC5jcmVhdGVDaGFpbmxpbmtBZ2dyZWdhdG9yLnBvcHVsYXRlVHJhbnNhY3Rpb24oaWQ0KVxuXHRcdGV2bVRyYW5zYWN0aW9uLmdhc1ByaWNlID0gb3B0aW9ucz8uZXZtR2FzUHJpY2UgfHwgZXZtVHJhbnNhY3Rpb24/Lmdhc1ByaWNlXG5cdFx0cmV0dXJuIHRoaXMuc2lnbmVyXG5cdFx0XHQuc2VuZFRyYW5zYWN0aW9uKGV2bVRyYW5zYWN0aW9uKVxuXHRcdFx0LnRoZW4oKHJlc3BvbnNlKSA9PiB7XG5cdFx0XHRcdGlmIChvcHRpb25zPy5vblRyYW5zYWN0aW9uKSB7XG5cdFx0XHRcdFx0b3B0aW9ucy5vblRyYW5zYWN0aW9uKHJlc3BvbnNlLmhhc2gpXG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLndhaXQoXG5cdFx0XHRcdFx0b3B0aW9ucz8uZXZtQ29uZmlybWF0aW9ucyB8fCAxLFxuXHRcdFx0XHRcdG9wdGlvbnM/LmV2bVRpbWVvdXQsXG5cdFx0XHRcdClcblx0XHRcdH0pXG5cdFx0XHQudGhlbigocmVjZWlwdCkgPT4ge1xuXHRcdFx0XHRpZiAob3B0aW9ucz8ub25UcmFuc2FjdGlvblJlY2VpcHQpIHtcblx0XHRcdFx0XHRvcHRpb25zLm9uVHJhbnNhY3Rpb25SZWNlaXB0KHJlY2VpcHQpXG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlY2VpcHRcblx0XHRcdH0pXG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgcHVzaERhdGFSZXBvcnQoXG5cdFx0cmVwb3J0OiBEYXRhUHVzaFJlcG9ydCxcblx0XHRvcHRpb25zPzoge1xuXHRcdFx0Y29uZmlybWF0aW9ucz86IG51bWJlclxuXHRcdFx0Z2FzUHJpY2U/OiBiaWdpbnRcblx0XHRcdGdhc0xpbWl0PzogYmlnaW50XG5cdFx0XHRtYXhHYXNQcmljZT86IGJpZ2ludFxuXHRcdFx0dGltZW91dD86IG51bWJlclxuXHRcdFx0b25UcmFuc2FjdGlvbj86ICh0eEhhc2g6IHN0cmluZykgPT4gYW55XG5cdFx0XHRvblRyYW5zYWN0aW9uUmVjZWlwdD86IChyZWNlaXB0OiBUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsKSA9PiBhbnlcblx0XHR9LFxuXHQpOiBQcm9taXNlPENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0IHwgVHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbD4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnRyYWN0LnB1c2hEYXRhUmVwb3J0XG5cdFx0XHQucG9wdWxhdGVUcmFuc2FjdGlvbihhYmlFbmNvZGVEYXRhUHVzaFJlcG9ydChyZXBvcnQpLCByZXBvcnQ/LmV2bV9wcm9vZilcblx0XHRcdC50aGVuKCh0eCkgPT4ge1xuXHRcdFx0XHRpZiAoIW9wdGlvbnM/Lmdhc1ByaWNlICYmIHR4Py5nYXNQcmljZSAmJiBvcHRpb25zPy5tYXhHYXNQcmljZSkge1xuXHRcdFx0XHRcdGlmICh0eC5nYXNQcmljZSA+IG9wdGlvbnMubWF4R2FzUHJpY2UpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRcdFx0YCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfTogbmV0d29yayBnYXMgcHJpY2UgdG9vIGhpZ2g6ICR7Zm9ybWF0VW5pdHMoXG5cdFx0XHRcdFx0XHRcdFx0dHguZ2FzUHJpY2UsXG5cdFx0XHRcdFx0XHRcdFx0OSxcblx0XHRcdFx0XHRcdFx0KX0gPiAke2Zvcm1hdFVuaXRzKG9wdGlvbnMubWF4R2FzUHJpY2UsIDkpfSBnd2VpYCxcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dHguZ2FzUHJpY2UgPSBvcHRpb25zPy5nYXNQcmljZSB8fCB0eD8uZ2FzUHJpY2Vcblx0XHRcdFx0dHguZ2FzTGltaXQgPSBvcHRpb25zPy5nYXNMaW1pdCB8fCB0eD8uZ2FzTGltaXRcblx0XHRcdFx0cmV0dXJuIHRoaXMuc2lnbmVyLnNlbmRUcmFuc2FjdGlvbih0eClcblx0XHRcdH0pXG5cdFx0XHQudGhlbigocmVzcG9uc2UpID0+IHtcblx0XHRcdFx0aWYgKG9wdGlvbnM/Lm9uVHJhbnNhY3Rpb24pIHtcblx0XHRcdFx0XHRvcHRpb25zLm9uVHJhbnNhY3Rpb24ocmVzcG9uc2UuaGFzaClcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVzcG9uc2Uud2FpdChvcHRpb25zPy5jb25maXJtYXRpb25zIHx8IDEsIG9wdGlvbnM/LnRpbWVvdXQpXG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKHJlY2VpcHQpID0+IHtcblx0XHRcdFx0aWYgKG9wdGlvbnM/Lm9uVHJhbnNhY3Rpb25SZWNlaXB0KSB7XG5cdFx0XHRcdFx0b3B0aW9ucy5vblRyYW5zYWN0aW9uUmVjZWlwdChyZWNlaXB0KVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZWNlaXB0XG5cdFx0XHR9KVxuXHR9XG5cblx0cHVibGljIGFzeW5jIHNldHRsZVByaWNlRmVlZFJhZG9uSGFzaChcblx0XHRjYXB0aW9uOiBzdHJpbmcsXG5cdFx0ZGVjaW1hbHM6IG51bWJlcixcblx0XHRyYWRIYXNoOiBXaXRuZXQuSGV4U3RyaW5nLFxuXHRcdG9wdGlvbnM/OiB7XG5cdFx0XHRldm1Db25maXJtYXRpb25zPzogbnVtYmVyXG5cdFx0XHRldm1HYXNQcmljZT86IGJpZ2ludFxuXHRcdFx0ZXZtVGltZW91dD86IG51bWJlclxuXHRcdFx0b25UcmFuc2FjdGlvbj86ICh0eEhhc2g6IFdpdG5ldC5IYXNoKSA9PiBhbnlcblx0XHRcdG9uVHJhbnNhY3Rpb25SZWNlaXB0PzogKHJlY2VpcHQ6IFRyYW5zYWN0aW9uUmVjZWlwdCB8IG51bGwpID0+IGFueVxuXHRcdH0sXG5cdCk6IFByb21pc2U8Q29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsPiB7XG5cdFx0Y29uc3QgZXZtVHJhbnNhY3Rpb246IENvbnRyYWN0VHJhbnNhY3Rpb24gPVxuXHRcdFx0YXdhaXQgdGhpcy5jb250cmFjdC5zZXR0bGVQcmljZUZlZWRSYWRvbkhhc2gucG9wdWxhdGVUcmFuc2FjdGlvbihcblx0XHRcdFx0Y2FwdGlvbixcblx0XHRcdFx0ZGVjaW1hbHMsXG5cdFx0XHRcdHJhZEhhc2gsXG5cdFx0XHQpXG5cdFx0ZXZtVHJhbnNhY3Rpb24uZ2FzUHJpY2UgPSBvcHRpb25zPy5ldm1HYXNQcmljZSB8fCBldm1UcmFuc2FjdGlvbj8uZ2FzUHJpY2Vcblx0XHRyZXR1cm4gdGhpcy5zaWduZXJcblx0XHRcdC5zZW5kVHJhbnNhY3Rpb24oZXZtVHJhbnNhY3Rpb24pXG5cdFx0XHQudGhlbigocmVzcG9uc2UpID0+IHtcblx0XHRcdFx0aWYgKG9wdGlvbnM/Lm9uVHJhbnNhY3Rpb24pIHtcblx0XHRcdFx0XHRvcHRpb25zLm9uVHJhbnNhY3Rpb24ocmVzcG9uc2UuaGFzaClcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVzcG9uc2Uud2FpdChcblx0XHRcdFx0XHRvcHRpb25zPy5ldm1Db25maXJtYXRpb25zIHx8IDEsXG5cdFx0XHRcdFx0b3B0aW9ucz8uZXZtVGltZW91dCxcblx0XHRcdFx0KVxuXHRcdFx0fSlcblx0XHRcdC50aGVuKChyZWNlaXB0KSA9PiB7XG5cdFx0XHRcdGlmIChvcHRpb25zPy5vblRyYW5zYWN0aW9uUmVjZWlwdCkge1xuXHRcdFx0XHRcdG9wdGlvbnMub25UcmFuc2FjdGlvblJlY2VpcHQocmVjZWlwdClcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVjZWlwdFxuXHRcdFx0fSlcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBzZXR0bGVQcmljZUZlZWRPcmFjbGUoXG5cdFx0Y2FwdGlvbjogc3RyaW5nLFxuXHRcdGRlY2ltYWxzOiBudW1iZXIsXG5cdFx0b3JhY2xlOiBQcmljZUZlZWRPcmFjbGVzIHwgc3RyaW5nLFxuXHRcdHRhcmdldDogV2l0bmV0LkhleFN0cmluZyxcblx0XHRzb3VyY2VzPzogV2l0bmV0LkhleFN0cmluZyxcblx0XHRvcHRpb25zPzoge1xuXHRcdFx0ZXZtQ29uZmlybWF0aW9ucz86IG51bWJlclxuXHRcdFx0ZXZtR2FzUHJpY2U/OiBiaWdpbnRcblx0XHRcdGV2bVRpbWVvdXQ/OiBudW1iZXJcblx0XHRcdG9uVHJhbnNhY3Rpb24/OiAodHhIYXNoOiBXaXRuZXQuSGFzaCkgPT4gYW55XG5cdFx0XHRvblRyYW5zYWN0aW9uUmVjZWlwdD86IChyZWNlaXB0OiBUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsKSA9PiBhbnlcblx0XHR9LFxuXHQpOiBQcm9taXNlPENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0IHwgVHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbD4ge1xuXHRcdGNvbnN0IGV2bVRyYW5zYWN0aW9uOiBDb250cmFjdFRyYW5zYWN0aW9uID1cblx0XHRcdGF3YWl0IHRoaXMuY29udHJhY3Quc2V0dGxlUHJpY2VGZWVkT3JhY2xlLnBvcHVsYXRlVHJhbnNhY3Rpb24oXG5cdFx0XHRcdGNhcHRpb24sXG5cdFx0XHRcdGRlY2ltYWxzLFxuXHRcdFx0XHR0eXBlb2Ygb3JhY2xlID09PSBcInN0cmluZ1wiXG5cdFx0XHRcdFx0PyBPYmplY3QudmFsdWVzKFByaWNlRmVlZE9yYWNsZXMpLmluZGV4T2Yob3JhY2xlKVxuXHRcdFx0XHRcdDogb3JhY2xlLFxuXHRcdFx0XHR0YXJnZXQsXG5cdFx0XHRcdHNvdXJjZXMgfHxcblx0XHRcdFx0XHRcIjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFxuXHRcdFx0KVxuXHRcdGV2bVRyYW5zYWN0aW9uLmdhc1ByaWNlID0gb3B0aW9ucz8uZXZtR2FzUHJpY2UgfHwgZXZtVHJhbnNhY3Rpb24/Lmdhc1ByaWNlXG5cdFx0cmV0dXJuIHRoaXMuc2lnbmVyXG5cdFx0XHQuc2VuZFRyYW5zYWN0aW9uKGV2bVRyYW5zYWN0aW9uKVxuXHRcdFx0LnRoZW4oKHJlc3BvbnNlKSA9PiB7XG5cdFx0XHRcdGlmIChvcHRpb25zPy5vblRyYW5zYWN0aW9uKSB7XG5cdFx0XHRcdFx0b3B0aW9ucy5vblRyYW5zYWN0aW9uKHJlc3BvbnNlLmhhc2gpXG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLndhaXQoXG5cdFx0XHRcdFx0b3B0aW9ucz8uZXZtQ29uZmlybWF0aW9ucyB8fCAxLFxuXHRcdFx0XHRcdG9wdGlvbnM/LmV2bVRpbWVvdXQsXG5cdFx0XHRcdClcblx0XHRcdH0pXG5cdFx0XHQudGhlbigocmVjZWlwdCkgPT4ge1xuXHRcdFx0XHRpZiAob3B0aW9ucz8ub25UcmFuc2FjdGlvblJlY2VpcHQpIHtcblx0XHRcdFx0XHRvcHRpb25zLm9uVHJhbnNhY3Rpb25SZWNlaXB0KHJlY2VpcHQpXG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlY2VpcHRcblx0XHRcdH0pXG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgc2V0dGxlUHJpY2VGZWVkTWFwcGVyKFxuXHRcdGNhcHRpb246IHN0cmluZyxcblx0XHRkZWNpbWFsczogbnVtYmVyLFxuXHRcdG1hcHBlcjogUHJpY2VGZWVkTWFwcGVycyB8IHN0cmluZyxcblx0XHRkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuXHRcdG9wdGlvbnM/OiB7XG5cdFx0XHRldm1Db25maXJtYXRpb25zPzogbnVtYmVyXG5cdFx0XHRldm1HYXNQcmljZT86IGJpZ2ludFxuXHRcdFx0ZXZtVGltZW91dD86IG51bWJlclxuXHRcdFx0b25UcmFuc2FjdGlvbj86ICh0eEhhc2g6IFdpdG5ldC5IYXNoKSA9PiBhbnlcblx0XHRcdG9uVHJhbnNhY3Rpb25SZWNlaXB0PzogKHJlY2VpcHQ6IFRyYW5zYWN0aW9uUmVjZWlwdCB8IG51bGwpID0+IGFueVxuXHRcdH0sXG5cdCk6IFByb21pc2U8Q29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsPiB7XG5cdFx0Y29uc3QgZXZtVHJhbnNhY3Rpb246IENvbnRyYWN0VHJhbnNhY3Rpb24gPVxuXHRcdFx0YXdhaXQgdGhpcy5jb250cmFjdC5zZXR0bGVQcmljZUZlZWRNYXBwZXIucG9wdWxhdGVUcmFuc2FjdGlvbihcblx0XHRcdFx0Y2FwdGlvbixcblx0XHRcdFx0ZGVjaW1hbHMsXG5cdFx0XHRcdHR5cGVvZiBtYXBwZXIgPT09IFwic3RyaW5nXCJcblx0XHRcdFx0XHQ/IE9iamVjdC52YWx1ZXMoUHJpY2VGZWVkTWFwcGVycykuaW5kZXhPZihtYXBwZXIpXG5cdFx0XHRcdFx0OiBtYXBwZXIsXG5cdFx0XHRcdGRlcGVuZGVuY2llcyxcblx0XHRcdClcblx0XHRldm1UcmFuc2FjdGlvbi5nYXNQcmljZSA9IG9wdGlvbnM/LmV2bUdhc1ByaWNlIHx8IGV2bVRyYW5zYWN0aW9uPy5nYXNQcmljZVxuXHRcdHJldHVybiB0aGlzLnNpZ25lclxuXHRcdFx0LnNlbmRUcmFuc2FjdGlvbihldm1UcmFuc2FjdGlvbilcblx0XHRcdC50aGVuKChyZXNwb25zZSkgPT4ge1xuXHRcdFx0XHRpZiAob3B0aW9ucz8ub25UcmFuc2FjdGlvbikge1xuXHRcdFx0XHRcdG9wdGlvbnMub25UcmFuc2FjdGlvbihyZXNwb25zZS5oYXNoKVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZXNwb25zZS53YWl0KFxuXHRcdFx0XHRcdG9wdGlvbnM/LmV2bUNvbmZpcm1hdGlvbnMgfHwgMSxcblx0XHRcdFx0XHRvcHRpb25zPy5ldm1UaW1lb3V0LFxuXHRcdFx0XHQpXG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKHJlY2VpcHQpID0+IHtcblx0XHRcdFx0aWYgKG9wdGlvbnM/Lm9uVHJhbnNhY3Rpb25SZWNlaXB0KSB7XG5cdFx0XHRcdFx0b3B0aW9ucy5vblRyYW5zYWN0aW9uUmVjZWlwdChyZWNlaXB0KVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZWNlaXB0XG5cdFx0XHR9KVxuXHR9XG5cblx0cHVibGljIGFzeW5jIHJlbW92ZVByaWNlRmVlZChcblx0XHRjYXB0aW9uOiBzdHJpbmcsXG5cdFx0b3B0aW9ucz86IHtcblx0XHRcdGV2bUNvbmZpcm1hdGlvbnM/OiBudW1iZXJcblx0XHRcdGV2bUdhc1ByaWNlPzogYmlnaW50XG5cdFx0XHRldm1UaW1lb3V0PzogbnVtYmVyXG5cdFx0XHRvblRyYW5zYWN0aW9uPzogKHR4SGFzaDogV2l0bmV0Lkhhc2gpID0+IGFueVxuXHRcdFx0b25UcmFuc2FjdGlvblJlY2VpcHQ/OiAocmVjZWlwdDogVHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbCkgPT4gYW55XG5cdFx0fSxcblx0KTogUHJvbWlzZTxDb250cmFjdFRyYW5zYWN0aW9uUmVjZWlwdCB8IFRyYW5zYWN0aW9uUmVjZWlwdCB8IG51bGw+IHtcblx0XHRjb25zdCBldm1UcmFuc2FjdGlvbjogQ29udHJhY3RUcmFuc2FjdGlvbiA9XG5cdFx0XHRhd2FpdCB0aGlzLmNvbnRyYWN0LnJlbW92ZVByaWNlRmVlZC5wb3B1bGF0ZVRyYW5zYWN0aW9uKGNhcHRpb24sIHRydWUpXG5cdFx0ZXZtVHJhbnNhY3Rpb24uZ2FzUHJpY2UgPSBvcHRpb25zPy5ldm1HYXNQcmljZSB8fCBldm1UcmFuc2FjdGlvbj8uZ2FzUHJpY2Vcblx0XHRyZXR1cm4gdGhpcy5zaWduZXJcblx0XHRcdC5zZW5kVHJhbnNhY3Rpb24oZXZtVHJhbnNhY3Rpb24pXG5cdFx0XHQudGhlbigocmVzcG9uc2UpID0+IHtcblx0XHRcdFx0aWYgKG9wdGlvbnM/Lm9uVHJhbnNhY3Rpb24pIHtcblx0XHRcdFx0XHRvcHRpb25zLm9uVHJhbnNhY3Rpb24ocmVzcG9uc2UuaGFzaClcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVzcG9uc2Uud2FpdChcblx0XHRcdFx0XHRvcHRpb25zPy5ldm1Db25maXJtYXRpb25zIHx8IDEsXG5cdFx0XHRcdFx0b3B0aW9ucz8uZXZtVGltZW91dCxcblx0XHRcdFx0KVxuXHRcdFx0fSlcblx0XHRcdC50aGVuKChyZWNlaXB0KSA9PiB7XG5cdFx0XHRcdGlmIChvcHRpb25zPy5vblRyYW5zYWN0aW9uUmVjZWlwdCkge1xuXHRcdFx0XHRcdG9wdGlvbnMub25UcmFuc2FjdGlvblJlY2VpcHQocmVjZWlwdClcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVjZWlwdFxuXHRcdFx0fSlcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBzZXR0bGVEZWZhdWx0VXBkYXRlQ29uZGl0aW9ucyhcblx0XHRjb25kaXRpb25zOiBQcmljZUZlZWRVcGRhdGVDb25kaXRpb25zLFxuXHRcdG9wdGlvbnM/OiB7XG5cdFx0XHRldm1Db25maXJtYXRpb25zPzogbnVtYmVyXG5cdFx0XHRldm1HYXNQcmljZT86IGJpZ2ludFxuXHRcdFx0ZXZtVGltZW91dD86IG51bWJlclxuXHRcdFx0b25UcmFuc2FjdGlvbj86ICh0eEhhc2g6IFdpdG5ldC5IYXNoKSA9PiBhbnlcblx0XHRcdG9uVHJhbnNhY3Rpb25SZWNlaXB0PzogKHJlY2VpcHQ6IFRyYW5zYWN0aW9uUmVjZWlwdCB8IG51bGwpID0+IGFueVxuXHRcdH0sXG5cdCk6IFByb21pc2U8Q29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsPiB7XG5cdFx0Y29uc3QgZXZtVHJhbnNhY3Rpb246IENvbnRyYWN0VHJhbnNhY3Rpb24gPVxuXHRcdFx0YXdhaXQgdGhpcy5jb250cmFjdC5zZXR0bGVEZWZhdWx0VXBkYXRlQ29uZGl0aW9ucy5wb3B1bGF0ZVRyYW5zYWN0aW9uKFxuXHRcdFx0XHRhYmlFbmNvZGVQcmljZUZlZWRVcGRhdGVDb25kaXRpb25zKGNvbmRpdGlvbnMpLFxuXHRcdFx0KVxuXHRcdGV2bVRyYW5zYWN0aW9uLmdhc1ByaWNlID0gb3B0aW9ucz8uZXZtR2FzUHJpY2UgfHwgZXZtVHJhbnNhY3Rpb24/Lmdhc1ByaWNlXG5cdFx0cmV0dXJuIHRoaXMuc2lnbmVyXG5cdFx0XHQuc2VuZFRyYW5zYWN0aW9uKGV2bVRyYW5zYWN0aW9uKVxuXHRcdFx0LnRoZW4oKHJlc3BvbnNlKSA9PiB7XG5cdFx0XHRcdGlmIChvcHRpb25zPy5vblRyYW5zYWN0aW9uKSB7XG5cdFx0XHRcdFx0b3B0aW9ucy5vblRyYW5zYWN0aW9uKHJlc3BvbnNlLmhhc2gpXG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLndhaXQoXG5cdFx0XHRcdFx0b3B0aW9ucz8uZXZtQ29uZmlybWF0aW9ucyB8fCAxLFxuXHRcdFx0XHRcdG9wdGlvbnM/LmV2bVRpbWVvdXQsXG5cdFx0XHRcdClcblx0XHRcdH0pXG5cdFx0XHQudGhlbigocmVjZWlwdCkgPT4ge1xuXHRcdFx0XHRpZiAob3B0aW9ucz8ub25UcmFuc2FjdGlvblJlY2VpcHQpIHtcblx0XHRcdFx0XHRvcHRpb25zLm9uVHJhbnNhY3Rpb25SZWNlaXB0KHJlY2VpcHQpXG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlY2VpcHRcblx0XHRcdH0pXG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgc2V0dGxlUHJpY2VGZWVkVXBkYXRlQ29uZGl0aW9ucyhcblx0XHRjYXB0aW9uOiBzdHJpbmcsXG5cdFx0Y29uZGl0aW9uczogUHJpY2VGZWVkVXBkYXRlQ29uZGl0aW9ucyxcblx0XHRvcHRpb25zPzoge1xuXHRcdFx0ZXZtQ29uZmlybWF0aW9ucz86IG51bWJlclxuXHRcdFx0ZXZtR2FzUHJpY2U/OiBiaWdpbnRcblx0XHRcdGV2bVRpbWVvdXQ/OiBudW1iZXJcblx0XHRcdG9uVHJhbnNhY3Rpb24/OiAodHhIYXNoOiBXaXRuZXQuSGFzaCkgPT4gYW55XG5cdFx0XHRvblRyYW5zYWN0aW9uUmVjZWlwdD86IChyZWNlaXB0OiBUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsKSA9PiBhbnlcblx0XHR9LFxuXHQpOiBQcm9taXNlPENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0IHwgVHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbD4ge1xuXHRcdGNvbnN0IGV2bVRyYW5zYWN0aW9uOiBDb250cmFjdFRyYW5zYWN0aW9uID1cblx0XHRcdGF3YWl0IHRoaXMuY29udHJhY3Quc2V0dGxlUHJpY2VGZWVkVXBkYXRlQ29uZGl0aW9ucy5wb3B1bGF0ZVRyYW5zYWN0aW9uKFxuXHRcdFx0XHRjYXB0aW9uLFxuXHRcdFx0XHRhYmlFbmNvZGVQcmljZUZlZWRVcGRhdGVDb25kaXRpb25zKGNvbmRpdGlvbnMpLFxuXHRcdFx0KVxuXHRcdGV2bVRyYW5zYWN0aW9uLmdhc1ByaWNlID0gb3B0aW9ucz8uZXZtR2FzUHJpY2UgfHwgZXZtVHJhbnNhY3Rpb24/Lmdhc1ByaWNlXG5cdFx0cmV0dXJuIHRoaXMuc2lnbmVyXG5cdFx0XHQuc2VuZFRyYW5zYWN0aW9uKGV2bVRyYW5zYWN0aW9uKVxuXHRcdFx0LnRoZW4oKHJlc3BvbnNlKSA9PiB7XG5cdFx0XHRcdGlmIChvcHRpb25zPy5vblRyYW5zYWN0aW9uKSB7XG5cdFx0XHRcdFx0b3B0aW9ucy5vblRyYW5zYWN0aW9uKHJlc3BvbnNlLmhhc2gpXG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLndhaXQoXG5cdFx0XHRcdFx0b3B0aW9ucz8uZXZtQ29uZmlybWF0aW9ucyB8fCAxLFxuXHRcdFx0XHRcdG9wdGlvbnM/LmV2bVRpbWVvdXQsXG5cdFx0XHRcdClcblx0XHRcdH0pXG5cdFx0XHQudGhlbigocmVjZWlwdCkgPT4ge1xuXHRcdFx0XHRpZiAob3B0aW9ucz8ub25UcmFuc2FjdGlvblJlY2VpcHQpIHtcblx0XHRcdFx0XHRvcHRpb25zLm9uVHJhbnNhY3Rpb25SZWNlaXB0KHJlY2VpcHQpXG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlY2VpcHRcblx0XHRcdH0pXG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgY2xvbmUoXG5cdFx0Y3VyYXRvcjogc3RyaW5nLFxuXHRcdG9wdGlvbnM/OiB7XG5cdFx0XHRldm1Db25maXJtYXRpb25zPzogbnVtYmVyXG5cdFx0XHRldm1HYXNQcmljZT86IGJpZ2ludFxuXHRcdFx0ZXZtVGltZW91dD86IG51bWJlclxuXHRcdFx0b25UcmFuc2FjdGlvbj86IChUeEhhc2g6IFdpdG5ldC5IYXNoKSA9PiBhbnlcblx0XHRcdG9uVHJhbnNhY3Rpb25SZWNlaXB0PzogKHJlY2VpcHQ6IFRyYW5zYWN0aW9uUmVjZWlwdCB8IG51bGwpID0+IGFueVxuXHRcdH0sXG5cdCk6IFByb21pc2U8Q29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsPiB7XG5cdFx0Y29uc3QgdHg6IENvbnRyYWN0VHJhbnNhY3Rpb24gPVxuXHRcdFx0YXdhaXQgdGhpcy5jb250cmFjdC5jbG9uZS5wb3B1bGF0ZVRyYW5zYWN0aW9uKGN1cmF0b3IpXG5cdFx0dHguZ2FzUHJpY2UgPSBvcHRpb25zPy5ldm1HYXNQcmljZSB8fCB0eD8uZ2FzUHJpY2Vcblx0XHRyZXR1cm4gdGhpcy5zaWduZXJcblx0XHRcdC5zZW5kVHJhbnNhY3Rpb24odHgpXG5cdFx0XHQudGhlbigocmVzcG9uc2UpID0+IHtcblx0XHRcdFx0aWYgKG9wdGlvbnM/Lm9uVHJhbnNhY3Rpb24pIHtcblx0XHRcdFx0XHRvcHRpb25zLm9uVHJhbnNhY3Rpb24ocmVzcG9uc2UuaGFzaClcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVzcG9uc2Uud2FpdChcblx0XHRcdFx0XHRvcHRpb25zPy5ldm1Db25maXJtYXRpb25zIHx8IDEsXG5cdFx0XHRcdFx0b3B0aW9ucz8uZXZtVGltZW91dCxcblx0XHRcdFx0KVxuXHRcdFx0fSlcblx0XHRcdC50aGVuKChyZWNlaXB0KSA9PiB7XG5cdFx0XHRcdGlmIChvcHRpb25zPy5vblRyYW5zYWN0aW9uUmVjZWlwdCkge1xuXHRcdFx0XHRcdG9wdGlvbnMub25UcmFuc2FjdGlvblJlY2VpcHQocmVjZWlwdClcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVjZWlwdFxuXHRcdFx0fSlcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBnZXREZWZhdWx0VXBkYXRlQ29uZGl0aW9ucygpOiBQcm9taXNlPFByaWNlRmVlZFVwZGF0ZUNvbmRpdGlvbnM+IHtcblx0XHRyZXR1cm4gdGhpcy5jb250cmFjdC5kZWZhdWx0VXBkYXRlQ29uZGl0aW9ucy5zdGF0aWNDYWxsKClcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBkZXRlcm1pbmVDaGFpbmxpbmtBZ2dyZWdhdG9yQWRkcmVzcyhcblx0XHRpZDQ6IFdpdG5ldC5IZXhTdHJpbmcsXG5cdCk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29udHJhY3QuY3JlYXRlQ2hhaW5saW5rQWdncmVnYXRvci5zdGF0aWNDYWxsKGlkNClcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBnZXRFdm1DbG9uYWJsZUJhc2UoKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gdGhpcy5jb250cmFjdC5iYXNlLnN0YXRpY0NhbGwoKVxuXHR9XG5cblx0cHVibGljIGFzeW5jIGdldEV2bUNvbnN1bWVyKCk6IFByb21pc2U8V2l0bmV0LkhleFN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnRyYWN0LmNvbnN1bWVyLnN0YXRpY0NhbGwoKVxuXHR9XG5cblx0cHVibGljIGFzeW5jIGdldEV2bUN1cmF0b3IoKTogUHJvbWlzZTxXaXRuZXQuSGV4U3RyaW5nPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29udHJhY3Qub3duZXIuc3RhdGljQ2FsbCgpXG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZ2V0RXZtRm9vdHByaW50KCk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29udHJhY3QuZm9vdHByaW50LnN0YXRpY0NhbGwoKVxuXHR9XG5cblx0cHVibGljIGFzeW5jIGdldElkNChjYXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPFdpdG5ldC5IZXhTdHJpbmc+IHtcblx0XHRyZXR1cm4gdGhpcy5jb250cmFjdC5oYXNoLnN0YXRpY0NhbGwoY2FwdGlvbikudGhlbigoaWQpID0+IGlkLnNsaWNlKDAsIDEwKSlcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBnZXRQcmljZShpZDQ6IFdpdG5ldC5IZXhTdHJpbmcpOiBQcm9taXNlPFByaWNlRmVlZFVwZGF0ZT4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnRyYWN0XG5cdFx0XHQuZ2V0RnVuY3Rpb24oXCJnZXRQcmljZShieXRlczQpXCIpXG5cdFx0XHQuc3RhdGljQ2FsbChpZDQpXG5cdFx0XHQudGhlbigocmVzdWx0OiBhbnkpID0+ICh7XG5cdFx0XHRcdHByaWNlOiBOdW1iZXIocmVzdWx0LnByaWNlKSAvIDEwICoqIE51bWJlcigtcmVzdWx0LmV4cG9uZW50KSxcblx0XHRcdFx0ZGVsdGFQcmljZTogTnVtYmVyKHJlc3VsdC5kZWx0YVByaWNlKSAvIDEwICoqIE51bWJlcigtcmVzdWx0LmV4cG9uZW50KSxcblx0XHRcdFx0ZXhwb25lbnQ6IE51bWJlcihyZXN1bHQuZXhwb25lbnQpLFxuXHRcdFx0XHR0aW1lc3RhbXA6IE51bWJlcihyZXN1bHQudGltZXN0YW1wKSxcblx0XHRcdFx0dHJhaWw6IHJlc3VsdC50cmFpbCxcblx0XHRcdH0pKVxuXHR9XG5cblx0cHVibGljIGFzeW5jIGdldFByaWNlTm90T2xkZXJUaGFuKFxuXHRcdGlkNDogV2l0bmV0LkhleFN0cmluZyxcblx0XHRhZ2U6IG51bWJlcixcblx0KTogUHJvbWlzZTxQcmljZUZlZWRVcGRhdGU+IHtcblx0XHRyZXR1cm4gdGhpcy5jb250cmFjdFxuXHRcdFx0LmdldEZ1bmN0aW9uKFwiZ2V0UHJpY2VOb3RPbGRlclRoYW4oYnl0ZXM0LHVpbnQyNClcIilcblx0XHRcdC5zdGF0aWNDYWxsKGlkNCwgYWdlKVxuXHRcdFx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiAoe1xuXHRcdFx0XHRwcmljZTogTnVtYmVyKHJlc3VsdC5wcmljZSkgLyAxMCAqKiBOdW1iZXIoLXJlc3VsdC5leHBvbmVudCksXG5cdFx0XHRcdGRlbHRhUHJpY2U6IE51bWJlcihyZXN1bHQuZGVsdGFQcmljZSkgLyAxMCAqKiBOdW1iZXIoLXJlc3VsdC5leHBvbmVudCksXG5cdFx0XHRcdGV4cG9uZW50OiBOdW1iZXIocmVzdWx0LmV4cG9uZW50KSxcblx0XHRcdFx0dGltZXN0YW1wOiBOdW1iZXIocmVzdWx0LnRpbWVzdGFtcCksXG5cdFx0XHRcdHRyYWlsOiByZXN1bHQudHJhaWwsXG5cdFx0XHR9KSlcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBnZXRQcmljZVVuc2FmZShpZDQ6IFdpdG5ldC5IZXhTdHJpbmcpOiBQcm9taXNlPFByaWNlRmVlZFVwZGF0ZT4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnRyYWN0XG5cdFx0XHQuZ2V0RnVuY3Rpb24oXCJnZXRQcmljZVVuc2FmZShieXRlczQpXCIpXG5cdFx0XHQuc3RhdGljQ2FsbChpZDQpXG5cdFx0XHQudGhlbigocmVzdWx0OiBhbnkpID0+ICh7XG5cdFx0XHRcdHByaWNlOiBOdW1iZXIocmVzdWx0LnByaWNlKSAvIDEwICoqIE51bWJlcigtcmVzdWx0LmV4cG9uZW50KSxcblx0XHRcdFx0ZGVsdGFQcmljZTogTnVtYmVyKHJlc3VsdC5kZWx0YVByaWNlKSAvIDEwICoqIE51bWJlcigtcmVzdWx0LmV4cG9uZW50KSxcblx0XHRcdFx0ZXhwb25lbnQ6IE51bWJlcihyZXN1bHQuZXhwb25lbnQpLFxuXHRcdFx0XHR0aW1lc3RhbXA6IE51bWJlcihyZXN1bHQudGltZXN0YW1wKSxcblx0XHRcdFx0dHJhaWw6IHJlc3VsdC50cmFpbCxcblx0XHRcdH0pKVxuXHR9XG5cblx0cHVibGljIGFzeW5jIGlzQ2FwdGlvblN1cHBvcnRlZChjYXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRyZXR1cm4gdGhpcy5jb250cmFjdC5zdXBwb3J0c0NhcHRpb24uc3RhdGljQ2FsbChjYXB0aW9uKVxuXHR9XG5cblx0cHVibGljIGFzeW5jIGxvb2t1cFByaWNlRmVlZChpZDQ6IFdpdG5ldC5IZXhTdHJpbmcpOiBQcm9taXNlPFByaWNlRmVlZD4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnRyYWN0Lmxvb2t1cFByaWNlRmVlZFxuXHRcdFx0LnN0YXRpY0NhbGwoaWQ0KVxuXHRcdFx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiAoe1xuXHRcdFx0XHRpZDogcmVzdWx0LmlkLFxuXHRcdFx0XHRpZDQ6IHJlc3VsdC5pZC5zbGljZSgwLCAxMCksXG5cdFx0XHRcdGV4cG9uZW50OiBOdW1iZXIocmVzdWx0LmV4cG9uZW50KSxcblx0XHRcdFx0c3ltYm9sOiByZXN1bHQuc3ltYm9sLFxuXHRcdFx0XHQuLi4ocmVzdWx0Lm1hcHBlci5jbGFzcyAhPT0gMG5cblx0XHRcdFx0XHQ/IHtcblx0XHRcdFx0XHRcdFx0bWFwcGVyOiB7XG5cdFx0XHRcdFx0XHRcdFx0Y2xhc3M6IFByaWNlRmVlZE1hcHBlcnNbcmVzdWx0Lm1hcHBlci5jbGFzc10sXG5cdFx0XHRcdFx0XHRcdFx0ZGVwczogcmVzdWx0Lm1hcHBlci5kZXBzLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdDoge1xuXHRcdFx0XHRcdFx0XHRvcmFjbGU6IHtcblx0XHRcdFx0XHRcdFx0XHRjbGFzczogUHJpY2VGZWVkT3JhY2xlc1tyZXN1bHQub3JhY2xlLmNsYXNzXSxcblx0XHRcdFx0XHRcdFx0XHR0YXJnZXQ6IHJlc3VsdC5vcmFjbGUudGFyZ2V0LFxuXHRcdFx0XHRcdFx0XHRcdHNvdXJjZXM6IHJlc3VsdC5vcmFjbGUuc291cmNlcyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHR1cGRhdGVDb25kaXRpb25zOiB7XG5cdFx0XHRcdFx0Y2FsbGJhY2tHYXM6IE51bWJlcihyZXN1bHQudXBkYXRlQ29uZGl0aW9ucy5jYWxsYmFja0dhcyksXG5cdFx0XHRcdFx0Y29tcHV0ZUVNQTogcmVzdWx0LnVwZGF0ZUNvbmRpdGlvbnMuY29tcHV0ZUVtYSxcblx0XHRcdFx0XHRjb29sZG93blNlY3M6IE51bWJlcihyZXN1bHQudXBkYXRlQ29uZGl0aW9ucy5jb29sZG93blNlY3MpLFxuXHRcdFx0XHRcdGhlYXJ0YmVhdFNlY3M6IE51bWJlcihyZXN1bHQudXBkYXRlQ29uZGl0aW9ucy5oZWFydGJlYXRTZWNzKSxcblx0XHRcdFx0XHRtYXhEZXZpYXRpb25QZXJjZW50YWdlOlxuXHRcdFx0XHRcdFx0TnVtYmVyKHJlc3VsdC51cGRhdGVDb25kaXRpb25zLm1heERldmlhdGlvbjEwMDApIC8gMTAsXG5cdFx0XHRcdFx0bWluV2l0bmVzc2VzOiBOdW1iZXIocmVzdWx0LnVwZGF0ZUNvbmRpdGlvbnMubWluV2l0bmVzc2VzKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFzdFVwZGF0ZToge1xuXHRcdFx0XHRcdHByaWNlOlxuXHRcdFx0XHRcdFx0TnVtYmVyKHJlc3VsdC5sYXN0VXBkYXRlLnByaWNlKSAvXG5cdFx0XHRcdFx0XHQxMCAqKiBOdW1iZXIoLXJlc3VsdC5sYXN0VXBkYXRlLmV4cG9uZW50KSxcblx0XHRcdFx0XHRkZWx0YVByaWNlOlxuXHRcdFx0XHRcdFx0TnVtYmVyKHJlc3VsdC5sYXN0VXBkYXRlLmRlbHRhUHJpY2UpIC9cblx0XHRcdFx0XHRcdDEwICoqIE51bWJlcigtcmVzdWx0Lmxhc3RVcGRhdGUuZXhwb25lbnQpLFxuXHRcdFx0XHRcdGV4cG9uZW50OiBOdW1iZXIocmVzdWx0Lmxhc3RVcGRhdGUuZXhwb25lbnQpLFxuXHRcdFx0XHRcdHRpbWVzdGFtcDogTnVtYmVyKHJlc3VsdC5sYXN0VXBkYXRlLnRpbWVzdGFtcCksXG5cdFx0XHRcdFx0dHJhaWw6IHJlc3VsdC5sYXN0VXBkYXRlLnRyYWlsLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSkpXG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgbG9va3VwUHJpY2VGZWVkQ2FwdGlvbihpZDQ6IFdpdG5ldC5IZXhTdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnRyYWN0Lmxvb2t1cFN5bWJvbC5zdGF0aWNDYWxsKGlkNClcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBsb29rdXBQcmljZUZlZWRFeHBvbmVudChpZDQ6IFdpdG5ldC5IZXhTdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnRyYWN0Lmxvb2t1cFByaWNlRmVlZEV4cG9uZW50XG5cdFx0XHQuc3RhdGljQ2FsbChpZDQpXG5cdFx0XHQudGhlbigocmVzdWx0KSA9PiBOdW1iZXIocmVzdWx0KSlcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBsb29rdXBQcmljZUZlZWRJRChpZDQ6IFdpdG5ldC5IZXhTdHJpbmcpOiBQcm9taXNlPFdpdG5ldC5IYXNoPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29udHJhY3QubG9va3VwUHJpY2VGZWVkSUQuc3RhdGljQ2FsbChpZDQpXG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgbG9va3VwUHJpY2VGZWVkcygpOiBQcm9taXNlPEFycmF5PFByaWNlRmVlZD4+IHtcblx0XHRyZXR1cm4gdGhpcy5jb250cmFjdC5sb29rdXBQcmljZUZlZWRzLnN0YXRpY0NhbGwoKS50aGVuKChyZXN1bHRzKSA9PlxuXHRcdFx0cmVzdWx0cy5tYXAoKHJlc3VsdDogYW55KSA9PiAoe1xuXHRcdFx0XHRpZDogcmVzdWx0LmlkLFxuXHRcdFx0XHRpZDQ6IHJlc3VsdC5pZC5zbGljZSgwLCAxMCksXG5cdFx0XHRcdGV4cG9uZW50OiBOdW1iZXIocmVzdWx0LmV4cG9uZW50KSxcblx0XHRcdFx0c3ltYm9sOiByZXN1bHQuc3ltYm9sLFxuXHRcdFx0XHQuLi4ocmVzdWx0Lm1hcHBlci5jbGFzcyAhPT0gMG5cblx0XHRcdFx0XHQ/IHtcblx0XHRcdFx0XHRcdFx0bWFwcGVyOiB7XG5cdFx0XHRcdFx0XHRcdFx0Y2xhc3M6IFByaWNlRmVlZE1hcHBlcnNbcmVzdWx0Lm1hcHBlci5jbGFzc10sXG5cdFx0XHRcdFx0XHRcdFx0ZGVwczogcmVzdWx0Lm1hcHBlci5kZXBzLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdDoge1xuXHRcdFx0XHRcdFx0XHRvcmFjbGU6IHtcblx0XHRcdFx0XHRcdFx0XHRjbGFzczogUHJpY2VGZWVkT3JhY2xlc1tyZXN1bHQub3JhY2xlLmNsYXNzXSxcblx0XHRcdFx0XHRcdFx0XHR0YXJnZXQ6IHJlc3VsdC5vcmFjbGUudGFyZ2V0LFxuXHRcdFx0XHRcdFx0XHRcdHNvdXJjZXM6IHJlc3VsdC5vcmFjbGUuc291cmNlcyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHR1cGRhdGVDb25kaXRpb25zOiB7XG5cdFx0XHRcdFx0Y2FsbGJhY2tHYXM6IE51bWJlcihyZXN1bHQudXBkYXRlQ29uZGl0aW9ucy5jYWxsYmFja0dhcyksXG5cdFx0XHRcdFx0Y29tcHV0ZUVNQTogcmVzdWx0LnVwZGF0ZUNvbmRpdGlvbnMuY29tcHV0ZUVtYSxcblx0XHRcdFx0XHRjb29sZG93blNlY3M6IE51bWJlcihyZXN1bHQudXBkYXRlQ29uZGl0aW9ucy5jb29sZG93blNlY3MpLFxuXHRcdFx0XHRcdGhlYXJ0YmVhdFNlY3M6IE51bWJlcihyZXN1bHQudXBkYXRlQ29uZGl0aW9ucy5oZWFydGJlYXRTZWNzKSxcblx0XHRcdFx0XHRtYXhEZXZpYXRpb25QZXJjZW50YWdlOlxuXHRcdFx0XHRcdFx0TnVtYmVyKHJlc3VsdC51cGRhdGVDb25kaXRpb25zLm1heERldmlhdGlvbjEwMDApIC8gMTAsXG5cdFx0XHRcdFx0bWluV2l0bmVzc2VzOiBOdW1iZXIocmVzdWx0LnVwZGF0ZUNvbmRpdGlvbnMubWluV2l0bmVzc2VzKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFzdFVwZGF0ZToge1xuXHRcdFx0XHRcdHByaWNlOlxuXHRcdFx0XHRcdFx0TnVtYmVyKHJlc3VsdC5sYXN0VXBkYXRlLnByaWNlKSAvXG5cdFx0XHRcdFx0XHQxMCAqKiBOdW1iZXIoLXJlc3VsdC5sYXN0VXBkYXRlLmV4cG9uZW50KSxcblx0XHRcdFx0XHRkZWx0YVByaWNlOlxuXHRcdFx0XHRcdFx0TnVtYmVyKHJlc3VsdC5sYXN0VXBkYXRlLmRlbHRhUHJpY2UpIC9cblx0XHRcdFx0XHRcdDEwICoqIE51bWJlcigtcmVzdWx0Lmxhc3RVcGRhdGUuZXhwb25lbnQpLFxuXHRcdFx0XHRcdGV4cG9uZW50OiBOdW1iZXIocmVzdWx0Lmxhc3RVcGRhdGUuZXhwb25lbnQpLFxuXHRcdFx0XHRcdHRpbWVzdGFtcDogQmlnSW50KHJlc3VsdC5sYXN0VXBkYXRlLnRpbWVzdGFtcCksXG5cdFx0XHRcdFx0dHJhaWw6IHJlc3VsdC5sYXN0VXBkYXRlLnRyYWlsLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSkpLFxuXHRcdClcblx0fVxufVxuIl19
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Witnet } from "@witnet/sdk";
|
|
2
|
+
import type { PriceFeed } from "../types.js";
|
|
3
|
+
import { WitAppliance } from "./WitAppliance.js";
|
|
4
|
+
import type { WitOracle } from "./WitOracle.js";
|
|
5
|
+
export declare class WitPriceFeedsLegacy extends WitAppliance {
|
|
6
|
+
protected constructor(witOracle: WitOracle, at: string);
|
|
7
|
+
static at(witOracle: WitOracle, target: string): Promise<WitPriceFeedsLegacy>;
|
|
8
|
+
getEvmFootprint(): Promise<string>;
|
|
9
|
+
isCaptionSupported(caption: string): Promise<boolean>;
|
|
10
|
+
lookupPriceFeedCaption(id4: Witnet.HexString): Promise<string>;
|
|
11
|
+
lookupPriceFeedExponent(id4: Witnet.HexString): Promise<number>;
|
|
12
|
+
lookupPriceFeeds(): Promise<Array<PriceFeed>>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=WitPriceFeedsLegacy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WitPriceFeedsLegacy.d.ts","sourceRoot":"","sources":["../../../../src/lib/wrappers/WitPriceFeedsLegacy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,qBAAa,mBAAoB,SAAQ,YAAY;IACpD,SAAS,aAAa,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM;WAIzC,EAAE,CACd,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,mBAAmB,CAAC;IAWlB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAIlC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrD,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAI9D,uBAAuB,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAM/D,gBAAgB,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;CAyC1D"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { WitAppliance } from "./WitAppliance.js";
|
|
2
|
+
export class WitPriceFeedsLegacy extends WitAppliance {
|
|
3
|
+
constructor(witOracle, at) {
|
|
4
|
+
super(witOracle, "WitPriceFeedsLegacy", at);
|
|
5
|
+
}
|
|
6
|
+
static async at(witOracle, target) {
|
|
7
|
+
const priceFeeds = new WitPriceFeedsLegacy(witOracle, target);
|
|
8
|
+
const oracleAddr = await priceFeeds.contract.witnet.staticCall();
|
|
9
|
+
if (oracleAddr !== witOracle.address) {
|
|
10
|
+
throw new Error(`WitPriceFeedsLegacy at ${target}: mismatching Wit/Oracle address (${oracleAddr})`);
|
|
11
|
+
}
|
|
12
|
+
return priceFeeds;
|
|
13
|
+
}
|
|
14
|
+
async getEvmFootprint() {
|
|
15
|
+
return this.contract.footprint.staticCall();
|
|
16
|
+
}
|
|
17
|
+
async isCaptionSupported(caption) {
|
|
18
|
+
return this.contract.supportsCaption.staticCall(caption);
|
|
19
|
+
}
|
|
20
|
+
async lookupPriceFeedCaption(id4) {
|
|
21
|
+
return this.contract.lookupCaption.staticCall(id4);
|
|
22
|
+
}
|
|
23
|
+
async lookupPriceFeedExponent(id4) {
|
|
24
|
+
return this.contract.lookupDecimals
|
|
25
|
+
.staticCall(id4)
|
|
26
|
+
.then((result) => Number(result));
|
|
27
|
+
}
|
|
28
|
+
async lookupPriceFeeds() {
|
|
29
|
+
const priceFeeds = await this.contract.supportedFeeds
|
|
30
|
+
.staticCall()
|
|
31
|
+
.then((results) => {
|
|
32
|
+
const [id4s, captions, dataSources] = results;
|
|
33
|
+
return id4s.map((id4, index) => ({
|
|
34
|
+
id4,
|
|
35
|
+
exponent: -Number(captions[index].split("#")[0].split("-").slice(-1)[0]),
|
|
36
|
+
symbol: captions[index],
|
|
37
|
+
...(dataSources[index].endsWith("00000000000000")
|
|
38
|
+
? {
|
|
39
|
+
mapper: {
|
|
40
|
+
class: "product",
|
|
41
|
+
deps: [dataSources[index].slice(0, 42)],
|
|
42
|
+
},
|
|
43
|
+
}
|
|
44
|
+
: {
|
|
45
|
+
oracle: {
|
|
46
|
+
class: "Witnet",
|
|
47
|
+
target: this.witOracle.address,
|
|
48
|
+
sources: dataSources[index],
|
|
49
|
+
},
|
|
50
|
+
}),
|
|
51
|
+
}));
|
|
52
|
+
});
|
|
53
|
+
const latestPrices = await this.contract.latestPrices.staticCall(priceFeeds.map((pf) => pf.id4));
|
|
54
|
+
return priceFeeds.map((pf, index) => ({
|
|
55
|
+
...pf,
|
|
56
|
+
lastUpdate: {
|
|
57
|
+
timestamp: latestPrices[index].timestamp,
|
|
58
|
+
trail: latestPrices[index].drTxHash,
|
|
59
|
+
price: Number(latestPrices[index].value) / 10 ** -pf.exponent,
|
|
60
|
+
},
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2l0UHJpY2VGZWVkc0xlZ2FjeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvd3JhcHBlcnMvV2l0UHJpY2VGZWVkc0xlZ2FjeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFHaEQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLFlBQVk7SUFDcEQsWUFBc0IsU0FBb0IsRUFBRSxFQUFVO1FBQ3JELEtBQUssQ0FBQyxTQUFTLEVBQUUscUJBQXFCLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDNUMsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUNkLFNBQW9CLEVBQ3BCLE1BQWM7UUFFZCxNQUFNLFVBQVUsR0FBRyxJQUFJLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUM3RCxNQUFNLFVBQVUsR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ2hFLElBQUksVUFBVSxLQUFLLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksS0FBSyxDQUNkLDBCQUEwQixNQUFNLHFDQUFxQyxVQUFVLEdBQUcsQ0FDbEYsQ0FBQTtRQUNGLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQTtJQUNsQixDQUFDO0lBRU0sS0FBSyxDQUFDLGVBQWU7UUFDM0IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUM1QyxDQUFDO0lBRU0sS0FBSyxDQUFDLGtCQUFrQixDQUFDLE9BQWU7UUFDOUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDekQsQ0FBQztJQUVNLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxHQUFxQjtRQUN4RCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNuRCxDQUFDO0lBRU0sS0FBSyxDQUFDLHVCQUF1QixDQUFDLEdBQXFCO1FBQ3pELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjO2FBQ2pDLFVBQVUsQ0FBQyxHQUFHLENBQUM7YUFDZixJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0lBQ25DLENBQUM7SUFFTSxLQUFLLENBQUMsZ0JBQWdCO1FBQzVCLE1BQU0sVUFBVSxHQUFxQixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYzthQUNyRSxVQUFVLEVBQUU7YUFDWixJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNqQixNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FBRyxPQUFPLENBQUE7WUFDN0MsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBVyxFQUFFLEtBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDaEQsR0FBRztnQkFDSCxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQ2hCLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNyRDtnQkFDRCxNQUFNLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDdkIsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7b0JBQ2hELENBQUMsQ0FBQzt3QkFDQSxNQUFNLEVBQUU7NEJBQ1AsS0FBSyxFQUFFLFNBQVM7NEJBQ2hCLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3lCQUN2QztxQkFDRDtvQkFDRixDQUFDLENBQUM7d0JBQ0EsTUFBTSxFQUFFOzRCQUNQLEtBQUssRUFBRSxRQUFROzRCQUNmLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87NEJBQzlCLE9BQU8sRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDO3lCQUMzQjtxQkFDRCxDQUFDO2FBQ0osQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtRQUVILE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUMvRCxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQzlCLENBQUE7UUFFRCxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLEdBQUcsRUFBRTtZQUNMLFVBQVUsRUFBRTtnQkFDWCxTQUFTLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVM7Z0JBQ3hDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUTtnQkFDbkMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVE7YUFDN0Q7U0FDRCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgV2l0bmV0IH0gZnJvbSBcIkB3aXRuZXQvc2RrXCJcbmltcG9ydCB0eXBlIHsgUHJpY2VGZWVkIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCJcbmltcG9ydCB7IFdpdEFwcGxpYW5jZSB9IGZyb20gXCIuL1dpdEFwcGxpYW5jZS5qc1wiXG5pbXBvcnQgdHlwZSB7IFdpdE9yYWNsZSB9IGZyb20gXCIuL1dpdE9yYWNsZS5qc1wiXG5cbmV4cG9ydCBjbGFzcyBXaXRQcmljZUZlZWRzTGVnYWN5IGV4dGVuZHMgV2l0QXBwbGlhbmNlIHtcblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yKHdpdE9yYWNsZTogV2l0T3JhY2xlLCBhdDogc3RyaW5nKSB7XG5cdFx0c3VwZXIod2l0T3JhY2xlLCBcIldpdFByaWNlRmVlZHNMZWdhY3lcIiwgYXQpXG5cdH1cblxuXHRzdGF0aWMgYXN5bmMgYXQoXG5cdFx0d2l0T3JhY2xlOiBXaXRPcmFjbGUsXG5cdFx0dGFyZ2V0OiBzdHJpbmcsXG5cdCk6IFByb21pc2U8V2l0UHJpY2VGZWVkc0xlZ2FjeT4ge1xuXHRcdGNvbnN0IHByaWNlRmVlZHMgPSBuZXcgV2l0UHJpY2VGZWVkc0xlZ2FjeSh3aXRPcmFjbGUsIHRhcmdldClcblx0XHRjb25zdCBvcmFjbGVBZGRyID0gYXdhaXQgcHJpY2VGZWVkcy5jb250cmFjdC53aXRuZXQuc3RhdGljQ2FsbCgpXG5cdFx0aWYgKG9yYWNsZUFkZHIgIT09IHdpdE9yYWNsZS5hZGRyZXNzKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdGBXaXRQcmljZUZlZWRzTGVnYWN5IGF0ICR7dGFyZ2V0fTogbWlzbWF0Y2hpbmcgV2l0L09yYWNsZSBhZGRyZXNzICgke29yYWNsZUFkZHJ9KWAsXG5cdFx0XHQpXG5cdFx0fVxuXHRcdHJldHVybiBwcmljZUZlZWRzXG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZ2V0RXZtRm9vdHByaW50KCk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29udHJhY3QuZm9vdHByaW50LnN0YXRpY0NhbGwoKVxuXHR9XG5cblx0cHVibGljIGFzeW5jIGlzQ2FwdGlvblN1cHBvcnRlZChjYXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRyZXR1cm4gdGhpcy5jb250cmFjdC5zdXBwb3J0c0NhcHRpb24uc3RhdGljQ2FsbChjYXB0aW9uKVxuXHR9XG5cblx0cHVibGljIGFzeW5jIGxvb2t1cFByaWNlRmVlZENhcHRpb24oaWQ0OiBXaXRuZXQuSGV4U3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gdGhpcy5jb250cmFjdC5sb29rdXBDYXB0aW9uLnN0YXRpY0NhbGwoaWQ0KVxuXHR9XG5cblx0cHVibGljIGFzeW5jIGxvb2t1cFByaWNlRmVlZEV4cG9uZW50KGlkNDogV2l0bmV0LkhleFN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29udHJhY3QubG9va3VwRGVjaW1hbHNcblx0XHRcdC5zdGF0aWNDYWxsKGlkNClcblx0XHRcdC50aGVuKChyZXN1bHQpID0+IE51bWJlcihyZXN1bHQpKVxuXHR9XG5cblx0cHVibGljIGFzeW5jIGxvb2t1cFByaWNlRmVlZHMoKTogUHJvbWlzZTxBcnJheTxQcmljZUZlZWQ+PiB7XG5cdFx0Y29uc3QgcHJpY2VGZWVkczogQXJyYXk8UHJpY2VGZWVkPiA9IGF3YWl0IHRoaXMuY29udHJhY3Quc3VwcG9ydGVkRmVlZHNcblx0XHRcdC5zdGF0aWNDYWxsKClcblx0XHRcdC50aGVuKChyZXN1bHRzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IFtpZDRzLCBjYXB0aW9ucywgZGF0YVNvdXJjZXNdID0gcmVzdWx0c1xuXHRcdFx0XHRyZXR1cm4gaWQ0cy5tYXAoKGlkNDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiAoe1xuXHRcdFx0XHRcdGlkNCxcblx0XHRcdFx0XHRleHBvbmVudDogLU51bWJlcihcblx0XHRcdFx0XHRcdGNhcHRpb25zW2luZGV4XS5zcGxpdChcIiNcIilbMF0uc3BsaXQoXCItXCIpLnNsaWNlKC0xKVswXSxcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHN5bWJvbDogY2FwdGlvbnNbaW5kZXhdLFxuXHRcdFx0XHRcdC4uLihkYXRhU291cmNlc1tpbmRleF0uZW5kc1dpdGgoXCIwMDAwMDAwMDAwMDAwMFwiKVxuXHRcdFx0XHRcdFx0PyB7XG5cdFx0XHRcdFx0XHRcdFx0bWFwcGVyOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjbGFzczogXCJwcm9kdWN0XCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRkZXBzOiBbZGF0YVNvdXJjZXNbaW5kZXhdLnNsaWNlKDAsIDQyKV0sXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0OiB7XG5cdFx0XHRcdFx0XHRcdFx0b3JhY2xlOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjbGFzczogXCJXaXRuZXRcIixcblx0XHRcdFx0XHRcdFx0XHRcdHRhcmdldDogdGhpcy53aXRPcmFjbGUuYWRkcmVzcyxcblx0XHRcdFx0XHRcdFx0XHRcdHNvdXJjZXM6IGRhdGFTb3VyY2VzW2luZGV4XSxcblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0fSkpXG5cdFx0XHR9KVxuXG5cdFx0Y29uc3QgbGF0ZXN0UHJpY2VzID0gYXdhaXQgdGhpcy5jb250cmFjdC5sYXRlc3RQcmljZXMuc3RhdGljQ2FsbChcblx0XHRcdHByaWNlRmVlZHMubWFwKChwZikgPT4gcGYuaWQ0KSxcblx0XHQpXG5cblx0XHRyZXR1cm4gcHJpY2VGZWVkcy5tYXAoKHBmLCBpbmRleCkgPT4gKHtcblx0XHRcdC4uLnBmLFxuXHRcdFx0bGFzdFVwZGF0ZToge1xuXHRcdFx0XHR0aW1lc3RhbXA6IGxhdGVzdFByaWNlc1tpbmRleF0udGltZXN0YW1wLFxuXHRcdFx0XHR0cmFpbDogbGF0ZXN0UHJpY2VzW2luZGV4XS5kclR4SGFzaCxcblx0XHRcdFx0cHJpY2U6IE51bWJlcihsYXRlc3RQcmljZXNbaW5kZXhdLnZhbHVlKSAvIDEwICoqIC1wZi5leHBvbmVudCxcblx0XHRcdH0sXG5cdFx0fSkpXG5cdH1cbn1cbiJdfQ==
|