@buildonspark/spark-sdk 0.5.0 → 0.5.1
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/CHANGELOG.md +26 -0
- package/dist/bare/index.cjs +1608 -3635
- package/dist/bare/index.d.cts +27 -435
- package/dist/bare/index.d.ts +27 -435
- package/dist/bare/index.js +1608 -3634
- package/dist/{chunk-RU434ZAE.js → chunk-F3BFSHVR.js} +357 -391
- package/dist/{chunk-UYEB2VPG.js → chunk-IOIEBLMK.js} +7 -1
- package/dist/{chunk-EU3I7GFB.js → chunk-STB6WMU7.js} +1 -1
- package/dist/{chunk-JE3MXMPW.js → chunk-UTECVGQQ.js} +93 -202
- package/dist/{chunk-ZP6Z6DFX.js → chunk-YFVVYZCS.js} +37 -5
- package/dist/{client-D1dLzWu0.d.ts → client-C9kc4cog.d.cts} +9 -3
- package/dist/{client-CVn0R_eM.d.cts → client-eyjf4knu.d.ts} +9 -3
- package/dist/graphql/objects/index.cjs +7 -1
- package/dist/graphql/objects/index.d.cts +3 -3
- package/dist/graphql/objects/index.d.ts +3 -3
- package/dist/graphql/objects/index.js +1 -1
- package/dist/index.browser.d.ts +27 -435
- package/dist/index.browser.js +1613 -3639
- package/dist/index.node.cjs +1613 -3640
- package/dist/index.node.d.cts +7 -8
- package/dist/index.node.d.ts +7 -8
- package/dist/index.node.js +5 -7
- package/dist/native/index.react-native.cjs +1613 -3640
- package/dist/native/index.react-native.d.cts +27 -435
- package/dist/native/index.react-native.d.ts +27 -435
- package/dist/native/index.react-native.js +1613 -3639
- package/dist/proto/spark.cjs +93 -202
- package/dist/proto/spark.d.cts +1 -1
- package/dist/proto/spark.d.ts +1 -1
- package/dist/proto/spark.js +1 -1
- package/dist/proto/spark_token.cjs +36 -4
- package/dist/proto/spark_token.d.cts +4 -1
- package/dist/proto/spark_token.d.ts +4 -1
- package/dist/proto/spark_token.js +2 -2
- package/dist/{spark-2Fxnvl8K.d.cts → spark-d6w3BLGZ.d.cts} +10 -328
- package/dist/{spark-2Fxnvl8K.d.ts → spark-d6w3BLGZ.d.ts} +10 -328
- package/dist/{spark-wallet.node-DlhZiDgY.d.ts → spark-wallet.node-MReThHBY.d.ts} +6 -7
- package/dist/{spark-wallet.node-xKJXzAEd.d.cts → spark-wallet.node-eR0svGws.d.cts} +6 -7
- package/dist/tests/test-utils.cjs +409 -2429
- package/dist/tests/test-utils.d.cts +3 -3
- package/dist/tests/test-utils.d.ts +3 -3
- package/dist/tests/test-utils.js +5 -5
- package/dist/types/index.cjs +100 -203
- package/dist/types/index.d.cts +2 -2
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.js +3 -3
- package/package.json +3 -3
- package/src/graphql/client.ts +36 -1
- package/src/graphql/objects/LightningSendRequestStatus.ts +25 -13
- package/src/proto/common.ts +1 -1
- package/src/proto/google/protobuf/descriptor.ts +1 -1
- package/src/proto/google/protobuf/duration.ts +1 -1
- package/src/proto/google/protobuf/empty.ts +1 -1
- package/src/proto/google/protobuf/timestamp.ts +1 -1
- package/src/proto/mock.ts +1 -1
- package/src/proto/spark.ts +113 -446
- package/src/proto/spark_authn.ts +1 -1
- package/src/proto/spark_token.ts +41 -2
- package/src/proto/validate/validate.ts +1 -1
- package/src/services/connection/connection.ts +23 -60
- package/src/services/coop-exit.ts +3 -5
- package/src/services/deposit.ts +1 -1
- package/src/services/lightning.ts +1 -1
- package/src/services/signing.ts +5 -6
- package/src/services/transfer.ts +250 -240
- package/src/services/wallet-config.ts +22 -5
- package/src/spark-wallet/proto-descriptors.ts +1 -1
- package/src/spark-wallet/proto-reflection.ts +0 -2
- package/src/spark-wallet/spark-wallet.ts +2 -2
- package/src/spark_descriptors.pb +0 -0
- package/src/tests/bufbuild-reflection.test.ts +2 -3
- package/src/tests/integration/coop-exit.test.ts +6 -1
- package/src/tests/integration/htlc.test.ts +5 -0
- package/src/tests/integration/lightning.test.ts +24 -4
- package/src/tests/integration/time-sync.test.ts +18 -0
- package/src/tests/integration/transfer.test.ts +42 -7
- package/src/tests/ssp-client-retry.test.ts +161 -0
- package/src/tests/token-hashing.test.ts +92 -0
- package/src/utils/token-hashing.ts +4 -51
- package/src/utils/transaction.ts +1 -2
- package/src/utils/unilateral-exit.ts +139 -142
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
SparkTokenServiceDefinition
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-YFVVYZCS.js";
|
|
4
4
|
import {
|
|
5
5
|
mapSettingsProtoToWalletSettings,
|
|
6
6
|
mapTransferToWalletTransfer,
|
|
7
7
|
mapTreeNodeToWalletLeaf
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-STB6WMU7.js";
|
|
9
9
|
import {
|
|
10
10
|
Empty,
|
|
11
11
|
SatsPayment,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
TokensPayment,
|
|
17
17
|
TreeNode,
|
|
18
18
|
networkToJSON
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-UTECVGQQ.js";
|
|
20
20
|
import {
|
|
21
21
|
BitcoinNetwork_default,
|
|
22
22
|
ClaimStaticDepositFromJson,
|
|
@@ -37,7 +37,7 @@ import {
|
|
|
37
37
|
SparkLeavesSwapRequestStatus_default,
|
|
38
38
|
SparkWalletUserToUserRequestsConnectionFromJson,
|
|
39
39
|
TransferFromJson
|
|
40
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-IOIEBLMK.js";
|
|
41
41
|
import {
|
|
42
42
|
Buffer
|
|
43
43
|
} from "./chunk-MVRQ5US7.js";
|
|
@@ -1264,7 +1264,7 @@ var isWebExtension = (
|
|
|
1264
1264
|
);
|
|
1265
1265
|
var isWebExtensionContentScript = isWebExtension && "window" in globalThis;
|
|
1266
1266
|
var userAgent = "navigator" in globalThis ? parseUserAgent(globalThis.navigator.userAgent) || "unknown-user-agent" : void 0;
|
|
1267
|
-
var packageVersion = true ? "0.5.
|
|
1267
|
+
var packageVersion = true ? "0.5.1" : "unknown";
|
|
1268
1268
|
var baseEnvStr = "unknown";
|
|
1269
1269
|
if (isBun) {
|
|
1270
1270
|
const bunVersion = "version" in globalThis.Bun ? globalThis.Bun.version : "unknown-version";
|
|
@@ -2533,22 +2533,22 @@ var BASE_CONFIG = {
|
|
|
2533
2533
|
// 5 minutes
|
|
2534
2534
|
minOutputsThreshold: 50
|
|
2535
2535
|
},
|
|
2536
|
-
tokenTransactionVersion: "
|
|
2536
|
+
tokenTransactionVersion: "V3"
|
|
2537
2537
|
};
|
|
2538
2538
|
var LOCAL_WALLET_CONFIG = {
|
|
2539
2539
|
...BASE_CONFIG,
|
|
2540
|
-
threshold:
|
|
2540
|
+
threshold: getLocalSigningThreshold()
|
|
2541
2541
|
};
|
|
2542
2542
|
var LOCAL_WALLET_CONFIG_SCHNORR = {
|
|
2543
2543
|
...LOCAL_WALLET_CONFIG,
|
|
2544
|
-
threshold:
|
|
2545
|
-
//
|
|
2544
|
+
threshold: getLocalSigningThreshold()
|
|
2545
|
+
// 2 for issuance tests.
|
|
2546
2546
|
};
|
|
2547
2547
|
var LOCAL_WALLET_CONFIG_ECDSA = {
|
|
2548
2548
|
...LOCAL_WALLET_CONFIG,
|
|
2549
2549
|
tokenSignatures: "ECDSA",
|
|
2550
|
-
threshold:
|
|
2551
|
-
//
|
|
2550
|
+
threshold: getLocalSigningThreshold()
|
|
2551
|
+
// 2 for issuance tests.
|
|
2552
2552
|
};
|
|
2553
2553
|
var REGTEST_WALLET_CONFIG = {
|
|
2554
2554
|
...BASE_CONFIG,
|
|
@@ -2604,6 +2604,7 @@ function getSigningOperators() {
|
|
|
2604
2604
|
};
|
|
2605
2605
|
}
|
|
2606
2606
|
function getLocalSigningOperators() {
|
|
2607
|
+
const numOperators = typeof process !== "undefined" && process.env.NUM_SPARK_OPERATORS !== void 0 ? parseInt(process.env.NUM_SPARK_OPERATORS, 10) : isHermeticTest ? 3 : 5;
|
|
2607
2608
|
const addresses = Array.from(
|
|
2608
2609
|
{ length: 5 },
|
|
2609
2610
|
(_, i) => isHermeticTest ? `https://${i}.spark.minikube.local` : `https://localhost:${i + 8535}`
|
|
@@ -2615,7 +2616,7 @@ function getLocalSigningOperators() {
|
|
|
2615
2616
|
"0352aef4d49439dedd798ac4aef1e7ebef95f569545b647a25338398c1247ffdea",
|
|
2616
2617
|
"02c05c88cc8fc181b1ba30006df6a4b0597de6490e24514fbdd0266d2b9cd3d0ba"
|
|
2617
2618
|
];
|
|
2618
|
-
|
|
2619
|
+
const allOperators = {
|
|
2619
2620
|
"0000000000000000000000000000000000000000000000000000000000000001": {
|
|
2620
2621
|
id: 0,
|
|
2621
2622
|
identifier: "0000000000000000000000000000000000000000000000000000000000000001",
|
|
@@ -2647,6 +2648,13 @@ function getLocalSigningOperators() {
|
|
|
2647
2648
|
identityPublicKey: pubkeys[4]
|
|
2648
2649
|
}
|
|
2649
2650
|
};
|
|
2651
|
+
return Object.fromEntries(
|
|
2652
|
+
Object.entries(allOperators).slice(0, numOperators)
|
|
2653
|
+
);
|
|
2654
|
+
}
|
|
2655
|
+
function getLocalSigningThreshold() {
|
|
2656
|
+
const numOperators = Object.keys(getLocalSigningOperators()).length;
|
|
2657
|
+
return Math.floor((numOperators + 2) / 2);
|
|
2650
2658
|
}
|
|
2651
2659
|
|
|
2652
2660
|
// src/utils/fetch.ts
|
|
@@ -3595,78 +3603,6 @@ function isEphemeralAnchorOutput(script, amount) {
|
|
|
3595
3603
|
script.length === 4 && script[0] === 81 && script[1] === 2 && script[2] === 78 && script[3] === 115)
|
|
3596
3604
|
);
|
|
3597
3605
|
}
|
|
3598
|
-
async function constructUnilateralExitTxs(nodeHexStrings, sparkClient, network) {
|
|
3599
|
-
const result = [];
|
|
3600
|
-
const nodes = nodeHexStrings.map((hex) => TreeNode.decode(hexToBytes5(hex)));
|
|
3601
|
-
const nodeMap = /* @__PURE__ */ new Map();
|
|
3602
|
-
for (const node of nodes) {
|
|
3603
|
-
nodeMap.set(node.id, node);
|
|
3604
|
-
}
|
|
3605
|
-
for (const node of nodes) {
|
|
3606
|
-
const transactions = [];
|
|
3607
|
-
const chain = [];
|
|
3608
|
-
let currentNode = node;
|
|
3609
|
-
while (currentNode) {
|
|
3610
|
-
chain.unshift(currentNode);
|
|
3611
|
-
if (currentNode.parentNodeId) {
|
|
3612
|
-
let parentNode = nodeMap.get(currentNode.parentNodeId);
|
|
3613
|
-
if (!parentNode && sparkClient) {
|
|
3614
|
-
try {
|
|
3615
|
-
const response = await sparkClient.query_nodes({
|
|
3616
|
-
source: {
|
|
3617
|
-
$case: "nodeIds",
|
|
3618
|
-
nodeIds: {
|
|
3619
|
-
nodeIds: [currentNode.parentNodeId]
|
|
3620
|
-
}
|
|
3621
|
-
},
|
|
3622
|
-
includeParents: true,
|
|
3623
|
-
network: network || 0
|
|
3624
|
-
// Default to mainnet if not provided
|
|
3625
|
-
});
|
|
3626
|
-
parentNode = response.nodes[currentNode.parentNodeId];
|
|
3627
|
-
if (parentNode) {
|
|
3628
|
-
nodeMap.set(currentNode.parentNodeId, parentNode);
|
|
3629
|
-
}
|
|
3630
|
-
} catch (error) {
|
|
3631
|
-
console.warn(
|
|
3632
|
-
`Failed to query parent node ${currentNode.parentNodeId}: ${error}`
|
|
3633
|
-
);
|
|
3634
|
-
break;
|
|
3635
|
-
}
|
|
3636
|
-
}
|
|
3637
|
-
if (parentNode) {
|
|
3638
|
-
currentNode = parentNode;
|
|
3639
|
-
} else {
|
|
3640
|
-
if (!sparkClient) {
|
|
3641
|
-
console.warn(
|
|
3642
|
-
`Parent node ${currentNode.parentNodeId} not found. Provide a sparkClient to fetch missing parents.`
|
|
3643
|
-
);
|
|
3644
|
-
} else {
|
|
3645
|
-
console.warn(
|
|
3646
|
-
`Parent node ${currentNode.parentNodeId} not found in database. Chain may be incomplete.`
|
|
3647
|
-
);
|
|
3648
|
-
}
|
|
3649
|
-
break;
|
|
3650
|
-
}
|
|
3651
|
-
} else {
|
|
3652
|
-
break;
|
|
3653
|
-
}
|
|
3654
|
-
}
|
|
3655
|
-
for (const chainNode of chain) {
|
|
3656
|
-
const nodeTx = bytesToHex5(chainNode.nodeTx);
|
|
3657
|
-
transactions.push(nodeTx);
|
|
3658
|
-
if (chainNode.id === node.id) {
|
|
3659
|
-
const refundTx = bytesToHex5(chainNode.refundTx);
|
|
3660
|
-
transactions.push(refundTx);
|
|
3661
|
-
}
|
|
3662
|
-
}
|
|
3663
|
-
result.push({
|
|
3664
|
-
leafId: node.id,
|
|
3665
|
-
transactions
|
|
3666
|
-
});
|
|
3667
|
-
}
|
|
3668
|
-
return result;
|
|
3669
|
-
}
|
|
3670
3606
|
async function constructUnilateralExitFeeBumpPackages(nodeHexStrings, utxos, feeRate, electrsUrl, sparkClient, network) {
|
|
3671
3607
|
const result = [];
|
|
3672
3608
|
const availableUtxos = [...utxos].sort((a, b) => {
|
|
@@ -3716,6 +3652,9 @@ async function constructUnilateralExitFeeBumpPackages(nodeHexStrings, utxos, fee
|
|
|
3716
3652
|
const chain = [];
|
|
3717
3653
|
let currentNode = node;
|
|
3718
3654
|
while (currentNode) {
|
|
3655
|
+
if (currentNode.status !== "AVAILABLE") {
|
|
3656
|
+
break;
|
|
3657
|
+
}
|
|
3719
3658
|
chain.unshift(currentNode);
|
|
3720
3659
|
if (currentNode.parentNodeId) {
|
|
3721
3660
|
let parentNode = nodeMap.get(currentNode.parentNodeId);
|
|
@@ -3798,7 +3737,7 @@ async function constructUnilateralExitFeeBumpPackages(nodeHexStrings, utxos, fee
|
|
|
3798
3737
|
const {
|
|
3799
3738
|
feeBumpPsbt: nodeFeeBumpPsbt,
|
|
3800
3739
|
usedUtxos,
|
|
3801
|
-
|
|
3740
|
+
parentTx
|
|
3802
3741
|
} = constructFeeBumpTx(nodeTxHex, availableUtxos, feeRate, void 0);
|
|
3803
3742
|
const feeBumpTx = btc3.Transaction.fromPSBT(hexToBytes5(nodeFeeBumpPsbt));
|
|
3804
3743
|
var feeBumpOut = feeBumpTx.outputsLength === 1 ? feeBumpTx.getOutput(0) : null;
|
|
@@ -3822,7 +3761,7 @@ async function constructUnilateralExitFeeBumpPackages(nodeHexStrings, utxos, fee
|
|
|
3822
3761
|
script: bytesToHex5(feeBumpOut.script),
|
|
3823
3762
|
publicKey: feeBumpOutPubKey
|
|
3824
3763
|
});
|
|
3825
|
-
const finalNodeTx =
|
|
3764
|
+
const finalNodeTx = parentTx || nodeTxHex;
|
|
3826
3765
|
txPackages.push({ tx: finalNodeTx, feeBumpPsbt: nodeFeeBumpPsbt });
|
|
3827
3766
|
if (chainNode.id === node.id) {
|
|
3828
3767
|
let refundTxHex = bytesToHex5(chainNode.refundTx);
|
|
@@ -3895,6 +3834,58 @@ function hash160(data) {
|
|
|
3895
3834
|
const sha256Hash = sha2565(data);
|
|
3896
3835
|
return ripemd160(sha256Hash);
|
|
3897
3836
|
}
|
|
3837
|
+
function calculateTransactionVSize(txHex) {
|
|
3838
|
+
try {
|
|
3839
|
+
const tx = getTxFromRawTxHex(txHex);
|
|
3840
|
+
const numInputs = tx.inputsLength;
|
|
3841
|
+
const numOutputs = tx.outputsLength;
|
|
3842
|
+
return getTxEstimatedVbytesSizeByNumberOfInputsOutputs(
|
|
3843
|
+
numInputs,
|
|
3844
|
+
numOutputs
|
|
3845
|
+
);
|
|
3846
|
+
} catch (error) {
|
|
3847
|
+
console.warn(
|
|
3848
|
+
`Failed to calculate transaction vSize: ${error}, falling back to default estimate`
|
|
3849
|
+
);
|
|
3850
|
+
return 191;
|
|
3851
|
+
}
|
|
3852
|
+
}
|
|
3853
|
+
function selectUtxosForFee(utxos, parentTxSize, feeRate) {
|
|
3854
|
+
if (utxos.length === 0) {
|
|
3855
|
+
throw new Error("No UTXOs available for selection");
|
|
3856
|
+
}
|
|
3857
|
+
const sortedUtxos = [...utxos].sort((a, b) => {
|
|
3858
|
+
if (a.value > b.value) return -1;
|
|
3859
|
+
if (a.value < b.value) return 1;
|
|
3860
|
+
return 0;
|
|
3861
|
+
});
|
|
3862
|
+
const selectedUtxos = [];
|
|
3863
|
+
let totalValue = 0n;
|
|
3864
|
+
if (!feeRate?.satPerVbyte) {
|
|
3865
|
+
return sortedUtxos;
|
|
3866
|
+
}
|
|
3867
|
+
for (let i = 0; i < sortedUtxos.length; i++) {
|
|
3868
|
+
const utxo = sortedUtxos[i];
|
|
3869
|
+
if (!utxo) {
|
|
3870
|
+
continue;
|
|
3871
|
+
}
|
|
3872
|
+
selectedUtxos.push(utxo);
|
|
3873
|
+
totalValue += utxo.value;
|
|
3874
|
+
const childTxSize = getTxEstimatedVbytesSizeByNumberOfInputsOutputs(
|
|
3875
|
+
selectedUtxos.length + 1,
|
|
3876
|
+
// selected UTXOs + ephemeral anchor
|
|
3877
|
+
1
|
|
3878
|
+
// single change output
|
|
3879
|
+
);
|
|
3880
|
+
const totalVbytes = parentTxSize + childTxSize;
|
|
3881
|
+
const requiredFee = BigInt(Math.ceil(totalVbytes * feeRate.satPerVbyte));
|
|
3882
|
+
const minChange = 546n;
|
|
3883
|
+
if (totalValue >= requiredFee + minChange) {
|
|
3884
|
+
return selectedUtxos;
|
|
3885
|
+
}
|
|
3886
|
+
}
|
|
3887
|
+
return sortedUtxos;
|
|
3888
|
+
}
|
|
3898
3889
|
function constructFeeBumpTx(txHex, utxos, feeRate, previousFeeBumpTx) {
|
|
3899
3890
|
if (!txHex || txHex.length === 0) {
|
|
3900
3891
|
throw new Error("Transaction hex string is empty or undefined");
|
|
@@ -3902,16 +3893,15 @@ function constructFeeBumpTx(txHex, utxos, feeRate, previousFeeBumpTx) {
|
|
|
3902
3893
|
if (utxos.length === 0) {
|
|
3903
3894
|
throw new Error("No UTXOs available for fee bump");
|
|
3904
3895
|
}
|
|
3905
|
-
let correctedTxHex = txHex;
|
|
3906
3896
|
let parentTx;
|
|
3907
3897
|
try {
|
|
3908
|
-
parentTx = getTxFromRawTxHex(
|
|
3898
|
+
parentTx = getTxFromRawTxHex(txHex);
|
|
3909
3899
|
if (!parentTx) {
|
|
3910
3900
|
throw new Error("getTxFromRawTxHex returned null/undefined");
|
|
3911
3901
|
}
|
|
3912
3902
|
} catch (parseError) {
|
|
3913
3903
|
throw new Error(
|
|
3914
|
-
`Failed to parse parent transaction hex: ${parseError}. Transaction hex: ${
|
|
3904
|
+
`Failed to parse parent transaction hex: ${parseError}. Transaction hex: ${txHex}`
|
|
3915
3905
|
);
|
|
3916
3906
|
}
|
|
3917
3907
|
try {
|
|
@@ -3958,6 +3948,8 @@ function constructFeeBumpTx(txHex, utxos, feeRate, previousFeeBumpTx) {
|
|
|
3958
3948
|
if (utxos.length === 0) {
|
|
3959
3949
|
throw new Error("No UTXOs available for fee bump");
|
|
3960
3950
|
}
|
|
3951
|
+
const parentTxSize = calculateTransactionVSize(txHex);
|
|
3952
|
+
const selectedUtxos = selectUtxosForFee(utxos, parentTxSize, feeRate);
|
|
3961
3953
|
const builder = new btc3.Transaction({
|
|
3962
3954
|
version: 3,
|
|
3963
3955
|
allowUnknown: true,
|
|
@@ -3965,8 +3957,8 @@ function constructFeeBumpTx(txHex, utxos, feeRate, previousFeeBumpTx) {
|
|
|
3965
3957
|
});
|
|
3966
3958
|
let totalValue = 0n;
|
|
3967
3959
|
const processedUtxos = [];
|
|
3968
|
-
for (let i = 0; i <
|
|
3969
|
-
const fundingUtxo =
|
|
3960
|
+
for (let i = 0; i < selectedUtxos.length; i++) {
|
|
3961
|
+
const fundingUtxo = selectedUtxos[i];
|
|
3970
3962
|
if (!fundingUtxo) {
|
|
3971
3963
|
throw new Error(`UTXO at index ${i} is undefined`);
|
|
3972
3964
|
}
|
|
@@ -4000,11 +3992,22 @@ function constructFeeBumpTx(txHex, utxos, feeRate, previousFeeBumpTx) {
|
|
|
4000
3992
|
sequence: 4294967295,
|
|
4001
3993
|
witnessUtxo: {
|
|
4002
3994
|
script: ephemeralAnchorOutput.script,
|
|
4003
|
-
// Use the original script directly (not P2WSH wrapped)
|
|
4004
3995
|
amount: 0n
|
|
4005
3996
|
}
|
|
4006
3997
|
});
|
|
4007
|
-
const
|
|
3998
|
+
const childTxSize = getTxEstimatedVbytesSizeByNumberOfInputsOutputs(
|
|
3999
|
+
selectedUtxos.length + 1,
|
|
4000
|
+
// funding UTXOs + ephemeral anchor
|
|
4001
|
+
1
|
|
4002
|
+
// single change output
|
|
4003
|
+
);
|
|
4004
|
+
const totalVbytes = parentTxSize + childTxSize;
|
|
4005
|
+
let fee;
|
|
4006
|
+
if (feeRate?.satPerVbyte) {
|
|
4007
|
+
fee = BigInt(Math.ceil(totalVbytes * feeRate.satPerVbyte));
|
|
4008
|
+
} else {
|
|
4009
|
+
fee = 1500n;
|
|
4010
|
+
}
|
|
4008
4011
|
const remainingValue = totalValue - fee;
|
|
4009
4012
|
if (remainingValue <= 0n) {
|
|
4010
4013
|
throw new Error(
|
|
@@ -4044,8 +4047,8 @@ function constructFeeBumpTx(txHex, utxos, feeRate, previousFeeBumpTx) {
|
|
|
4044
4047
|
}
|
|
4045
4048
|
return {
|
|
4046
4049
|
feeBumpPsbt: psbtHex,
|
|
4047
|
-
usedUtxos:
|
|
4048
|
-
|
|
4050
|
+
usedUtxos: selectedUtxos,
|
|
4051
|
+
parentTx: txHex !== txHex ? txHex : void 0
|
|
4049
4052
|
};
|
|
4050
4053
|
}
|
|
4051
4054
|
|
|
@@ -8872,7 +8875,7 @@ function isSet(value) {
|
|
|
8872
8875
|
}
|
|
8873
8876
|
|
|
8874
8877
|
// src/spark-wallet/proto-descriptors.ts
|
|
8875
|
-
var SPARK_DESCRIPTORS_BASE64 = "Cv8BCh9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvEg9nb29nbGUucHJvdG9idWYiOwoJVGltZXN0YW1wEhgKB3NlY29uZHMYASABKANSB3NlY29uZHMSFAoFbmFub3MYAiABKAVSBW5hbm9zQoUBChNjb20uZ29vZ2xlLnByb3RvYnVmQg5UaW1lc3RhbXBQcm90b1ABWjJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi90aW1lc3RhbXBwYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCr4BChtnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIHCgVFbXB0eUJ9ChNjb20uZ29vZ2xlLnByb3RvYnVmQgpFbXB0eVByb3RvUAFaLmdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2VtcHR5cGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMwqIYAogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiJbChFGaWxlRGVzY3JpcHRvclNldBI4CgRmaWxlGAEgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG9SBGZpbGUqDAiA7Mr/ARCB7Mr/ASKYBQoTRmlsZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhgKB3BhY2thZ2UYAiABKAlSB3BhY2thZ2USHgoKZGVwZW5kZW5jeRgDIAMoCVIKZGVwZW5kZW5jeRIrChFwdWJsaWNfZGVwZW5kZW5jeRgKIAMoBVIQcHVibGljRGVwZW5kZW5jeRInCg93ZWFrX2RlcGVuZGVuY3kYCyADKAVSDndlYWtEZXBlbmRlbmN5EkMKDG1lc3NhZ2VfdHlwZRgEIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SC21lc3NhZ2VUeXBlEkEKCWVudW1fdHlwZRgFIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJBCgdzZXJ2aWNlGAYgAygLMicuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9SB3NlcnZpY2USQwoJZXh0ZW5zaW9uGAcgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SNgoHb3B0aW9ucxgIIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1IHb3B0aW9ucxJJChBzb3VyY2VfY29kZV9pbmZvGAkgASgLMh8uZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvUg5zb3VyY2VDb2RlSW5mbxIWCgZzeW50YXgYDCABKAlSBnN5bnRheBIyCgdlZGl0aW9uGA4gASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SB2VkaXRpb24iuQYKD0Rlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjsKBWZpZWxkGAIgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUgVmaWVsZBJDCglleHRlbnNpb24YBiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhJBCgtuZXN0ZWRfdHlwZRgDIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SCm5lc3RlZFR5cGUSQQoJZW51bV90eXBlGAQgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlElgKD2V4dGVuc2lvbl9yYW5nZRgFIAMoCzIvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2VSDmV4dGVuc2lvblJhbmdlEkQKCm9uZW9mX2RlY2wYCCADKAsyJS5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG9SCW9uZW9mRGVjbBI5CgdvcHRpb25zGAcgASgLMh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zUgdvcHRpb25zElUKDnJlc2VydmVkX3JhbmdlGAkgAygLMi4uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYCiADKAlSDHJlc2VydmVkTmFtZRp6Cg5FeHRlbnNpb25SYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQSQAoHb3B0aW9ucxgDIAEoCzImLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnNSB29wdGlvbnMaNwoNUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQizAQKFUV4dGVuc2lvblJhbmdlT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbhJZCgtkZWNsYXJhdGlvbhgCIAMoCzIyLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuRGVjbGFyYXRpb25CA4gBAlILZGVjbGFyYXRpb24SNwoIZmVhdHVyZXMYMiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSbQoMdmVyaWZpY2F0aW9uGAMgASgOMjguZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5WZXJpZmljYXRpb25TdGF0ZToKVU5WRVJJRklFREIDiAECUgx2ZXJpZmljYXRpb24alAEKC0RlY2xhcmF0aW9uEhYKBm51bWJlchgBIAEoBVIGbnVtYmVyEhsKCWZ1bGxfbmFtZRgCIAEoCVIIZnVsbE5hbWUSEgoEdHlwZRgDIAEoCVIEdHlwZRIaCghyZXNlcnZlZBgFIAEoCFIIcmVzZXJ2ZWQSGgoIcmVwZWF0ZWQYBiABKAhSCHJlcGVhdGVkSgQIBBAFIjQKEVZlcmlmaWNhdGlvblN0YXRlEg8KC0RFQ0xBUkFUSU9OEAASDgoKVU5WRVJJRklFRBABKgkI6AcQgICAgAIiwQYKFEZpZWxkRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAMgASgFUgZudW1iZXISQQoFbGFiZWwYBCABKA4yKy5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWxSBWxhYmVsEj4KBHR5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZVIEdHlwZRIbCgl0eXBlX25hbWUYBiABKAlSCHR5cGVOYW1lEhoKCGV4dGVuZGVlGAIgASgJUghleHRlbmRlZRIjCg1kZWZhdWx0X3ZhbHVlGAcgASgJUgxkZWZhdWx0VmFsdWUSHwoLb25lb2ZfaW5kZXgYCSABKAVSCm9uZW9mSW5kZXgSGwoJanNvbl9uYW1lGAogASgJUghqc29uTmFtZRI3CgdvcHRpb25zGAggASgLMh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9uc1IHb3B0aW9ucxInCg9wcm90bzNfb3B0aW9uYWwYESABKAhSDnByb3RvM09wdGlvbmFsIrYCCgRUeXBlEg8KC1RZUEVfRE9VQkxFEAESDgoKVFlQRV9GTE9BVBACEg4KClRZUEVfSU5UNjQQAxIPCgtUWVBFX1VJTlQ2NBAEEg4KClRZUEVfSU5UMzIQBRIQCgxUWVBFX0ZJWEVENjQQBhIQCgxUWVBFX0ZJWEVEMzIQBxINCglUWVBFX0JPT0wQCBIPCgtUWVBFX1NUUklORxAJEg4KClRZUEVfR1JPVVAQChIQCgxUWVBFX01FU1NBR0UQCxIOCgpUWVBFX0JZVEVTEAwSDwoLVFlQRV9VSU5UMzIQDRINCglUWVBFX0VOVU0QDhIRCg1UWVBFX1NGSVhFRDMyEA8SEQoNVFlQRV9TRklYRUQ2NBAQEg8KC1RZUEVfU0lOVDMyEBESDwoLVFlQRV9TSU5UNjQQEiJDCgVMYWJlbBISCg5MQUJFTF9PUFRJT05BTBABEhIKDkxBQkVMX1JFUEVBVEVEEAMSEgoOTEFCRUxfUkVRVUlSRUQQAiJjChRPbmVvZkRlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjcKB29wdGlvbnMYAiABKAsyHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zUgdvcHRpb25zIuMCChNFbnVtRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPwoFdmFsdWUYAiADKAsyKS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvUgV2YWx1ZRI2CgdvcHRpb25zGAMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zUgdvcHRpb25zEl0KDnJlc2VydmVkX3JhbmdlGAQgAygLMjYuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2VSDXJlc2VydmVkUmFuZ2USIwoNcmVzZXJ2ZWRfbmFtZRgFIAMoCVIMcmVzZXJ2ZWROYW1lGjsKEUVudW1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKDAQoYRW51bVZhbHVlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAIgASgFUgZudW1iZXISOwoHb3B0aW9ucxgDIAEoCzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zUgdvcHRpb25zIqcBChZTZXJ2aWNlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPgoGbWV0aG9kGAIgAygLMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1IGbWV0aG9kEjkKB29wdGlvbnMYAyABKAsyHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnNSB29wdGlvbnMiiQIKFU1ldGhvZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEh0KCmlucHV0X3R5cGUYAiABKAlSCWlucHV0VHlwZRIfCgtvdXRwdXRfdHlwZRgDIAEoCVIKb3V0cHV0VHlwZRI4CgdvcHRpb25zGAQgASgLMh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNSB29wdGlvbnMSMAoQY2xpZW50X3N0cmVhbWluZxgFIAEoCDoFZmFsc2VSD2NsaWVudFN0cmVhbWluZxIwChBzZXJ2ZXJfc3RyZWFtaW5nGAYgASgIOgVmYWxzZVIPc2VydmVyU3RyZWFtaW5nIq0JCgtGaWxlT3B0aW9ucxIhCgxqYXZhX3BhY2thZ2UYASABKAlSC2phdmFQYWNrYWdlEjAKFGphdmFfb3V0ZXJfY2xhc3NuYW1lGAggASgJUhJqYXZhT3V0ZXJDbGFzc25hbWUSNQoTamF2YV9tdWx0aXBsZV9maWxlcxgKIAEoCDoFZmFsc2VSEWphdmFNdWx0aXBsZUZpbGVzEkQKHWphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoGBQgASgIQgIYAVIZamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaBI6ChZqYXZhX3N0cmluZ19jaGVja191dGY4GBsgASgIOgVmYWxzZVITamF2YVN0cmluZ0NoZWNrVXRmOBJTCgxvcHRpbWl6ZV9mb3IYCSABKA4yKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlOgVTUEVFRFILb3B0aW1pemVGb3ISHQoKZ29fcGFja2FnZRgLIAEoCVIJZ29QYWNrYWdlEjUKE2NjX2dlbmVyaWNfc2VydmljZXMYECABKAg6BWZhbHNlUhFjY0dlbmVyaWNTZXJ2aWNlcxI5ChVqYXZhX2dlbmVyaWNfc2VydmljZXMYESABKAg6BWZhbHNlUhNqYXZhR2VuZXJpY1NlcnZpY2VzEjUKE3B5X2dlbmVyaWNfc2VydmljZXMYEiABKAg6BWZhbHNlUhFweUdlbmVyaWNTZXJ2aWNlcxIlCgpkZXByZWNhdGVkGBcgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIuChBjY19lbmFibGVfYXJlbmFzGB8gASgIOgR0cnVlUg5jY0VuYWJsZUFyZW5hcxIqChFvYmpjX2NsYXNzX3ByZWZpeBgkIAEoCVIPb2JqY0NsYXNzUHJlZml4EikKEGNzaGFycF9uYW1lc3BhY2UYJSABKAlSD2NzaGFycE5hbWVzcGFjZRIhCgxzd2lmdF9wcmVmaXgYJyABKAlSC3N3aWZ0UHJlZml4EigKEHBocF9jbGFzc19wcmVmaXgYKCABKAlSDnBocENsYXNzUHJlZml4EiMKDXBocF9uYW1lc3BhY2UYKSABKAlSDHBocE5hbWVzcGFjZRI0ChZwaHBfbWV0YWRhdGFfbmFtZXNwYWNlGCwgASgJUhRwaHBNZXRhZGF0YU5hbWVzcGFjZRIhCgxydWJ5X3BhY2thZ2UYLSABKAlSC3J1YnlQYWNrYWdlEjcKCGZlYXR1cmVzGDIgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIjoKDE9wdGltaXplTW9kZRIJCgVTUEVFRBABEg0KCUNPREVfU0laRRACEhAKDExJVEVfUlVOVElNRRADKgkI6AcQgICAgAJKBAgqECtKBAgmECdSFHBocF9nZW5lcmljX3NlcnZpY2VzIvQDCg5NZXNzYWdlT3B0aW9ucxI8ChdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdBgBIAEoCDoFZmFsc2VSFG1lc3NhZ2VTZXRXaXJlRm9ybWF0EkwKH25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IYAiABKAg6BWZhbHNlUhxub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhsKCW1hcF9lbnRyeRgHIAEoCFIIbWFwRW50cnkSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYCyABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAwgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgEEAVKBAgFEAZKBAgGEAdKBAgIEAlKBAgJEAoinQ0KDEZpZWxkT3B0aW9ucxJBCgVjdHlwZRgBIAEoDjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGU6BlNUUklOR1IFY3R5cGUSFgoGcGFja2VkGAIgASgIUgZwYWNrZWQSRwoGanN0eXBlGAYgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6CUpTX05PUk1BTFIGanN0eXBlEhkKBGxhenkYBSABKAg6BWZhbHNlUgRsYXp5Ei4KD3VudmVyaWZpZWRfbGF6eRgPIAEoCDoFZmFsc2VSDnVudmVyaWZpZWRMYXp5EiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhkKBHdlYWsYCiABKAg6BWZhbHNlUgR3ZWFrEigKDGRlYnVnX3JlZGFjdBgQIAEoCDoFZmFsc2VSC2RlYnVnUmVkYWN0EksKCXJldGVudGlvbhgRIAEoDjItLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uUmV0ZW50aW9uUglyZXRlbnRpb24SSAoHdGFyZ2V0cxgTIAMoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZVIHdGFyZ2V0cxJXChBlZGl0aW9uX2RlZmF1bHRzGBQgAygLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5FZGl0aW9uRGVmYXVsdFIPZWRpdGlvbkRlZmF1bHRzEjcKCGZlYXR1cmVzGBUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElUKD2ZlYXR1cmVfc3VwcG9ydBgWIAEoCzIsLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuRmVhdHVyZVN1cHBvcnRSDmZlYXR1cmVTdXBwb3J0ElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uGloKDkVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhIUCgV2YWx1ZRgCIAEoCVIFdmFsdWUalgIKDkZlYXR1cmVTdXBwb3J0EkcKEmVkaXRpb25faW50cm9kdWNlZBgBIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUhFlZGl0aW9uSW50cm9kdWNlZBJHChJlZGl0aW9uX2RlcHJlY2F0ZWQYAiABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIRZWRpdGlvbkRlcHJlY2F0ZWQSLwoTZGVwcmVjYXRpb25fd2FybmluZxgDIAEoCVISZGVwcmVjYXRpb25XYXJuaW5nEkEKD2VkaXRpb25fcmVtb3ZlZBgEIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5lZGl0aW9uUmVtb3ZlZCIvCgVDVHlwZRIKCgZTVFJJTkcQABIICgRDT1JEEAESEAoMU1RSSU5HX1BJRUNFEAIiNQoGSlNUeXBlEg0KCUpTX05PUk1BTBAAEg0KCUpTX1NUUklORxABEg0KCUpTX05VTUJFUhACIlUKD09wdGlvblJldGVudGlvbhIVChFSRVRFTlRJT05fVU5LTk9XThAAEhUKEVJFVEVOVElPTl9SVU5USU1FEAESFAoQUkVURU5USU9OX1NPVVJDRRACIowCChBPcHRpb25UYXJnZXRUeXBlEhcKE1RBUkdFVF9UWVBFX1VOS05PV04QABIUChBUQVJHRVRfVFlQRV9GSUxFEAESHwobVEFSR0VUX1RZUEVfRVhURU5TSU9OX1JBTkdFEAISFwoTVEFSR0VUX1RZUEVfTUVTU0FHRRADEhUKEVRBUkdFVF9UWVBFX0ZJRUxEEAQSFQoRVEFSR0VUX1RZUEVfT05FT0YQBRIUChBUQVJHRVRfVFlQRV9FTlVNEAYSGgoWVEFSR0VUX1RZUEVfRU5VTV9FTlRSWRAHEhcKE1RBUkdFVF9UWVBFX1NFUlZJQ0UQCBIWChJUQVJHRVRfVFlQRV9NRVRIT0QQCSoJCOgHEICAgIACSgQIBBAFSgQIEhATIqwBCgxPbmVvZk9wdGlvbnMSNwoIZmVhdHVyZXMYASABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLRAgoLRW51bU9wdGlvbnMSHwoLYWxsb3dfYWxpYXMYAiABKAhSCmFsbG93QWxpYXMSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYBiABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgFEAYi2AIKEEVudW1WYWx1ZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBgBIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSNwoIZmVhdHVyZXMYAiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSKAoMZGVidWdfcmVkYWN0GAMgASgIOgVmYWxzZVILZGVidWdSZWRhY3QSVQoPZmVhdHVyZV9zdXBwb3J0GAQgASgLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5GZWF0dXJlU3VwcG9ydFIOZmVhdHVyZVN1cHBvcnQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLVAQoOU2VydmljZU9wdGlvbnMSNwoIZmVhdHVyZXMYIiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKZAwoNTWV0aG9kT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJxChFpZGVtcG90ZW5jeV9sZXZlbBgiIAEoDjIvLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLklkZW1wb3RlbmN5TGV2ZWw6E0lERU1QT1RFTkNZX1VOS05PV05SEGlkZW1wb3RlbmN5TGV2ZWwSNwoIZmVhdHVyZXMYIyABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iUAoQSWRlbXBvdGVuY3lMZXZlbBIXChNJREVNUE9URU5DWV9VTktOT1dOEAASEwoPTk9fU0lERV9FRkZFQ1RTEAESDgoKSURFTVBPVEVOVBACKgkI6AcQgICAgAIimgMKE1VuaW50ZXJwcmV0ZWRPcHRpb24SQQoEbmFtZRgCIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0UgRuYW1lEikKEGlkZW50aWZpZXJfdmFsdWUYAyABKAlSD2lkZW50aWZpZXJWYWx1ZRIsChJwb3NpdGl2ZV9pbnRfdmFsdWUYBCABKARSEHBvc2l0aXZlSW50VmFsdWUSLAoSbmVnYXRpdmVfaW50X3ZhbHVlGAUgASgDUhBuZWdhdGl2ZUludFZhbHVlEiEKDGRvdWJsZV92YWx1ZRgGIAEoAVILZG91YmxlVmFsdWUSIQoMc3RyaW5nX3ZhbHVlGAcgASgMUgtzdHJpbmdWYWx1ZRInCg9hZ2dyZWdhdGVfdmFsdWUYCCABKAlSDmFnZ3JlZ2F0ZVZhbHVlGkoKCE5hbWVQYXJ0EhsKCW5hbWVfcGFydBgBIAIoCVIIbmFtZVBhcnQSIQoMaXNfZXh0ZW5zaW9uGAIgAigIUgtpc0V4dGVuc2lvbiKnCgoKRmVhdHVyZVNldBKRAQoOZmllbGRfcHJlc2VuY2UYASABKA4yKS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5GaWVsZFByZXNlbmNlQj+IAQGYAQSYAQGiAQ0SCEVYUExJQ0lUGIQHogENEghJTVBMSUNJVBjnB6IBDRIIRVhQTElDSVQY6AeyAQMI6AdSDWZpZWxkUHJlc2VuY2USbAoJZW51bV90eXBlGAIgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuRW51bVR5cGVCKYgBAZgBBpgBAaIBCxIGQ0xPU0VEGIQHogEJEgRPUEVOGOcHsgEDCOgHUghlbnVtVHlwZRKYAQoXcmVwZWF0ZWRfZmllbGRfZW5jb2RpbmcYAyABKA4yMS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5SZXBlYXRlZEZpZWxkRW5jb2RpbmdCLYgBAZgBBJgBAaIBDRIIRVhQQU5ERUQYhAeiAQsSBlBBQ0tFRBjnB7IBAwjoB1IVcmVwZWF0ZWRGaWVsZEVuY29kaW5nEn4KD3V0ZjhfdmFsaWRhdGlvbhgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LlV0ZjhWYWxpZGF0aW9uQimIAQGYAQSYAQGiAQkSBE5PTkUYhAeiAQsSBlZFUklGWRjnB7IBAwjoB1IOdXRmOFZhbGlkYXRpb24SfgoQbWVzc2FnZV9lbmNvZGluZxgFIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0Lk1lc3NhZ2VFbmNvZGluZ0ImiAEBmAEEmAEBogEUEg9MRU5HVEhfUFJFRklYRUQYhAeyAQMI6AdSD21lc3NhZ2VFbmNvZGluZxKCAQoLanNvbl9mb3JtYXQYBiABKA4yJi5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5Kc29uRm9ybWF0QjmIAQGYAQOYAQaYAQGiARcSEkxFR0FDWV9CRVNUX0VGRk9SVBiEB6IBChIFQUxMT1cY5weyAQMI6AdSCmpzb25Gb3JtYXQiXAoNRmllbGRQcmVzZW5jZRIaChZGSUVMRF9QUkVTRU5DRV9VTktOT1dOEAASDAoIRVhQTElDSVQQARIMCghJTVBMSUNJVBACEhMKD0xFR0FDWV9SRVFVSVJFRBADIjcKCEVudW1UeXBlEhUKEUVOVU1fVFlQRV9VTktOT1dOEAASCAoET1BFThABEgoKBkNMT1NFRBACIlYKFVJlcGVhdGVkRmllbGRFbmNvZGluZxIjCh9SRVBFQVRFRF9GSUVMRF9FTkNPRElOR19VTktOT1dOEAASCgoGUEFDS0VEEAESDAoIRVhQQU5ERUQQAiJJCg5VdGY4VmFsaWRhdGlvbhIbChdVVEY4X1ZBTElEQVRJT05fVU5LTk9XThAAEgoKBlZFUklGWRACEggKBE5PTkUQAyIECAEQASJTCg9NZXNzYWdlRW5jb2RpbmcSHAoYTUVTU0FHRV9FTkNPRElOR19VTktOT1dOEAASEwoPTEVOR1RIX1BSRUZJWEVEEAESDQoJREVMSU1JVEVEEAIiSAoKSnNvbkZvcm1hdBIXChNKU09OX0ZPUk1BVF9VTktOT1dOEAASCQoFQUxMT1cQARIWChJMRUdBQ1lfQkVTVF9FRkZPUlQQAioGCOgHEItOKgYIi04QkE4qBgiQThCRTkoGCOcHEOgHIu8DChJGZWF0dXJlU2V0RGVmYXVsdHMSWAoIZGVmYXVsdHMYASADKAsyPC5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldERlZmF1bHRzLkZlYXR1cmVTZXRFZGl0aW9uRGVmYXVsdFIIZGVmYXVsdHMSQQoPbWluaW11bV9lZGl0aW9uGAQgASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SDm1pbmltdW1FZGl0aW9uEkEKD21heGltdW1fZWRpdGlvbhgFIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5tYXhpbXVtRWRpdGlvbhr4AQoYRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhJOChRvdmVycmlkYWJsZV9mZWF0dXJlcxgEIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UhNvdmVycmlkYWJsZUZlYXR1cmVzEkIKDmZpeGVkX2ZlYXR1cmVzGAUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSDWZpeGVkRmVhdHVyZXNKBAgBEAJKBAgCEANSCGZlYXR1cmVzIrUCCg5Tb3VyY2VDb2RlSW5mbxJECghsb2NhdGlvbhgBIAMoCzIoLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblIIbG9jYXRpb24azgEKCExvY2F0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEhYKBHNwYW4YAiADKAVCAhABUgRzcGFuEikKEGxlYWRpbmdfY29tbWVudHMYAyABKAlSD2xlYWRpbmdDb21tZW50cxIrChF0cmFpbGluZ19jb21tZW50cxgEIAEoCVIQdHJhaWxpbmdDb21tZW50cxI6ChlsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzGAYgAygJUhdsZWFkaW5nRGV0YWNoZWRDb21tZW50cyoMCIDsyv8BEIHsyv8BItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACKqcCCgdFZGl0aW9uEhMKD0VESVRJT05fVU5LTk9XThAAEhMKDkVESVRJT05fTEVHQUNZEIQHEhMKDkVESVRJT05fUFJPVE8yEOYHEhMKDkVESVRJT05fUFJPVE8zEOcHEhEKDEVESVRJT05fMjAyMxDoBxIRCgxFRElUSU9OXzIwMjQQ6QcSFwoTRURJVElPTl8xX1RFU1RfT05MWRABEhcKE0VESVRJT05fMl9URVNUX09OTFkQAhIdChdFRElUSU9OXzk5OTk3X1RFU1RfT05MWRCdjQYSHQoXRURJVElPTl85OTk5OF9URVNUX09OTFkQno0GEh0KF0VESVRJT05fOTk5OTlfVEVTVF9PTkxZEJ+NBhITCgtFRElUSU9OX01BWBD/////B0J+ChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9yUHJvdG9zSAFaLWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rlc2NyaXB0b3JwYvgBAaICA0dQQqoCGkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCvsBCh5nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiI6CghEdXJhdGlvbhIYCgdzZWNvbmRzGAEgASgDUgdzZWNvbmRzEhQKBW5hbm9zGAIgASgFUgVuYW5vc0KDAQoTY29tLmdvb2dsZS5wcm90b2J1ZkINRHVyYXRpb25Qcm90b1ABWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9kdXJhdGlvbnBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKrzEKF3ZhbGlkYXRlL3ZhbGlkYXRlLnByb3RvEgh2YWxpZGF0ZRogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90bxofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byLICAoKRmllbGRSdWxlcxIwCgdtZXNzYWdlGBEgASgLMhYudmFsaWRhdGUuTWVzc2FnZVJ1bGVzUgdtZXNzYWdlEiwKBWZsb2F0GAEgASgLMhQudmFsaWRhdGUuRmxvYXRSdWxlc0gAUgVmbG9hdBIvCgZkb3VibGUYAiABKAsyFS52YWxpZGF0ZS5Eb3VibGVSdWxlc0gAUgZkb3VibGUSLAoFaW50MzIYAyABKAsyFC52YWxpZGF0ZS5JbnQzMlJ1bGVzSABSBWludDMyEiwKBWludDY0GAQgASgLMhQudmFsaWRhdGUuSW50NjRSdWxlc0gAUgVpbnQ2NBIvCgZ1aW50MzIYBSABKAsyFS52YWxpZGF0ZS5VSW50MzJSdWxlc0gAUgZ1aW50MzISLwoGdWludDY0GAYgASgLMhUudmFsaWRhdGUuVUludDY0UnVsZXNIAFIGdWludDY0Ei8KBnNpbnQzMhgHIAEoCzIVLnZhbGlkYXRlLlNJbnQzMlJ1bGVzSABSBnNpbnQzMhIvCgZzaW50NjQYCCABKAsyFS52YWxpZGF0ZS5TSW50NjRSdWxlc0gAUgZzaW50NjQSMgoHZml4ZWQzMhgJIAEoCzIWLnZhbGlkYXRlLkZpeGVkMzJSdWxlc0gAUgdmaXhlZDMyEjIKB2ZpeGVkNjQYCiABKAsyFi52YWxpZGF0ZS5GaXhlZDY0UnVsZXNIAFIHZml4ZWQ2NBI1CghzZml4ZWQzMhgLIAEoCzIXLnZhbGlkYXRlLlNGaXhlZDMyUnVsZXNIAFIIc2ZpeGVkMzISNQoIc2ZpeGVkNjQYDCABKAsyFy52YWxpZGF0ZS5TRml4ZWQ2NFJ1bGVzSABSCHNmaXhlZDY0EikKBGJvb2wYDSABKAsyEy52YWxpZGF0ZS5Cb29sUnVsZXNIAFIEYm9vbBIvCgZzdHJpbmcYDiABKAsyFS52YWxpZGF0ZS5TdHJpbmdSdWxlc0gAUgZzdHJpbmcSLAoFYnl0ZXMYDyABKAsyFC52YWxpZGF0ZS5CeXRlc1J1bGVzSABSBWJ5dGVzEikKBGVudW0YECABKAsyEy52YWxpZGF0ZS5FbnVtUnVsZXNIAFIEZW51bRI1CghyZXBlYXRlZBgSIAEoCzIXLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXNIAFIIcmVwZWF0ZWQSJgoDbWFwGBMgASgLMhIudmFsaWRhdGUuTWFwUnVsZXNIAFIDbWFwEiYKA2FueRgUIAEoCzISLnZhbGlkYXRlLkFueVJ1bGVzSABSA2FueRI1CghkdXJhdGlvbhgVIAEoCzIXLnZhbGlkYXRlLkR1cmF0aW9uUnVsZXNIAFIIZHVyYXRpb24SOAoJdGltZXN0YW1wGBYgASgLMhgudmFsaWRhdGUuVGltZXN0YW1wUnVsZXNIAFIJdGltZXN0YW1wQgYKBHR5cGUisAEKCkZsb2F0UnVsZXMSFAoFY29uc3QYASABKAJSBWNvbnN0Eg4KAmx0GAIgASgCUgJsdBIQCgNsdGUYAyABKAJSA2x0ZRIOCgJndBgEIAEoAlICZ3QSEAoDZ3RlGAUgASgCUgNndGUSDgoCaW4YBiADKAJSAmluEhUKBm5vdF9pbhgHIAMoAlIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKxAQoLRG91YmxlUnVsZXMSFAoFY29uc3QYASABKAFSBWNvbnN0Eg4KAmx0GAIgASgBUgJsdBIQCgNsdGUYAyABKAFSA2x0ZRIOCgJndBgEIAEoAVICZ3QSEAoDZ3RlGAUgASgBUgNndGUSDgoCaW4YBiADKAFSAmluEhUKBm5vdF9pbhgHIAMoAVIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKwAQoKSW50MzJSdWxlcxIUCgVjb25zdBgBIAEoBVIFY29uc3QSDgoCbHQYAiABKAVSAmx0EhAKA2x0ZRgDIAEoBVIDbHRlEg4KAmd0GAQgASgFUgJndBIQCgNndGUYBSABKAVSA2d0ZRIOCgJpbhgGIAMoBVICaW4SFQoGbm90X2luGAcgAygFUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrABCgpJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgDUgVjb25zdBIOCgJsdBgCIAEoA1ICbHQSEAoDbHRlGAMgASgDUgNsdGUSDgoCZ3QYBCABKANSAmd0EhAKA2d0ZRgFIAEoA1IDZ3RlEg4KAmluGAYgAygDUgJpbhIVCgZub3RfaW4YByADKANSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1VJbnQzMlJ1bGVzEhQKBWNvbnN0GAEgASgNUgVjb25zdBIOCgJsdBgCIAEoDVICbHQSEAoDbHRlGAMgASgNUgNsdGUSDgoCZ3QYBCABKA1SAmd0EhAKA2d0ZRgFIAEoDVIDZ3RlEg4KAmluGAYgAygNUgJpbhIVCgZub3RfaW4YByADKA1SBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1VJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgEUgVjb25zdBIOCgJsdBgCIAEoBFICbHQSEAoDbHRlGAMgASgEUgNsdGUSDgoCZ3QYBCABKARSAmd0EhAKA2d0ZRgFIAEoBFIDZ3RlEg4KAmluGAYgAygEUgJpbhIVCgZub3RfaW4YByADKARSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1NJbnQzMlJ1bGVzEhQKBWNvbnN0GAEgASgRUgVjb25zdBIOCgJsdBgCIAEoEVICbHQSEAoDbHRlGAMgASgRUgNsdGUSDgoCZ3QYBCABKBFSAmd0EhAKA2d0ZRgFIAEoEVIDZ3RlEg4KAmluGAYgAygRUgJpbhIVCgZub3RfaW4YByADKBFSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1NJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgSUgVjb25zdBIOCgJsdBgCIAEoElICbHQSEAoDbHRlGAMgASgSUgNsdGUSDgoCZ3QYBCABKBJSAmd0EhAKA2d0ZRgFIAEoElIDZ3RlEg4KAmluGAYgAygSUgJpbhIVCgZub3RfaW4YByADKBJSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisgEKDEZpeGVkMzJSdWxlcxIUCgVjb25zdBgBIAEoB1IFY29uc3QSDgoCbHQYAiABKAdSAmx0EhAKA2x0ZRgDIAEoB1IDbHRlEg4KAmd0GAQgASgHUgJndBIQCgNndGUYBSABKAdSA2d0ZRIOCgJpbhgGIAMoB1ICaW4SFQoGbm90X2luGAcgAygHUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrIBCgxGaXhlZDY0UnVsZXMSFAoFY29uc3QYASABKAZSBWNvbnN0Eg4KAmx0GAIgASgGUgJsdBIQCgNsdGUYAyABKAZSA2x0ZRIOCgJndBgEIAEoBlICZ3QSEAoDZ3RlGAUgASgGUgNndGUSDgoCaW4YBiADKAZSAmluEhUKBm5vdF9pbhgHIAMoBlIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKzAQoNU0ZpeGVkMzJSdWxlcxIUCgVjb25zdBgBIAEoD1IFY29uc3QSDgoCbHQYAiABKA9SAmx0EhAKA2x0ZRgDIAEoD1IDbHRlEg4KAmd0GAQgASgPUgJndBIQCgNndGUYBSABKA9SA2d0ZRIOCgJpbhgGIAMoD1ICaW4SFQoGbm90X2luGAcgAygPUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrMBCg1TRml4ZWQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgQUgVjb25zdBIOCgJsdBgCIAEoEFICbHQSEAoDbHRlGAMgASgQUgNsdGUSDgoCZ3QYBCABKBBSAmd0EhAKA2d0ZRgFIAEoEFIDZ3RlEg4KAmluGAYgAygQUgJpbhIVCgZub3RfaW4YByADKBBSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkiIQoJQm9vbFJ1bGVzEhQKBWNvbnN0GAEgASgIUgVjb25zdCLUBQoLU3RyaW5nUnVsZXMSFAoFY29uc3QYASABKAlSBWNvbnN0EhAKA2xlbhgTIAEoBFIDbGVuEhcKB21pbl9sZW4YAiABKARSBm1pbkxlbhIXCgdtYXhfbGVuGAMgASgEUgZtYXhMZW4SGwoJbGVuX2J5dGVzGBQgASgEUghsZW5CeXRlcxIbCgltaW5fYnl0ZXMYBCABKARSCG1pbkJ5dGVzEhsKCW1heF9ieXRlcxgFIAEoBFIIbWF4Qnl0ZXMSGAoHcGF0dGVybhgGIAEoCVIHcGF0dGVybhIWCgZwcmVmaXgYByABKAlSBnByZWZpeBIWCgZzdWZmaXgYCCABKAlSBnN1ZmZpeBIaCghjb250YWlucxgJIAEoCVIIY29udGFpbnMSIQoMbm90X2NvbnRhaW5zGBcgASgJUgtub3RDb250YWlucxIOCgJpbhgKIAMoCVICaW4SFQoGbm90X2luGAsgAygJUgVub3RJbhIWCgVlbWFpbBgMIAEoCEgAUgVlbWFpbBIcCghob3N0bmFtZRgNIAEoCEgAUghob3N0bmFtZRIQCgJpcBgOIAEoCEgAUgJpcBIUCgRpcHY0GA8gASgISABSBGlwdjQSFAoEaXB2NhgQIAEoCEgAUgRpcHY2EhIKA3VyaRgRIAEoCEgAUgN1cmkSGQoHdXJpX3JlZhgSIAEoCEgAUgZ1cmlSZWYSGgoHYWRkcmVzcxgVIAEoCEgAUgdhZGRyZXNzEhQKBHV1aWQYFiABKAhIAFIEdXVpZBJAChB3ZWxsX2tub3duX3JlZ2V4GBggASgOMhQudmFsaWRhdGUuS25vd25SZWdleEgAUg53ZWxsS25vd25SZWdleBIcCgZzdHJpY3QYGSABKAg6BHRydWVSBnN0cmljdBIhCgxpZ25vcmVfZW1wdHkYGiABKAhSC2lnbm9yZUVtcHR5QgwKCndlbGxfa25vd24i4gIKCkJ5dGVzUnVsZXMSFAoFY29uc3QYASABKAxSBWNvbnN0EhAKA2xlbhgNIAEoBFIDbGVuEhcKB21pbl9sZW4YAiABKARSBm1pbkxlbhIXCgdtYXhfbGVuGAMgASgEUgZtYXhMZW4SGAoHcGF0dGVybhgEIAEoCVIHcGF0dGVybhIWCgZwcmVmaXgYBSABKAxSBnByZWZpeBIWCgZzdWZmaXgYBiABKAxSBnN1ZmZpeBIaCghjb250YWlucxgHIAEoDFIIY29udGFpbnMSDgoCaW4YCCADKAxSAmluEhUKBm5vdF9pbhgJIAMoDFIFbm90SW4SEAoCaXAYCiABKAhIAFICaXASFAoEaXB2NBgLIAEoCEgAUgRpcHY0EhQKBGlwdjYYDCABKAhIAFIEaXB2NhIhCgxpZ25vcmVfZW1wdHkYDiABKAhSC2lnbm9yZUVtcHR5QgwKCndlbGxfa25vd24iawoJRW51bVJ1bGVzEhQKBWNvbnN0GAEgASgFUgVjb25zdBIhCgxkZWZpbmVkX29ubHkYAiABKAhSC2RlZmluZWRPbmx5Eg4KAmluGAMgAygFUgJpbhIVCgZub3RfaW4YBCADKAVSBW5vdEluIj4KDE1lc3NhZ2VSdWxlcxISCgRza2lwGAEgASgIUgRza2lwEhoKCHJlcXVpcmVkGAIgASgIUghyZXF1aXJlZCKwAQoNUmVwZWF0ZWRSdWxlcxIbCgltaW5faXRlbXMYASABKARSCG1pbkl0ZW1zEhsKCW1heF9pdGVtcxgCIAEoBFIIbWF4SXRlbXMSFgoGdW5pcXVlGAMgASgIUgZ1bmlxdWUSKgoFaXRlbXMYBCABKAsyFC52YWxpZGF0ZS5GaWVsZFJ1bGVzUgVpdGVtcxIhCgxpZ25vcmVfZW1wdHkYBSABKAhSC2lnbm9yZUVtcHR5ItwBCghNYXBSdWxlcxIbCgltaW5fcGFpcnMYASABKARSCG1pblBhaXJzEhsKCW1heF9wYWlycxgCIAEoBFIIbWF4UGFpcnMSGwoJbm9fc3BhcnNlGAMgASgIUghub1NwYXJzZRIoCgRrZXlzGAQgASgLMhQudmFsaWRhdGUuRmllbGRSdWxlc1IEa2V5cxIsCgZ2YWx1ZXMYBSABKAsyFC52YWxpZGF0ZS5GaWVsZFJ1bGVzUgZ2YWx1ZXMSIQoMaWdub3JlX2VtcHR5GAYgASgIUgtpZ25vcmVFbXB0eSJNCghBbnlSdWxlcxIaCghyZXF1aXJlZBgBIAEoCFIIcmVxdWlyZWQSDgoCaW4YAiADKAlSAmluEhUKBm5vdF9pbhgDIAMoCVIFbm90SW4i6QIKDUR1cmF0aW9uUnVsZXMSGgoIcmVxdWlyZWQYASABKAhSCHJlcXVpcmVkEi8KBWNvbnN0GAIgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgVjb25zdBIpCgJsdBgDIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblICbHQSKwoDbHRlGAQgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgNsdGUSKQoCZ3QYBSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25SAmd0EisKA2d0ZRgGIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblIDZ3RlEikKAmluGAcgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgJpbhIwCgZub3RfaW4YCCADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25SBW5vdEluIvMCCg5UaW1lc3RhbXBSdWxlcxIaCghyZXF1aXJlZBgBIAEoCFIIcmVxdWlyZWQSMAoFY29uc3QYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgVjb25zdBIqCgJsdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSAmx0EiwKA2x0ZRgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSA2x0ZRIqCgJndBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSAmd0EiwKA2d0ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSA2d0ZRIVCgZsdF9ub3cYByABKAhSBWx0Tm93EhUKBmd0X25vdxgIIAEoCFIFZ3ROb3cSMQoGd2l0aGluGAkgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgZ3aXRoaW4qRgoKS25vd25SZWdleBILCgdVTktOT1dOEAASFAoQSFRUUF9IRUFERVJfTkFNRRABEhUKEUhUVFBfSEVBREVSX1ZBTFVFEAI6PAoIZGlzYWJsZWQSHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYrwggASgIUghkaXNhYmxlZDo6CgdpZ25vcmVkEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGLAIIAEoCFIHaWdub3JlZDo6CghyZXF1aXJlZBIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMYrwggASgIUghyZXF1aXJlZDpKCgVydWxlcxIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYrwggASgLMhQudmFsaWRhdGUuRmllbGRSdWxlc1IFcnVsZXNCUAoaaW8uZW52b3lwcm94eS5wZ3YudmFsaWRhdGVaMmdpdGh1Yi5jb20vZW52b3lwcm94eS9wcm90b2MtZ2VuLXZhbGlkYXRlL3ZhbGlkYXRlCrcDCgxjb21tb24ucHJvdG8SBmNvbW1vbiKHAQoKUGFja2FnZU1hcBI8CghwYWNrYWdlcxgBIAMoCzIgLmNvbW1vbi5QYWNrYWdlTWFwLlBhY2thZ2VzRW50cnlSCHBhY2thZ2VzGjsKDVBhY2thZ2VzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAxSBXZhbHVlOgI4ASJFChFTaWduaW5nQ29tbWl0bWVudBIWCgZoaWRpbmcYASABKAxSBmhpZGluZxIYCgdiaW5kaW5nGAIgASgMUgdiaW5kaW5nIjgKDVNpZ25pbmdSZXN1bHQSJwoPc2lnbmF0dXJlX3NoYXJlGAEgASgMUg5zaWduYXR1cmVTaGFyZSpdCg9TaWduYXR1cmVJbnRlbnQSDAoIQ1JFQVRJT04QABIMCghUUkFOU0ZFUhABEg0KCUFHR1JFR0FURRACEg8KB1JFRlJFU0gQAxoCCAESDgoGRVhURU5EEAQaAggBQi1aK2dpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9jb21tb25iBnByb3RvMwqeuQIKC3NwYXJrLnByb3RvEgVzcGFyaxofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bxobZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvGhd2YWxpZGF0ZS92YWxpZGF0ZS5wcm90bxoMY29tbW9uLnByb3RvIkoKGFN1YnNjcmliZVRvRXZlbnRzUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAogASgMUhFpZGVudGl0eVB1YmxpY0tleSLAAQoZU3Vic2NyaWJlVG9FdmVudHNSZXNwb25zZRIyCgh0cmFuc2ZlchgBIAEoCzIULnNwYXJrLlRyYW5zZmVyRXZlbnRIAFIIdHJhbnNmZXISLwoHZGVwb3NpdBgCIAEoCzITLnNwYXJrLkRlcG9zaXRFdmVudEgAUgdkZXBvc2l0EjUKCWNvbm5lY3RlZBgDIAEoCzIVLnNwYXJrLkNvbm5lY3RlZEV2ZW50SABSCWNvbm5lY3RlZEIHCgVldmVudCIQCg5Db25uZWN0ZWRFdmVudCI8Cg1UcmFuc2ZlckV2ZW50EisKCHRyYW5zZmVyGAogASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIjkKDERlcG9zaXRFdmVudBIpCgdkZXBvc2l0GAogASgLMg8uc3BhcmsuVHJlZU5vZGVSB2RlcG9zaXQicgoLUGFnZVJlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgFUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIuCglkaXJlY3Rpb24YAyABKA4yEC5zcGFyay5EaXJlY3Rpb25SCWRpcmVjdGlvbiKoAQoMUGFnZVJlc3BvbnNlEiIKDWhhc19uZXh0X3BhZ2UYASABKAhSC2hhc05leHRQYWdlEioKEWhhc19wcmV2aW91c19wYWdlGAIgASgIUg9oYXNQcmV2aW91c1BhZ2USHwoLbmV4dF9jdXJzb3IYAyABKAlSCm5leHRDdXJzb3ISJwoPcHJldmlvdXNfY3Vyc29yGAQgASgJUg5wcmV2aW91c0N1cnNvciKAAgoTRGVwb3NpdEFkZHJlc3NQcm9vZhJgChJhZGRyZXNzX3NpZ25hdHVyZXMYASADKAsyMS5zcGFyay5EZXBvc2l0QWRkcmVzc1Byb29mLkFkZHJlc3NTaWduYXR1cmVzRW50cnlSEWFkZHJlc3NTaWduYXR1cmVzEkEKHXByb29mX29mX3Bvc3Nlc3Npb25fc2lnbmF0dXJlGAIgASgMUhpwcm9vZk9mUG9zc2Vzc2lvblNpZ25hdHVyZRpEChZBZGRyZXNzU2lnbmF0dXJlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEilQIKHUdlbmVyYXRlRGVwb3NpdEFkZHJlc3NSZXF1ZXN0EiwKEnNpZ25pbmdfcHVibGljX2tleRgBIAEoDFIQc2lnbmluZ1B1YmxpY0tleRIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhFpZGVudGl0eVB1YmxpY0tleRIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsSJgoHbGVhZl9pZBgEIAEoCUII+kIFcgOwAQFIAFIGbGVhZklkiAEBEiAKCWlzX3N0YXRpYxgFIAEoCEgBUghpc1N0YXRpY4gBAUIKCghfbGVhZl9pZEIMCgpfaXNfc3RhdGljIrUBCgdBZGRyZXNzEhgKB2FkZHJlc3MYASABKAlSB2FkZHJlc3MSIwoNdmVyaWZ5aW5nX2tleRgCIAEoDFIMdmVyaWZ5aW5nS2V5Ek4KFWRlcG9zaXRfYWRkcmVzc19wcm9vZhgDIAEoCzIaLnNwYXJrLkRlcG9zaXRBZGRyZXNzUHJvb2ZSE2RlcG9zaXRBZGRyZXNzUHJvb2YSGwoJaXNfc3RhdGljGAUgASgIUghpc1N0YXRpYyJZCh5HZW5lcmF0ZURlcG9zaXRBZGRyZXNzUmVzcG9uc2USNwoPZGVwb3NpdF9hZGRyZXNzGAEgASgLMg4uc3BhcmsuQWRkcmVzc1IOZGVwb3NpdEFkZHJlc3MiyQEKI0dlbmVyYXRlU3RhdGljRGVwb3NpdEFkZHJlc3NSZXF1ZXN0EjUKEnNpZ25pbmdfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIQc2lnbmluZ1B1YmxpY0tleRI3ChNpZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUhFpZGVudGl0eVB1YmxpY0tleRIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsiXwokR2VuZXJhdGVTdGF0aWNEZXBvc2l0QWRkcmVzc1Jlc3BvbnNlEjcKD2RlcG9zaXRfYWRkcmVzcxgBIAEoCzIOLnNwYXJrLkFkZHJlc3NSDmRlcG9zaXRBZGRyZXNzInkKBFVUWE8SFQoGcmF3X3R4GAEgASgMUgVyYXdUeBISCgR2b3V0GAIgASgNUgR2b3V0EjIKB25ldHdvcmsYAyABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yaxISCgR0eGlkGAQgASgMUgR0eGlkIjkKCk5vZGVPdXRwdXQSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEhIKBHZvdXQYAiABKA1SBHZvdXQipgEKClNpZ25pbmdKb2ISLAoSc2lnbmluZ19wdWJsaWNfa2V5GAEgASgMUhBzaWduaW5nUHVibGljS2V5EhUKBnJhd190eBgCIAEoDFIFcmF3VHgSUwoYc2lnbmluZ19ub25jZV9jb21taXRtZW50GAMgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UhZzaWduaW5nTm9uY2VDb21taXRtZW50IsoCCg9TaWduaW5nS2V5c2hhcmUSKwoRb3duZXJfaWRlbnRpZmllcnMYASADKAlSEG93bmVySWRlbnRpZmllcnMSHAoJdGhyZXNob2xkGAIgASgNUgl0aHJlc2hvbGQSHQoKcHVibGljX2tleRgDIAEoDFIJcHVibGljS2V5Ek0KDXB1YmxpY19zaGFyZXMYBCADKAsyKC5zcGFyay5TaWduaW5nS2V5c2hhcmUuUHVibGljU2hhcmVzRW50cnlSDHB1YmxpY1NoYXJlcxI9Cgx1cGRhdGVkX3RpbWUYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgt1cGRhdGVkVGltZRo/ChFQdWJsaWNTaGFyZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoDFIFdmFsdWU6AjgBIsgECg1TaWduaW5nUmVzdWx0EkUKC3B1YmxpY19rZXlzGAEgAygLMiQuc3BhcmsuU2lnbmluZ1Jlc3VsdC5QdWJsaWNLZXlzRW50cnlSCnB1YmxpY0tleXMSbQoZc2lnbmluZ19ub25jZV9jb21taXRtZW50cxgCIAMoCzIxLnNwYXJrLlNpZ25pbmdSZXN1bHQuU2lnbmluZ05vbmNlQ29tbWl0bWVudHNFbnRyeVIXc2lnbmluZ05vbmNlQ29tbWl0bWVudHMSVAoQc2lnbmF0dXJlX3NoYXJlcxgDIAMoCzIpLnNwYXJrLlNpZ25pbmdSZXN1bHQuU2lnbmF0dXJlU2hhcmVzRW50cnlSD3NpZ25hdHVyZVNoYXJlcxJBChBzaWduaW5nX2tleXNoYXJlGAQgASgLMhYuc3BhcmsuU2lnbmluZ0tleXNoYXJlUg9zaWduaW5nS2V5c2hhcmUaPQoPUHVibGljS2V5c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEaZQocU2lnbmluZ05vbmNlQ29tbWl0bWVudHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIvCgV2YWx1ZRgCIAEoCzIZLmNvbW1vbi5TaWduaW5nQ29tbWl0bWVudFIFdmFsdWU6AjgBGkIKFFNpZ25hdHVyZVNoYXJlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEikgMKEFJlbmV3TGVhZlJlcXVlc3QSFwoHbGVhZl9pZBgBIAEoCVIGbGVhZklkEmoKH3JlbmV3X25vZGVfdGltZWxvY2tfc2lnbmluZ19qb2IYAiABKAsyIi5zcGFyay5SZW5ld05vZGVUaW1lbG9ja1NpZ25pbmdKb2JIAFIbcmVuZXdOb2RlVGltZWxvY2tTaWduaW5nSm9iEnAKIXJlbmV3X3JlZnVuZF90aW1lbG9ja19zaWduaW5nX2pvYhgDIAEoCzIkLnNwYXJrLlJlbmV3UmVmdW5kVGltZWxvY2tTaWduaW5nSm9iSABSHXJlbmV3UmVmdW5kVGltZWxvY2tTaWduaW5nSm9iEncKJHJlbmV3X25vZGVfemVyb190aW1lbG9ja19zaWduaW5nX2pvYhgEIAEoCzImLnNwYXJrLlJlbmV3Tm9kZVplcm9UaW1lbG9ja1NpZ25pbmdKb2JIAFIfcmVuZXdOb2RlWmVyb1RpbWVsb2NrU2lnbmluZ0pvYkIOCgxzaWduaW5nX2pvYnMipwUKG1JlbmV3Tm9kZVRpbWVsb2NrU2lnbmluZ0pvYhJXChlzcGxpdF9ub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIVc3BsaXROb2RlVHhTaWduaW5nSm9iEmQKIHNwbGl0X25vZGVfZGlyZWN0X3R4X3NpZ25pbmdfam9iGAIgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIbc3BsaXROb2RlRGlyZWN0VHhTaWduaW5nSm9iEkwKE25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhBub2RlVHhTaWduaW5nSm9iElAKFXJlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSEnJlZnVuZFR4U2lnbmluZ0pvYhJZChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgFIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISXQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJvCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgHIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIuoDCh1SZW5ld1JlZnVuZFRpbWVsb2NrU2lnbmluZ0pvYhJMChNub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIQbm9kZVR4U2lnbmluZ0pvYhJQChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISWQoaZGlyZWN0X25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhZkaXJlY3ROb2RlVHhTaWduaW5nSm9iEl0KHGRpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBCABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhhkaXJlY3RSZWZ1bmRUeFNpZ25pbmdKb2ISbwomZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBSABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUiBkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ0pvYiKTAwofUmVuZXdOb2RlWmVyb1RpbWVsb2NrU2lnbmluZ0pvYhJMChNub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIQbm9kZVR4U2lnbmluZ0pvYhJQChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISWQoaZGlyZWN0X25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhZkaXJlY3ROb2RlVHhTaWduaW5nSm9iEm8KJmRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAUgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIgZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25pbmdKb2JKBAgEEAUi0wIKEVJlbmV3TGVhZlJlc3BvbnNlEl0KGnJlbmV3X25vZGVfdGltZWxvY2tfcmVzdWx0GAEgASgLMh4uc3BhcmsuUmVuZXdOb2RlVGltZWxvY2tSZXN1bHRIAFIXcmVuZXdOb2RlVGltZWxvY2tSZXN1bHQSYwoccmVuZXdfcmVmdW5kX3RpbWVsb2NrX3Jlc3VsdBgCIAEoCzIgLnNwYXJrLlJlbmV3UmVmdW5kVGltZWxvY2tSZXN1bHRIAFIZcmVuZXdSZWZ1bmRUaW1lbG9ja1Jlc3VsdBJqCh9yZW5ld19ub2RlX3plcm9fdGltZWxvY2tfcmVzdWx0GAMgASgLMiIuc3BhcmsuUmVuZXdOb2RlWmVyb1RpbWVsb2NrUmVzdWx0SABSG3JlbmV3Tm9kZVplcm9UaW1lbG9ja1Jlc3VsdEIOCgxyZW5ld19yZXN1bHQibgoXUmVuZXdOb2RlVGltZWxvY2tSZXN1bHQSLgoKc3BsaXRfbm9kZRgBIAEoCzIPLnNwYXJrLlRyZWVOb2RlUglzcGxpdE5vZGUSIwoEbm9kZRgCIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgRub2RlIkAKGVJlbmV3UmVmdW5kVGltZWxvY2tSZXN1bHQSIwoEbm9kZRgBIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgRub2RlInIKG1JlbmV3Tm9kZVplcm9UaW1lbG9ja1Jlc3VsdBIuCgpzcGxpdF9ub2RlGAEgASgLMg8uc3BhcmsuVHJlZU5vZGVSCXNwbGl0Tm9kZRIjCgRub2RlGAIgASgLMg8uc3BhcmsuVHJlZU5vZGVSBG5vZGUijwQKE05vZGVTaWduYXR1cmVTaGFyZXMSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEkkKFm5vZGVfdHhfc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhNub2RlVHhTaWduaW5nUmVzdWx0Ek0KGHJlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgDIAEoCzIULnNwYXJrLlNpZ25pbmdSZXN1bHRSFXJlZnVuZFR4U2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAQgASgMUgx2ZXJpZnlpbmdLZXkSVgodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhlkaXJlY3ROb2RlVHhTaWduaW5nUmVzdWx0EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYByABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCLKAgoOTm9kZVNpZ25hdHVyZXMSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEioKEW5vZGVfdHhfc2lnbmF0dXJlGAIgASgMUg9ub2RlVHhTaWduYXR1cmUSLgoTcmVmdW5kX3R4X3NpZ25hdHVyZRgDIAEoDFIRcmVmdW5kVHhTaWduYXR1cmUSNwoYZGlyZWN0X25vZGVfdHhfc2lnbmF0dXJlGAQgASgMUhVkaXJlY3ROb2RlVHhTaWduYXR1cmUSOwoaZGlyZWN0X3JlZnVuZF90eF9zaWduYXR1cmUYBSABKAxSF2RpcmVjdFJlZnVuZFR4U2lnbmF0dXJlEk0KJGRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25hdHVyZRgGIAEoDFIfZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25hdHVyZSKKBAoYU3RhcnRUcmVlQ3JlYXRpb25SZXF1ZXN0Ei4KE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSEWlkZW50aXR5UHVibGljS2V5Ei8KDW9uX2NoYWluX3V0eG8YAiABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxJAChNyb290X3R4X3NpZ25pbmdfam9iGAMgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIQcm9vdFR4U2lnbmluZ0pvYhJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYBCABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISTQoaZGlyZWN0X3Jvb3RfdHhfc2lnbmluZ19qb2IYBSABKAsyES5zcGFyay5TaWduaW5nSm9iUhZkaXJlY3RSb290VHhTaWduaW5nSm9iElEKHGRpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBiABKAsyES5zcGFyay5TaWduaW5nSm9iUhhkaXJlY3RSZWZ1bmRUeFNpZ25pbmdKb2ISYwomZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYByABKAsyES5zcGFyay5TaWduaW5nSm9iUiBkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ0pvYiKNAQoZU3RhcnRUcmVlQ3JlYXRpb25SZXNwb25zZRIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSVwoacm9vdF9ub2RlX3NpZ25hdHVyZV9zaGFyZXMYAiABKAsyGi5zcGFyay5Ob2RlU2lnbmF0dXJlU2hhcmVzUhdyb290Tm9kZVNpZ25hdHVyZVNoYXJlcyKRBAofU3RhcnREZXBvc2l0VHJlZUNyZWF0aW9uUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIvCg1vbl9jaGFpbl91dHhvGAIgASgLMgsuc3BhcmsuVVRYT1ILb25DaGFpblV0eG8SQAoTcm9vdF90eF9zaWduaW5nX2pvYhgDIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEHJvb3RUeFNpZ25pbmdKb2ISRAoVcmVmdW5kX3R4X3NpZ25pbmdfam9iGAQgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIScmVmdW5kVHhTaWduaW5nSm9iEk0KGmRpcmVjdF9yb290X3R4X3NpZ25pbmdfam9iGAUgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIWZGlyZWN0Um9vdFR4U2lnbmluZ0pvYhJRChxkaXJlY3RfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAYgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIYZGlyZWN0UmVmdW5kVHhTaWduaW5nSm9iEmMKJmRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAcgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIgZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25pbmdKb2IilAEKIFN0YXJ0RGVwb3NpdFRyZWVDcmVhdGlvblJlc3BvbnNlEhcKB3RyZWVfaWQYASABKAlSBnRyZWVJZBJXChpyb290X25vZGVfc2lnbmF0dXJlX3NoYXJlcxgCIAEoCzIaLnNwYXJrLk5vZGVTaWduYXR1cmVTaGFyZXNSF3Jvb3ROb2RlU2lnbmF0dXJlU2hhcmVzIpsBChJUb2tlbk91dHB1dFRvU3BlbmQSRgobcHJldl90b2tlbl90cmFuc2FjdGlvbl9oYXNoGAEgASgMQgf6QgR6AmggUhhwcmV2VG9rZW5UcmFuc2FjdGlvbkhhc2gSPQobcHJldl90b2tlbl90cmFuc2FjdGlvbl92b3V0GAIgASgNUhhwcmV2VG9rZW5UcmFuc2FjdGlvblZvdXQiWQoSVG9rZW5UcmFuc2ZlcklucHV0EkMKEG91dHB1dHNfdG9fc3BlbmQYASADKAsyGS5zcGFyay5Ub2tlbk91dHB1dFRvU3BlbmRSDm91dHB1dHNUb1NwZW5kIs8BCg5Ub2tlbk1pbnRJbnB1dBIzChFpc3N1ZXJfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIPaXNzdWVyUHVibGljS2V5EjoKGWlzc3Vlcl9wcm92aWRlZF90aW1lc3RhbXAYAiABKARSF2lzc3VlclByb3ZpZGVkVGltZXN0YW1wEjcKEHRva2VuX2lkZW50aWZpZXIYAyABKAxCB/pCBHoCaCBIAFIPdG9rZW5JZGVudGlmaWVyiAEBQhMKEV90b2tlbl9pZGVudGlmaWVyIvYCChBUb2tlbkNyZWF0ZUlucHV0EjMKEWlzc3Vlcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg9pc3N1ZXJQdWJsaWNLZXkSJgoKdG9rZW5fbmFtZRgCIAEoCUIH+kIEcgIYFFIJdG9rZW5OYW1lEioKDHRva2VuX3RpY2tlchgDIAEoCUIH+kIEcgIYBlILdG9rZW5UaWNrZXISJAoIZGVjaW1hbHMYBCABKA1CCPpCBSoDGP8BUghkZWNpbWFscxImCgptYXhfc3VwcGx5GAUgASgMQgf6QgR6AmgQUgltYXhTdXBwbHkSIQoMaXNfZnJlZXphYmxlGAYgASgIUgtpc0ZyZWV6YWJsZRJJChpjcmVhdGlvbl9lbnRpdHlfcHVibGljX2tleRgHIAEoDEIH+kIEegJoIUgAUhdjcmVhdGlvbkVudGl0eVB1YmxpY0tleYgBAUIdChtfY3JlYXRpb25fZW50aXR5X3B1YmxpY19rZXkixwQKC1Rva2VuT3V0cHV0Eh0KAmlkGAEgASgJQgj6QgVyA7ABAUgAUgJpZIgBARIxChBvd25lcl9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRJBChVyZXZvY2F0aW9uX2NvbW1pdG1lbnQYAyABKAxCB/pCBHoCaCFIAVIUcmV2b2NhdGlvbkNvbW1pdG1lbnSIAQESMQoSd2l0aGRyYXdfYm9uZF9zYXRzGAQgASgESAJSEHdpdGhkcmF3Qm9uZFNhdHOIAQESTAogd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWUYBSABKARIA1Idd2l0aGRyYXdSZWxhdGl2ZUJsb2NrTG9ja3RpbWWIAQESNgoQdG9rZW5fcHVibGljX2tleRgGIAEoDEIH+kIEegJoIUgEUg50b2tlblB1YmxpY0tleYgBARI3ChB0b2tlbl9pZGVudGlmaWVyGAggASgMQgf6QgR6AmggSAVSD3Rva2VuSWRlbnRpZmllcogBARIqCgx0b2tlbl9hbW91bnQYByABKAxCB/pCBHoCaBBSC3Rva2VuQW1vdW50QgUKA19pZEIYChZfcmV2b2NhdGlvbl9jb21taXRtZW50QhUKE193aXRoZHJhd19ib25kX3NhdHNCIwohX3dpdGhkcmF3X3JlbGF0aXZlX2Jsb2NrX2xvY2t0aW1lQhMKEV90b2tlbl9wdWJsaWNfa2V5QhMKEV90b2tlbl9pZGVudGlmaWVyIqUDChBUb2tlblRyYW5zYWN0aW9uEjYKCm1pbnRfaW5wdXQYASABKAsyFS5zcGFyay5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSQgoOdHJhbnNmZXJfaW5wdXQYAiABKAsyGS5zcGFyay5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBI8CgxjcmVhdGVfaW5wdXQYBSABKAsyFy5zcGFyay5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0EjcKDXRva2VuX291dHB1dHMYAyADKAsyEi5zcGFyay5Ub2tlbk91dHB1dFIMdG9rZW5PdXRwdXRzEloKI3NwYXJrX29wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXlzGAQgAygMQgz6QgmSAQYiBHoCaCFSH3NwYXJrT3BlcmF0b3JJZGVudGl0eVB1YmxpY0tleXMSMgoHbmV0d29yaxgKIAEoDjIOLnNwYXJrLk5ldHdvcmtCCPpCBYIBAiAAUgduZXR3b3JrQg4KDHRva2VuX2lucHV0cyJeChJTaWduYXR1cmVXaXRoSW5kZXgSJwoJc2lnbmF0dXJlGAEgASgMQgn6QgZ6BBBAGElSCXNpZ25hdHVyZRIfCgtpbnB1dF9pbmRleBgCIAEoDVIKaW5wdXRJbmRleCLFAQovT3BlcmF0b3JTcGVjaWZpY1Rva2VuVHJhbnNhY3Rpb25TaWduYWJsZVBheWxvYWQSSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgBIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaBJIChxvcGVyYXRvcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUhlvcGVyYXRvcklkZW50aXR5UHVibGljS2V5IrYBCh5PcGVyYXRvclNwZWNpZmljT3duZXJTaWduYXR1cmUSQgoPb3duZXJfc2lnbmF0dXJlGAEgASgLMhkuc3BhcmsuU2lnbmF0dXJlV2l0aEluZGV4Ug5vd25lclNpZ25hdHVyZRJQCgdwYXlsb2FkGAIgASgLMjYuc3BhcmsuT3BlcmF0b3JTcGVjaWZpY1Rva2VuVHJhbnNhY3Rpb25TaWduYWJsZVBheWxvYWRSB3BheWxvYWQicgoZUmV2b2NhdGlvblNlY3JldFdpdGhJbmRleBIfCgtpbnB1dF9pbmRleBgBIAEoDVIKaW5wdXRJbmRleBI0ChFyZXZvY2F0aW9uX3NlY3JldBgCIAEoDEIH+kIEegJoIFIQcmV2b2NhdGlvblNlY3JldCL4AgoTRnJlZXplVG9rZW5zUGF5bG9hZBIxChBvd25lcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRIxChB0b2tlbl9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUg50b2tlblB1YmxpY0tleRI6Chlpc3N1ZXJfcHJvdmlkZWRfdGltZXN0YW1wGAMgASgEUhdpc3N1ZXJQcm92aWRlZFRpbWVzdGFtcBJIChxvcGVyYXRvcl9pZGVudGl0eV9wdWJsaWNfa2V5GAQgASgMQgf6QgR6AmghUhlvcGVyYXRvcklkZW50aXR5UHVibGljS2V5EicKD3Nob3VsZF91bmZyZWV6ZRgFIAEoCFIOc2hvdWxkVW5mcmVlemUSNwoQdG9rZW5faWRlbnRpZmllchgGIAEoDEIH+kIEegJoIEgAUg90b2tlbklkZW50aWZpZXKIAQFCEwoRX3Rva2VuX2lkZW50aWZpZXIimwEKE0ZyZWV6ZVRva2Vuc1JlcXVlc3QSTgoVZnJlZXplX3Rva2Vuc19wYXlsb2FkGAEgASgLMhouc3BhcmsuRnJlZXplVG9rZW5zUGF5bG9hZFITZnJlZXplVG9rZW5zUGF5bG9hZBI0ChBpc3N1ZXJfc2lnbmF0dXJlGAIgASgMQgn6QgZ6BBBAGElSD2lzc3VlclNpZ25hdHVyZSKJAQoURnJlZXplVG9rZW5zUmVzcG9uc2USPQoTaW1wYWN0ZWRfb3V0cHV0X2lkcxgBIAMoCUIN+kIKkgEHIgVyA7ABAVIRaW1wYWN0ZWRPdXRwdXRJZHMSMgoVaW1wYWN0ZWRfdG9rZW5fYW1vdW50GAIgASgMUhNpbXBhY3RlZFRva2VuQW1vdW50Iv0FCghUcmVlTm9kZRIOCgJpZBgBIAEoCVICaWQSFwoHdHJlZV9pZBgCIAEoCVIGdHJlZUlkEhQKBXZhbHVlGAMgASgEUgV2YWx1ZRIpCg5wYXJlbnRfbm9kZV9pZBgEIAEoCUgAUgxwYXJlbnROb2RlSWSIAQESFwoHbm9kZV90eBgFIAEoDFIGbm9kZVR4EhsKCXJlZnVuZF90eBgGIAEoDFIIcmVmdW5kVHgSEgoEdm91dBgHIAEoDVIEdm91dBIwChR2ZXJpZnlpbmdfcHVibGljX2tleRgIIAEoDFISdmVyaWZ5aW5nUHVibGljS2V5EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYCSABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQQoQc2lnbmluZ19rZXlzaGFyZRgKIAEoCzIWLnNwYXJrLlNpZ25pbmdLZXlzaGFyZVIPc2lnbmluZ0tleXNoYXJlEhYKBnN0YXR1cxgLIAEoCVIGc3RhdHVzEigKB25ldHdvcmsYDCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEj0KDGNyZWF0ZWRfdGltZRgNIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSC2NyZWF0ZWRUaW1lEj0KDHVwZGF0ZWRfdGltZRgOIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSC3VwZGF0ZWRUaW1lEjcKGG93bmVyX3NpZ25pbmdfcHVibGljX2tleRgPIAEoDFIVb3duZXJTaWduaW5nUHVibGljS2V5EhsKCWRpcmVjdF90eBgQIAEoDFIIZGlyZWN0VHgSKAoQZGlyZWN0X3JlZnVuZF90eBgRIAEoDFIOZGlyZWN0UmVmdW5kVHgSOgoaZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHgYEiABKAxSFmRpcmVjdEZyb21DcGZwUmVmdW5kVHhCEQoPX3BhcmVudF9ub2RlX2lkIpABCh1GaW5hbGl6ZU5vZGVTaWduYXR1cmVzUmVxdWVzdBIvCgZpbnRlbnQYASABKA4yFy5jb21tb24uU2lnbmF0dXJlSW50ZW50UgZpbnRlbnQSPgoPbm9kZV9zaWduYXR1cmVzGAIgAygLMhUuc3BhcmsuTm9kZVNpZ25hdHVyZXNSDm5vZGVTaWduYXR1cmVzIkcKHkZpbmFsaXplTm9kZVNpZ25hdHVyZXNSZXNwb25zZRIlCgVub2RlcxgBIAMoCzIPLnNwYXJrLlRyZWVOb2RlUgVub2RlcyJICgtTZWNyZXRTaGFyZRIhCgxzZWNyZXRfc2hhcmUYASABKAxSC3NlY3JldFNoYXJlEhYKBnByb29mcxgCIAMoDFIGcHJvb2ZzIiUKC1NlY3JldFByb29mEhYKBnByb29mcxgBIAMoDFIGcHJvb2ZzIq8CChZMZWFmUmVmdW5kVHhTaWduaW5nSm9iEhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgDIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIr4CChZVc2VyU2lnbmVkVHhTaWduaW5nSm9iEhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBIsChJzaWduaW5nX3B1YmxpY19rZXkYAiABKAxSEHNpZ25pbmdQdWJsaWNLZXkSFQoGcmF3X3R4GAMgASgMUgVyYXdUeBJTChhzaWduaW5nX25vbmNlX2NvbW1pdG1lbnQYBCABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSFnNpZ25pbmdOb25jZUNvbW1pdG1lbnQSJQoOdXNlcl9zaWduYXR1cmUYBSABKAxSDXVzZXJTaWduYXR1cmUSSgoTc2lnbmluZ19jb21taXRtZW50cxgGIAEoCzIZLnNwYXJrLlNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzIvICChlMZWFmUmVmdW5kVHhTaWduaW5nUmVzdWx0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSIwoNdmVyaWZ5aW5nX2tleRgDIAEoDFIMdmVyaWZ5aW5nS2V5EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBCABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCL1AwoeU3RhcnRVc2VyU2lnbmVkVHJhbnNmZXJSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQwoObGVhdmVzX3RvX3NlbmQYAyADKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUgxsZWF2ZXNUb1NlbmQSPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgEIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRI7CgtleHBpcnlfdGltZRgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSCmV4cGlyeVRpbWUSUAoVZGlyZWN0X2xlYXZlc190b19zZW5kGAYgAygLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlISZGlyZWN0TGVhdmVzVG9TZW5kEmIKH2RpcmVjdF9mcm9tX2NwZnBfbGVhdmVzX3RvX3NlbmQYByADKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhpkaXJlY3RGcm9tQ3BmcExlYXZlc1RvU2VuZCKpAwoUU3RhcnRUcmFuc2ZlclJlcXVlc3QSHwoLdHJhbnNmZXJfaWQYASABKAlSCnRyYW5zZmVySWQSOQoZb3duZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDFIWb3duZXJJZGVudGl0eVB1YmxpY0tleRJDCg5sZWF2ZXNfdG9fc2VuZBgDIAMoCzIdLnNwYXJrLkxlYWZSZWZ1bmRUeFNpZ25pbmdKb2JSDGxlYXZlc1RvU2VuZBI/ChxyZWNlaXZlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAQgASgMUhlyZWNlaXZlcklkZW50aXR5UHVibGljS2V5EjsKC2V4cGlyeV90aW1lGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIKZXhwaXJ5VGltZRJBChB0cmFuc2Zlcl9wYWNrYWdlGAcgASgLMhYuc3BhcmsuVHJhbnNmZXJQYWNrYWdlUg90cmFuc2ZlclBhY2thZ2USIwoNc3BhcmtfaW52b2ljZRgKIAEoCVIMc3BhcmtJbnZvaWNlSgQIBhAHSgQICRAKIo8BChVTdGFydFRyYW5zZmVyUmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXISSQoPc2lnbmluZ19yZXN1bHRzGAIgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi0AMKD1RyYW5zZmVyUGFja2FnZRJDCg5sZWF2ZXNfdG9fc2VuZBgBIAMoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSDGxlYXZlc1RvU2VuZBJXChFrZXlfdHdlYWtfcGFja2FnZRgCIAMoCzIrLnNwYXJrLlRyYW5zZmVyUGFja2FnZS5LZXlUd2Vha1BhY2thZ2VFbnRyeVIPa2V5VHdlYWtQYWNrYWdlEiUKDnVzZXJfc2lnbmF0dXJlGAMgASgMUg11c2VyU2lnbmF0dXJlElAKFWRpcmVjdF9sZWF2ZXNfdG9fc2VuZBgEIAMoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSEmRpcmVjdExlYXZlc1RvU2VuZBJiCh9kaXJlY3RfZnJvbV9jcGZwX2xlYXZlc190b19zZW5kGAUgAygLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIaZGlyZWN0RnJvbUNwZnBMZWF2ZXNUb1NlbmQaQgoUS2V5VHdlYWtQYWNrYWdlRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAxSBXZhbHVlOgI4ASJSChFTZW5kTGVhZktleVR3ZWFrcxI9Cg5sZWF2ZXNfdG9fc2VuZBgBIAMoCzIXLnNwYXJrLlNlbmRMZWFmS2V5VHdlYWtSDGxlYXZlc1RvU2VuZCKDBAoQU2VuZExlYWZLZXlUd2VhaxIXCgdsZWFmX2lkGAEgASgJUgZsZWFmSWQSQAoSc2VjcmV0X3NoYXJlX3R3ZWFrGAIgASgLMhIuc3BhcmsuU2VjcmV0U2hhcmVSEHNlY3JldFNoYXJlVHdlYWsSXgoTcHVia2V5X3NoYXJlc190d2VhaxgDIAMoCzIuLnNwYXJrLlNlbmRMZWFmS2V5VHdlYWsuUHVia2V5U2hhcmVzVHdlYWtFbnRyeVIRcHVia2V5U2hhcmVzVHdlYWsSIwoNc2VjcmV0X2NpcGhlchgEIAEoDFIMc2VjcmV0Q2lwaGVyEhwKCXNpZ25hdHVyZRgFIAEoDFIJc2lnbmF0dXJlEikKEHJlZnVuZF9zaWduYXR1cmUYBiABKAxSD3JlZnVuZFNpZ25hdHVyZRI2ChdkaXJlY3RfcmVmdW5kX3NpZ25hdHVyZRgHIAEoDFIVZGlyZWN0UmVmdW5kU2lnbmF0dXJlEkgKIWRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3NpZ25hdHVyZRgIIAEoDFIdZGlyZWN0RnJvbUNwZnBSZWZ1bmRTaWduYXR1cmUaRAoWUHVia2V5U2hhcmVzVHdlYWtFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoDFIFdmFsdWU6AjgBIuYBChdGaW5hbGl6ZVRyYW5zZmVyUmVxdWVzdBIfCgt0cmFuc2Zlcl9pZBgBIAEoCVIKdHJhbnNmZXJJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5Ej0KDmxlYXZlc190b19zZW5kGAMgAygLMhcuc3BhcmsuU2VuZExlYWZLZXlUd2Vha1IMbGVhdmVzVG9TZW5kEjAKFHNwYXJrX3BheW1lbnRfaW50ZW50GAQgASgJUhJzcGFya1BheW1lbnRJbnRlbnQiywEKKkZpbmFsaXplVHJhbnNmZXJXaXRoVHJhbnNmZXJQYWNrYWdlUmVxdWVzdBIfCgt0cmFuc2Zlcl9pZBgBIAEoCVIKdHJhbnNmZXJJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EkEKEHRyYW5zZmVyX3BhY2thZ2UYAyABKAsyFi5zcGFyay5UcmFuc2ZlclBhY2thZ2VSD3RyYW5zZmVyUGFja2FnZSJHChhGaW5hbGl6ZVRyYW5zZmVyUmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXIiyAQKCFRyYW5zZmVyEg4KAmlkGAEgASgJUgJpZBI7ChpzZW5kZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDFIXc2VuZGVySWRlbnRpdHlQdWJsaWNLZXkSPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgDIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRItCgZzdGF0dXMYBCABKA4yFS5zcGFyay5UcmFuc2ZlclN0YXR1c1IGc3RhdHVzEh8KC3RvdGFsX3ZhbHVlGAUgASgEUgp0b3RhbFZhbHVlEjsKC2V4cGlyeV90aW1lGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIKZXhwaXJ5VGltZRIrCgZsZWF2ZXMYByADKAsyEy5zcGFyay5UcmFuc2ZlckxlYWZSBmxlYXZlcxI9CgxjcmVhdGVkX3RpbWUYCCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgtjcmVhdGVkVGltZRI9Cgx1cGRhdGVkX3RpbWUYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgt1cGRhdGVkVGltZRInCgR0eXBlGAogASgOMhMuc3BhcmsuVHJhbnNmZXJUeXBlUgR0eXBlEiMKDXNwYXJrX2ludm9pY2UYCyABKAlSDHNwYXJrSW52b2ljZRIoCgduZXR3b3JrGAwgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yayKEAwoMVHJhbnNmZXJMZWFmEiMKBGxlYWYYASABKAsyDy5zcGFyay5UcmVlTm9kZVIEbGVhZhIjCg1zZWNyZXRfY2lwaGVyGAIgASgMUgxzZWNyZXRDaXBoZXISHAoJc2lnbmF0dXJlGAMgASgMUglzaWduYXR1cmUSNAoWaW50ZXJtZWRpYXRlX3JlZnVuZF90eBgEIAEoDFIUaW50ZXJtZWRpYXRlUmVmdW5kVHgSQQodaW50ZXJtZWRpYXRlX2RpcmVjdF9yZWZ1bmRfdHgYBSABKAxSGmludGVybWVkaWF0ZURpcmVjdFJlZnVuZFR4ElMKJ2ludGVybWVkaWF0ZV9kaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eBgGIAEoDFIiaW50ZXJtZWRpYXRlRGlyZWN0RnJvbUNwZnBSZWZ1bmRUeBI+ChxwZW5kaW5nX2tleV90d2Vha19wdWJsaWNfa2V5GAcgASgMUhhwZW5kaW5nS2V5VHdlYWtQdWJsaWNLZXki8wMKDlRyYW5zZmVyRmlsdGVyEkEKHHJlY2VpdmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxIAFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRI9ChpzZW5kZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDEgAUhdzZW5kZXJJZGVudGl0eVB1YmxpY0tleRJTCiZzZW5kZXJfb3JfcmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRg8IAEoDEgAUiFzZW5kZXJPclJlY2VpdmVySWRlbnRpdHlQdWJsaWNLZXkSIQoMdHJhbnNmZXJfaWRzGAMgAygJUgt0cmFuc2ZlcklkcxIUCgVsaW1pdBgoIAEoA1IFbGltaXQSFgoGb2Zmc2V0GDIgASgDUgZvZmZzZXQSKQoFdHlwZXMYRiADKA4yEy5zcGFyay5UcmFuc2ZlclR5cGVSBXR5cGVzEigKB25ldHdvcmsYBCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEjEKCHN0YXR1c2VzGFAgAygOMhUuc3BhcmsuVHJhbnNmZXJTdGF0dXNSCHN0YXR1c2VzEiIKBW9yZGVyGAUgASgOMgwuc3BhcmsuT3JkZXJSBW9yZGVyQg0KC3BhcnRpY2lwYW50Il8KFlF1ZXJ5VHJhbnNmZXJzUmVzcG9uc2USLQoJdHJhbnNmZXJzGAEgAygLMg8uc3BhcmsuVHJhbnNmZXJSCXRyYW5zZmVycxIWCgZvZmZzZXQYAiABKANSBm9mZnNldCKVAgoRQ2xhaW1MZWFmS2V5VHdlYWsSFwoHbGVhZl9pZBgBIAEoCVIGbGVhZklkEkAKEnNlY3JldF9zaGFyZV90d2VhaxgCIAEoCzISLnNwYXJrLlNlY3JldFNoYXJlUhBzZWNyZXRTaGFyZVR3ZWFrEl8KE3B1YmtleV9zaGFyZXNfdHdlYWsYAyADKAsyLy5zcGFyay5DbGFpbUxlYWZLZXlUd2Vhay5QdWJrZXlTaGFyZXNUd2Vha0VudHJ5UhFwdWJrZXlTaGFyZXNUd2VhaxpEChZQdWJrZXlTaGFyZXNUd2Vha0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEiwQEKHUNsYWltVHJhbnNmZXJUd2Vha0tleXNSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSRAoRbGVhdmVzX3RvX3JlY2VpdmUYAyADKAsyGC5zcGFyay5DbGFpbUxlYWZLZXlUd2Vha1IPbGVhdmVzVG9SZWNlaXZlIsUBCh9DbGFpbVRyYW5zZmVyU2lnblJlZnVuZHNSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQAoMc2lnbmluZ19qb2JzGAMgAygLMh0uc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ0pvYlILc2lnbmluZ0pvYnNKBAgEEAUibQogQ2xhaW1UcmFuc2ZlclNpZ25SZWZ1bmRzUmVzcG9uc2USSQoPc2lnbmluZ19yZXN1bHRzGAEgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi9wEKGVN0b3JlUHJlaW1hZ2VTaGFyZVJlcXVlc3QSIQoMcGF5bWVudF9oYXNoGAEgASgMUgtwYXltZW50SGFzaBI5Cg5wcmVpbWFnZV9zaGFyZRgCIAEoCzISLnNwYXJrLlNlY3JldFNoYXJlUg1wcmVpbWFnZVNoYXJlEhwKCXRocmVzaG9sZBgDIAEoDVIJdGhyZXNob2xkEiUKDmludm9pY2Vfc3RyaW5nGAQgASgJUg1pbnZvaWNlU3RyaW5nEjcKGHVzZXJfaWRlbnRpdHlfcHVibGljX2tleRgFIAEoDFIVdXNlcklkZW50aXR5UHVibGljS2V5IoECChtSZXF1ZXN0ZWRTaWduaW5nQ29tbWl0bWVudHMSewoZc2lnbmluZ19ub25jZV9jb21taXRtZW50cxgBIAMoCzI/LnNwYXJrLlJlcXVlc3RlZFNpZ25pbmdDb21taXRtZW50cy5TaWduaW5nTm9uY2VDb21taXRtZW50c0VudHJ5UhdzaWduaW5nTm9uY2VDb21taXRtZW50cxplChxTaWduaW5nTm9uY2VDb21taXRtZW50c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ei8KBXZhbHVlGAIgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UgV2YWx1ZToCOAEiTwocR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVxdWVzdBIZCghub2RlX2lkcxgBIAMoCVIHbm9kZUlkcxIUCgVjb3VudBgCIAEoDVIFY291bnQidAodR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVzcG9uc2USUwoTc2lnbmluZ19jb21taXRtZW50cxgBIAMoCzIiLnNwYXJrLlJlcXVlc3RlZFNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzItoBChJTaWduaW5nQ29tbWl0bWVudHMSYgoTc2lnbmluZ19jb21taXRtZW50cxgBIAMoCzIxLnNwYXJrLlNpZ25pbmdDb21taXRtZW50cy5TaWduaW5nQ29tbWl0bWVudHNFbnRyeVISc2lnbmluZ0NvbW1pdG1lbnRzGmAKF1NpZ25pbmdDb21taXRtZW50c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ei8KBXZhbHVlGAIgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UgV2YWx1ZToCOAEixgIKEFVzZXJTaWduZWRSZWZ1bmQSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEhsKCXJlZnVuZF90eBgCIAEoDFIIcmVmdW5kVHgSJQoOdXNlcl9zaWduYXR1cmUYAyABKAxSDXVzZXJTaWduYXR1cmUSSgoTc2lnbmluZ19jb21taXRtZW50cxgEIAEoCzIZLnNwYXJrLlNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzElUKGXVzZXJfc2lnbmF0dXJlX2NvbW1pdG1lbnQYBSABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSF3VzZXJTaWduYXR1cmVDb21taXRtZW50EjIKB25ldHdvcmsYBiABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yayI7ChJJbnZvaWNlQW1vdW50UHJvb2YSJQoOYm9sdDExX2ludm9pY2UYASABKAlSDWJvbHQxMUludm9pY2UiewoNSW52b2ljZUFtb3VudBIdCgp2YWx1ZV9zYXRzGAEgASgEUgl2YWx1ZVNhdHMSSwoUaW52b2ljZV9hbW91bnRfcHJvb2YYAiABKAsyGS5zcGFyay5JbnZvaWNlQW1vdW50UHJvb2ZSEmludm9pY2VBbW91bnRQcm9vZiLWAwobSW5pdGlhdGVQcmVpbWFnZVN3YXBSZXF1ZXN0EiEKDHBheW1lbnRfaGFzaBgBIAEoDFILcGF5bWVudEhhc2gSOwoOaW52b2ljZV9hbW91bnQYAiABKAsyFC5zcGFyay5JbnZvaWNlQW1vdW50Ug1pbnZvaWNlQW1vdW50EkEKBnJlYXNvbhgDIAEoDjIpLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVxdWVzdC5SZWFzb25SBnJlYXNvbhJBCgh0cmFuc2ZlchgEIAEoCzIlLnNwYXJrLlN0YXJ0VXNlclNpZ25lZFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgFIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRIZCghmZWVfc2F0cxgGIAEoBFIHZmVlU2F0cxJGChB0cmFuc2Zlcl9yZXF1ZXN0GAcgASgLMhsuc3BhcmsuU3RhcnRUcmFuc2ZlclJlcXVlc3RSD3RyYW5zZmVyUmVxdWVzdCItCgZSZWFzb24SDwoLUkVBU09OX1NFTkQQABISCg5SRUFTT05fUkVDRUlWRRABImcKHEluaXRpYXRlUHJlaW1hZ2VTd2FwUmVzcG9uc2USGgoIcHJlaW1hZ2UYASABKAxSCHByZWltYWdlEisKCHRyYW5zZmVyGAIgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIjIKCE91dFBvaW50EhIKBHR4aWQYASABKAxSBHR4aWQSEgoEdm91dBgCIAEoDVIEdm91dCKHAQoWQ29vcGVyYXRpdmVFeGl0UmVxdWVzdBI3Cgh0cmFuc2ZlchgBIAEoCzIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ugh0cmFuc2ZlchIXCgdleGl0X2lkGAIgASgJUgZleGl0SWQSGwoJZXhpdF90eGlkGAMgASgMUghleGl0VHhpZCKRAQoXQ29vcGVyYXRpdmVFeGl0UmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXISSQoPc2lnbmluZ19yZXN1bHRzGAIgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMioAIKFkNvdW50ZXJMZWFmU3dhcFJlcXVlc3QSNwoIdHJhbnNmZXIYASABKAsyGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISFwoHc3dhcF9pZBgCIAEoCVIGc3dhcElkEiwKEmFkYXB0b3JfcHVibGljX2tleRgDIAEoDFIQYWRhcHRvclB1YmxpY0tleRI5ChlkaXJlY3RfYWRhcHRvcl9wdWJsaWNfa2V5GAQgASgMUhZkaXJlY3RBZGFwdG9yUHVibGljS2V5EksKI2RpcmVjdF9mcm9tX2NwZnBfYWRhcHRvcl9wdWJsaWNfa2V5GAUgASgMUh5kaXJlY3RGcm9tQ3BmcEFkYXB0b3JQdWJsaWNLZXkikQEKF0NvdW50ZXJMZWFmU3dhcFJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyEkkKD3NpZ25pbmdfcmVzdWx0cxgCIAMoCzIgLnNwYXJrLkxlYWZSZWZ1bmRUeFNpZ25pbmdSZXN1bHRSDnNpZ25pbmdSZXN1bHRzIqIBChZSZWZyZXNoVGltZWxvY2tSZXF1ZXN0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EjQKDHNpZ25pbmdfam9icxgDIAMoCzIRLnNwYXJrLlNpZ25pbmdKb2JSC3NpZ25pbmdKb2JzIoABChxSZWZyZXNoVGltZWxvY2tTaWduaW5nUmVzdWx0EjsKDnNpZ25pbmdfcmVzdWx0GAEgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFINc2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAIgASgMUgx2ZXJpZnlpbmdLZXkiZwoXUmVmcmVzaFRpbWVsb2NrUmVzcG9uc2USTAoPc2lnbmluZ19yZXN1bHRzGAEgAygLMiMuc3BhcmsuUmVmcmVzaFRpbWVsb2NrU2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi9gMKEUV4dGVuZExlYWZSZXF1ZXN0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EkAKE25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyES5zcGFyay5TaWduaW5nSm9iUhBub2RlVHhTaWduaW5nSm9iEkQKFXJlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEnJlZnVuZFR4U2lnbmluZ0pvYhJNChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgFIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgHIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iInsKF0V4dGVuZExlYWZTaWduaW5nUmVzdWx0EjsKDnNpZ25pbmdfcmVzdWx0GAEgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFINc2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAIgASgMUgx2ZXJpZnlpbmdLZXkimwQKEkV4dGVuZExlYWZSZXNwb25zZRIXCgdsZWFmX2lkGAEgASgJUgZsZWFmSWQSUwoWbm9kZV90eF9zaWduaW5nX3Jlc3VsdBgCIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UhNub2RlVHhTaWduaW5nUmVzdWx0ElcKGHJlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgDIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSYAodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBCABKAsyHi5zcGFyay5FeHRlbmRMZWFmU2lnbmluZ1Jlc3VsdFIZZGlyZWN0Tm9kZVR4U2lnbmluZ1Jlc3VsdBJkCh9kaXJlY3RfcmVmdW5kX3R4X3NpZ25pbmdfcmVzdWx0GAUgASgLMh4uc3BhcmsuRXh0ZW5kTGVhZlNpZ25pbmdSZXN1bHRSG2RpcmVjdFJlZnVuZFR4U2lnbmluZ1Jlc3VsdBJ2CilkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgGIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCJzChJBZGRyZXNzUmVxdWVzdE5vZGUSJgoPdXNlcl9wdWJsaWNfa2V5GAEgASgMUg11c2VyUHVibGljS2V5EjUKCGNoaWxkcmVuGAIgAygLMhkuc3BhcmsuQWRkcmVzc1JlcXVlc3ROb2RlUghjaGlsZHJlbiKDAgoZUHJlcGFyZVRyZWVBZGRyZXNzUmVxdWVzdBJBChJwYXJlbnRfbm9kZV9vdXRwdXQYASABKAsyES5zcGFyay5Ob2RlT3V0cHV0SABSEHBhcmVudE5vZGVPdXRwdXQSMQoNb25fY2hhaW5fdXR4bxgCIAEoCzILLnNwYXJrLlVUWE9IAFILb25DaGFpblV0eG8SLQoEbm9kZRgDIAEoCzIZLnNwYXJrLkFkZHJlc3NSZXF1ZXN0Tm9kZVIEbm9kZRI3Chh1c2VyX2lkZW50aXR5X3B1YmxpY19rZXkYBCABKAxSFXVzZXJJZGVudGl0eVB1YmxpY0tleUIICgZzb3VyY2UiZwoLQWRkcmVzc05vZGUSKAoHYWRkcmVzcxgBIAEoCzIOLnNwYXJrLkFkZHJlc3NSB2FkZHJlc3MSLgoIY2hpbGRyZW4YAiADKAsyEi5zcGFyay5BZGRyZXNzTm9kZVIIY2hpbGRyZW4iRAoaUHJlcGFyZVRyZWVBZGRyZXNzUmVzcG9uc2USJgoEbm9kZRgBIAEoCzISLnNwYXJrLkFkZHJlc3NOb2RlUgRub2RlIs4DCgxDcmVhdGlvbk5vZGUSQAoTbm9kZV90eF9zaWduaW5nX2pvYhgBIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEG5vZGVUeFNpZ25pbmdKb2ISRAoVcmVmdW5kX3R4X3NpZ25pbmdfam9iGAIgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIScmVmdW5kVHhTaWduaW5nSm9iEi8KCGNoaWxkcmVuGAMgAygLMhMuc3BhcmsuQ3JlYXRpb25Ob2RlUghjaGlsZHJlbhJNChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgFIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIvUBChFDcmVhdGVUcmVlUmVxdWVzdBJBChJwYXJlbnRfbm9kZV9vdXRwdXQYASABKAsyES5zcGFyay5Ob2RlT3V0cHV0SABSEHBhcmVudE5vZGVPdXRwdXQSMQoNb25fY2hhaW5fdXR4bxgCIAEoCzILLnNwYXJrLlVUWE9IAFILb25DaGFpblV0eG8SJwoEbm9kZRgDIAEoCzITLnNwYXJrLkNyZWF0aW9uTm9kZVIEbm9kZRI3Chh1c2VyX2lkZW50aXR5X3B1YmxpY19rZXkYBCABKAxSFXVzZXJJZGVudGl0eVB1YmxpY0tleUIICgZzb3VyY2UipAQKFENyZWF0aW9uUmVzcG9uc2VOb2RlEhcKB25vZGVfaWQYASABKAlSBm5vZGVJZBJJChZub2RlX3R4X3NpZ25pbmdfcmVzdWx0GAIgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFITbm9kZVR4U2lnbmluZ1Jlc3VsdBJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYAyABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSNwoIY2hpbGRyZW4YBCADKAsyGy5zcGFyay5DcmVhdGlvblJlc3BvbnNlTm9kZVIIY2hpbGRyZW4SVgodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhlkaXJlY3ROb2RlVHhTaWduaW5nUmVzdWx0EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYByABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCJFChJDcmVhdGVUcmVlUmVzcG9uc2USLwoEbm9kZRgBIAEoCzIbLnNwYXJrLkNyZWF0aW9uUmVzcG9uc2VOb2RlUgRub2RlIoQBChNTaWduaW5nT3BlcmF0b3JJbmZvEhQKBWluZGV4GAEgASgEUgVpbmRleBIeCgppZGVudGlmaWVyGAIgASgJUgppZGVudGlmaWVyEh0KCnB1YmxpY19rZXkYAyABKAxSCXB1YmxpY0tleRIYCgdhZGRyZXNzGAQgASgJUgdhZGRyZXNzIusBCh5HZXRTaWduaW5nT3BlcmF0b3JMaXN0UmVzcG9uc2USaAoRc2lnbmluZ19vcGVyYXRvcnMYASADKAsyOy5zcGFyay5HZXRTaWduaW5nT3BlcmF0b3JMaXN0UmVzcG9uc2UuU2lnbmluZ09wZXJhdG9yc0VudHJ5UhBzaWduaW5nT3BlcmF0b3JzGl8KFVNpZ25pbmdPcGVyYXRvcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIwCgV2YWx1ZRgCIAEoCzIaLnNwYXJrLlNpZ25pbmdPcGVyYXRvckluZm9SBXZhbHVlOgI4ASJyCh1RdWVyeVVzZXJTaWduZWRSZWZ1bmRzUmVxdWVzdBIhCgxwYXltZW50X2hhc2gYASABKAxSC3BheW1lbnRIYXNoEi4KE2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSEWlkZW50aXR5UHVibGljS2V5IpwBCh5RdWVyeVVzZXJTaWduZWRSZWZ1bmRzUmVzcG9uc2USRwoTdXNlcl9zaWduZWRfcmVmdW5kcxgBIAMoCzIXLnNwYXJrLlVzZXJTaWduZWRSZWZ1bmRSEXVzZXJTaWduZWRSZWZ1bmRzEisKCHRyYW5zZmVyGAMgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVySgQIAhADIqQDChtQcmVpbWFnZVJlcXVlc3RXaXRoVHJhbnNmZXISKgoMcGF5bWVudF9oYXNoGAEgASgMQgf6QgR6AmggUgtwYXltZW50SGFzaBJBChhyZWNlaXZlcl9pZGVudGl0eV9wdWJrZXkYAiABKAxCB/pCBHoCaCFSFnJlY2VpdmVySWRlbnRpdHlQdWJrZXkSNAoGc3RhdHVzGAMgASgOMhwuc3BhcmsuUHJlaW1hZ2VSZXF1ZXN0U3RhdHVzUgZzdGF0dXMSPQoMY3JlYXRlZF90aW1lGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFILY3JlYXRlZFRpbWUSMAoIdHJhbnNmZXIYBSABKAsyDy5zcGFyay5UcmFuc2ZlckgAUgh0cmFuc2ZlcogBARIfCghwcmVpbWFnZRgGIAEoDEgBUghwcmVpbWFnZYgBARI0ChZzZW5kZXJfaWRlbnRpdHlfcHVia2V5GAcgASgMUhRzZW5kZXJJZGVudGl0eVB1YmtleUILCglfdHJhbnNmZXJCCwoJX3ByZWltYWdlIsQCChBRdWVyeUh0bGNSZXF1ZXN0EiUKDnBheW1lbnRfaGFzaGVzGAEgAygMUg1wYXltZW50SGFzaGVzEjcKE2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSEWlkZW50aXR5UHVibGljS2V5EjkKBnN0YXR1cxgDIAEoDjIcLnNwYXJrLlByZWltYWdlUmVxdWVzdFN0YXR1c0gAUgZzdGF0dXOIAQESFAoFbGltaXQYBCABKANSBWxpbWl0EhYKBm9mZnNldBgFIAEoA1IGb2Zmc2V0EiEKDHRyYW5zZmVyX2lkcxgGIAMoCVILdHJhbnNmZXJJZHMSOQoKbWF0Y2hfcm9sZRgHIAEoDjIaLnNwYXJrLlByZWltYWdlUmVxdWVzdFJvbGVSCW1hdGNoUm9sZUIJCgdfc3RhdHVzInwKEVF1ZXJ5SHRsY1Jlc3BvbnNlEk8KEXByZWltYWdlX3JlcXVlc3RzGAEgAygLMiIuc3BhcmsuUHJlaW1hZ2VSZXF1ZXN0V2l0aFRyYW5zZmVyUhBwcmVpbWFnZVJlcXVlc3RzEhYKBm9mZnNldBgCIAEoA1IGb2Zmc2V0IocBChZQcm92aWRlUHJlaW1hZ2VSZXF1ZXN0EiEKDHBheW1lbnRfaGFzaBgBIAEoDFILcGF5bWVudEhhc2gSGgoIcHJlaW1hZ2UYAiABKAxSCHByZWltYWdlEi4KE2lkZW50aXR5X3B1YmxpY19rZXkYAyABKAxSEWlkZW50aXR5UHVibGljS2V5IkYKF1Byb3ZpZGVQcmVpbWFnZVJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIigKC1RyZWVOb2RlSWRzEhkKCG5vZGVfaWRzGAEgAygJUgdub2RlSWRzIrgCChFRdWVyeU5vZGVzUmVxdWVzdBI0ChVvd25lcl9pZGVudGl0eV9wdWJrZXkYASABKAxIAFITb3duZXJJZGVudGl0eVB1YmtleRIvCghub2RlX2lkcxgCIAEoCzISLnNwYXJrLlRyZWVOb2RlSWRzSABSB25vZGVJZHMSJwoPaW5jbHVkZV9wYXJlbnRzGAMgASgIUg5pbmNsdWRlUGFyZW50cxIUCgVsaW1pdBgEIAEoA1IFbGltaXQSFgoGb2Zmc2V0GAUgASgDUgZvZmZzZXQSKAoHbmV0d29yaxgGIAEoDjIOLnNwYXJrLk5ldHdvcmtSB25ldHdvcmsSMQoIc3RhdHVzZXMYByADKA4yFS5zcGFyay5UcmVlTm9kZVN0YXR1c1IIc3RhdHVzZXNCCAoGc291cmNlIrMBChJRdWVyeU5vZGVzUmVzcG9uc2USOgoFbm9kZXMYASADKAsyJC5zcGFyay5RdWVyeU5vZGVzUmVzcG9uc2UuTm9kZXNFbnRyeVIFbm9kZXMSFgoGb2Zmc2V0GAIgASgDUgZvZmZzZXQaSQoKTm9kZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIlCgV2YWx1ZRgCIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgV2YWx1ZToCOAEidQoVQ2FuY2VsVHJhbnNmZXJSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjsKGnNlbmRlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhdzZW5kZXJJZGVudGl0eVB1YmxpY0tleSJFChZDYW5jZWxUcmFuc2ZlclJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIqwBCiJRdWVyeVVudXNlZERlcG9zaXRBZGRyZXNzZXNSZXF1ZXN0Ei4KE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSEWlkZW50aXR5UHVibGljS2V5EigKB25ldHdvcmsYAiABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEhQKBWxpbWl0GAMgASgDUgVsaW1pdBIWCgZvZmZzZXQYBCABKANSBm9mZnNldCLuAQoiUXVlcnlTdGF0aWNEZXBvc2l0QWRkcmVzc2VzUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIoCgduZXR3b3JrGAIgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yaxIUCgVsaW1pdBgEIAEoA1IFbGltaXQSFgoGb2Zmc2V0GAUgASgDUgZvZmZzZXQSLAoPZGVwb3NpdF9hZGRyZXNzGAYgASgJSABSDmRlcG9zaXRBZGRyZXNziAEBQhIKEF9kZXBvc2l0X2FkZHJlc3MiygIKGURlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHQSJwoPZGVwb3NpdF9hZGRyZXNzGAEgASgJUg5kZXBvc2l0QWRkcmVzcxI1Chd1c2VyX3NpZ25pbmdfcHVibGljX2tleRgCIAEoDFIUdXNlclNpZ25pbmdQdWJsaWNLZXkSMAoUdmVyaWZ5aW5nX3B1YmxpY19rZXkYAyABKAxSEnZlcmlmeWluZ1B1YmxpY0tleRImCgdsZWFmX2lkGAQgASgJQgj6QgVyA7ABAUgAUgZsZWFmSWSIAQESTwoTcHJvb2Zfb2ZfcG9zc2Vzc2lvbhgFIAEoCzIaLnNwYXJrLkRlcG9zaXRBZGRyZXNzUHJvb2ZIAVIRcHJvb2ZPZlBvc3Nlc3Npb26IAQFCCgoIX2xlYWZfaWRCFgoUX3Byb29mX29mX3Bvc3Nlc3Npb24ijAEKI1F1ZXJ5VW51c2VkRGVwb3NpdEFkZHJlc3Nlc1Jlc3BvbnNlEk0KEWRlcG9zaXRfYWRkcmVzc2VzGAEgAygLMiAuc3BhcmsuRGVwb3NpdEFkZHJlc3NRdWVyeVJlc3VsdFIQZGVwb3NpdEFkZHJlc3NlcxIWCgZvZmZzZXQYAiABKANSBm9mZnNldCJ0CiNRdWVyeVN0YXRpY0RlcG9zaXRBZGRyZXNzZXNSZXNwb25zZRJNChFkZXBvc2l0X2FkZHJlc3NlcxgBIAMoCzIgLnNwYXJrLkRlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHRSEGRlcG9zaXRBZGRyZXNzZXMibwoTUXVlcnlCYWxhbmNlUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIoCgduZXR3b3JrGAIgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yayLFAQoUUXVlcnlCYWxhbmNlUmVzcG9uc2USGAoHYmFsYW5jZRgBIAEoBFIHYmFsYW5jZRJSCg1ub2RlX2JhbGFuY2VzGAIgAygLMi0uc3BhcmsuUXVlcnlCYWxhbmNlUmVzcG9uc2UuTm9kZUJhbGFuY2VzRW50cnlSDG5vZGVCYWxhbmNlcxo/ChFOb2RlQmFsYW5jZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoBFIFdmFsdWU6AjgBIsUBCgxTcGFya0FkZHJlc3MSLgoTaWRlbnRpdHlfcHVibGljX2tleRgBIAEoDFIRaWRlbnRpdHlQdWJsaWNLZXkSSwoUc3BhcmtfaW52b2ljZV9maWVsZHMYAiABKAsyGS5zcGFyay5TcGFya0ludm9pY2VGaWVsZHNSEnNwYXJrSW52b2ljZUZpZWxkcxIqCglzaWduYXR1cmUYAyABKAxCB/pCBHoCaEBIAFIJc2lnbmF0dXJliAEBQgwKCl9zaWduYXR1cmUinAMKElNwYXJrSW52b2ljZUZpZWxkcxIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEhcKAmlkGAIgASgMQgf6QgR6AmgQUgJpZBI9Cg50b2tlbnNfcGF5bWVudBgDIAEoCzIULnNwYXJrLlRva2Vuc1BheW1lbnRIAFINdG9rZW5zUGF5bWVudBI3CgxzYXRzX3BheW1lbnQYBCABKAsyEi5zcGFyay5TYXRzUGF5bWVudEgAUgtzYXRzUGF5bWVudBIgCgRtZW1vGAUgASgJQgf6QgRyAih4SAFSBG1lbW+IAQESOAoRc2VuZGVyX3B1YmxpY19rZXkYBiABKAxCB/pCBHoCaCFIAlIPc2VuZGVyUHVibGljS2V5iAEBEkAKC2V4cGlyeV90aW1lGAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgDUgpleHBpcnlUaW1liAEBQg4KDHBheW1lbnRfdHlwZUIHCgVfbWVtb0IUChJfc2VuZGVyX3B1YmxpY19rZXlCDgoMX2V4cGlyeV90aW1lIjUKC1NhdHNQYXltZW50EhsKBmFtb3VudBgBIAEoBEgAUgZhbW91bnSIAQFCCQoHX2Ftb3VudCKOAQoNVG9rZW5zUGF5bWVudBI3ChB0b2tlbl9pZGVudGlmaWVyGAEgASgMQgf6QgR6AmggSABSD3Rva2VuSWRlbnRpZmllcogBARIkCgZhbW91bnQYAiABKAxCB/pCBHoCGBBIAVIGYW1vdW50iAEBQhMKEV90b2tlbl9pZGVudGlmaWVyQgkKB19hbW91bnQixgEKJkluaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXF1ZXN0Ei8KDW9uX2NoYWluX3V0eG8YASABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAyABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISJQoOdXNlcl9zaWduYXR1cmUYBCABKAxSDXVzZXJTaWduYXR1cmUiwwEKJ0luaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXNwb25zZRJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYASABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSSQoPZGVwb3NpdF9hZGRyZXNzGAIgASgLMiAuc3BhcmsuRGVwb3NpdEFkZHJlc3NRdWVyeVJlc3VsdFIOZGVwb3NpdEFkZHJlc3MisAMKF0luaXRpYXRlVXR4b1N3YXBSZXF1ZXN0Ei8KDW9uX2NoYWluX3V0eG8YASABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxI9CgxyZXF1ZXN0X3R5cGUYAiABKA4yGi5zcGFyay5VdHhvU3dhcFJlcXVlc3RUeXBlUgtyZXF1ZXN0VHlwZRIuChJjcmVkaXRfYW1vdW50X3NhdHMYAyABKARIAFIQY3JlZGl0QW1vdW50U2F0cxIiCgxtYXhfZmVlX3NhdHMYBCABKARIAFIKbWF4RmVlU2F0cxIjCg1zc3Bfc2lnbmF0dXJlGAUgASgMUgxzc3BTaWduYXR1cmUSJQoOdXNlcl9zaWduYXR1cmUYBiABKAxSDXVzZXJTaWduYXR1cmUSNwoIdHJhbnNmZXIYByABKAsyGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISQgoUc3BlbmRfdHhfc2lnbmluZ19qb2IYCCABKAsyES5zcGFyay5TaWduaW5nSm9iUhFzcGVuZFR4U2lnbmluZ0pvYkIICgZhbW91bnQi3wEKGEluaXRpYXRlVXR4b1N3YXBSZXNwb25zZRJLChdzcGVuZF90eF9zaWduaW5nX3Jlc3VsdBgBIAEoCzIULnNwYXJrLlNpZ25pbmdSZXN1bHRSFHNwZW5kVHhTaWduaW5nUmVzdWx0EisKCHRyYW5zZmVyGAIgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyEkkKD2RlcG9zaXRfYWRkcmVzcxgDIAEoCzIgLnNwYXJrLkRlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHRSDmRlcG9zaXRBZGRyZXNzIosBCgtFeGl0aW5nVHJlZRIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSUQoXdXNlcl9zaWduaW5nX2NvbW1pdG1lbnQYAiABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSFXVzZXJTaWduaW5nQ29tbWl0bWVudBIQCgN2aW4YAyABKA1SA3ZpbiKcAQofRXhpdFNpbmdsZU5vZGVUcmVlU2lnbmluZ1Jlc3VsdBIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSOwoOc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0Ug1zaWduaW5nUmVzdWx0EiMKDXZlcmlmeWluZ19rZXkYAyABKAxSDHZlcmlmeWluZ0tleSJNChhCaXRjb2luVHJhbnNhY3Rpb25PdXRwdXQSFAoFdmFsdWUYASABKANSBXZhbHVlEhsKCXBrX3NjcmlwdBgCIAEoDFIIcGtTY3JpcHQi8wEKGkV4aXRTaW5nbGVOb2RlVHJlZXNSZXF1ZXN0EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSNwoNZXhpdGluZ190cmVlcxgCIAMoCzISLnNwYXJrLkV4aXRpbmdUcmVlUgxleGl0aW5nVHJlZXMSFQoGcmF3X3R4GAMgASgMUgVyYXdUeBJKChBwcmV2aW91c19vdXRwdXRzGAQgAygLMh8uc3BhcmsuQml0Y29pblRyYW5zYWN0aW9uT3V0cHV0Ug9wcmV2aW91c091dHB1dHMibgobRXhpdFNpbmdsZU5vZGVUcmVlc1Jlc3BvbnNlEk8KD3NpZ25pbmdfcmVzdWx0cxgBIAMoCzImLnNwYXJrLkV4aXRTaW5nbGVOb2RlVHJlZVNpZ25pbmdSZXN1bHRSDnNpZ25pbmdSZXN1bHRzIloKHVF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXF1ZXN0EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkizwEKHlF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXNwb25zZRJoChFub2RlX2Rpc3RyaWJ1dGlvbhgBIAMoCzI7LnNwYXJrLlF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXNwb25zZS5Ob2RlRGlzdHJpYnV0aW9uRW50cnlSEG5vZGVEaXN0cmlidXRpb24aQwoVTm9kZURpc3RyaWJ1dGlvbkVudHJ5EhAKA2tleRgBIAEoBFIDa2V5EhQKBXZhbHVlGAIgASgEUgV2YWx1ZToCOAEimQEKGFF1ZXJ5Tm9kZXNCeVZhbHVlUmVxdWVzdBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EhQKBXZhbHVlGAIgASgDUgV2YWx1ZRIWCgZvZmZzZXQYAyABKANSBm9mZnNldBIUCgVsaW1pdBgEIAEoA1IFbGltaXQiwQEKGVF1ZXJ5Tm9kZXNCeVZhbHVlUmVzcG9uc2USQQoFbm9kZXMYASADKAsyKy5zcGFyay5RdWVyeU5vZGVzQnlWYWx1ZVJlc3BvbnNlLk5vZGVzRW50cnlSBW5vZGVzEhYKBm9mZnNldBgCIAEoA1IGb2Zmc2V0GkkKCk5vZGVzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSJQoFdmFsdWUYAiABKAsyDy5zcGFyay5UcmVlTm9kZVIFdmFsdWU6AjgBIrYBChlHZXRVdHhvc0ZvckFkZHJlc3NSZXF1ZXN0EhgKB2FkZHJlc3MYASABKAlSB2FkZHJlc3MSFgoGb2Zmc2V0GAIgASgEUgZvZmZzZXQSFAoFbGltaXQYAyABKARSBWxpbWl0EigKB25ldHdvcmsYBCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEicKD2V4Y2x1ZGVfY2xhaW1lZBgFIAEoCFIOZXhjbHVkZUNsYWltZWQiVwoaR2V0VXR4b3NGb3JBZGRyZXNzUmVzcG9uc2USIQoFdXR4b3MYASADKAsyCy5zcGFyay5VVFhPUgV1dHhvcxIWCgZvZmZzZXQYAiABKARSBm9mZnNldCJjChlRdWVyeVNwYXJrSW52b2ljZXNSZXF1ZXN0EhQKBWxpbWl0GAEgASgDUgVsaW1pdBIWCgZvZmZzZXQYAiABKANSBm9mZnNldBIYCgdpbnZvaWNlGAMgAygJUgdpbnZvaWNlIncKGlF1ZXJ5U3BhcmtJbnZvaWNlc1Jlc3BvbnNlEhYKBm9mZnNldBgBIAEoA1IGb2Zmc2V0EkEKEGludm9pY2Vfc3RhdHVzZXMYAiADKAsyFi5zcGFyay5JbnZvaWNlUmVzcG9uc2VSD2ludm9pY2VTdGF0dXNlcyLlAQoPSW52b2ljZVJlc3BvbnNlEhgKB2ludm9pY2UYASABKAlSB2ludm9pY2USLAoGc3RhdHVzGAIgASgOMhQuc3BhcmsuSW52b2ljZVN0YXR1c1IGc3RhdHVzEjoKDXNhdHNfdHJhbnNmZXIYAyABKAsyEy5zcGFyay5TYXRzVHJhbnNmZXJIAFIMc2F0c1RyYW5zZmVyEj0KDnRva2VuX3RyYW5zZmVyGAQgASgLMhQuc3BhcmsuVG9rZW5UcmFuc2ZlckgAUg10b2tlblRyYW5zZmVyQg8KDXRyYW5zZmVyX3R5cGUiOAoMU2F0c1RyYW5zZmVyEigKC3RyYW5zZmVyX2lkGAEgASgMQgf6QgR6AmgQUgp0cmFuc2ZlcklkIlkKDVRva2VuVHJhbnNmZXISSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgBIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaCKtAQoiSW5pdGlhdGVTd2FwUHJpbWFyeVRyYW5zZmVyUmVxdWVzdBI3Cgh0cmFuc2ZlchgBIAEoCzIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ugh0cmFuc2ZlchJOChNhZGFwdG9yX3B1YmxpY19rZXlzGAIgASgLMh4uc3BhcmsuQWRhcHRvclB1YmxpY0tleVBhY2thZ2VSEWFkYXB0b3JQdWJsaWNLZXlzIp0BCiNJbml0aWF0ZVN3YXBQcmltYXJ5VHJhbnNmZXJSZXNwb25zZRIrCgh0cmFuc2ZlchgBIAEoCzIPLnNwYXJrLlRyYW5zZmVyUgh0cmFuc2ZlchJJCg9zaWduaW5nX3Jlc3VsdHMYAiADKAsyIC5zcGFyay5MZWFmUmVmdW5kVHhTaWduaW5nUmVzdWx0Ug5zaWduaW5nUmVzdWx0cyLPAQoXQWRhcHRvclB1YmxpY0tleVBhY2thZ2USLAoSYWRhcHRvcl9wdWJsaWNfa2V5GAEgASgMUhBhZGFwdG9yUHVibGljS2V5EjkKGWRpcmVjdF9hZGFwdG9yX3B1YmxpY19rZXkYAiABKAxSFmRpcmVjdEFkYXB0b3JQdWJsaWNLZXkSSwojZGlyZWN0X2Zyb21fY3BmcF9hZGFwdG9yX3B1YmxpY19rZXkYAyABKAxSHmRpcmVjdEZyb21DcGZwQWRhcHRvclB1YmxpY0tleSJ8Cg1XYWxsZXRTZXR0aW5nEkIKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxCB/pCBHoCaCFSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSJwoPcHJpdmF0ZV9lbmFibGVkGAIgASgIUg5wcml2YXRlRW5hYmxlZCJeChpVcGRhdGVXYWxsZXRTZXR0aW5nUmVxdWVzdBIsCg9wcml2YXRlX2VuYWJsZWQYASABKAhIAFIOcHJpdmF0ZUVuYWJsZWSIAQFCEgoQX3ByaXZhdGVfZW5hYmxlZCJaChtVcGRhdGVXYWxsZXRTZXR0aW5nUmVzcG9uc2USOwoOd2FsbGV0X3NldHRpbmcYASABKAsyFC5zcGFyay5XYWxsZXRTZXR0aW5nUg13YWxsZXRTZXR0aW5nIhsKGVF1ZXJ5V2FsbGV0U2V0dGluZ1JlcXVlc3QiWQoaUXVlcnlXYWxsZXRTZXR0aW5nUmVzcG9uc2USOwoOd2FsbGV0X3NldHRpbmcYASABKAsyFC5zcGFyay5XYWxsZXRTZXR0aW5nUg13YWxsZXRTZXR0aW5nKk0KB05ldHdvcmsSDwoLVU5TUEVDSUZJRUQQABILCgdNQUlOTkVUEAESCwoHUkVHVEVTVBACEgsKB1RFU1RORVQQAxIKCgZTSUdORVQQBCojCglEaXJlY3Rpb24SCAoETkVYVBAAEgwKCFBSRVZJT1VTEAEq/AMKDlRyYW5zZmVyU3RhdHVzEiQKIFRSQU5TRkVSX1NUQVRVU19TRU5ERVJfSU5JVElBVEVEEAASLAooVFJBTlNGRVJfU1RBVFVTX1NFTkRFUl9LRVlfVFdFQUtfUEVORElORxABEiYKIlRSQU5TRkVSX1NUQVRVU19TRU5ERVJfS0VZX1RXRUFLRUQQAhIoCiRUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfS0VZX1RXRUFLRUQQAxIqCiZUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfUkVGVU5EX1NJR05FRBAEEh0KGVRSQU5TRkVSX1NUQVRVU19DT01QTEVURUQQBRIbChdUUkFOU0ZFUl9TVEFUVVNfRVhQSVJFRBAGEhwKGFRSQU5TRkVSX1NUQVRVU19SRVRVUk5FRBAHEjAKLFRSQU5TRkVSX1NUQVRVU19TRU5ERVJfSU5JVElBVEVEX0NPT1JESU5BVE9SEAgSLQopVFJBTlNGRVJfU1RBVFVTX1JFQ0VJVkVSX0tFWV9UV0VBS19MT0NLRUQQCRIuCipUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfS0VZX1RXRUFLX0FQUExJRUQQChItCilUUkFOU0ZFUl9TVEFUVVNfQVBQTFlJTkdfU0VOREVSX0tFWV9UV0VBSxALKpoBCgxUcmFuc2ZlclR5cGUSEQoNUFJFSU1BR0VfU1dBUBAAEhQKEENPT1BFUkFUSVZFX0VYSVQQARIMCghUUkFOU0ZFUhACEg0KCVVUWE9fU1dBUBADEggKBFNXQVAQHhIQCgxDT1VOVEVSX1NXQVAQKBITCg9QUklNQVJZX1NXQVBfVjMQBBITCg9DT1VOVEVSX1NXQVBfVjMQBSomCgVPcmRlchIOCgpERVNDRU5ESU5HEAASDQoJQVNDRU5ESU5HEAEqnAEKFVByZWltYWdlUmVxdWVzdFN0YXR1cxIwCixQUkVJTUFHRV9SRVFVRVNUX1NUQVRVU19XQUlUSU5HX0ZPUl9QUkVJTUFHRRAAEisKJ1BSRUlNQUdFX1JFUVVFU1RfU1RBVFVTX1BSRUlNQUdFX1NIQVJFRBABEiQKIFBSRUlNQUdFX1JFUVVFU1RfU1RBVFVTX1JFVFVSTkVEEAIqWwoTUHJlaW1hZ2VSZXF1ZXN0Um9sZRIiCh5QUkVJTUFHRV9SRVFVRVNUX1JPTEVfUkVDRUlWRVIQABIgChxQUkVJTUFHRV9SRVFVRVNUX1JPTEVfU0VOREVSEAEqOAoTVXR4b1N3YXBSZXF1ZXN0VHlwZRIJCgVGaXhlZBAAEgoKBk1heEZlZRABEgoKBlJlZnVuZBACKk4KDUludm9pY2VTdGF0dXMSDQoJTk9UX0ZPVU5EEAASCwoHUEVORElORxABEg0KCUZJTkFMSVpFRBACEgwKCFJFVFVSTkVEEAQiBAgDEAMq4AIKDlRyZWVOb2RlU3RhdHVzEh0KGVRSRUVfTk9ERV9TVEFUVVNfQ1JFQVRJTkcQABIeChpUUkVFX05PREVfU1RBVFVTX0FWQUlMQUJMRRABEiUKIVRSRUVfTk9ERV9TVEFUVVNfRlJPWkVOX0JZX0lTU1VFUhACEiQKIFRSRUVfTk9ERV9TVEFUVVNfVFJBTlNGRVJfTE9DS0VEEAMSIQodVFJFRV9OT0RFX1NUQVRVU19TUExJVF9MT0NLRUQQBBIdChlUUkVFX05PREVfU1RBVFVTX1NQTElUVEVEEAUSHwobVFJFRV9OT0RFX1NUQVRVU19BR0dSRUdBVEVEEAYSHQoZVFJFRV9OT0RFX1NUQVRVU19PTl9DSEFJThAHEiMKH1RSRUVfTk9ERV9TVEFUVVNfQUdHUkVHQVRFX0xPQ0sQCBIbChdUUkVFX05PREVfU1RBVFVTX0VYSVRFRBAJMpMnCgxTcGFya1NlcnZpY2USaQoYZ2VuZXJhdGVfZGVwb3NpdF9hZGRyZXNzEiQuc3BhcmsuR2VuZXJhdGVEZXBvc2l0QWRkcmVzc1JlcXVlc3QaJS5zcGFyay5HZW5lcmF0ZURlcG9zaXRBZGRyZXNzUmVzcG9uc2UiABJ8Ch9nZW5lcmF0ZV9zdGF0aWNfZGVwb3NpdF9hZGRyZXNzEiouc3BhcmsuR2VuZXJhdGVTdGF0aWNEZXBvc2l0QWRkcmVzc1JlcXVlc3QaKy5zcGFyay5HZW5lcmF0ZVN0YXRpY0RlcG9zaXRBZGRyZXNzUmVzcG9uc2UiABJwChtzdGFydF9kZXBvc2l0X3RyZWVfY3JlYXRpb24SJi5zcGFyay5TdGFydERlcG9zaXRUcmVlQ3JlYXRpb25SZXF1ZXN0Gicuc3BhcmsuU3RhcnREZXBvc2l0VHJlZUNyZWF0aW9uUmVzcG9uc2UiABJdChNzdGFydF90cmVlX2NyZWF0aW9uEh8uc3BhcmsuU3RhcnRUcmVlQ3JlYXRpb25SZXF1ZXN0GiAuc3BhcmsuU3RhcnRUcmVlQ3JlYXRpb25SZXNwb25zZSIDiAIBEmwKGGZpbmFsaXplX25vZGVfc2lnbmF0dXJlcxIkLnNwYXJrLkZpbmFsaXplTm9kZVNpZ25hdHVyZXNSZXF1ZXN0GiUuc3BhcmsuRmluYWxpemVOb2RlU2lnbmF0dXJlc1Jlc3BvbnNlIgOIAgESUAoOc3RhcnRfdHJhbnNmZXISGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdBocLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXNwb25zZSIDiAIBElkKEWZpbmFsaXplX3RyYW5zZmVyEh4uc3BhcmsuRmluYWxpemVUcmFuc2ZlclJlcXVlc3QaHy5zcGFyay5GaW5hbGl6ZVRyYW5zZmVyUmVzcG9uc2UiA4gCARJ/CidmaW5hbGl6ZV90cmFuc2Zlcl93aXRoX3RyYW5zZmVyX3BhY2thZ2USMS5zcGFyay5GaW5hbGl6ZVRyYW5zZmVyV2l0aFRyYW5zZmVyUGFja2FnZVJlcXVlc3QaHy5zcGFyay5GaW5hbGl6ZVRyYW5zZmVyUmVzcG9uc2UiABJTCg9jYW5jZWxfdHJhbnNmZXISHC5zcGFyay5DYW5jZWxUcmFuc2ZlclJlcXVlc3QaHS5zcGFyay5DYW5jZWxUcmFuc2ZlclJlc3BvbnNlIgOIAgESUQoXcXVlcnlfcGVuZGluZ190cmFuc2ZlcnMSFS5zcGFyay5UcmFuc2ZlckZpbHRlchodLnNwYXJrLlF1ZXJ5VHJhbnNmZXJzUmVzcG9uc2UiABJNChNxdWVyeV9hbGxfdHJhbnNmZXJzEhUuc3BhcmsuVHJhbnNmZXJGaWx0ZXIaHS5zcGFyay5RdWVyeVRyYW5zZmVyc1Jlc3BvbnNlIgASWwoZY2xhaW1fdHJhbnNmZXJfdHdlYWtfa2V5cxIkLnNwYXJrLkNsYWltVHJhbnNmZXJUd2Vha0tleXNSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IgAScwobY2xhaW1fdHJhbnNmZXJfc2lnbl9yZWZ1bmRzEiYuc3BhcmsuQ2xhaW1UcmFuc2ZlclNpZ25SZWZ1bmRzUmVxdWVzdBonLnNwYXJrLkNsYWltVHJhbnNmZXJTaWduUmVmdW5kc1Jlc3BvbnNlIgOIAgESUgoUc3RvcmVfcHJlaW1hZ2Vfc2hhcmUSIC5zcGFyay5TdG9yZVByZWltYWdlU2hhcmVSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IgASZgoXZ2V0X3NpZ25pbmdfY29tbWl0bWVudHMSIy5zcGFyay5HZXRTaWduaW5nQ29tbWl0bWVudHNSZXF1ZXN0GiQuc3BhcmsuR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVzcG9uc2UiABJWChBjb29wZXJhdGl2ZV9leGl0Eh0uc3BhcmsuQ29vcGVyYXRpdmVFeGl0UmVxdWVzdBoeLnNwYXJrLkNvb3BlcmF0aXZlRXhpdFJlc3BvbnNlIgOIAgESZgoWaW5pdGlhdGVfcHJlaW1hZ2Vfc3dhcBIiLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVxdWVzdBojLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVzcG9uc2UiA4gCARJTChBwcm92aWRlX3ByZWltYWdlEh0uc3BhcmsuUHJvdmlkZVByZWltYWdlUmVxdWVzdBoeLnNwYXJrLlByb3ZpZGVQcmVpbWFnZVJlc3BvbnNlIgASQQoKcXVlcnlfaHRsYxIXLnNwYXJrLlF1ZXJ5SHRsY1JlcXVlc3QaGC5zcGFyay5RdWVyeUh0bGNSZXNwb25zZSIAEk4KD3N0YXJ0X2xlYWZfc3dhcBIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ghwuc3BhcmsuU3RhcnRUcmFuc2ZlclJlc3BvbnNlIgASTwoJbGVhZl9zd2FwEh0uc3BhcmsuQ291bnRlckxlYWZTd2FwUmVxdWVzdBoeLnNwYXJrLkNvdW50ZXJMZWFmU3dhcFJlc3BvbnNlIgOIAgESVwoRY291bnRlcl9sZWFmX3N3YXASHS5zcGFyay5Db3VudGVyTGVhZlN3YXBSZXF1ZXN0Gh4uc3BhcmsuQ291bnRlckxlYWZTd2FwUmVzcG9uc2UiA4gCARJWChByZWZyZXNoX3RpbWVsb2NrEh0uc3BhcmsuUmVmcmVzaFRpbWVsb2NrUmVxdWVzdBoeLnNwYXJrLlJlZnJlc2hUaW1lbG9ja1Jlc3BvbnNlIgOIAgESRwoLZXh0ZW5kX2xlYWYSGC5zcGFyay5FeHRlbmRMZWFmUmVxdWVzdBoZLnNwYXJrLkV4dGVuZExlYWZSZXNwb25zZSIDiAIBEkEKCnJlbmV3X2xlYWYSFy5zcGFyay5SZW5ld0xlYWZSZXF1ZXN0Ghguc3BhcmsuUmVuZXdMZWFmUmVzcG9uc2UiABJcChlnZXRfc2lnbmluZ19vcGVyYXRvcl9saXN0EhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5GiUuc3BhcmsuR2V0U2lnbmluZ09wZXJhdG9yTGlzdFJlc3BvbnNlIgASRAoLcXVlcnlfbm9kZXMSGC5zcGFyay5RdWVyeU5vZGVzUmVxdWVzdBoZLnNwYXJrLlF1ZXJ5Tm9kZXNSZXNwb25zZSIAEmwKGHF1ZXJ5X25vZGVzX2Rpc3RyaWJ1dGlvbhIkLnNwYXJrLlF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXF1ZXN0GiUuc3BhcmsuUXVlcnlOb2Rlc0Rpc3RyaWJ1dGlvblJlc3BvbnNlIgOIAgESXgoUcXVlcnlfbm9kZXNfYnlfdmFsdWUSHy5zcGFyay5RdWVyeU5vZGVzQnlWYWx1ZVJlcXVlc3QaIC5zcGFyay5RdWVyeU5vZGVzQnlWYWx1ZVJlc3BvbnNlIgOIAgESSgoNcXVlcnlfYmFsYW5jZRIaLnNwYXJrLlF1ZXJ5QmFsYW5jZVJlcXVlc3QaGy5zcGFyay5RdWVyeUJhbGFuY2VSZXNwb25zZSIAEmoKGXF1ZXJ5X3VzZXJfc2lnbmVkX3JlZnVuZHMSJC5zcGFyay5RdWVyeVVzZXJTaWduZWRSZWZ1bmRzUmVxdWVzdBolLnNwYXJrLlF1ZXJ5VXNlclNpZ25lZFJlZnVuZHNSZXNwb25zZSIAEnkKHnF1ZXJ5X3VudXNlZF9kZXBvc2l0X2FkZHJlc3NlcxIpLnNwYXJrLlF1ZXJ5VW51c2VkRGVwb3NpdEFkZHJlc3Nlc1JlcXVlc3QaKi5zcGFyay5RdWVyeVVudXNlZERlcG9zaXRBZGRyZXNzZXNSZXNwb25zZSIAEnkKHnF1ZXJ5X3N0YXRpY19kZXBvc2l0X2FkZHJlc3NlcxIpLnNwYXJrLlF1ZXJ5U3RhdGljRGVwb3NpdEFkZHJlc3Nlc1JlcXVlc3QaKi5zcGFyay5RdWVyeVN0YXRpY0RlcG9zaXRBZGRyZXNzZXNSZXNwb25zZSIAElwKE3N1YnNjcmliZV90b19ldmVudHMSHy5zcGFyay5TdWJzY3JpYmVUb0V2ZW50c1JlcXVlc3QaIC5zcGFyay5TdWJzY3JpYmVUb0V2ZW50c1Jlc3BvbnNlIgAwARKGAQojaW5pdGlhdGVfc3RhdGljX2RlcG9zaXRfdXR4b19yZWZ1bmQSLS5zcGFyay5Jbml0aWF0ZVN0YXRpY0RlcG9zaXRVdHhvUmVmdW5kUmVxdWVzdBouLnNwYXJrLkluaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXNwb25zZSIAEloKEmluaXRpYXRlX3V0eG9fc3dhcBIeLnNwYXJrLkluaXRpYXRlVXR4b1N3YXBSZXF1ZXN0Gh8uc3BhcmsuSW5pdGlhdGVVdHhvU3dhcFJlc3BvbnNlIgOIAgESYQoWZXhpdF9zaW5nbGVfbm9kZV90cmVlcxIhLnNwYXJrLkV4aXRTaW5nbGVOb2RlVHJlZXNSZXF1ZXN0GiIuc3BhcmsuRXhpdFNpbmdsZU5vZGVUcmVlc1Jlc3BvbnNlIgASVgoTY29vcGVyYXRpdmVfZXhpdF92MhIdLnNwYXJrLkNvb3BlcmF0aXZlRXhpdFJlcXVlc3QaHi5zcGFyay5Db29wZXJhdGl2ZUV4aXRSZXNwb25zZSIAEkoKDmV4dGVuZF9sZWFmX3YyEhguc3BhcmsuRXh0ZW5kTGVhZlJlcXVlc3QaGS5zcGFyay5FeHRlbmRMZWFmUmVzcG9uc2UiA4gCARJzCh5jbGFpbV90cmFuc2Zlcl9zaWduX3JlZnVuZHNfdjISJi5zcGFyay5DbGFpbVRyYW5zZmVyU2lnblJlZnVuZHNSZXF1ZXN0Gicuc3BhcmsuQ2xhaW1UcmFuc2ZlclNpZ25SZWZ1bmRzUmVzcG9uc2UiABJsChtmaW5hbGl6ZV9ub2RlX3NpZ25hdHVyZXNfdjISJC5zcGFyay5GaW5hbGl6ZU5vZGVTaWduYXR1cmVzUmVxdWVzdBolLnNwYXJrLkZpbmFsaXplTm9kZVNpZ25hdHVyZXNSZXNwb25zZSIAEmYKGWluaXRpYXRlX3ByZWltYWdlX3N3YXBfdjISIi5zcGFyay5Jbml0aWF0ZVByZWltYWdlU3dhcFJlcXVlc3QaIy5zcGFyay5Jbml0aWF0ZVByZWltYWdlU3dhcFJlc3BvbnNlIgASZgoZaW5pdGlhdGVfcHJlaW1hZ2Vfc3dhcF92MxIiLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVxdWVzdBojLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVzcG9uc2UiABJRChJzdGFydF9sZWFmX3N3YXBfdjISGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdBocLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXNwb25zZSIAEloKFGNvdW50ZXJfbGVhZl9zd2FwX3YyEh0uc3BhcmsuQ291bnRlckxlYWZTd2FwUmVxdWVzdBoeLnNwYXJrLkNvdW50ZXJMZWFmU3dhcFJlc3BvbnNlIgOIAgESUAoRc3RhcnRfdHJhbnNmZXJfdjISGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdBocLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXNwb25zZSIAElkKE3JlZnJlc2hfdGltZWxvY2tfdjISHS5zcGFyay5SZWZyZXNoVGltZWxvY2tSZXF1ZXN0Gh4uc3BhcmsuUmVmcmVzaFRpbWVsb2NrUmVzcG9uc2UiA4gCARJeChVnZXRfdXR4b3NfZm9yX2FkZHJlc3MSIC5zcGFyay5HZXRVdHhvc0ZvckFkZHJlc3NSZXF1ZXN0GiEuc3BhcmsuR2V0VXR4b3NGb3JBZGRyZXNzUmVzcG9uc2UiABJdChRxdWVyeV9zcGFya19pbnZvaWNlcxIgLnNwYXJrLlF1ZXJ5U3BhcmtJbnZvaWNlc1JlcXVlc3QaIS5zcGFyay5RdWVyeVNwYXJrSW52b2ljZXNSZXNwb25zZSIAEnkKHmluaXRpYXRlX3N3YXBfcHJpbWFyeV90cmFuc2ZlchIpLnNwYXJrLkluaXRpYXRlU3dhcFByaW1hcnlUcmFuc2ZlclJlcXVlc3QaKi5zcGFyay5Jbml0aWF0ZVN3YXBQcmltYXJ5VHJhbnNmZXJSZXNwb25zZSIAEmAKFXVwZGF0ZV93YWxsZXRfc2V0dGluZxIhLnNwYXJrLlVwZGF0ZVdhbGxldFNldHRpbmdSZXF1ZXN0GiIuc3BhcmsuVXBkYXRlV2FsbGV0U2V0dGluZ1Jlc3BvbnNlIgASXQoUcXVlcnlfd2FsbGV0X3NldHRpbmcSIC5zcGFyay5RdWVyeVdhbGxldFNldHRpbmdSZXF1ZXN0GiEuc3BhcmsuUXVlcnlXYWxsZXRTZXR0aW5nUmVzcG9uc2UiAEIsWipnaXRodWIuY29tL2xpZ2h0c3BhcmtkZXYvc3BhcmsvcHJvdG8vc3BhcmtiBnByb3RvMwqIVQoRc3BhcmtfdG9rZW4ucHJvdG8SC3NwYXJrX3Rva2VuGh9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvGgtzcGFyay5wcm90bxoXdmFsaWRhdGUvdmFsaWRhdGUucHJvdG8imwEKElRva2VuT3V0cHV0VG9TcGVuZBJGChtwcmV2X3Rva2VuX3RyYW5zYWN0aW9uX2hhc2gYASABKAxCB/pCBHoCaCBSGHByZXZUb2tlblRyYW5zYWN0aW9uSGFzaBI9ChtwcmV2X3Rva2VuX3RyYW5zYWN0aW9uX3ZvdXQYAiABKA1SGHByZXZUb2tlblRyYW5zYWN0aW9uVm91dCJfChJUb2tlblRyYW5zZmVySW5wdXQSSQoQb3V0cHV0c190b19zcGVuZBgBIAMoCzIfLnNwYXJrX3Rva2VuLlRva2VuT3V0cHV0VG9TcGVuZFIOb3V0cHV0c1RvU3BlbmQikwEKDlRva2VuTWludElucHV0EjMKEWlzc3Vlcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg9pc3N1ZXJQdWJsaWNLZXkSNwoQdG9rZW5faWRlbnRpZmllchgCIAEoDEIH+kIEegJoIEgAUg90b2tlbklkZW50aWZpZXKIAQFCEwoRX3Rva2VuX2lkZW50aWZpZXIi9gIKEFRva2VuQ3JlYXRlSW5wdXQSMwoRaXNzdWVyX3B1YmxpY19rZXkYASABKAxCB/pCBHoCaCFSD2lzc3VlclB1YmxpY0tleRImCgp0b2tlbl9uYW1lGAIgASgJQgf6QgRyAhgUUgl0b2tlbk5hbWUSKgoMdG9rZW5fdGlja2VyGAMgASgJQgf6QgRyAhgGUgt0b2tlblRpY2tlchIkCghkZWNpbWFscxgEIAEoDUII+kIFKgMY/wFSCGRlY2ltYWxzEiYKCm1heF9zdXBwbHkYBSABKAxCB/pCBHoCaBBSCW1heFN1cHBseRIhCgxpc19mcmVlemFibGUYBiABKAhSC2lzRnJlZXphYmxlEkkKGmNyZWF0aW9uX2VudGl0eV9wdWJsaWNfa2V5GAcgASgMQgf6QgR6AmghSABSF2NyZWF0aW9uRW50aXR5UHVibGljS2V5iAEBQh0KG19jcmVhdGlvbl9lbnRpdHlfcHVibGljX2tleSLHBAoLVG9rZW5PdXRwdXQSHQoCaWQYASABKAlCCPpCBXIDsAEBSABSAmlkiAEBEjEKEG93bmVyX3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSDm93bmVyUHVibGljS2V5EkEKFXJldm9jYXRpb25fY29tbWl0bWVudBgDIAEoDEIH+kIEegJoIUgBUhRyZXZvY2F0aW9uQ29tbWl0bWVudIgBARIxChJ3aXRoZHJhd19ib25kX3NhdHMYBCABKARIAlIQd2l0aGRyYXdCb25kU2F0c4gBARJMCiB3aXRoZHJhd19yZWxhdGl2ZV9ibG9ja19sb2NrdGltZRgFIAEoBEgDUh13aXRoZHJhd1JlbGF0aXZlQmxvY2tMb2NrdGltZYgBARI2ChB0b2tlbl9wdWJsaWNfa2V5GAYgASgMQgf6QgR6AmghSARSDnRva2VuUHVibGljS2V5iAEBEjcKEHRva2VuX2lkZW50aWZpZXIYCCABKAxCB/pCBHoCaCBIBVIPdG9rZW5JZGVudGlmaWVyiAEBEioKDHRva2VuX2Ftb3VudBgHIAEoDEIH+kIEegJoEFILdG9rZW5BbW91bnRCBQoDX2lkQhgKFl9yZXZvY2F0aW9uX2NvbW1pdG1lbnRCFQoTX3dpdGhkcmF3X2JvbmRfc2F0c0IjCiFfd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWVCEwoRX3Rva2VuX3B1YmxpY19rZXlCEwoRX3Rva2VuX2lkZW50aWZpZXIingIKElBhcnRpYWxUb2tlbk91dHB1dBIxChBvd25lcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRIsChJ3aXRoZHJhd19ib25kX3NhdHMYAiABKARSEHdpdGhkcmF3Qm9uZFNhdHMSRwogd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWUYAyABKARSHXdpdGhkcmF3UmVsYXRpdmVCbG9ja0xvY2t0aW1lEjIKEHRva2VuX2lkZW50aWZpZXIYBCABKAxCB/pCBHoCaCBSD3Rva2VuSWRlbnRpZmllchIqCgx0b2tlbl9hbW91bnQYBSABKAxCB/pCBHoCaBBSC3Rva2VuQW1vdW50IqMBChBGaW5hbFRva2VuT3V0cHV0ElEKFHBhcnRpYWxfdG9rZW5fb3V0cHV0GAEgASgLMh8uc3BhcmtfdG9rZW4uUGFydGlhbFRva2VuT3V0cHV0UhJwYXJ0aWFsVG9rZW5PdXRwdXQSPAoVcmV2b2NhdGlvbl9jb21taXRtZW50GAIgASgMQgf6QgR6AmghUhRyZXZvY2F0aW9uQ29tbWl0bWVudCKaBgoQVG9rZW5UcmFuc2FjdGlvbhIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEjwKCm1pbnRfaW5wdXQYAiABKAsyGy5zcGFya190b2tlbi5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSSAoOdHJhbnNmZXJfaW5wdXQYAyABKAsyHy5zcGFya190b2tlbi5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBJCCgxjcmVhdGVfaW5wdXQYCCABKAsyHS5zcGFya190b2tlbi5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0Ej0KDXRva2VuX291dHB1dHMYBCADKAsyGC5zcGFya190b2tlbi5Ub2tlbk91dHB1dFIMdG9rZW5PdXRwdXRzEloKI3NwYXJrX29wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXlzGAUgAygMQgz6QgmSAQYiBHoCaCFSH3NwYXJrT3BlcmF0b3JJZGVudGl0eVB1YmxpY0tleXMSOwoLZXhwaXJ5X3RpbWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgpleHBpcnlUaW1lEjIKB25ldHdvcmsYByABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yaxJUChhjbGllbnRfY3JlYXRlZF90aW1lc3RhbXAYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUhZjbGllbnRDcmVhdGVkVGltZXN0YW1wEk8KE2ludm9pY2VfYXR0YWNobWVudHMYCiADKAsyHi5zcGFya190b2tlbi5JbnZvaWNlQXR0YWNobWVudFISaW52b2ljZUF0dGFjaG1lbnRzEj8KGXZhbGlkaXR5X2R1cmF0aW9uX3NlY29uZHMYCyABKARIAVIXdmFsaWRpdHlEdXJhdGlvblNlY29uZHOIAQFCDgoMdG9rZW5faW5wdXRzQhwKGl92YWxpZGl0eV9kdXJhdGlvbl9zZWNvbmRzIpkDChhUb2tlblRyYW5zYWN0aW9uTWV0YWRhdGESWgojc3Bhcmtfb3BlcmF0b3JfaWRlbnRpdHlfcHVibGljX2tleXMYAiADKAxCDPpCCZIBBiIEegJoIVIfc3BhcmtPcGVyYXRvcklkZW50aXR5UHVibGljS2V5cxIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsSVAoYY2xpZW50X2NyZWF0ZWRfdGltZXN0YW1wGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIWY2xpZW50Q3JlYXRlZFRpbWVzdGFtcBJGChl2YWxpZGl0eV9kdXJhdGlvbl9zZWNvbmRzGAUgASgEQgr6QgcyBRisAigBUhd2YWxpZGl0eUR1cmF0aW9uU2Vjb25kcxJPChNpbnZvaWNlX2F0dGFjaG1lbnRzGAYgAygLMh4uc3BhcmtfdG9rZW4uSW52b2ljZUF0dGFjaG1lbnRSEmludm9pY2VBdHRhY2htZW50cyLJAwoXUGFydGlhbFRva2VuVHJhbnNhY3Rpb24SGAoHdmVyc2lvbhgBIAEoDVIHdmVyc2lvbhJjChp0b2tlbl90cmFuc2FjdGlvbl9tZXRhZGF0YRgCIAEoCzIlLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25NZXRhZGF0YVIYdG9rZW5UcmFuc2FjdGlvbk1ldGFkYXRhEjwKCm1pbnRfaW5wdXQYAyABKAsyGy5zcGFya190b2tlbi5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSSAoOdHJhbnNmZXJfaW5wdXQYBCABKAsyHy5zcGFya190b2tlbi5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBJCCgxjcmVhdGVfaW5wdXQYBSABKAsyHS5zcGFya190b2tlbi5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0ElMKFXBhcnRpYWxfdG9rZW5fb3V0cHV0cxgGIAMoCzIfLnNwYXJrX3Rva2VuLlBhcnRpYWxUb2tlbk91dHB1dFITcGFydGlhbFRva2VuT3V0cHV0c0IOCgx0b2tlbl9pbnB1dHMiwQMKFUZpbmFsVG9rZW5UcmFuc2FjdGlvbhIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEmMKGnRva2VuX3RyYW5zYWN0aW9uX21ldGFkYXRhGAIgASgLMiUuc3BhcmtfdG9rZW4uVG9rZW5UcmFuc2FjdGlvbk1ldGFkYXRhUhh0b2tlblRyYW5zYWN0aW9uTWV0YWRhdGESPAoKbWludF9pbnB1dBgDIAEoCzIbLnNwYXJrX3Rva2VuLlRva2VuTWludElucHV0SABSCW1pbnRJbnB1dBJICg50cmFuc2Zlcl9pbnB1dBgEIAEoCzIfLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNmZXJJbnB1dEgAUg10cmFuc2ZlcklucHV0EkIKDGNyZWF0ZV9pbnB1dBgFIAEoCzIdLnNwYXJrX3Rva2VuLlRva2VuQ3JlYXRlSW5wdXRIAFILY3JlYXRlSW5wdXQSTQoTZmluYWxfdG9rZW5fb3V0cHV0cxgGIAMoCzIdLnNwYXJrX3Rva2VuLkZpbmFsVG9rZW5PdXRwdXRSEWZpbmFsVG9rZW5PdXRwdXRzQg4KDHRva2VuX2lucHV0cyI4ChFJbnZvaWNlQXR0YWNobWVudBIjCg1zcGFya19pbnZvaWNlGAEgASgJUgxzcGFya0ludm9pY2UiXgoSU2lnbmF0dXJlV2l0aEluZGV4EicKCXNpZ25hdHVyZRgBIAEoDEIJ+kIGegQQQBhJUglzaWduYXR1cmUSHwoLaW5wdXRfaW5kZXgYAiABKA1SCmlucHV0SW5kZXgitAEKHklucHV0VHR4b1NpZ25hdHVyZXNQZXJPcGVyYXRvchJICg90dHhvX3NpZ25hdHVyZXMYASADKAsyHy5zcGFya190b2tlbi5TaWduYXR1cmVXaXRoSW5kZXhSDnR0eG9TaWduYXR1cmVzEkgKHG9wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSGW9wZXJhdG9ySWRlbnRpdHlQdWJsaWNLZXki8gIKF1N0YXJ0VHJhbnNhY3Rpb25SZXF1ZXN0EjcKE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxCB/pCBHoCaCFSEWlkZW50aXR5UHVibGljS2V5ElkKGXBhcnRpYWxfdG9rZW5fdHJhbnNhY3Rpb24YAiABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhdwYXJ0aWFsVG9rZW5UcmFuc2FjdGlvbhJ7CipwYXJ0aWFsX3Rva2VuX3RyYW5zYWN0aW9uX293bmVyX3NpZ25hdHVyZXMYAyADKAsyHy5zcGFya190b2tlbi5TaWduYXR1cmVXaXRoSW5kZXhSJnBhcnRpYWxUb2tlblRyYW5zYWN0aW9uT3duZXJTaWduYXR1cmVzEkYKGXZhbGlkaXR5X2R1cmF0aW9uX3NlY29uZHMYBCABKARCCvpCBzIFGKwCKAFSF3ZhbGlkaXR5RHVyYXRpb25TZWNvbmRzIq4BChhTdGFydFRyYW5zYWN0aW9uUmVzcG9uc2USVQoXZmluYWxfdG9rZW5fdHJhbnNhY3Rpb24YASABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SOwoNa2V5c2hhcmVfaW5mbxgCIAEoCzIWLnNwYXJrLlNpZ25pbmdLZXlzaGFyZVIMa2V5c2hhcmVJbmZvIvgCChhDb21taXRUcmFuc2FjdGlvblJlcXVlc3QSVQoXZmluYWxfdG9rZW5fdHJhbnNhY3Rpb24YASABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgCIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaBJ3CiJpbnB1dF90dHhvX3NpZ25hdHVyZXNfcGVyX29wZXJhdG9yGAMgAygLMisuc3BhcmtfdG9rZW4uSW5wdXRUdHhvU2lnbmF0dXJlc1Blck9wZXJhdG9yUh5pbnB1dFR0eG9TaWduYXR1cmVzUGVyT3BlcmF0b3ISQgoZb3duZXJfaWRlbnRpdHlfcHVibGljX2tleRgEIAEoDEIH+kIEegJoIVIWb3duZXJJZGVudGl0eVB1YmxpY0tleSK6AQoOQ29tbWl0UHJvZ3Jlc3MSUQoeY29tbWl0dGVkX29wZXJhdG9yX3B1YmxpY19rZXlzGAEgAygMQgz6QgmSAQYiBHoCaCFSG2NvbW1pdHRlZE9wZXJhdG9yUHVibGljS2V5cxJVCiB1bmNvbW1pdHRlZF9vcGVyYXRvcl9wdWJsaWNfa2V5cxgCIAMoDEIM+kIJkgEGIgR6AmghUh11bmNvbW1pdHRlZE9wZXJhdG9yUHVibGljS2V5cyKhAQoZQ29tbWl0VHJhbnNhY3Rpb25SZXNwb25zZRI+Cg1jb21taXRfc3RhdHVzGAEgASgOMhkuc3BhcmtfdG9rZW4uQ29tbWl0U3RhdHVzUgxjb21taXRTdGF0dXMSRAoPY29tbWl0X3Byb2dyZXNzGAIgASgLMhsuc3BhcmtfdG9rZW4uQ29tbWl0UHJvZ3Jlc3NSDmNvbW1pdFByb2dyZXNzIqYCChtCcm9hZGNhc3RUcmFuc2FjdGlvblJlcXVlc3QSNwoTaWRlbnRpdHlfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIRaWRlbnRpdHlQdWJsaWNLZXkSYAoZcGFydGlhbF90b2tlbl90cmFuc2FjdGlvbhgCIAEoCzIkLnNwYXJrX3Rva2VuLlBhcnRpYWxUb2tlblRyYW5zYWN0aW9uUhdwYXJ0aWFsVG9rZW5UcmFuc2FjdGlvbhJsCiJ0b2tlbl90cmFuc2FjdGlvbl9vd25lcl9zaWduYXR1cmVzGAMgAygLMh8uc3BhcmtfdG9rZW4uU2lnbmF0dXJlV2l0aEluZGV4Uh90b2tlblRyYW5zYWN0aW9uT3duZXJTaWduYXR1cmVzIoACChxCcm9hZGNhc3RUcmFuc2FjdGlvblJlc3BvbnNlEloKF2ZpbmFsX3Rva2VuX3RyYW5zYWN0aW9uGAEgASgLMiIuc3BhcmtfdG9rZW4uRmluYWxUb2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SPgoNY29tbWl0X3N0YXR1cxgCIAEoDjIZLnNwYXJrX3Rva2VuLkNvbW1pdFN0YXR1c1IMY29tbWl0U3RhdHVzEkQKD2NvbW1pdF9wcm9ncmVzcxgDIAEoCzIbLnNwYXJrX3Rva2VuLkNvbW1pdFByb2dyZXNzUg5jb21taXRQcm9ncmVzcyKSAQoZUXVlcnlUb2tlbk1ldGFkYXRhUmVxdWVzdBI5ChF0b2tlbl9pZGVudGlmaWVycxgBIAMoDEIM+kIJkgEGIgR6AmggUhB0b2tlbklkZW50aWZpZXJzEjoKEmlzc3Vlcl9wdWJsaWNfa2V5cxgCIAMoDEIM+kIJkgEGIgR6AmghUhBpc3N1ZXJQdWJsaWNLZXlzIqcDCg1Ub2tlbk1ldGFkYXRhEjMKEWlzc3Vlcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg9pc3N1ZXJQdWJsaWNLZXkSJgoKdG9rZW5fbmFtZRgCIAEoCUIH+kIEcgIYFFIJdG9rZW5OYW1lEioKDHRva2VuX3RpY2tlchgDIAEoCUIH+kIEcgIYBlILdG9rZW5UaWNrZXISJAoIZGVjaW1hbHMYBCABKA1CCPpCBSoDGP8BUghkZWNpbWFscxImCgptYXhfc3VwcGx5GAUgASgMQgf6QgR6AmgQUgltYXhTdXBwbHkSIQoMaXNfZnJlZXphYmxlGAYgASgIUgtpc0ZyZWV6YWJsZRJJChpjcmVhdGlvbl9lbnRpdHlfcHVibGljX2tleRgHIAEoDEIH+kIEegJoIUgAUhdjcmVhdGlvbkVudGl0eVB1YmxpY0tleYgBARIyChB0b2tlbl9pZGVudGlmaWVyGAggASgMQgf6QgR6AmggUg90b2tlbklkZW50aWZpZXJCHQobX2NyZWF0aW9uX2VudGl0eV9wdWJsaWNfa2V5Il8KGlF1ZXJ5VG9rZW5NZXRhZGF0YVJlc3BvbnNlEkEKDnRva2VuX21ldGFkYXRhGAEgAygLMhouc3BhcmtfdG9rZW4uVG9rZW5NZXRhZGF0YVINdG9rZW5NZXRhZGF0YSKsAgoYUXVlcnlUb2tlbk91dHB1dHNSZXF1ZXN0EjgKEW93bmVyX3B1YmxpY19rZXlzGAEgAygMQgz6QgmSAQYiBHoCaCFSD293bmVyUHVibGljS2V5cxI6ChJpc3N1ZXJfcHVibGljX2tleXMYAiADKAxCDPpCCZIBBiIEegJoIVIQaXNzdWVyUHVibGljS2V5cxI5ChF0b2tlbl9pZGVudGlmaWVycxgEIAMoDEIM+kIJkgEGIgR6AmggUhB0b2tlbklkZW50aWZpZXJzEigKB25ldHdvcmsYAyABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEjUKDHBhZ2VfcmVxdWVzdBgFIAEoCzISLnNwYXJrLlBhZ2VSZXF1ZXN0UgtwYWdlUmVxdWVzdCKtAwodUXVlcnlUb2tlblRyYW5zYWN0aW9uc1JlcXVlc3QSLAoKb3V0cHV0X2lkcxgBIAMoCUIN+kIKkgEHIgVyA7ABAVIJb3V0cHV0SWRzEjgKEW93bmVyX3B1YmxpY19rZXlzGAIgAygMQgz6QgmSAQYiBHoCaCFSD293bmVyUHVibGljS2V5cxI6ChJpc3N1ZXJfcHVibGljX2tleXMYAyADKAxCDPpCCZIBBiIEegJoIVIQaXNzdWVyUHVibGljS2V5cxI5ChF0b2tlbl9pZGVudGlmaWVycxgHIAMoDEIM+kIJkgEGIgR6AmggUhB0b2tlbklkZW50aWZpZXJzEkYKGHRva2VuX3RyYW5zYWN0aW9uX2hhc2hlcxgEIAMoDEIM+kIJkgEGIgR6AmggUhZ0b2tlblRyYW5zYWN0aW9uSGFzaGVzEiIKBW9yZGVyGAggASgOMgwuc3BhcmsuT3JkZXJSBW9yZGVyEiAKBWxpbWl0GAUgASgDQgr6QgciBRjoBygAUgVsaW1pdBIfCgZvZmZzZXQYBiABKANCB/pCBCICKABSBm9mZnNldCKmAQoeUXVlcnlUb2tlblRyYW5zYWN0aW9uc1Jlc3BvbnNlEmwKHnRva2VuX3RyYW5zYWN0aW9uc193aXRoX3N0YXR1cxgBIAMoCzInLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25XaXRoU3RhdHVzUht0b2tlblRyYW5zYWN0aW9uc1dpdGhTdGF0dXMSFgoGb2Zmc2V0GAIgASgDUgZvZmZzZXQi1gEKIU91dHB1dFdpdGhQcmV2aW91c1RyYW5zYWN0aW9uRGF0YRIwCgZvdXRwdXQYASABKAsyGC5zcGFya190b2tlbi5Ub2tlbk91dHB1dFIGb3V0cHV0EkMKGXByZXZpb3VzX3RyYW5zYWN0aW9uX2hhc2gYAiABKAxCB/pCBHoCaCBSF3ByZXZpb3VzVHJhbnNhY3Rpb25IYXNoEjoKGXByZXZpb3VzX3RyYW5zYWN0aW9uX3ZvdXQYAyABKA1SF3ByZXZpb3VzVHJhbnNhY3Rpb25Wb3V0ItoBChlRdWVyeVRva2VuT3V0cHV0c1Jlc3BvbnNlEoIBCiZvdXRwdXRzX3dpdGhfcHJldmlvdXNfdHJhbnNhY3Rpb25fZGF0YRgBIAMoCzIuLnNwYXJrX3Rva2VuLk91dHB1dFdpdGhQcmV2aW91c1RyYW5zYWN0aW9uRGF0YVIib3V0cHV0c1dpdGhQcmV2aW91c1RyYW5zYWN0aW9uRGF0YRI4Cg1wYWdlX3Jlc3BvbnNlGAIgASgLMhMuc3BhcmsuUGFnZVJlc3BvbnNlUgxwYWdlUmVzcG9uc2UiZAoYU3BlbnRUb2tlbk91dHB1dE1ldGFkYXRhEhsKCW91dHB1dF9pZBgBIAEoCVIIb3V0cHV0SWQSKwoRcmV2b2NhdGlvbl9zZWNyZXQYAiABKAxSEHJldm9jYXRpb25TZWNyZXQijgEKJFRva2VuVHJhbnNhY3Rpb25Db25maXJtYXRpb25NZXRhZGF0YRJmChxzcGVudF90b2tlbl9vdXRwdXRzX21ldGFkYXRhGAEgAygLMiUuc3BhcmtfdG9rZW4uU3BlbnRUb2tlbk91dHB1dE1ldGFkYXRhUhlzcGVudFRva2VuT3V0cHV0c01ldGFkYXRhIswCChpUb2tlblRyYW5zYWN0aW9uV2l0aFN0YXR1cxJKChF0b2tlbl90cmFuc2FjdGlvbhgBIAEoCzIdLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25SEHRva2VuVHJhbnNhY3Rpb24SOwoGc3RhdHVzGAIgASgOMiMuc3BhcmtfdG9rZW4uVG9rZW5UcmFuc2FjdGlvblN0YXR1c1IGc3RhdHVzEmYKFWNvbmZpcm1hdGlvbl9tZXRhZGF0YRgDIAEoCzIxLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25Db25maXJtYXRpb25NZXRhZGF0YVIUY29uZmlybWF0aW9uTWV0YWRhdGESPQoWdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgEIAEoDEIH+kIEegJoIFIUdG9rZW5UcmFuc2FjdGlvbkhhc2girAMKE0ZyZWV6ZVRva2Vuc1BheWxvYWQSGAoHdmVyc2lvbhgBIAEoDVIHdmVyc2lvbhIxChBvd25lcl9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRI2ChB0b2tlbl9wdWJsaWNfa2V5GAMgASgMQgf6QgR6AmghSABSDnRva2VuUHVibGljS2V5iAEBEjcKEHRva2VuX2lkZW50aWZpZXIYBCABKAxCB/pCBHoCaCBIAVIPdG9rZW5JZGVudGlmaWVyiAEBEjoKGWlzc3Vlcl9wcm92aWRlZF90aW1lc3RhbXAYBSABKARSF2lzc3VlclByb3ZpZGVkVGltZXN0YW1wEkgKHG9wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXkYBiABKAxCB/pCBHoCaCFSGW9wZXJhdG9ySWRlbnRpdHlQdWJsaWNLZXkSJwoPc2hvdWxkX3VuZnJlZXplGAcgASgIUg5zaG91bGRVbmZyZWV6ZUITChFfdG9rZW5fcHVibGljX2tleUITChFfdG9rZW5faWRlbnRpZmllciKhAQoTRnJlZXplVG9rZW5zUmVxdWVzdBJUChVmcmVlemVfdG9rZW5zX3BheWxvYWQYASABKAsyIC5zcGFya190b2tlbi5GcmVlemVUb2tlbnNQYXlsb2FkUhNmcmVlemVUb2tlbnNQYXlsb2FkEjQKEGlzc3Vlcl9zaWduYXR1cmUYAiABKAxCCfpCBnoEEEAYSVIPaXNzdWVyU2lnbmF0dXJlIokBChRGcmVlemVUb2tlbnNSZXNwb25zZRI9ChNpbXBhY3RlZF9vdXRwdXRfaWRzGAEgAygJQg36QgqSAQciBXIDsAEBUhFpbXBhY3RlZE91dHB1dElkcxIyChVpbXBhY3RlZF90b2tlbl9hbW91bnQYAiABKAxSE2ltcGFjdGVkVG9rZW5BbW91bnQqpwEKFFRva2VuVHJhbnNhY3Rpb25UeXBlEiYKIlRPS0VOX1RSQU5TQUNUSU9OX1RZUEVfVU5TUEVDSUZJRUQQABIhCh1UT0tFTl9UUkFOU0FDVElPTl9UWVBFX0NSRUFURRABEh8KG1RPS0VOX1RSQU5TQUNUSU9OX1RZUEVfTUlOVBACEiMKH1RPS0VOX1RSQU5TQUNUSU9OX1RZUEVfVFJBTlNGRVIQAypTCgxDb21taXRTdGF0dXMSFgoSQ09NTUlUX1VOU1BFQ0lGSUVEEAASFQoRQ09NTUlUX1BST0NFU1NJTkcQARIUChBDT01NSVRfRklOQUxJWkVEEAIqhgIKFlRva2VuVHJhbnNhY3Rpb25TdGF0dXMSHQoZVE9LRU5fVFJBTlNBQ1RJT05fU1RBUlRFRBAAEhwKGFRPS0VOX1RSQU5TQUNUSU9OX1NJR05FRBABEh4KGlRPS0VOX1RSQU5TQUNUSU9OX1JFVkVBTEVEEAUSHwobVE9LRU5fVFJBTlNBQ1RJT05fRklOQUxJWkVEEAISJwojVE9LRU5fVFJBTlNBQ1RJT05fU1RBUlRFRF9DQU5DRUxMRUQQAxImCiJUT0tFTl9UUkFOU0FDVElPTl9TSUdORURfQ0FOQ0VMTEVEEAQSHQoZVE9LRU5fVFJBTlNBQ1RJT05fVU5LTk9XThAKMvAFChFTcGFya1Rva2VuU2VydmljZRJiChFzdGFydF90cmFuc2FjdGlvbhIkLnNwYXJrX3Rva2VuLlN0YXJ0VHJhbnNhY3Rpb25SZXF1ZXN0GiUuc3BhcmtfdG9rZW4uU3RhcnRUcmFuc2FjdGlvblJlc3BvbnNlIgASZQoSY29tbWl0X3RyYW5zYWN0aW9uEiUuc3BhcmtfdG9rZW4uQ29tbWl0VHJhbnNhY3Rpb25SZXF1ZXN0GiYuc3BhcmtfdG9rZW4uQ29tbWl0VHJhbnNhY3Rpb25SZXNwb25zZSIAEmkKFHF1ZXJ5X3Rva2VuX21ldGFkYXRhEiYuc3BhcmtfdG9rZW4uUXVlcnlUb2tlbk1ldGFkYXRhUmVxdWVzdBonLnNwYXJrX3Rva2VuLlF1ZXJ5VG9rZW5NZXRhZGF0YVJlc3BvbnNlIgASdQoYcXVlcnlfdG9rZW5fdHJhbnNhY3Rpb25zEiouc3BhcmtfdG9rZW4uUXVlcnlUb2tlblRyYW5zYWN0aW9uc1JlcXVlc3QaKy5zcGFya190b2tlbi5RdWVyeVRva2VuVHJhbnNhY3Rpb25zUmVzcG9uc2UiABJmChNxdWVyeV90b2tlbl9vdXRwdXRzEiUuc3BhcmtfdG9rZW4uUXVlcnlUb2tlbk91dHB1dHNSZXF1ZXN0GiYuc3BhcmtfdG9rZW4uUXVlcnlUb2tlbk91dHB1dHNSZXNwb25zZSIAElYKDWZyZWV6ZV90b2tlbnMSIC5zcGFya190b2tlbi5GcmVlemVUb2tlbnNSZXF1ZXN0GiEuc3BhcmtfdG9rZW4uRnJlZXplVG9rZW5zUmVzcG9uc2UiABJuChVicm9hZGNhc3RfdHJhbnNhY3Rpb24SKC5zcGFya190b2tlbi5Ccm9hZGNhc3RUcmFuc2FjdGlvblJlcXVlc3QaKS5zcGFya190b2tlbi5Ccm9hZGNhc3RUcmFuc2FjdGlvblJlc3BvbnNlIgBCMlowZ2l0aHViLmNvbS9saWdodHNwYXJrZGV2L3NwYXJrL3Byb3RvL3NwYXJrX3Rva2VuYgZwcm90bzMKpQQKCm1vY2sucHJvdG8SBG1vY2saG2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90byJAChtDbGVhblVwUHJlaW1hZ2VTaGFyZVJlcXVlc3QSIQoMcGF5bWVudF9oYXNoGAEgASgMUgtwYXltZW50SGFzaCJNChhVcGRhdGVOb2Rlc1N0YXR1c1JlcXVlc3QSGQoIbm9kZV9pZHMYASADKAlSB25vZGVJZHMSFgoGc3RhdHVzGAIgASgJUgZzdGF0dXMiMQoSVHJpZ2dlclRhc2tSZXF1ZXN0EhsKCXRhc2tfbmFtZRgBIAEoCVIIdGFza05hbWUy+gEKC01vY2tTZXJ2aWNlElYKF2NsZWFuX3VwX3ByZWltYWdlX3NoYXJlEiEubW9jay5DbGVhblVwUHJlaW1hZ2VTaGFyZVJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiABJPChN1cGRhdGVfbm9kZXNfc3RhdHVzEh4ubW9jay5VcGRhdGVOb2Rlc1N0YXR1c1JlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiABJCCgx0cmlnZ2VyX3Rhc2sSGC5tb2NrLlRyaWdnZXJUYXNrUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSIAQitaKWdpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9tb2NrYgZwcm90bzMK6gcKEXNwYXJrX2F1dGhuLnByb3RvEgtzcGFya19hdXRobiJ4CglDaGFsbGVuZ2USGAoHdmVyc2lvbhgBIAEoBVIHdmVyc2lvbhIcCgl0aW1lc3RhbXAYAiABKANSCXRpbWVzdGFtcBIUCgVub25jZRgDIAEoDFIFbm9uY2USHQoKcHVibGljX2tleRgEIAEoDFIJcHVibGljS2V5IoUBChJQcm90ZWN0ZWRDaGFsbGVuZ2USGAoHdmVyc2lvbhgBIAEoBVIHdmVyc2lvbhI0CgljaGFsbGVuZ2UYAiABKAsyFi5zcGFya19hdXRobi5DaGFsbGVuZ2VSCWNoYWxsZW5nZRIfCgtzZXJ2ZXJfaG1hYxgDIAEoDFIKc2VydmVySG1hYyI0ChNHZXRDaGFsbGVuZ2VSZXF1ZXN0Eh0KCnB1YmxpY19rZXkYASABKAxSCXB1YmxpY0tleSJoChRHZXRDaGFsbGVuZ2VSZXNwb25zZRJQChNwcm90ZWN0ZWRfY2hhbGxlbmdlGAEgASgLMh8uc3BhcmtfYXV0aG4uUHJvdGVjdGVkQ2hhbGxlbmdlUhJwcm90ZWN0ZWRDaGFsbGVuZ2UipwEKFlZlcmlmeUNoYWxsZW5nZVJlcXVlc3QSUAoTcHJvdGVjdGVkX2NoYWxsZW5nZRgBIAEoCzIfLnNwYXJrX2F1dGhuLlByb3RlY3RlZENoYWxsZW5nZVIScHJvdGVjdGVkQ2hhbGxlbmdlEhwKCXNpZ25hdHVyZRgCIAEoDFIJc2lnbmF0dXJlEh0KCnB1YmxpY19rZXkYAyABKAxSCXB1YmxpY0tleSJxChdWZXJpZnlDaGFsbGVuZ2VSZXNwb25zZRIjCg1zZXNzaW9uX3Rva2VuGAEgASgJUgxzZXNzaW9uVG9rZW4SMQoUZXhwaXJhdGlvbl90aW1lc3RhbXAYAiABKANSE2V4cGlyYXRpb25UaW1lc3RhbXAyzAEKEVNwYXJrQXV0aG5TZXJ2aWNlElYKDWdldF9jaGFsbGVuZ2USIC5zcGFya19hdXRobi5HZXRDaGFsbGVuZ2VSZXF1ZXN0GiEuc3BhcmtfYXV0aG4uR2V0Q2hhbGxlbmdlUmVzcG9uc2UiABJfChB2ZXJpZnlfY2hhbGxlbmdlEiMuc3BhcmtfYXV0aG4uVmVyaWZ5Q2hhbGxlbmdlUmVxdWVzdBokLnNwYXJrX2F1dGhuLlZlcmlmeUNoYWxsZW5nZVJlc3BvbnNlIgBCMlowZ2l0aHViLmNvbS9saWdodHNwYXJrZGV2L3NwYXJrL3Byb3RvL3NwYXJrX2F1dGhuYgZwcm90bzM=";
|
|
8878
|
+
var SPARK_DESCRIPTORS_BASE64 = "Cv8BCh9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvEg9nb29nbGUucHJvdG9idWYiOwoJVGltZXN0YW1wEhgKB3NlY29uZHMYASABKANSB3NlY29uZHMSFAoFbmFub3MYAiABKAVSBW5hbm9zQoUBChNjb20uZ29vZ2xlLnByb3RvYnVmQg5UaW1lc3RhbXBQcm90b1ABWjJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi90aW1lc3RhbXBwYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCr4BChtnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIHCgVFbXB0eUJ9ChNjb20uZ29vZ2xlLnByb3RvYnVmQgpFbXB0eVByb3RvUAFaLmdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2VtcHR5cGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMwqIYAogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiJbChFGaWxlRGVzY3JpcHRvclNldBI4CgRmaWxlGAEgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG9SBGZpbGUqDAiA7Mr/ARCB7Mr/ASKYBQoTRmlsZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhgKB3BhY2thZ2UYAiABKAlSB3BhY2thZ2USHgoKZGVwZW5kZW5jeRgDIAMoCVIKZGVwZW5kZW5jeRIrChFwdWJsaWNfZGVwZW5kZW5jeRgKIAMoBVIQcHVibGljRGVwZW5kZW5jeRInCg93ZWFrX2RlcGVuZGVuY3kYCyADKAVSDndlYWtEZXBlbmRlbmN5EkMKDG1lc3NhZ2VfdHlwZRgEIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SC21lc3NhZ2VUeXBlEkEKCWVudW1fdHlwZRgFIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJBCgdzZXJ2aWNlGAYgAygLMicuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9SB3NlcnZpY2USQwoJZXh0ZW5zaW9uGAcgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SNgoHb3B0aW9ucxgIIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1IHb3B0aW9ucxJJChBzb3VyY2VfY29kZV9pbmZvGAkgASgLMh8uZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvUg5zb3VyY2VDb2RlSW5mbxIWCgZzeW50YXgYDCABKAlSBnN5bnRheBIyCgdlZGl0aW9uGA4gASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SB2VkaXRpb24iuQYKD0Rlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjsKBWZpZWxkGAIgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUgVmaWVsZBJDCglleHRlbnNpb24YBiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhJBCgtuZXN0ZWRfdHlwZRgDIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SCm5lc3RlZFR5cGUSQQoJZW51bV90eXBlGAQgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlElgKD2V4dGVuc2lvbl9yYW5nZRgFIAMoCzIvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2VSDmV4dGVuc2lvblJhbmdlEkQKCm9uZW9mX2RlY2wYCCADKAsyJS5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG9SCW9uZW9mRGVjbBI5CgdvcHRpb25zGAcgASgLMh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zUgdvcHRpb25zElUKDnJlc2VydmVkX3JhbmdlGAkgAygLMi4uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYCiADKAlSDHJlc2VydmVkTmFtZRp6Cg5FeHRlbnNpb25SYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQSQAoHb3B0aW9ucxgDIAEoCzImLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnNSB29wdGlvbnMaNwoNUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQizAQKFUV4dGVuc2lvblJhbmdlT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbhJZCgtkZWNsYXJhdGlvbhgCIAMoCzIyLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuRGVjbGFyYXRpb25CA4gBAlILZGVjbGFyYXRpb24SNwoIZmVhdHVyZXMYMiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSbQoMdmVyaWZpY2F0aW9uGAMgASgOMjguZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5WZXJpZmljYXRpb25TdGF0ZToKVU5WRVJJRklFREIDiAECUgx2ZXJpZmljYXRpb24alAEKC0RlY2xhcmF0aW9uEhYKBm51bWJlchgBIAEoBVIGbnVtYmVyEhsKCWZ1bGxfbmFtZRgCIAEoCVIIZnVsbE5hbWUSEgoEdHlwZRgDIAEoCVIEdHlwZRIaCghyZXNlcnZlZBgFIAEoCFIIcmVzZXJ2ZWQSGgoIcmVwZWF0ZWQYBiABKAhSCHJlcGVhdGVkSgQIBBAFIjQKEVZlcmlmaWNhdGlvblN0YXRlEg8KC0RFQ0xBUkFUSU9OEAASDgoKVU5WRVJJRklFRBABKgkI6AcQgICAgAIiwQYKFEZpZWxkRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAMgASgFUgZudW1iZXISQQoFbGFiZWwYBCABKA4yKy5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWxSBWxhYmVsEj4KBHR5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZVIEdHlwZRIbCgl0eXBlX25hbWUYBiABKAlSCHR5cGVOYW1lEhoKCGV4dGVuZGVlGAIgASgJUghleHRlbmRlZRIjCg1kZWZhdWx0X3ZhbHVlGAcgASgJUgxkZWZhdWx0VmFsdWUSHwoLb25lb2ZfaW5kZXgYCSABKAVSCm9uZW9mSW5kZXgSGwoJanNvbl9uYW1lGAogASgJUghqc29uTmFtZRI3CgdvcHRpb25zGAggASgLMh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9uc1IHb3B0aW9ucxInCg9wcm90bzNfb3B0aW9uYWwYESABKAhSDnByb3RvM09wdGlvbmFsIrYCCgRUeXBlEg8KC1RZUEVfRE9VQkxFEAESDgoKVFlQRV9GTE9BVBACEg4KClRZUEVfSU5UNjQQAxIPCgtUWVBFX1VJTlQ2NBAEEg4KClRZUEVfSU5UMzIQBRIQCgxUWVBFX0ZJWEVENjQQBhIQCgxUWVBFX0ZJWEVEMzIQBxINCglUWVBFX0JPT0wQCBIPCgtUWVBFX1NUUklORxAJEg4KClRZUEVfR1JPVVAQChIQCgxUWVBFX01FU1NBR0UQCxIOCgpUWVBFX0JZVEVTEAwSDwoLVFlQRV9VSU5UMzIQDRINCglUWVBFX0VOVU0QDhIRCg1UWVBFX1NGSVhFRDMyEA8SEQoNVFlQRV9TRklYRUQ2NBAQEg8KC1RZUEVfU0lOVDMyEBESDwoLVFlQRV9TSU5UNjQQEiJDCgVMYWJlbBISCg5MQUJFTF9PUFRJT05BTBABEhIKDkxBQkVMX1JFUEVBVEVEEAMSEgoOTEFCRUxfUkVRVUlSRUQQAiJjChRPbmVvZkRlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjcKB29wdGlvbnMYAiABKAsyHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zUgdvcHRpb25zIuMCChNFbnVtRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPwoFdmFsdWUYAiADKAsyKS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvUgV2YWx1ZRI2CgdvcHRpb25zGAMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zUgdvcHRpb25zEl0KDnJlc2VydmVkX3JhbmdlGAQgAygLMjYuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2VSDXJlc2VydmVkUmFuZ2USIwoNcmVzZXJ2ZWRfbmFtZRgFIAMoCVIMcmVzZXJ2ZWROYW1lGjsKEUVudW1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKDAQoYRW51bVZhbHVlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAIgASgFUgZudW1iZXISOwoHb3B0aW9ucxgDIAEoCzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zUgdvcHRpb25zIqcBChZTZXJ2aWNlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPgoGbWV0aG9kGAIgAygLMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1IGbWV0aG9kEjkKB29wdGlvbnMYAyABKAsyHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnNSB29wdGlvbnMiiQIKFU1ldGhvZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEh0KCmlucHV0X3R5cGUYAiABKAlSCWlucHV0VHlwZRIfCgtvdXRwdXRfdHlwZRgDIAEoCVIKb3V0cHV0VHlwZRI4CgdvcHRpb25zGAQgASgLMh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNSB29wdGlvbnMSMAoQY2xpZW50X3N0cmVhbWluZxgFIAEoCDoFZmFsc2VSD2NsaWVudFN0cmVhbWluZxIwChBzZXJ2ZXJfc3RyZWFtaW5nGAYgASgIOgVmYWxzZVIPc2VydmVyU3RyZWFtaW5nIq0JCgtGaWxlT3B0aW9ucxIhCgxqYXZhX3BhY2thZ2UYASABKAlSC2phdmFQYWNrYWdlEjAKFGphdmFfb3V0ZXJfY2xhc3NuYW1lGAggASgJUhJqYXZhT3V0ZXJDbGFzc25hbWUSNQoTamF2YV9tdWx0aXBsZV9maWxlcxgKIAEoCDoFZmFsc2VSEWphdmFNdWx0aXBsZUZpbGVzEkQKHWphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoGBQgASgIQgIYAVIZamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaBI6ChZqYXZhX3N0cmluZ19jaGVja191dGY4GBsgASgIOgVmYWxzZVITamF2YVN0cmluZ0NoZWNrVXRmOBJTCgxvcHRpbWl6ZV9mb3IYCSABKA4yKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlOgVTUEVFRFILb3B0aW1pemVGb3ISHQoKZ29fcGFja2FnZRgLIAEoCVIJZ29QYWNrYWdlEjUKE2NjX2dlbmVyaWNfc2VydmljZXMYECABKAg6BWZhbHNlUhFjY0dlbmVyaWNTZXJ2aWNlcxI5ChVqYXZhX2dlbmVyaWNfc2VydmljZXMYESABKAg6BWZhbHNlUhNqYXZhR2VuZXJpY1NlcnZpY2VzEjUKE3B5X2dlbmVyaWNfc2VydmljZXMYEiABKAg6BWZhbHNlUhFweUdlbmVyaWNTZXJ2aWNlcxIlCgpkZXByZWNhdGVkGBcgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIuChBjY19lbmFibGVfYXJlbmFzGB8gASgIOgR0cnVlUg5jY0VuYWJsZUFyZW5hcxIqChFvYmpjX2NsYXNzX3ByZWZpeBgkIAEoCVIPb2JqY0NsYXNzUHJlZml4EikKEGNzaGFycF9uYW1lc3BhY2UYJSABKAlSD2NzaGFycE5hbWVzcGFjZRIhCgxzd2lmdF9wcmVmaXgYJyABKAlSC3N3aWZ0UHJlZml4EigKEHBocF9jbGFzc19wcmVmaXgYKCABKAlSDnBocENsYXNzUHJlZml4EiMKDXBocF9uYW1lc3BhY2UYKSABKAlSDHBocE5hbWVzcGFjZRI0ChZwaHBfbWV0YWRhdGFfbmFtZXNwYWNlGCwgASgJUhRwaHBNZXRhZGF0YU5hbWVzcGFjZRIhCgxydWJ5X3BhY2thZ2UYLSABKAlSC3J1YnlQYWNrYWdlEjcKCGZlYXR1cmVzGDIgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIjoKDE9wdGltaXplTW9kZRIJCgVTUEVFRBABEg0KCUNPREVfU0laRRACEhAKDExJVEVfUlVOVElNRRADKgkI6AcQgICAgAJKBAgqECtKBAgmECdSFHBocF9nZW5lcmljX3NlcnZpY2VzIvQDCg5NZXNzYWdlT3B0aW9ucxI8ChdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdBgBIAEoCDoFZmFsc2VSFG1lc3NhZ2VTZXRXaXJlRm9ybWF0EkwKH25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IYAiABKAg6BWZhbHNlUhxub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhsKCW1hcF9lbnRyeRgHIAEoCFIIbWFwRW50cnkSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYCyABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAwgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgEEAVKBAgFEAZKBAgGEAdKBAgIEAlKBAgJEAoinQ0KDEZpZWxkT3B0aW9ucxJBCgVjdHlwZRgBIAEoDjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGU6BlNUUklOR1IFY3R5cGUSFgoGcGFja2VkGAIgASgIUgZwYWNrZWQSRwoGanN0eXBlGAYgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6CUpTX05PUk1BTFIGanN0eXBlEhkKBGxhenkYBSABKAg6BWZhbHNlUgRsYXp5Ei4KD3VudmVyaWZpZWRfbGF6eRgPIAEoCDoFZmFsc2VSDnVudmVyaWZpZWRMYXp5EiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhkKBHdlYWsYCiABKAg6BWZhbHNlUgR3ZWFrEigKDGRlYnVnX3JlZGFjdBgQIAEoCDoFZmFsc2VSC2RlYnVnUmVkYWN0EksKCXJldGVudGlvbhgRIAEoDjItLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uUmV0ZW50aW9uUglyZXRlbnRpb24SSAoHdGFyZ2V0cxgTIAMoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZVIHdGFyZ2V0cxJXChBlZGl0aW9uX2RlZmF1bHRzGBQgAygLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5FZGl0aW9uRGVmYXVsdFIPZWRpdGlvbkRlZmF1bHRzEjcKCGZlYXR1cmVzGBUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElUKD2ZlYXR1cmVfc3VwcG9ydBgWIAEoCzIsLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuRmVhdHVyZVN1cHBvcnRSDmZlYXR1cmVTdXBwb3J0ElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uGloKDkVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhIUCgV2YWx1ZRgCIAEoCVIFdmFsdWUalgIKDkZlYXR1cmVTdXBwb3J0EkcKEmVkaXRpb25faW50cm9kdWNlZBgBIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUhFlZGl0aW9uSW50cm9kdWNlZBJHChJlZGl0aW9uX2RlcHJlY2F0ZWQYAiABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIRZWRpdGlvbkRlcHJlY2F0ZWQSLwoTZGVwcmVjYXRpb25fd2FybmluZxgDIAEoCVISZGVwcmVjYXRpb25XYXJuaW5nEkEKD2VkaXRpb25fcmVtb3ZlZBgEIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5lZGl0aW9uUmVtb3ZlZCIvCgVDVHlwZRIKCgZTVFJJTkcQABIICgRDT1JEEAESEAoMU1RSSU5HX1BJRUNFEAIiNQoGSlNUeXBlEg0KCUpTX05PUk1BTBAAEg0KCUpTX1NUUklORxABEg0KCUpTX05VTUJFUhACIlUKD09wdGlvblJldGVudGlvbhIVChFSRVRFTlRJT05fVU5LTk9XThAAEhUKEVJFVEVOVElPTl9SVU5USU1FEAESFAoQUkVURU5USU9OX1NPVVJDRRACIowCChBPcHRpb25UYXJnZXRUeXBlEhcKE1RBUkdFVF9UWVBFX1VOS05PV04QABIUChBUQVJHRVRfVFlQRV9GSUxFEAESHwobVEFSR0VUX1RZUEVfRVhURU5TSU9OX1JBTkdFEAISFwoTVEFSR0VUX1RZUEVfTUVTU0FHRRADEhUKEVRBUkdFVF9UWVBFX0ZJRUxEEAQSFQoRVEFSR0VUX1RZUEVfT05FT0YQBRIUChBUQVJHRVRfVFlQRV9FTlVNEAYSGgoWVEFSR0VUX1RZUEVfRU5VTV9FTlRSWRAHEhcKE1RBUkdFVF9UWVBFX1NFUlZJQ0UQCBIWChJUQVJHRVRfVFlQRV9NRVRIT0QQCSoJCOgHEICAgIACSgQIBBAFSgQIEhATIqwBCgxPbmVvZk9wdGlvbnMSNwoIZmVhdHVyZXMYASABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLRAgoLRW51bU9wdGlvbnMSHwoLYWxsb3dfYWxpYXMYAiABKAhSCmFsbG93QWxpYXMSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYBiABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgFEAYi2AIKEEVudW1WYWx1ZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBgBIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSNwoIZmVhdHVyZXMYAiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSKAoMZGVidWdfcmVkYWN0GAMgASgIOgVmYWxzZVILZGVidWdSZWRhY3QSVQoPZmVhdHVyZV9zdXBwb3J0GAQgASgLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5GZWF0dXJlU3VwcG9ydFIOZmVhdHVyZVN1cHBvcnQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLVAQoOU2VydmljZU9wdGlvbnMSNwoIZmVhdHVyZXMYIiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKZAwoNTWV0aG9kT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJxChFpZGVtcG90ZW5jeV9sZXZlbBgiIAEoDjIvLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLklkZW1wb3RlbmN5TGV2ZWw6E0lERU1QT1RFTkNZX1VOS05PV05SEGlkZW1wb3RlbmN5TGV2ZWwSNwoIZmVhdHVyZXMYIyABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iUAoQSWRlbXBvdGVuY3lMZXZlbBIXChNJREVNUE9URU5DWV9VTktOT1dOEAASEwoPTk9fU0lERV9FRkZFQ1RTEAESDgoKSURFTVBPVEVOVBACKgkI6AcQgICAgAIimgMKE1VuaW50ZXJwcmV0ZWRPcHRpb24SQQoEbmFtZRgCIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0UgRuYW1lEikKEGlkZW50aWZpZXJfdmFsdWUYAyABKAlSD2lkZW50aWZpZXJWYWx1ZRIsChJwb3NpdGl2ZV9pbnRfdmFsdWUYBCABKARSEHBvc2l0aXZlSW50VmFsdWUSLAoSbmVnYXRpdmVfaW50X3ZhbHVlGAUgASgDUhBuZWdhdGl2ZUludFZhbHVlEiEKDGRvdWJsZV92YWx1ZRgGIAEoAVILZG91YmxlVmFsdWUSIQoMc3RyaW5nX3ZhbHVlGAcgASgMUgtzdHJpbmdWYWx1ZRInCg9hZ2dyZWdhdGVfdmFsdWUYCCABKAlSDmFnZ3JlZ2F0ZVZhbHVlGkoKCE5hbWVQYXJ0EhsKCW5hbWVfcGFydBgBIAIoCVIIbmFtZVBhcnQSIQoMaXNfZXh0ZW5zaW9uGAIgAigIUgtpc0V4dGVuc2lvbiKnCgoKRmVhdHVyZVNldBKRAQoOZmllbGRfcHJlc2VuY2UYASABKA4yKS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5GaWVsZFByZXNlbmNlQj+IAQGYAQSYAQGiAQ0SCEVYUExJQ0lUGIQHogENEghJTVBMSUNJVBjnB6IBDRIIRVhQTElDSVQY6AeyAQMI6AdSDWZpZWxkUHJlc2VuY2USbAoJZW51bV90eXBlGAIgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuRW51bVR5cGVCKYgBAZgBBpgBAaIBCxIGQ0xPU0VEGIQHogEJEgRPUEVOGOcHsgEDCOgHUghlbnVtVHlwZRKYAQoXcmVwZWF0ZWRfZmllbGRfZW5jb2RpbmcYAyABKA4yMS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5SZXBlYXRlZEZpZWxkRW5jb2RpbmdCLYgBAZgBBJgBAaIBDRIIRVhQQU5ERUQYhAeiAQsSBlBBQ0tFRBjnB7IBAwjoB1IVcmVwZWF0ZWRGaWVsZEVuY29kaW5nEn4KD3V0ZjhfdmFsaWRhdGlvbhgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LlV0ZjhWYWxpZGF0aW9uQimIAQGYAQSYAQGiAQkSBE5PTkUYhAeiAQsSBlZFUklGWRjnB7IBAwjoB1IOdXRmOFZhbGlkYXRpb24SfgoQbWVzc2FnZV9lbmNvZGluZxgFIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0Lk1lc3NhZ2VFbmNvZGluZ0ImiAEBmAEEmAEBogEUEg9MRU5HVEhfUFJFRklYRUQYhAeyAQMI6AdSD21lc3NhZ2VFbmNvZGluZxKCAQoLanNvbl9mb3JtYXQYBiABKA4yJi5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5Kc29uRm9ybWF0QjmIAQGYAQOYAQaYAQGiARcSEkxFR0FDWV9CRVNUX0VGRk9SVBiEB6IBChIFQUxMT1cY5weyAQMI6AdSCmpzb25Gb3JtYXQiXAoNRmllbGRQcmVzZW5jZRIaChZGSUVMRF9QUkVTRU5DRV9VTktOT1dOEAASDAoIRVhQTElDSVQQARIMCghJTVBMSUNJVBACEhMKD0xFR0FDWV9SRVFVSVJFRBADIjcKCEVudW1UeXBlEhUKEUVOVU1fVFlQRV9VTktOT1dOEAASCAoET1BFThABEgoKBkNMT1NFRBACIlYKFVJlcGVhdGVkRmllbGRFbmNvZGluZxIjCh9SRVBFQVRFRF9GSUVMRF9FTkNPRElOR19VTktOT1dOEAASCgoGUEFDS0VEEAESDAoIRVhQQU5ERUQQAiJJCg5VdGY4VmFsaWRhdGlvbhIbChdVVEY4X1ZBTElEQVRJT05fVU5LTk9XThAAEgoKBlZFUklGWRACEggKBE5PTkUQAyIECAEQASJTCg9NZXNzYWdlRW5jb2RpbmcSHAoYTUVTU0FHRV9FTkNPRElOR19VTktOT1dOEAASEwoPTEVOR1RIX1BSRUZJWEVEEAESDQoJREVMSU1JVEVEEAIiSAoKSnNvbkZvcm1hdBIXChNKU09OX0ZPUk1BVF9VTktOT1dOEAASCQoFQUxMT1cQARIWChJMRUdBQ1lfQkVTVF9FRkZPUlQQAioGCOgHEItOKgYIi04QkE4qBgiQThCRTkoGCOcHEOgHIu8DChJGZWF0dXJlU2V0RGVmYXVsdHMSWAoIZGVmYXVsdHMYASADKAsyPC5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldERlZmF1bHRzLkZlYXR1cmVTZXRFZGl0aW9uRGVmYXVsdFIIZGVmYXVsdHMSQQoPbWluaW11bV9lZGl0aW9uGAQgASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SDm1pbmltdW1FZGl0aW9uEkEKD21heGltdW1fZWRpdGlvbhgFIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5tYXhpbXVtRWRpdGlvbhr4AQoYRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhJOChRvdmVycmlkYWJsZV9mZWF0dXJlcxgEIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UhNvdmVycmlkYWJsZUZlYXR1cmVzEkIKDmZpeGVkX2ZlYXR1cmVzGAUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSDWZpeGVkRmVhdHVyZXNKBAgBEAJKBAgCEANSCGZlYXR1cmVzIrUCCg5Tb3VyY2VDb2RlSW5mbxJECghsb2NhdGlvbhgBIAMoCzIoLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblIIbG9jYXRpb24azgEKCExvY2F0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEhYKBHNwYW4YAiADKAVCAhABUgRzcGFuEikKEGxlYWRpbmdfY29tbWVudHMYAyABKAlSD2xlYWRpbmdDb21tZW50cxIrChF0cmFpbGluZ19jb21tZW50cxgEIAEoCVIQdHJhaWxpbmdDb21tZW50cxI6ChlsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzGAYgAygJUhdsZWFkaW5nRGV0YWNoZWRDb21tZW50cyoMCIDsyv8BEIHsyv8BItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACKqcCCgdFZGl0aW9uEhMKD0VESVRJT05fVU5LTk9XThAAEhMKDkVESVRJT05fTEVHQUNZEIQHEhMKDkVESVRJT05fUFJPVE8yEOYHEhMKDkVESVRJT05fUFJPVE8zEOcHEhEKDEVESVRJT05fMjAyMxDoBxIRCgxFRElUSU9OXzIwMjQQ6QcSFwoTRURJVElPTl8xX1RFU1RfT05MWRABEhcKE0VESVRJT05fMl9URVNUX09OTFkQAhIdChdFRElUSU9OXzk5OTk3X1RFU1RfT05MWRCdjQYSHQoXRURJVElPTl85OTk5OF9URVNUX09OTFkQno0GEh0KF0VESVRJT05fOTk5OTlfVEVTVF9PTkxZEJ+NBhITCgtFRElUSU9OX01BWBD/////B0J+ChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9yUHJvdG9zSAFaLWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rlc2NyaXB0b3JwYvgBAaICA0dQQqoCGkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCvsBCh5nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiI6CghEdXJhdGlvbhIYCgdzZWNvbmRzGAEgASgDUgdzZWNvbmRzEhQKBW5hbm9zGAIgASgFUgVuYW5vc0KDAQoTY29tLmdvb2dsZS5wcm90b2J1ZkINRHVyYXRpb25Qcm90b1ABWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9kdXJhdGlvbnBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKrzEKF3ZhbGlkYXRlL3ZhbGlkYXRlLnByb3RvEgh2YWxpZGF0ZRogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90bxofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byLICAoKRmllbGRSdWxlcxIwCgdtZXNzYWdlGBEgASgLMhYudmFsaWRhdGUuTWVzc2FnZVJ1bGVzUgdtZXNzYWdlEiwKBWZsb2F0GAEgASgLMhQudmFsaWRhdGUuRmxvYXRSdWxlc0gAUgVmbG9hdBIvCgZkb3VibGUYAiABKAsyFS52YWxpZGF0ZS5Eb3VibGVSdWxlc0gAUgZkb3VibGUSLAoFaW50MzIYAyABKAsyFC52YWxpZGF0ZS5JbnQzMlJ1bGVzSABSBWludDMyEiwKBWludDY0GAQgASgLMhQudmFsaWRhdGUuSW50NjRSdWxlc0gAUgVpbnQ2NBIvCgZ1aW50MzIYBSABKAsyFS52YWxpZGF0ZS5VSW50MzJSdWxlc0gAUgZ1aW50MzISLwoGdWludDY0GAYgASgLMhUudmFsaWRhdGUuVUludDY0UnVsZXNIAFIGdWludDY0Ei8KBnNpbnQzMhgHIAEoCzIVLnZhbGlkYXRlLlNJbnQzMlJ1bGVzSABSBnNpbnQzMhIvCgZzaW50NjQYCCABKAsyFS52YWxpZGF0ZS5TSW50NjRSdWxlc0gAUgZzaW50NjQSMgoHZml4ZWQzMhgJIAEoCzIWLnZhbGlkYXRlLkZpeGVkMzJSdWxlc0gAUgdmaXhlZDMyEjIKB2ZpeGVkNjQYCiABKAsyFi52YWxpZGF0ZS5GaXhlZDY0UnVsZXNIAFIHZml4ZWQ2NBI1CghzZml4ZWQzMhgLIAEoCzIXLnZhbGlkYXRlLlNGaXhlZDMyUnVsZXNIAFIIc2ZpeGVkMzISNQoIc2ZpeGVkNjQYDCABKAsyFy52YWxpZGF0ZS5TRml4ZWQ2NFJ1bGVzSABSCHNmaXhlZDY0EikKBGJvb2wYDSABKAsyEy52YWxpZGF0ZS5Cb29sUnVsZXNIAFIEYm9vbBIvCgZzdHJpbmcYDiABKAsyFS52YWxpZGF0ZS5TdHJpbmdSdWxlc0gAUgZzdHJpbmcSLAoFYnl0ZXMYDyABKAsyFC52YWxpZGF0ZS5CeXRlc1J1bGVzSABSBWJ5dGVzEikKBGVudW0YECABKAsyEy52YWxpZGF0ZS5FbnVtUnVsZXNIAFIEZW51bRI1CghyZXBlYXRlZBgSIAEoCzIXLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXNIAFIIcmVwZWF0ZWQSJgoDbWFwGBMgASgLMhIudmFsaWRhdGUuTWFwUnVsZXNIAFIDbWFwEiYKA2FueRgUIAEoCzISLnZhbGlkYXRlLkFueVJ1bGVzSABSA2FueRI1CghkdXJhdGlvbhgVIAEoCzIXLnZhbGlkYXRlLkR1cmF0aW9uUnVsZXNIAFIIZHVyYXRpb24SOAoJdGltZXN0YW1wGBYgASgLMhgudmFsaWRhdGUuVGltZXN0YW1wUnVsZXNIAFIJdGltZXN0YW1wQgYKBHR5cGUisAEKCkZsb2F0UnVsZXMSFAoFY29uc3QYASABKAJSBWNvbnN0Eg4KAmx0GAIgASgCUgJsdBIQCgNsdGUYAyABKAJSA2x0ZRIOCgJndBgEIAEoAlICZ3QSEAoDZ3RlGAUgASgCUgNndGUSDgoCaW4YBiADKAJSAmluEhUKBm5vdF9pbhgHIAMoAlIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKxAQoLRG91YmxlUnVsZXMSFAoFY29uc3QYASABKAFSBWNvbnN0Eg4KAmx0GAIgASgBUgJsdBIQCgNsdGUYAyABKAFSA2x0ZRIOCgJndBgEIAEoAVICZ3QSEAoDZ3RlGAUgASgBUgNndGUSDgoCaW4YBiADKAFSAmluEhUKBm5vdF9pbhgHIAMoAVIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKwAQoKSW50MzJSdWxlcxIUCgVjb25zdBgBIAEoBVIFY29uc3QSDgoCbHQYAiABKAVSAmx0EhAKA2x0ZRgDIAEoBVIDbHRlEg4KAmd0GAQgASgFUgJndBIQCgNndGUYBSABKAVSA2d0ZRIOCgJpbhgGIAMoBVICaW4SFQoGbm90X2luGAcgAygFUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrABCgpJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgDUgVjb25zdBIOCgJsdBgCIAEoA1ICbHQSEAoDbHRlGAMgASgDUgNsdGUSDgoCZ3QYBCABKANSAmd0EhAKA2d0ZRgFIAEoA1IDZ3RlEg4KAmluGAYgAygDUgJpbhIVCgZub3RfaW4YByADKANSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1VJbnQzMlJ1bGVzEhQKBWNvbnN0GAEgASgNUgVjb25zdBIOCgJsdBgCIAEoDVICbHQSEAoDbHRlGAMgASgNUgNsdGUSDgoCZ3QYBCABKA1SAmd0EhAKA2d0ZRgFIAEoDVIDZ3RlEg4KAmluGAYgAygNUgJpbhIVCgZub3RfaW4YByADKA1SBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1VJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgEUgVjb25zdBIOCgJsdBgCIAEoBFICbHQSEAoDbHRlGAMgASgEUgNsdGUSDgoCZ3QYBCABKARSAmd0EhAKA2d0ZRgFIAEoBFIDZ3RlEg4KAmluGAYgAygEUgJpbhIVCgZub3RfaW4YByADKARSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1NJbnQzMlJ1bGVzEhQKBWNvbnN0GAEgASgRUgVjb25zdBIOCgJsdBgCIAEoEVICbHQSEAoDbHRlGAMgASgRUgNsdGUSDgoCZ3QYBCABKBFSAmd0EhAKA2d0ZRgFIAEoEVIDZ3RlEg4KAmluGAYgAygRUgJpbhIVCgZub3RfaW4YByADKBFSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1NJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgSUgVjb25zdBIOCgJsdBgCIAEoElICbHQSEAoDbHRlGAMgASgSUgNsdGUSDgoCZ3QYBCABKBJSAmd0EhAKA2d0ZRgFIAEoElIDZ3RlEg4KAmluGAYgAygSUgJpbhIVCgZub3RfaW4YByADKBJSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisgEKDEZpeGVkMzJSdWxlcxIUCgVjb25zdBgBIAEoB1IFY29uc3QSDgoCbHQYAiABKAdSAmx0EhAKA2x0ZRgDIAEoB1IDbHRlEg4KAmd0GAQgASgHUgJndBIQCgNndGUYBSABKAdSA2d0ZRIOCgJpbhgGIAMoB1ICaW4SFQoGbm90X2luGAcgAygHUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrIBCgxGaXhlZDY0UnVsZXMSFAoFY29uc3QYASABKAZSBWNvbnN0Eg4KAmx0GAIgASgGUgJsdBIQCgNsdGUYAyABKAZSA2x0ZRIOCgJndBgEIAEoBlICZ3QSEAoDZ3RlGAUgASgGUgNndGUSDgoCaW4YBiADKAZSAmluEhUKBm5vdF9pbhgHIAMoBlIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKzAQoNU0ZpeGVkMzJSdWxlcxIUCgVjb25zdBgBIAEoD1IFY29uc3QSDgoCbHQYAiABKA9SAmx0EhAKA2x0ZRgDIAEoD1IDbHRlEg4KAmd0GAQgASgPUgJndBIQCgNndGUYBSABKA9SA2d0ZRIOCgJpbhgGIAMoD1ICaW4SFQoGbm90X2luGAcgAygPUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrMBCg1TRml4ZWQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgQUgVjb25zdBIOCgJsdBgCIAEoEFICbHQSEAoDbHRlGAMgASgQUgNsdGUSDgoCZ3QYBCABKBBSAmd0EhAKA2d0ZRgFIAEoEFIDZ3RlEg4KAmluGAYgAygQUgJpbhIVCgZub3RfaW4YByADKBBSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkiIQoJQm9vbFJ1bGVzEhQKBWNvbnN0GAEgASgIUgVjb25zdCLUBQoLU3RyaW5nUnVsZXMSFAoFY29uc3QYASABKAlSBWNvbnN0EhAKA2xlbhgTIAEoBFIDbGVuEhcKB21pbl9sZW4YAiABKARSBm1pbkxlbhIXCgdtYXhfbGVuGAMgASgEUgZtYXhMZW4SGwoJbGVuX2J5dGVzGBQgASgEUghsZW5CeXRlcxIbCgltaW5fYnl0ZXMYBCABKARSCG1pbkJ5dGVzEhsKCW1heF9ieXRlcxgFIAEoBFIIbWF4Qnl0ZXMSGAoHcGF0dGVybhgGIAEoCVIHcGF0dGVybhIWCgZwcmVmaXgYByABKAlSBnByZWZpeBIWCgZzdWZmaXgYCCABKAlSBnN1ZmZpeBIaCghjb250YWlucxgJIAEoCVIIY29udGFpbnMSIQoMbm90X2NvbnRhaW5zGBcgASgJUgtub3RDb250YWlucxIOCgJpbhgKIAMoCVICaW4SFQoGbm90X2luGAsgAygJUgVub3RJbhIWCgVlbWFpbBgMIAEoCEgAUgVlbWFpbBIcCghob3N0bmFtZRgNIAEoCEgAUghob3N0bmFtZRIQCgJpcBgOIAEoCEgAUgJpcBIUCgRpcHY0GA8gASgISABSBGlwdjQSFAoEaXB2NhgQIAEoCEgAUgRpcHY2EhIKA3VyaRgRIAEoCEgAUgN1cmkSGQoHdXJpX3JlZhgSIAEoCEgAUgZ1cmlSZWYSGgoHYWRkcmVzcxgVIAEoCEgAUgdhZGRyZXNzEhQKBHV1aWQYFiABKAhIAFIEdXVpZBJAChB3ZWxsX2tub3duX3JlZ2V4GBggASgOMhQudmFsaWRhdGUuS25vd25SZWdleEgAUg53ZWxsS25vd25SZWdleBIcCgZzdHJpY3QYGSABKAg6BHRydWVSBnN0cmljdBIhCgxpZ25vcmVfZW1wdHkYGiABKAhSC2lnbm9yZUVtcHR5QgwKCndlbGxfa25vd24i4gIKCkJ5dGVzUnVsZXMSFAoFY29uc3QYASABKAxSBWNvbnN0EhAKA2xlbhgNIAEoBFIDbGVuEhcKB21pbl9sZW4YAiABKARSBm1pbkxlbhIXCgdtYXhfbGVuGAMgASgEUgZtYXhMZW4SGAoHcGF0dGVybhgEIAEoCVIHcGF0dGVybhIWCgZwcmVmaXgYBSABKAxSBnByZWZpeBIWCgZzdWZmaXgYBiABKAxSBnN1ZmZpeBIaCghjb250YWlucxgHIAEoDFIIY29udGFpbnMSDgoCaW4YCCADKAxSAmluEhUKBm5vdF9pbhgJIAMoDFIFbm90SW4SEAoCaXAYCiABKAhIAFICaXASFAoEaXB2NBgLIAEoCEgAUgRpcHY0EhQKBGlwdjYYDCABKAhIAFIEaXB2NhIhCgxpZ25vcmVfZW1wdHkYDiABKAhSC2lnbm9yZUVtcHR5QgwKCndlbGxfa25vd24iawoJRW51bVJ1bGVzEhQKBWNvbnN0GAEgASgFUgVjb25zdBIhCgxkZWZpbmVkX29ubHkYAiABKAhSC2RlZmluZWRPbmx5Eg4KAmluGAMgAygFUgJpbhIVCgZub3RfaW4YBCADKAVSBW5vdEluIj4KDE1lc3NhZ2VSdWxlcxISCgRza2lwGAEgASgIUgRza2lwEhoKCHJlcXVpcmVkGAIgASgIUghyZXF1aXJlZCKwAQoNUmVwZWF0ZWRSdWxlcxIbCgltaW5faXRlbXMYASABKARSCG1pbkl0ZW1zEhsKCW1heF9pdGVtcxgCIAEoBFIIbWF4SXRlbXMSFgoGdW5pcXVlGAMgASgIUgZ1bmlxdWUSKgoFaXRlbXMYBCABKAsyFC52YWxpZGF0ZS5GaWVsZFJ1bGVzUgVpdGVtcxIhCgxpZ25vcmVfZW1wdHkYBSABKAhSC2lnbm9yZUVtcHR5ItwBCghNYXBSdWxlcxIbCgltaW5fcGFpcnMYASABKARSCG1pblBhaXJzEhsKCW1heF9wYWlycxgCIAEoBFIIbWF4UGFpcnMSGwoJbm9fc3BhcnNlGAMgASgIUghub1NwYXJzZRIoCgRrZXlzGAQgASgLMhQudmFsaWRhdGUuRmllbGRSdWxlc1IEa2V5cxIsCgZ2YWx1ZXMYBSABKAsyFC52YWxpZGF0ZS5GaWVsZFJ1bGVzUgZ2YWx1ZXMSIQoMaWdub3JlX2VtcHR5GAYgASgIUgtpZ25vcmVFbXB0eSJNCghBbnlSdWxlcxIaCghyZXF1aXJlZBgBIAEoCFIIcmVxdWlyZWQSDgoCaW4YAiADKAlSAmluEhUKBm5vdF9pbhgDIAMoCVIFbm90SW4i6QIKDUR1cmF0aW9uUnVsZXMSGgoIcmVxdWlyZWQYASABKAhSCHJlcXVpcmVkEi8KBWNvbnN0GAIgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgVjb25zdBIpCgJsdBgDIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblICbHQSKwoDbHRlGAQgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgNsdGUSKQoCZ3QYBSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25SAmd0EisKA2d0ZRgGIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblIDZ3RlEikKAmluGAcgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgJpbhIwCgZub3RfaW4YCCADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25SBW5vdEluIvMCCg5UaW1lc3RhbXBSdWxlcxIaCghyZXF1aXJlZBgBIAEoCFIIcmVxdWlyZWQSMAoFY29uc3QYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgVjb25zdBIqCgJsdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSAmx0EiwKA2x0ZRgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSA2x0ZRIqCgJndBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSAmd0EiwKA2d0ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSA2d0ZRIVCgZsdF9ub3cYByABKAhSBWx0Tm93EhUKBmd0X25vdxgIIAEoCFIFZ3ROb3cSMQoGd2l0aGluGAkgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgZ3aXRoaW4qRgoKS25vd25SZWdleBILCgdVTktOT1dOEAASFAoQSFRUUF9IRUFERVJfTkFNRRABEhUKEUhUVFBfSEVBREVSX1ZBTFVFEAI6PAoIZGlzYWJsZWQSHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYrwggASgIUghkaXNhYmxlZDo6CgdpZ25vcmVkEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGLAIIAEoCFIHaWdub3JlZDo6CghyZXF1aXJlZBIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMYrwggASgIUghyZXF1aXJlZDpKCgVydWxlcxIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYrwggASgLMhQudmFsaWRhdGUuRmllbGRSdWxlc1IFcnVsZXNCUAoaaW8uZW52b3lwcm94eS5wZ3YudmFsaWRhdGVaMmdpdGh1Yi5jb20vZW52b3lwcm94eS9wcm90b2MtZ2VuLXZhbGlkYXRlL3ZhbGlkYXRlCrcDCgxjb21tb24ucHJvdG8SBmNvbW1vbiKHAQoKUGFja2FnZU1hcBI8CghwYWNrYWdlcxgBIAMoCzIgLmNvbW1vbi5QYWNrYWdlTWFwLlBhY2thZ2VzRW50cnlSCHBhY2thZ2VzGjsKDVBhY2thZ2VzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAxSBXZhbHVlOgI4ASJFChFTaWduaW5nQ29tbWl0bWVudBIWCgZoaWRpbmcYASABKAxSBmhpZGluZxIYCgdiaW5kaW5nGAIgASgMUgdiaW5kaW5nIjgKDVNpZ25pbmdSZXN1bHQSJwoPc2lnbmF0dXJlX3NoYXJlGAEgASgMUg5zaWduYXR1cmVTaGFyZSpdCg9TaWduYXR1cmVJbnRlbnQSDAoIQ1JFQVRJT04QABIMCghUUkFOU0ZFUhABEg0KCUFHR1JFR0FURRACEg8KB1JFRlJFU0gQAxoCCAESDgoGRVhURU5EEAQaAggBQi1aK2dpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9jb21tb25iBnByb3RvMwq/rgIKC3NwYXJrLnByb3RvEgVzcGFyaxofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bxobZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvGhd2YWxpZGF0ZS92YWxpZGF0ZS5wcm90bxoMY29tbW9uLnByb3RvIkoKGFN1YnNjcmliZVRvRXZlbnRzUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAogASgMUhFpZGVudGl0eVB1YmxpY0tleSLAAQoZU3Vic2NyaWJlVG9FdmVudHNSZXNwb25zZRIyCgh0cmFuc2ZlchgBIAEoCzIULnNwYXJrLlRyYW5zZmVyRXZlbnRIAFIIdHJhbnNmZXISLwoHZGVwb3NpdBgCIAEoCzITLnNwYXJrLkRlcG9zaXRFdmVudEgAUgdkZXBvc2l0EjUKCWNvbm5lY3RlZBgDIAEoCzIVLnNwYXJrLkNvbm5lY3RlZEV2ZW50SABSCWNvbm5lY3RlZEIHCgVldmVudCIQCg5Db25uZWN0ZWRFdmVudCI8Cg1UcmFuc2ZlckV2ZW50EisKCHRyYW5zZmVyGAogASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIjkKDERlcG9zaXRFdmVudBIpCgdkZXBvc2l0GAogASgLMg8uc3BhcmsuVHJlZU5vZGVSB2RlcG9zaXQicgoLUGFnZVJlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgFUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIuCglkaXJlY3Rpb24YAyABKA4yEC5zcGFyay5EaXJlY3Rpb25SCWRpcmVjdGlvbiKoAQoMUGFnZVJlc3BvbnNlEiIKDWhhc19uZXh0X3BhZ2UYASABKAhSC2hhc05leHRQYWdlEioKEWhhc19wcmV2aW91c19wYWdlGAIgASgIUg9oYXNQcmV2aW91c1BhZ2USHwoLbmV4dF9jdXJzb3IYAyABKAlSCm5leHRDdXJzb3ISJwoPcHJldmlvdXNfY3Vyc29yGAQgASgJUg5wcmV2aW91c0N1cnNvciKAAgoTRGVwb3NpdEFkZHJlc3NQcm9vZhJgChJhZGRyZXNzX3NpZ25hdHVyZXMYASADKAsyMS5zcGFyay5EZXBvc2l0QWRkcmVzc1Byb29mLkFkZHJlc3NTaWduYXR1cmVzRW50cnlSEWFkZHJlc3NTaWduYXR1cmVzEkEKHXByb29mX29mX3Bvc3Nlc3Npb25fc2lnbmF0dXJlGAIgASgMUhpwcm9vZk9mUG9zc2Vzc2lvblNpZ25hdHVyZRpEChZBZGRyZXNzU2lnbmF0dXJlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEilQIKHUdlbmVyYXRlRGVwb3NpdEFkZHJlc3NSZXF1ZXN0EiwKEnNpZ25pbmdfcHVibGljX2tleRgBIAEoDFIQc2lnbmluZ1B1YmxpY0tleRIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhFpZGVudGl0eVB1YmxpY0tleRIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsSJgoHbGVhZl9pZBgEIAEoCUII+kIFcgOwAQFIAFIGbGVhZklkiAEBEiAKCWlzX3N0YXRpYxgFIAEoCEgBUghpc1N0YXRpY4gBAUIKCghfbGVhZl9pZEIMCgpfaXNfc3RhdGljIrUBCgdBZGRyZXNzEhgKB2FkZHJlc3MYASABKAlSB2FkZHJlc3MSIwoNdmVyaWZ5aW5nX2tleRgCIAEoDFIMdmVyaWZ5aW5nS2V5Ek4KFWRlcG9zaXRfYWRkcmVzc19wcm9vZhgDIAEoCzIaLnNwYXJrLkRlcG9zaXRBZGRyZXNzUHJvb2ZSE2RlcG9zaXRBZGRyZXNzUHJvb2YSGwoJaXNfc3RhdGljGAUgASgIUghpc1N0YXRpYyJZCh5HZW5lcmF0ZURlcG9zaXRBZGRyZXNzUmVzcG9uc2USNwoPZGVwb3NpdF9hZGRyZXNzGAEgASgLMg4uc3BhcmsuQWRkcmVzc1IOZGVwb3NpdEFkZHJlc3MiyQEKI0dlbmVyYXRlU3RhdGljRGVwb3NpdEFkZHJlc3NSZXF1ZXN0EjUKEnNpZ25pbmdfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIQc2lnbmluZ1B1YmxpY0tleRI3ChNpZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUhFpZGVudGl0eVB1YmxpY0tleRIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsiXwokR2VuZXJhdGVTdGF0aWNEZXBvc2l0QWRkcmVzc1Jlc3BvbnNlEjcKD2RlcG9zaXRfYWRkcmVzcxgBIAEoCzIOLnNwYXJrLkFkZHJlc3NSDmRlcG9zaXRBZGRyZXNzInkKBFVUWE8SFQoGcmF3X3R4GAEgASgMUgVyYXdUeBISCgR2b3V0GAIgASgNUgR2b3V0EjIKB25ldHdvcmsYAyABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yaxISCgR0eGlkGAQgASgMUgR0eGlkIjkKCk5vZGVPdXRwdXQSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEhIKBHZvdXQYAiABKA1SBHZvdXQipgEKClNpZ25pbmdKb2ISLAoSc2lnbmluZ19wdWJsaWNfa2V5GAEgASgMUhBzaWduaW5nUHVibGljS2V5EhUKBnJhd190eBgCIAEoDFIFcmF3VHgSUwoYc2lnbmluZ19ub25jZV9jb21taXRtZW50GAMgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UhZzaWduaW5nTm9uY2VDb21taXRtZW50IsoCCg9TaWduaW5nS2V5c2hhcmUSKwoRb3duZXJfaWRlbnRpZmllcnMYASADKAlSEG93bmVySWRlbnRpZmllcnMSHAoJdGhyZXNob2xkGAIgASgNUgl0aHJlc2hvbGQSHQoKcHVibGljX2tleRgDIAEoDFIJcHVibGljS2V5Ek0KDXB1YmxpY19zaGFyZXMYBCADKAsyKC5zcGFyay5TaWduaW5nS2V5c2hhcmUuUHVibGljU2hhcmVzRW50cnlSDHB1YmxpY1NoYXJlcxI9Cgx1cGRhdGVkX3RpbWUYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgt1cGRhdGVkVGltZRo/ChFQdWJsaWNTaGFyZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoDFIFdmFsdWU6AjgBIsgECg1TaWduaW5nUmVzdWx0EkUKC3B1YmxpY19rZXlzGAEgAygLMiQuc3BhcmsuU2lnbmluZ1Jlc3VsdC5QdWJsaWNLZXlzRW50cnlSCnB1YmxpY0tleXMSbQoZc2lnbmluZ19ub25jZV9jb21taXRtZW50cxgCIAMoCzIxLnNwYXJrLlNpZ25pbmdSZXN1bHQuU2lnbmluZ05vbmNlQ29tbWl0bWVudHNFbnRyeVIXc2lnbmluZ05vbmNlQ29tbWl0bWVudHMSVAoQc2lnbmF0dXJlX3NoYXJlcxgDIAMoCzIpLnNwYXJrLlNpZ25pbmdSZXN1bHQuU2lnbmF0dXJlU2hhcmVzRW50cnlSD3NpZ25hdHVyZVNoYXJlcxJBChBzaWduaW5nX2tleXNoYXJlGAQgASgLMhYuc3BhcmsuU2lnbmluZ0tleXNoYXJlUg9zaWduaW5nS2V5c2hhcmUaPQoPUHVibGljS2V5c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEaZQocU2lnbmluZ05vbmNlQ29tbWl0bWVudHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIvCgV2YWx1ZRgCIAEoCzIZLmNvbW1vbi5TaWduaW5nQ29tbWl0bWVudFIFdmFsdWU6AjgBGkIKFFNpZ25hdHVyZVNoYXJlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEikgMKEFJlbmV3TGVhZlJlcXVlc3QSFwoHbGVhZl9pZBgBIAEoCVIGbGVhZklkEmoKH3JlbmV3X25vZGVfdGltZWxvY2tfc2lnbmluZ19qb2IYAiABKAsyIi5zcGFyay5SZW5ld05vZGVUaW1lbG9ja1NpZ25pbmdKb2JIAFIbcmVuZXdOb2RlVGltZWxvY2tTaWduaW5nSm9iEnAKIXJlbmV3X3JlZnVuZF90aW1lbG9ja19zaWduaW5nX2pvYhgDIAEoCzIkLnNwYXJrLlJlbmV3UmVmdW5kVGltZWxvY2tTaWduaW5nSm9iSABSHXJlbmV3UmVmdW5kVGltZWxvY2tTaWduaW5nSm9iEncKJHJlbmV3X25vZGVfemVyb190aW1lbG9ja19zaWduaW5nX2pvYhgEIAEoCzImLnNwYXJrLlJlbmV3Tm9kZVplcm9UaW1lbG9ja1NpZ25pbmdKb2JIAFIfcmVuZXdOb2RlWmVyb1RpbWVsb2NrU2lnbmluZ0pvYkIOCgxzaWduaW5nX2pvYnMipwUKG1JlbmV3Tm9kZVRpbWVsb2NrU2lnbmluZ0pvYhJXChlzcGxpdF9ub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIVc3BsaXROb2RlVHhTaWduaW5nSm9iEmQKIHNwbGl0X25vZGVfZGlyZWN0X3R4X3NpZ25pbmdfam9iGAIgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIbc3BsaXROb2RlRGlyZWN0VHhTaWduaW5nSm9iEkwKE25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhBub2RlVHhTaWduaW5nSm9iElAKFXJlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSEnJlZnVuZFR4U2lnbmluZ0pvYhJZChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgFIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISXQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJvCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgHIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIuoDCh1SZW5ld1JlZnVuZFRpbWVsb2NrU2lnbmluZ0pvYhJMChNub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIQbm9kZVR4U2lnbmluZ0pvYhJQChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISWQoaZGlyZWN0X25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhZkaXJlY3ROb2RlVHhTaWduaW5nSm9iEl0KHGRpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBCABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhhkaXJlY3RSZWZ1bmRUeFNpZ25pbmdKb2ISbwomZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBSABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUiBkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ0pvYiKTAwofUmVuZXdOb2RlWmVyb1RpbWVsb2NrU2lnbmluZ0pvYhJMChNub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIQbm9kZVR4U2lnbmluZ0pvYhJQChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISWQoaZGlyZWN0X25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhZkaXJlY3ROb2RlVHhTaWduaW5nSm9iEm8KJmRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAUgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIgZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25pbmdKb2JKBAgEEAUi0wIKEVJlbmV3TGVhZlJlc3BvbnNlEl0KGnJlbmV3X25vZGVfdGltZWxvY2tfcmVzdWx0GAEgASgLMh4uc3BhcmsuUmVuZXdOb2RlVGltZWxvY2tSZXN1bHRIAFIXcmVuZXdOb2RlVGltZWxvY2tSZXN1bHQSYwoccmVuZXdfcmVmdW5kX3RpbWVsb2NrX3Jlc3VsdBgCIAEoCzIgLnNwYXJrLlJlbmV3UmVmdW5kVGltZWxvY2tSZXN1bHRIAFIZcmVuZXdSZWZ1bmRUaW1lbG9ja1Jlc3VsdBJqCh9yZW5ld19ub2RlX3plcm9fdGltZWxvY2tfcmVzdWx0GAMgASgLMiIuc3BhcmsuUmVuZXdOb2RlWmVyb1RpbWVsb2NrUmVzdWx0SABSG3JlbmV3Tm9kZVplcm9UaW1lbG9ja1Jlc3VsdEIOCgxyZW5ld19yZXN1bHQibgoXUmVuZXdOb2RlVGltZWxvY2tSZXN1bHQSLgoKc3BsaXRfbm9kZRgBIAEoCzIPLnNwYXJrLlRyZWVOb2RlUglzcGxpdE5vZGUSIwoEbm9kZRgCIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgRub2RlIkAKGVJlbmV3UmVmdW5kVGltZWxvY2tSZXN1bHQSIwoEbm9kZRgBIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgRub2RlInIKG1JlbmV3Tm9kZVplcm9UaW1lbG9ja1Jlc3VsdBIuCgpzcGxpdF9ub2RlGAEgASgLMg8uc3BhcmsuVHJlZU5vZGVSCXNwbGl0Tm9kZRIjCgRub2RlGAIgASgLMg8uc3BhcmsuVHJlZU5vZGVSBG5vZGUijwQKE05vZGVTaWduYXR1cmVTaGFyZXMSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEkkKFm5vZGVfdHhfc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhNub2RlVHhTaWduaW5nUmVzdWx0Ek0KGHJlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgDIAEoCzIULnNwYXJrLlNpZ25pbmdSZXN1bHRSFXJlZnVuZFR4U2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAQgASgMUgx2ZXJpZnlpbmdLZXkSVgodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhlkaXJlY3ROb2RlVHhTaWduaW5nUmVzdWx0EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYByABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCLKAgoOTm9kZVNpZ25hdHVyZXMSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEioKEW5vZGVfdHhfc2lnbmF0dXJlGAIgASgMUg9ub2RlVHhTaWduYXR1cmUSLgoTcmVmdW5kX3R4X3NpZ25hdHVyZRgDIAEoDFIRcmVmdW5kVHhTaWduYXR1cmUSNwoYZGlyZWN0X25vZGVfdHhfc2lnbmF0dXJlGAQgASgMUhVkaXJlY3ROb2RlVHhTaWduYXR1cmUSOwoaZGlyZWN0X3JlZnVuZF90eF9zaWduYXR1cmUYBSABKAxSF2RpcmVjdFJlZnVuZFR4U2lnbmF0dXJlEk0KJGRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25hdHVyZRgGIAEoDFIfZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25hdHVyZSKKBAoYU3RhcnRUcmVlQ3JlYXRpb25SZXF1ZXN0Ei4KE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSEWlkZW50aXR5UHVibGljS2V5Ei8KDW9uX2NoYWluX3V0eG8YAiABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxJAChNyb290X3R4X3NpZ25pbmdfam9iGAMgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIQcm9vdFR4U2lnbmluZ0pvYhJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYBCABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISTQoaZGlyZWN0X3Jvb3RfdHhfc2lnbmluZ19qb2IYBSABKAsyES5zcGFyay5TaWduaW5nSm9iUhZkaXJlY3RSb290VHhTaWduaW5nSm9iElEKHGRpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBiABKAsyES5zcGFyay5TaWduaW5nSm9iUhhkaXJlY3RSZWZ1bmRUeFNpZ25pbmdKb2ISYwomZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYByABKAsyES5zcGFyay5TaWduaW5nSm9iUiBkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ0pvYiKNAQoZU3RhcnRUcmVlQ3JlYXRpb25SZXNwb25zZRIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSVwoacm9vdF9ub2RlX3NpZ25hdHVyZV9zaGFyZXMYAiABKAsyGi5zcGFyay5Ob2RlU2lnbmF0dXJlU2hhcmVzUhdyb290Tm9kZVNpZ25hdHVyZVNoYXJlcyKRBAofU3RhcnREZXBvc2l0VHJlZUNyZWF0aW9uUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIvCg1vbl9jaGFpbl91dHhvGAIgASgLMgsuc3BhcmsuVVRYT1ILb25DaGFpblV0eG8SQAoTcm9vdF90eF9zaWduaW5nX2pvYhgDIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEHJvb3RUeFNpZ25pbmdKb2ISRAoVcmVmdW5kX3R4X3NpZ25pbmdfam9iGAQgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIScmVmdW5kVHhTaWduaW5nSm9iEk0KGmRpcmVjdF9yb290X3R4X3NpZ25pbmdfam9iGAUgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIWZGlyZWN0Um9vdFR4U2lnbmluZ0pvYhJRChxkaXJlY3RfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAYgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIYZGlyZWN0UmVmdW5kVHhTaWduaW5nSm9iEmMKJmRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAcgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIgZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25pbmdKb2IilAEKIFN0YXJ0RGVwb3NpdFRyZWVDcmVhdGlvblJlc3BvbnNlEhcKB3RyZWVfaWQYASABKAlSBnRyZWVJZBJXChpyb290X25vZGVfc2lnbmF0dXJlX3NoYXJlcxgCIAEoCzIaLnNwYXJrLk5vZGVTaWduYXR1cmVTaGFyZXNSF3Jvb3ROb2RlU2lnbmF0dXJlU2hhcmVzIpsBChJUb2tlbk91dHB1dFRvU3BlbmQSRgobcHJldl90b2tlbl90cmFuc2FjdGlvbl9oYXNoGAEgASgMQgf6QgR6AmggUhhwcmV2VG9rZW5UcmFuc2FjdGlvbkhhc2gSPQobcHJldl90b2tlbl90cmFuc2FjdGlvbl92b3V0GAIgASgNUhhwcmV2VG9rZW5UcmFuc2FjdGlvblZvdXQiWQoSVG9rZW5UcmFuc2ZlcklucHV0EkMKEG91dHB1dHNfdG9fc3BlbmQYASADKAsyGS5zcGFyay5Ub2tlbk91dHB1dFRvU3BlbmRSDm91dHB1dHNUb1NwZW5kIs8BCg5Ub2tlbk1pbnRJbnB1dBIzChFpc3N1ZXJfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIPaXNzdWVyUHVibGljS2V5EjoKGWlzc3Vlcl9wcm92aWRlZF90aW1lc3RhbXAYAiABKARSF2lzc3VlclByb3ZpZGVkVGltZXN0YW1wEjcKEHRva2VuX2lkZW50aWZpZXIYAyABKAxCB/pCBHoCaCBIAFIPdG9rZW5JZGVudGlmaWVyiAEBQhMKEV90b2tlbl9pZGVudGlmaWVyIvYCChBUb2tlbkNyZWF0ZUlucHV0EjMKEWlzc3Vlcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg9pc3N1ZXJQdWJsaWNLZXkSJgoKdG9rZW5fbmFtZRgCIAEoCUIH+kIEcgIYFFIJdG9rZW5OYW1lEioKDHRva2VuX3RpY2tlchgDIAEoCUIH+kIEcgIYBlILdG9rZW5UaWNrZXISJAoIZGVjaW1hbHMYBCABKA1CCPpCBSoDGP8BUghkZWNpbWFscxImCgptYXhfc3VwcGx5GAUgASgMQgf6QgR6AmgQUgltYXhTdXBwbHkSIQoMaXNfZnJlZXphYmxlGAYgASgIUgtpc0ZyZWV6YWJsZRJJChpjcmVhdGlvbl9lbnRpdHlfcHVibGljX2tleRgHIAEoDEIH+kIEegJoIUgAUhdjcmVhdGlvbkVudGl0eVB1YmxpY0tleYgBAUIdChtfY3JlYXRpb25fZW50aXR5X3B1YmxpY19rZXkixwQKC1Rva2VuT3V0cHV0Eh0KAmlkGAEgASgJQgj6QgVyA7ABAUgAUgJpZIgBARIxChBvd25lcl9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRJBChVyZXZvY2F0aW9uX2NvbW1pdG1lbnQYAyABKAxCB/pCBHoCaCFIAVIUcmV2b2NhdGlvbkNvbW1pdG1lbnSIAQESMQoSd2l0aGRyYXdfYm9uZF9zYXRzGAQgASgESAJSEHdpdGhkcmF3Qm9uZFNhdHOIAQESTAogd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWUYBSABKARIA1Idd2l0aGRyYXdSZWxhdGl2ZUJsb2NrTG9ja3RpbWWIAQESNgoQdG9rZW5fcHVibGljX2tleRgGIAEoDEIH+kIEegJoIUgEUg50b2tlblB1YmxpY0tleYgBARI3ChB0b2tlbl9pZGVudGlmaWVyGAggASgMQgf6QgR6AmggSAVSD3Rva2VuSWRlbnRpZmllcogBARIqCgx0b2tlbl9hbW91bnQYByABKAxCB/pCBHoCaBBSC3Rva2VuQW1vdW50QgUKA19pZEIYChZfcmV2b2NhdGlvbl9jb21taXRtZW50QhUKE193aXRoZHJhd19ib25kX3NhdHNCIwohX3dpdGhkcmF3X3JlbGF0aXZlX2Jsb2NrX2xvY2t0aW1lQhMKEV90b2tlbl9wdWJsaWNfa2V5QhMKEV90b2tlbl9pZGVudGlmaWVyIqUDChBUb2tlblRyYW5zYWN0aW9uEjYKCm1pbnRfaW5wdXQYASABKAsyFS5zcGFyay5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSQgoOdHJhbnNmZXJfaW5wdXQYAiABKAsyGS5zcGFyay5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBI8CgxjcmVhdGVfaW5wdXQYBSABKAsyFy5zcGFyay5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0EjcKDXRva2VuX291dHB1dHMYAyADKAsyEi5zcGFyay5Ub2tlbk91dHB1dFIMdG9rZW5PdXRwdXRzEloKI3NwYXJrX29wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXlzGAQgAygMQgz6QgmSAQYiBHoCaCFSH3NwYXJrT3BlcmF0b3JJZGVudGl0eVB1YmxpY0tleXMSMgoHbmV0d29yaxgKIAEoDjIOLnNwYXJrLk5ldHdvcmtCCPpCBYIBAiAAUgduZXR3b3JrQg4KDHRva2VuX2lucHV0cyJeChJTaWduYXR1cmVXaXRoSW5kZXgSJwoJc2lnbmF0dXJlGAEgASgMQgn6QgZ6BBBAGElSCXNpZ25hdHVyZRIfCgtpbnB1dF9pbmRleBgCIAEoDVIKaW5wdXRJbmRleCLFAQovT3BlcmF0b3JTcGVjaWZpY1Rva2VuVHJhbnNhY3Rpb25TaWduYWJsZVBheWxvYWQSSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgBIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaBJIChxvcGVyYXRvcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUhlvcGVyYXRvcklkZW50aXR5UHVibGljS2V5IrYBCh5PcGVyYXRvclNwZWNpZmljT3duZXJTaWduYXR1cmUSQgoPb3duZXJfc2lnbmF0dXJlGAEgASgLMhkuc3BhcmsuU2lnbmF0dXJlV2l0aEluZGV4Ug5vd25lclNpZ25hdHVyZRJQCgdwYXlsb2FkGAIgASgLMjYuc3BhcmsuT3BlcmF0b3JTcGVjaWZpY1Rva2VuVHJhbnNhY3Rpb25TaWduYWJsZVBheWxvYWRSB3BheWxvYWQicgoZUmV2b2NhdGlvblNlY3JldFdpdGhJbmRleBIfCgtpbnB1dF9pbmRleBgBIAEoDVIKaW5wdXRJbmRleBI0ChFyZXZvY2F0aW9uX3NlY3JldBgCIAEoDEIH+kIEegJoIFIQcmV2b2NhdGlvblNlY3JldCL4AgoTRnJlZXplVG9rZW5zUGF5bG9hZBIxChBvd25lcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRIxChB0b2tlbl9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUg50b2tlblB1YmxpY0tleRI6Chlpc3N1ZXJfcHJvdmlkZWRfdGltZXN0YW1wGAMgASgEUhdpc3N1ZXJQcm92aWRlZFRpbWVzdGFtcBJIChxvcGVyYXRvcl9pZGVudGl0eV9wdWJsaWNfa2V5GAQgASgMQgf6QgR6AmghUhlvcGVyYXRvcklkZW50aXR5UHVibGljS2V5EicKD3Nob3VsZF91bmZyZWV6ZRgFIAEoCFIOc2hvdWxkVW5mcmVlemUSNwoQdG9rZW5faWRlbnRpZmllchgGIAEoDEIH+kIEegJoIEgAUg90b2tlbklkZW50aWZpZXKIAQFCEwoRX3Rva2VuX2lkZW50aWZpZXIimwEKE0ZyZWV6ZVRva2Vuc1JlcXVlc3QSTgoVZnJlZXplX3Rva2Vuc19wYXlsb2FkGAEgASgLMhouc3BhcmsuRnJlZXplVG9rZW5zUGF5bG9hZFITZnJlZXplVG9rZW5zUGF5bG9hZBI0ChBpc3N1ZXJfc2lnbmF0dXJlGAIgASgMQgn6QgZ6BBBAGElSD2lzc3VlclNpZ25hdHVyZSKJAQoURnJlZXplVG9rZW5zUmVzcG9uc2USPQoTaW1wYWN0ZWRfb3V0cHV0X2lkcxgBIAMoCUIN+kIKkgEHIgVyA7ABAVIRaW1wYWN0ZWRPdXRwdXRJZHMSMgoVaW1wYWN0ZWRfdG9rZW5fYW1vdW50GAIgASgMUhNpbXBhY3RlZFRva2VuQW1vdW50Iv0FCghUcmVlTm9kZRIOCgJpZBgBIAEoCVICaWQSFwoHdHJlZV9pZBgCIAEoCVIGdHJlZUlkEhQKBXZhbHVlGAMgASgEUgV2YWx1ZRIpCg5wYXJlbnRfbm9kZV9pZBgEIAEoCUgAUgxwYXJlbnROb2RlSWSIAQESFwoHbm9kZV90eBgFIAEoDFIGbm9kZVR4EhsKCXJlZnVuZF90eBgGIAEoDFIIcmVmdW5kVHgSEgoEdm91dBgHIAEoDVIEdm91dBIwChR2ZXJpZnlpbmdfcHVibGljX2tleRgIIAEoDFISdmVyaWZ5aW5nUHVibGljS2V5EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYCSABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQQoQc2lnbmluZ19rZXlzaGFyZRgKIAEoCzIWLnNwYXJrLlNpZ25pbmdLZXlzaGFyZVIPc2lnbmluZ0tleXNoYXJlEhYKBnN0YXR1cxgLIAEoCVIGc3RhdHVzEigKB25ldHdvcmsYDCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEj0KDGNyZWF0ZWRfdGltZRgNIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSC2NyZWF0ZWRUaW1lEj0KDHVwZGF0ZWRfdGltZRgOIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSC3VwZGF0ZWRUaW1lEjcKGG93bmVyX3NpZ25pbmdfcHVibGljX2tleRgPIAEoDFIVb3duZXJTaWduaW5nUHVibGljS2V5EhsKCWRpcmVjdF90eBgQIAEoDFIIZGlyZWN0VHgSKAoQZGlyZWN0X3JlZnVuZF90eBgRIAEoDFIOZGlyZWN0UmVmdW5kVHgSOgoaZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHgYEiABKAxSFmRpcmVjdEZyb21DcGZwUmVmdW5kVHhCEQoPX3BhcmVudF9ub2RlX2lkIpABCh1GaW5hbGl6ZU5vZGVTaWduYXR1cmVzUmVxdWVzdBIvCgZpbnRlbnQYASABKA4yFy5jb21tb24uU2lnbmF0dXJlSW50ZW50UgZpbnRlbnQSPgoPbm9kZV9zaWduYXR1cmVzGAIgAygLMhUuc3BhcmsuTm9kZVNpZ25hdHVyZXNSDm5vZGVTaWduYXR1cmVzIkcKHkZpbmFsaXplTm9kZVNpZ25hdHVyZXNSZXNwb25zZRIlCgVub2RlcxgBIAMoCzIPLnNwYXJrLlRyZWVOb2RlUgVub2RlcyJICgtTZWNyZXRTaGFyZRIhCgxzZWNyZXRfc2hhcmUYASABKAxSC3NlY3JldFNoYXJlEhYKBnByb29mcxgCIAMoDFIGcHJvb2ZzIiUKC1NlY3JldFByb29mEhYKBnByb29mcxgBIAMoDFIGcHJvb2ZzIq8CChZMZWFmUmVmdW5kVHhTaWduaW5nSm9iEhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgDIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIr4CChZVc2VyU2lnbmVkVHhTaWduaW5nSm9iEhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBIsChJzaWduaW5nX3B1YmxpY19rZXkYAiABKAxSEHNpZ25pbmdQdWJsaWNLZXkSFQoGcmF3X3R4GAMgASgMUgVyYXdUeBJTChhzaWduaW5nX25vbmNlX2NvbW1pdG1lbnQYBCABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSFnNpZ25pbmdOb25jZUNvbW1pdG1lbnQSJQoOdXNlcl9zaWduYXR1cmUYBSABKAxSDXVzZXJTaWduYXR1cmUSSgoTc2lnbmluZ19jb21taXRtZW50cxgGIAEoCzIZLnNwYXJrLlNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzIvICChlMZWFmUmVmdW5kVHhTaWduaW5nUmVzdWx0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSIwoNdmVyaWZ5aW5nX2tleRgDIAEoDFIMdmVyaWZ5aW5nS2V5EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBCABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCL1AwoeU3RhcnRVc2VyU2lnbmVkVHJhbnNmZXJSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQwoObGVhdmVzX3RvX3NlbmQYAyADKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUgxsZWF2ZXNUb1NlbmQSPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgEIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRI7CgtleHBpcnlfdGltZRgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSCmV4cGlyeVRpbWUSUAoVZGlyZWN0X2xlYXZlc190b19zZW5kGAYgAygLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlISZGlyZWN0TGVhdmVzVG9TZW5kEmIKH2RpcmVjdF9mcm9tX2NwZnBfbGVhdmVzX3RvX3NlbmQYByADKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhpkaXJlY3RGcm9tQ3BmcExlYXZlc1RvU2VuZCKpAwoUU3RhcnRUcmFuc2ZlclJlcXVlc3QSHwoLdHJhbnNmZXJfaWQYASABKAlSCnRyYW5zZmVySWQSOQoZb3duZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDFIWb3duZXJJZGVudGl0eVB1YmxpY0tleRJDCg5sZWF2ZXNfdG9fc2VuZBgDIAMoCzIdLnNwYXJrLkxlYWZSZWZ1bmRUeFNpZ25pbmdKb2JSDGxlYXZlc1RvU2VuZBI/ChxyZWNlaXZlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAQgASgMUhlyZWNlaXZlcklkZW50aXR5UHVibGljS2V5EjsKC2V4cGlyeV90aW1lGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIKZXhwaXJ5VGltZRJBChB0cmFuc2Zlcl9wYWNrYWdlGAcgASgLMhYuc3BhcmsuVHJhbnNmZXJQYWNrYWdlUg90cmFuc2ZlclBhY2thZ2USIwoNc3BhcmtfaW52b2ljZRgKIAEoCVIMc3BhcmtJbnZvaWNlSgQIBhAHSgQICRAKIo8BChVTdGFydFRyYW5zZmVyUmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXISSQoPc2lnbmluZ19yZXN1bHRzGAIgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi0AMKD1RyYW5zZmVyUGFja2FnZRJDCg5sZWF2ZXNfdG9fc2VuZBgBIAMoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSDGxlYXZlc1RvU2VuZBJXChFrZXlfdHdlYWtfcGFja2FnZRgCIAMoCzIrLnNwYXJrLlRyYW5zZmVyUGFja2FnZS5LZXlUd2Vha1BhY2thZ2VFbnRyeVIPa2V5VHdlYWtQYWNrYWdlEiUKDnVzZXJfc2lnbmF0dXJlGAMgASgMUg11c2VyU2lnbmF0dXJlElAKFWRpcmVjdF9sZWF2ZXNfdG9fc2VuZBgEIAMoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSEmRpcmVjdExlYXZlc1RvU2VuZBJiCh9kaXJlY3RfZnJvbV9jcGZwX2xlYXZlc190b19zZW5kGAUgAygLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIaZGlyZWN0RnJvbUNwZnBMZWF2ZXNUb1NlbmQaQgoUS2V5VHdlYWtQYWNrYWdlRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAxSBXZhbHVlOgI4ASJSChFTZW5kTGVhZktleVR3ZWFrcxI9Cg5sZWF2ZXNfdG9fc2VuZBgBIAMoCzIXLnNwYXJrLlNlbmRMZWFmS2V5VHdlYWtSDGxlYXZlc1RvU2VuZCKDBAoQU2VuZExlYWZLZXlUd2VhaxIXCgdsZWFmX2lkGAEgASgJUgZsZWFmSWQSQAoSc2VjcmV0X3NoYXJlX3R3ZWFrGAIgASgLMhIuc3BhcmsuU2VjcmV0U2hhcmVSEHNlY3JldFNoYXJlVHdlYWsSXgoTcHVia2V5X3NoYXJlc190d2VhaxgDIAMoCzIuLnNwYXJrLlNlbmRMZWFmS2V5VHdlYWsuUHVia2V5U2hhcmVzVHdlYWtFbnRyeVIRcHVia2V5U2hhcmVzVHdlYWsSIwoNc2VjcmV0X2NpcGhlchgEIAEoDFIMc2VjcmV0Q2lwaGVyEhwKCXNpZ25hdHVyZRgFIAEoDFIJc2lnbmF0dXJlEikKEHJlZnVuZF9zaWduYXR1cmUYBiABKAxSD3JlZnVuZFNpZ25hdHVyZRI2ChdkaXJlY3RfcmVmdW5kX3NpZ25hdHVyZRgHIAEoDFIVZGlyZWN0UmVmdW5kU2lnbmF0dXJlEkgKIWRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3NpZ25hdHVyZRgIIAEoDFIdZGlyZWN0RnJvbUNwZnBSZWZ1bmRTaWduYXR1cmUaRAoWUHVia2V5U2hhcmVzVHdlYWtFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoDFIFdmFsdWU6AjgBIuYBChdGaW5hbGl6ZVRyYW5zZmVyUmVxdWVzdBIfCgt0cmFuc2Zlcl9pZBgBIAEoCVIKdHJhbnNmZXJJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5Ej0KDmxlYXZlc190b19zZW5kGAMgAygLMhcuc3BhcmsuU2VuZExlYWZLZXlUd2Vha1IMbGVhdmVzVG9TZW5kEjAKFHNwYXJrX3BheW1lbnRfaW50ZW50GAQgASgJUhJzcGFya1BheW1lbnRJbnRlbnQiywEKKkZpbmFsaXplVHJhbnNmZXJXaXRoVHJhbnNmZXJQYWNrYWdlUmVxdWVzdBIfCgt0cmFuc2Zlcl9pZBgBIAEoCVIKdHJhbnNmZXJJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EkEKEHRyYW5zZmVyX3BhY2thZ2UYAyABKAsyFi5zcGFyay5UcmFuc2ZlclBhY2thZ2VSD3RyYW5zZmVyUGFja2FnZSJHChhGaW5hbGl6ZVRyYW5zZmVyUmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXIiyAQKCFRyYW5zZmVyEg4KAmlkGAEgASgJUgJpZBI7ChpzZW5kZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDFIXc2VuZGVySWRlbnRpdHlQdWJsaWNLZXkSPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgDIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRItCgZzdGF0dXMYBCABKA4yFS5zcGFyay5UcmFuc2ZlclN0YXR1c1IGc3RhdHVzEh8KC3RvdGFsX3ZhbHVlGAUgASgEUgp0b3RhbFZhbHVlEjsKC2V4cGlyeV90aW1lGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIKZXhwaXJ5VGltZRIrCgZsZWF2ZXMYByADKAsyEy5zcGFyay5UcmFuc2ZlckxlYWZSBmxlYXZlcxI9CgxjcmVhdGVkX3RpbWUYCCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgtjcmVhdGVkVGltZRI9Cgx1cGRhdGVkX3RpbWUYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgt1cGRhdGVkVGltZRInCgR0eXBlGAogASgOMhMuc3BhcmsuVHJhbnNmZXJUeXBlUgR0eXBlEiMKDXNwYXJrX2ludm9pY2UYCyABKAlSDHNwYXJrSW52b2ljZRIoCgduZXR3b3JrGAwgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yayKEAwoMVHJhbnNmZXJMZWFmEiMKBGxlYWYYASABKAsyDy5zcGFyay5UcmVlTm9kZVIEbGVhZhIjCg1zZWNyZXRfY2lwaGVyGAIgASgMUgxzZWNyZXRDaXBoZXISHAoJc2lnbmF0dXJlGAMgASgMUglzaWduYXR1cmUSNAoWaW50ZXJtZWRpYXRlX3JlZnVuZF90eBgEIAEoDFIUaW50ZXJtZWRpYXRlUmVmdW5kVHgSQQodaW50ZXJtZWRpYXRlX2RpcmVjdF9yZWZ1bmRfdHgYBSABKAxSGmludGVybWVkaWF0ZURpcmVjdFJlZnVuZFR4ElMKJ2ludGVybWVkaWF0ZV9kaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eBgGIAEoDFIiaW50ZXJtZWRpYXRlRGlyZWN0RnJvbUNwZnBSZWZ1bmRUeBI+ChxwZW5kaW5nX2tleV90d2Vha19wdWJsaWNfa2V5GAcgASgMUhhwZW5kaW5nS2V5VHdlYWtQdWJsaWNLZXki8wMKDlRyYW5zZmVyRmlsdGVyEkEKHHJlY2VpdmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxIAFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRI9ChpzZW5kZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDEgAUhdzZW5kZXJJZGVudGl0eVB1YmxpY0tleRJTCiZzZW5kZXJfb3JfcmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRg8IAEoDEgAUiFzZW5kZXJPclJlY2VpdmVySWRlbnRpdHlQdWJsaWNLZXkSIQoMdHJhbnNmZXJfaWRzGAMgAygJUgt0cmFuc2ZlcklkcxIUCgVsaW1pdBgoIAEoA1IFbGltaXQSFgoGb2Zmc2V0GDIgASgDUgZvZmZzZXQSKQoFdHlwZXMYRiADKA4yEy5zcGFyay5UcmFuc2ZlclR5cGVSBXR5cGVzEigKB25ldHdvcmsYBCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEjEKCHN0YXR1c2VzGFAgAygOMhUuc3BhcmsuVHJhbnNmZXJTdGF0dXNSCHN0YXR1c2VzEiIKBW9yZGVyGAUgASgOMgwuc3BhcmsuT3JkZXJSBW9yZGVyQg0KC3BhcnRpY2lwYW50Il8KFlF1ZXJ5VHJhbnNmZXJzUmVzcG9uc2USLQoJdHJhbnNmZXJzGAEgAygLMg8uc3BhcmsuVHJhbnNmZXJSCXRyYW5zZmVycxIWCgZvZmZzZXQYAiABKANSBm9mZnNldCKVAgoRQ2xhaW1MZWFmS2V5VHdlYWsSFwoHbGVhZl9pZBgBIAEoCVIGbGVhZklkEkAKEnNlY3JldF9zaGFyZV90d2VhaxgCIAEoCzISLnNwYXJrLlNlY3JldFNoYXJlUhBzZWNyZXRTaGFyZVR3ZWFrEl8KE3B1YmtleV9zaGFyZXNfdHdlYWsYAyADKAsyLy5zcGFyay5DbGFpbUxlYWZLZXlUd2Vhay5QdWJrZXlTaGFyZXNUd2Vha0VudHJ5UhFwdWJrZXlTaGFyZXNUd2VhaxpEChZQdWJrZXlTaGFyZXNUd2Vha0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEiwQEKHUNsYWltVHJhbnNmZXJUd2Vha0tleXNSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSRAoRbGVhdmVzX3RvX3JlY2VpdmUYAyADKAsyGC5zcGFyay5DbGFpbUxlYWZLZXlUd2Vha1IPbGVhdmVzVG9SZWNlaXZlIsUBCh9DbGFpbVRyYW5zZmVyU2lnblJlZnVuZHNSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQAoMc2lnbmluZ19qb2JzGAMgAygLMh0uc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ0pvYlILc2lnbmluZ0pvYnNKBAgEEAUibQogQ2xhaW1UcmFuc2ZlclNpZ25SZWZ1bmRzUmVzcG9uc2USSQoPc2lnbmluZ19yZXN1bHRzGAEgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi9wEKGVN0b3JlUHJlaW1hZ2VTaGFyZVJlcXVlc3QSIQoMcGF5bWVudF9oYXNoGAEgASgMUgtwYXltZW50SGFzaBI5Cg5wcmVpbWFnZV9zaGFyZRgCIAEoCzISLnNwYXJrLlNlY3JldFNoYXJlUg1wcmVpbWFnZVNoYXJlEhwKCXRocmVzaG9sZBgDIAEoDVIJdGhyZXNob2xkEiUKDmludm9pY2Vfc3RyaW5nGAQgASgJUg1pbnZvaWNlU3RyaW5nEjcKGHVzZXJfaWRlbnRpdHlfcHVibGljX2tleRgFIAEoDFIVdXNlcklkZW50aXR5UHVibGljS2V5IoECChtSZXF1ZXN0ZWRTaWduaW5nQ29tbWl0bWVudHMSewoZc2lnbmluZ19ub25jZV9jb21taXRtZW50cxgBIAMoCzI/LnNwYXJrLlJlcXVlc3RlZFNpZ25pbmdDb21taXRtZW50cy5TaWduaW5nTm9uY2VDb21taXRtZW50c0VudHJ5UhdzaWduaW5nTm9uY2VDb21taXRtZW50cxplChxTaWduaW5nTm9uY2VDb21taXRtZW50c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ei8KBXZhbHVlGAIgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UgV2YWx1ZToCOAEiTwocR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVxdWVzdBIZCghub2RlX2lkcxgBIAMoCVIHbm9kZUlkcxIUCgVjb3VudBgCIAEoDVIFY291bnQidAodR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVzcG9uc2USUwoTc2lnbmluZ19jb21taXRtZW50cxgBIAMoCzIiLnNwYXJrLlJlcXVlc3RlZFNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzItoBChJTaWduaW5nQ29tbWl0bWVudHMSYgoTc2lnbmluZ19jb21taXRtZW50cxgBIAMoCzIxLnNwYXJrLlNpZ25pbmdDb21taXRtZW50cy5TaWduaW5nQ29tbWl0bWVudHNFbnRyeVISc2lnbmluZ0NvbW1pdG1lbnRzGmAKF1NpZ25pbmdDb21taXRtZW50c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ei8KBXZhbHVlGAIgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UgV2YWx1ZToCOAEixgIKEFVzZXJTaWduZWRSZWZ1bmQSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEhsKCXJlZnVuZF90eBgCIAEoDFIIcmVmdW5kVHgSJQoOdXNlcl9zaWduYXR1cmUYAyABKAxSDXVzZXJTaWduYXR1cmUSSgoTc2lnbmluZ19jb21taXRtZW50cxgEIAEoCzIZLnNwYXJrLlNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzElUKGXVzZXJfc2lnbmF0dXJlX2NvbW1pdG1lbnQYBSABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSF3VzZXJTaWduYXR1cmVDb21taXRtZW50EjIKB25ldHdvcmsYBiABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yayI7ChJJbnZvaWNlQW1vdW50UHJvb2YSJQoOYm9sdDExX2ludm9pY2UYASABKAlSDWJvbHQxMUludm9pY2UiewoNSW52b2ljZUFtb3VudBIdCgp2YWx1ZV9zYXRzGAEgASgEUgl2YWx1ZVNhdHMSSwoUaW52b2ljZV9hbW91bnRfcHJvb2YYAiABKAsyGS5zcGFyay5JbnZvaWNlQW1vdW50UHJvb2ZSEmludm9pY2VBbW91bnRQcm9vZiLWAwobSW5pdGlhdGVQcmVpbWFnZVN3YXBSZXF1ZXN0EiEKDHBheW1lbnRfaGFzaBgBIAEoDFILcGF5bWVudEhhc2gSOwoOaW52b2ljZV9hbW91bnQYAiABKAsyFC5zcGFyay5JbnZvaWNlQW1vdW50Ug1pbnZvaWNlQW1vdW50EkEKBnJlYXNvbhgDIAEoDjIpLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVxdWVzdC5SZWFzb25SBnJlYXNvbhJBCgh0cmFuc2ZlchgEIAEoCzIlLnNwYXJrLlN0YXJ0VXNlclNpZ25lZFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgFIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRIZCghmZWVfc2F0cxgGIAEoBFIHZmVlU2F0cxJGChB0cmFuc2Zlcl9yZXF1ZXN0GAcgASgLMhsuc3BhcmsuU3RhcnRUcmFuc2ZlclJlcXVlc3RSD3RyYW5zZmVyUmVxdWVzdCItCgZSZWFzb24SDwoLUkVBU09OX1NFTkQQABISCg5SRUFTT05fUkVDRUlWRRABImcKHEluaXRpYXRlUHJlaW1hZ2VTd2FwUmVzcG9uc2USGgoIcHJlaW1hZ2UYASABKAxSCHByZWltYWdlEisKCHRyYW5zZmVyGAIgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIjIKCE91dFBvaW50EhIKBHR4aWQYASABKAxSBHR4aWQSEgoEdm91dBgCIAEoDVIEdm91dCKHAQoWQ29vcGVyYXRpdmVFeGl0UmVxdWVzdBI3Cgh0cmFuc2ZlchgBIAEoCzIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ugh0cmFuc2ZlchIXCgdleGl0X2lkGAIgASgJUgZleGl0SWQSGwoJZXhpdF90eGlkGAMgASgMUghleGl0VHhpZCKRAQoXQ29vcGVyYXRpdmVFeGl0UmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXISSQoPc2lnbmluZ19yZXN1bHRzGAIgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMioAIKFkNvdW50ZXJMZWFmU3dhcFJlcXVlc3QSNwoIdHJhbnNmZXIYASABKAsyGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISFwoHc3dhcF9pZBgCIAEoCVIGc3dhcElkEiwKEmFkYXB0b3JfcHVibGljX2tleRgDIAEoDFIQYWRhcHRvclB1YmxpY0tleRI5ChlkaXJlY3RfYWRhcHRvcl9wdWJsaWNfa2V5GAQgASgMUhZkaXJlY3RBZGFwdG9yUHVibGljS2V5EksKI2RpcmVjdF9mcm9tX2NwZnBfYWRhcHRvcl9wdWJsaWNfa2V5GAUgASgMUh5kaXJlY3RGcm9tQ3BmcEFkYXB0b3JQdWJsaWNLZXkikQEKF0NvdW50ZXJMZWFmU3dhcFJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyEkkKD3NpZ25pbmdfcmVzdWx0cxgCIAMoCzIgLnNwYXJrLkxlYWZSZWZ1bmRUeFNpZ25pbmdSZXN1bHRSDnNpZ25pbmdSZXN1bHRzIqIBChZSZWZyZXNoVGltZWxvY2tSZXF1ZXN0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EjQKDHNpZ25pbmdfam9icxgDIAMoCzIRLnNwYXJrLlNpZ25pbmdKb2JSC3NpZ25pbmdKb2JzIoABChxSZWZyZXNoVGltZWxvY2tTaWduaW5nUmVzdWx0EjsKDnNpZ25pbmdfcmVzdWx0GAEgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFINc2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAIgASgMUgx2ZXJpZnlpbmdLZXkiZwoXUmVmcmVzaFRpbWVsb2NrUmVzcG9uc2USTAoPc2lnbmluZ19yZXN1bHRzGAEgAygLMiMuc3BhcmsuUmVmcmVzaFRpbWVsb2NrU2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi9gMKEUV4dGVuZExlYWZSZXF1ZXN0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EkAKE25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyES5zcGFyay5TaWduaW5nSm9iUhBub2RlVHhTaWduaW5nSm9iEkQKFXJlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEnJlZnVuZFR4U2lnbmluZ0pvYhJNChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgFIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgHIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iInsKF0V4dGVuZExlYWZTaWduaW5nUmVzdWx0EjsKDnNpZ25pbmdfcmVzdWx0GAEgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFINc2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAIgASgMUgx2ZXJpZnlpbmdLZXkimwQKEkV4dGVuZExlYWZSZXNwb25zZRIXCgdsZWFmX2lkGAEgASgJUgZsZWFmSWQSUwoWbm9kZV90eF9zaWduaW5nX3Jlc3VsdBgCIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UhNub2RlVHhTaWduaW5nUmVzdWx0ElcKGHJlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgDIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSYAodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBCABKAsyHi5zcGFyay5FeHRlbmRMZWFmU2lnbmluZ1Jlc3VsdFIZZGlyZWN0Tm9kZVR4U2lnbmluZ1Jlc3VsdBJkCh9kaXJlY3RfcmVmdW5kX3R4X3NpZ25pbmdfcmVzdWx0GAUgASgLMh4uc3BhcmsuRXh0ZW5kTGVhZlNpZ25pbmdSZXN1bHRSG2RpcmVjdFJlZnVuZFR4U2lnbmluZ1Jlc3VsdBJ2CilkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgGIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCJzChJBZGRyZXNzUmVxdWVzdE5vZGUSJgoPdXNlcl9wdWJsaWNfa2V5GAEgASgMUg11c2VyUHVibGljS2V5EjUKCGNoaWxkcmVuGAIgAygLMhkuc3BhcmsuQWRkcmVzc1JlcXVlc3ROb2RlUghjaGlsZHJlbiKDAgoZUHJlcGFyZVRyZWVBZGRyZXNzUmVxdWVzdBJBChJwYXJlbnRfbm9kZV9vdXRwdXQYASABKAsyES5zcGFyay5Ob2RlT3V0cHV0SABSEHBhcmVudE5vZGVPdXRwdXQSMQoNb25fY2hhaW5fdXR4bxgCIAEoCzILLnNwYXJrLlVUWE9IAFILb25DaGFpblV0eG8SLQoEbm9kZRgDIAEoCzIZLnNwYXJrLkFkZHJlc3NSZXF1ZXN0Tm9kZVIEbm9kZRI3Chh1c2VyX2lkZW50aXR5X3B1YmxpY19rZXkYBCABKAxSFXVzZXJJZGVudGl0eVB1YmxpY0tleUIICgZzb3VyY2UiZwoLQWRkcmVzc05vZGUSKAoHYWRkcmVzcxgBIAEoCzIOLnNwYXJrLkFkZHJlc3NSB2FkZHJlc3MSLgoIY2hpbGRyZW4YAiADKAsyEi5zcGFyay5BZGRyZXNzTm9kZVIIY2hpbGRyZW4iRAoaUHJlcGFyZVRyZWVBZGRyZXNzUmVzcG9uc2USJgoEbm9kZRgBIAEoCzISLnNwYXJrLkFkZHJlc3NOb2RlUgRub2RlIs4DCgxDcmVhdGlvbk5vZGUSQAoTbm9kZV90eF9zaWduaW5nX2pvYhgBIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEG5vZGVUeFNpZ25pbmdKb2ISRAoVcmVmdW5kX3R4X3NpZ25pbmdfam9iGAIgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIScmVmdW5kVHhTaWduaW5nSm9iEi8KCGNoaWxkcmVuGAMgAygLMhMuc3BhcmsuQ3JlYXRpb25Ob2RlUghjaGlsZHJlbhJNChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgFIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIvUBChFDcmVhdGVUcmVlUmVxdWVzdBJBChJwYXJlbnRfbm9kZV9vdXRwdXQYASABKAsyES5zcGFyay5Ob2RlT3V0cHV0SABSEHBhcmVudE5vZGVPdXRwdXQSMQoNb25fY2hhaW5fdXR4bxgCIAEoCzILLnNwYXJrLlVUWE9IAFILb25DaGFpblV0eG8SJwoEbm9kZRgDIAEoCzITLnNwYXJrLkNyZWF0aW9uTm9kZVIEbm9kZRI3Chh1c2VyX2lkZW50aXR5X3B1YmxpY19rZXkYBCABKAxSFXVzZXJJZGVudGl0eVB1YmxpY0tleUIICgZzb3VyY2UipAQKFENyZWF0aW9uUmVzcG9uc2VOb2RlEhcKB25vZGVfaWQYASABKAlSBm5vZGVJZBJJChZub2RlX3R4X3NpZ25pbmdfcmVzdWx0GAIgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFITbm9kZVR4U2lnbmluZ1Jlc3VsdBJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYAyABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSNwoIY2hpbGRyZW4YBCADKAsyGy5zcGFyay5DcmVhdGlvblJlc3BvbnNlTm9kZVIIY2hpbGRyZW4SVgodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhlkaXJlY3ROb2RlVHhTaWduaW5nUmVzdWx0EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYByABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCJFChJDcmVhdGVUcmVlUmVzcG9uc2USLwoEbm9kZRgBIAEoCzIbLnNwYXJrLkNyZWF0aW9uUmVzcG9uc2VOb2RlUgRub2RlIoQBChNTaWduaW5nT3BlcmF0b3JJbmZvEhQKBWluZGV4GAEgASgEUgVpbmRleBIeCgppZGVudGlmaWVyGAIgASgJUgppZGVudGlmaWVyEh0KCnB1YmxpY19rZXkYAyABKAxSCXB1YmxpY0tleRIYCgdhZGRyZXNzGAQgASgJUgdhZGRyZXNzIusBCh5HZXRTaWduaW5nT3BlcmF0b3JMaXN0UmVzcG9uc2USaAoRc2lnbmluZ19vcGVyYXRvcnMYASADKAsyOy5zcGFyay5HZXRTaWduaW5nT3BlcmF0b3JMaXN0UmVzcG9uc2UuU2lnbmluZ09wZXJhdG9yc0VudHJ5UhBzaWduaW5nT3BlcmF0b3JzGl8KFVNpZ25pbmdPcGVyYXRvcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIwCgV2YWx1ZRgCIAEoCzIaLnNwYXJrLlNpZ25pbmdPcGVyYXRvckluZm9SBXZhbHVlOgI4ASJyCh1RdWVyeVVzZXJTaWduZWRSZWZ1bmRzUmVxdWVzdBIhCgxwYXltZW50X2hhc2gYASABKAxSC3BheW1lbnRIYXNoEi4KE2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSEWlkZW50aXR5UHVibGljS2V5IpwBCh5RdWVyeVVzZXJTaWduZWRSZWZ1bmRzUmVzcG9uc2USRwoTdXNlcl9zaWduZWRfcmVmdW5kcxgBIAMoCzIXLnNwYXJrLlVzZXJTaWduZWRSZWZ1bmRSEXVzZXJTaWduZWRSZWZ1bmRzEisKCHRyYW5zZmVyGAMgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVySgQIAhADIqQDChtQcmVpbWFnZVJlcXVlc3RXaXRoVHJhbnNmZXISKgoMcGF5bWVudF9oYXNoGAEgASgMQgf6QgR6AmggUgtwYXltZW50SGFzaBJBChhyZWNlaXZlcl9pZGVudGl0eV9wdWJrZXkYAiABKAxCB/pCBHoCaCFSFnJlY2VpdmVySWRlbnRpdHlQdWJrZXkSNAoGc3RhdHVzGAMgASgOMhwuc3BhcmsuUHJlaW1hZ2VSZXF1ZXN0U3RhdHVzUgZzdGF0dXMSPQoMY3JlYXRlZF90aW1lGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFILY3JlYXRlZFRpbWUSMAoIdHJhbnNmZXIYBSABKAsyDy5zcGFyay5UcmFuc2ZlckgAUgh0cmFuc2ZlcogBARIfCghwcmVpbWFnZRgGIAEoDEgBUghwcmVpbWFnZYgBARI0ChZzZW5kZXJfaWRlbnRpdHlfcHVia2V5GAcgASgMUhRzZW5kZXJJZGVudGl0eVB1YmtleUILCglfdHJhbnNmZXJCCwoJX3ByZWltYWdlIsQCChBRdWVyeUh0bGNSZXF1ZXN0EiUKDnBheW1lbnRfaGFzaGVzGAEgAygMUg1wYXltZW50SGFzaGVzEjcKE2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSEWlkZW50aXR5UHVibGljS2V5EjkKBnN0YXR1cxgDIAEoDjIcLnNwYXJrLlByZWltYWdlUmVxdWVzdFN0YXR1c0gAUgZzdGF0dXOIAQESFAoFbGltaXQYBCABKANSBWxpbWl0EhYKBm9mZnNldBgFIAEoA1IGb2Zmc2V0EiEKDHRyYW5zZmVyX2lkcxgGIAMoCVILdHJhbnNmZXJJZHMSOQoKbWF0Y2hfcm9sZRgHIAEoDjIaLnNwYXJrLlByZWltYWdlUmVxdWVzdFJvbGVSCW1hdGNoUm9sZUIJCgdfc3RhdHVzInwKEVF1ZXJ5SHRsY1Jlc3BvbnNlEk8KEXByZWltYWdlX3JlcXVlc3RzGAEgAygLMiIuc3BhcmsuUHJlaW1hZ2VSZXF1ZXN0V2l0aFRyYW5zZmVyUhBwcmVpbWFnZVJlcXVlc3RzEhYKBm9mZnNldBgCIAEoA1IGb2Zmc2V0IocBChZQcm92aWRlUHJlaW1hZ2VSZXF1ZXN0EiEKDHBheW1lbnRfaGFzaBgBIAEoDFILcGF5bWVudEhhc2gSGgoIcHJlaW1hZ2UYAiABKAxSCHByZWltYWdlEi4KE2lkZW50aXR5X3B1YmxpY19rZXkYAyABKAxSEWlkZW50aXR5UHVibGljS2V5IkYKF1Byb3ZpZGVQcmVpbWFnZVJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIigKC1RyZWVOb2RlSWRzEhkKCG5vZGVfaWRzGAEgAygJUgdub2RlSWRzIrgCChFRdWVyeU5vZGVzUmVxdWVzdBI0ChVvd25lcl9pZGVudGl0eV9wdWJrZXkYASABKAxIAFITb3duZXJJZGVudGl0eVB1YmtleRIvCghub2RlX2lkcxgCIAEoCzISLnNwYXJrLlRyZWVOb2RlSWRzSABSB25vZGVJZHMSJwoPaW5jbHVkZV9wYXJlbnRzGAMgASgIUg5pbmNsdWRlUGFyZW50cxIUCgVsaW1pdBgEIAEoA1IFbGltaXQSFgoGb2Zmc2V0GAUgASgDUgZvZmZzZXQSKAoHbmV0d29yaxgGIAEoDjIOLnNwYXJrLk5ldHdvcmtSB25ldHdvcmsSMQoIc3RhdHVzZXMYByADKA4yFS5zcGFyay5UcmVlTm9kZVN0YXR1c1IIc3RhdHVzZXNCCAoGc291cmNlIrMBChJRdWVyeU5vZGVzUmVzcG9uc2USOgoFbm9kZXMYASADKAsyJC5zcGFyay5RdWVyeU5vZGVzUmVzcG9uc2UuTm9kZXNFbnRyeVIFbm9kZXMSFgoGb2Zmc2V0GAIgASgDUgZvZmZzZXQaSQoKTm9kZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIlCgV2YWx1ZRgCIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgV2YWx1ZToCOAEidQoVQ2FuY2VsVHJhbnNmZXJSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjsKGnNlbmRlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhdzZW5kZXJJZGVudGl0eVB1YmxpY0tleSJFChZDYW5jZWxUcmFuc2ZlclJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIqwBCiJRdWVyeVVudXNlZERlcG9zaXRBZGRyZXNzZXNSZXF1ZXN0Ei4KE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSEWlkZW50aXR5UHVibGljS2V5EigKB25ldHdvcmsYAiABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEhQKBWxpbWl0GAMgASgDUgVsaW1pdBIWCgZvZmZzZXQYBCABKANSBm9mZnNldCLuAQoiUXVlcnlTdGF0aWNEZXBvc2l0QWRkcmVzc2VzUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIoCgduZXR3b3JrGAIgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yaxIUCgVsaW1pdBgEIAEoA1IFbGltaXQSFgoGb2Zmc2V0GAUgASgDUgZvZmZzZXQSLAoPZGVwb3NpdF9hZGRyZXNzGAYgASgJSABSDmRlcG9zaXRBZGRyZXNziAEBQhIKEF9kZXBvc2l0X2FkZHJlc3MiygIKGURlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHQSJwoPZGVwb3NpdF9hZGRyZXNzGAEgASgJUg5kZXBvc2l0QWRkcmVzcxI1Chd1c2VyX3NpZ25pbmdfcHVibGljX2tleRgCIAEoDFIUdXNlclNpZ25pbmdQdWJsaWNLZXkSMAoUdmVyaWZ5aW5nX3B1YmxpY19rZXkYAyABKAxSEnZlcmlmeWluZ1B1YmxpY0tleRImCgdsZWFmX2lkGAQgASgJQgj6QgVyA7ABAUgAUgZsZWFmSWSIAQESTwoTcHJvb2Zfb2ZfcG9zc2Vzc2lvbhgFIAEoCzIaLnNwYXJrLkRlcG9zaXRBZGRyZXNzUHJvb2ZIAVIRcHJvb2ZPZlBvc3Nlc3Npb26IAQFCCgoIX2xlYWZfaWRCFgoUX3Byb29mX29mX3Bvc3Nlc3Npb24ijAEKI1F1ZXJ5VW51c2VkRGVwb3NpdEFkZHJlc3Nlc1Jlc3BvbnNlEk0KEWRlcG9zaXRfYWRkcmVzc2VzGAEgAygLMiAuc3BhcmsuRGVwb3NpdEFkZHJlc3NRdWVyeVJlc3VsdFIQZGVwb3NpdEFkZHJlc3NlcxIWCgZvZmZzZXQYAiABKANSBm9mZnNldCJ0CiNRdWVyeVN0YXRpY0RlcG9zaXRBZGRyZXNzZXNSZXNwb25zZRJNChFkZXBvc2l0X2FkZHJlc3NlcxgBIAMoCzIgLnNwYXJrLkRlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHRSEGRlcG9zaXRBZGRyZXNzZXMibwoTUXVlcnlCYWxhbmNlUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIoCgduZXR3b3JrGAIgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yayLFAQoUUXVlcnlCYWxhbmNlUmVzcG9uc2USGAoHYmFsYW5jZRgBIAEoBFIHYmFsYW5jZRJSCg1ub2RlX2JhbGFuY2VzGAIgAygLMi0uc3BhcmsuUXVlcnlCYWxhbmNlUmVzcG9uc2UuTm9kZUJhbGFuY2VzRW50cnlSDG5vZGVCYWxhbmNlcxo/ChFOb2RlQmFsYW5jZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoBFIFdmFsdWU6AjgBIsUBCgxTcGFya0FkZHJlc3MSLgoTaWRlbnRpdHlfcHVibGljX2tleRgBIAEoDFIRaWRlbnRpdHlQdWJsaWNLZXkSSwoUc3BhcmtfaW52b2ljZV9maWVsZHMYAiABKAsyGS5zcGFyay5TcGFya0ludm9pY2VGaWVsZHNSEnNwYXJrSW52b2ljZUZpZWxkcxIqCglzaWduYXR1cmUYAyABKAxCB/pCBHoCaEBIAFIJc2lnbmF0dXJliAEBQgwKCl9zaWduYXR1cmUinAMKElNwYXJrSW52b2ljZUZpZWxkcxIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEhcKAmlkGAIgASgMQgf6QgR6AmgQUgJpZBI9Cg50b2tlbnNfcGF5bWVudBgDIAEoCzIULnNwYXJrLlRva2Vuc1BheW1lbnRIAFINdG9rZW5zUGF5bWVudBI3CgxzYXRzX3BheW1lbnQYBCABKAsyEi5zcGFyay5TYXRzUGF5bWVudEgAUgtzYXRzUGF5bWVudBIgCgRtZW1vGAUgASgJQgf6QgRyAih4SAFSBG1lbW+IAQESOAoRc2VuZGVyX3B1YmxpY19rZXkYBiABKAxCB/pCBHoCaCFIAlIPc2VuZGVyUHVibGljS2V5iAEBEkAKC2V4cGlyeV90aW1lGAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgDUgpleHBpcnlUaW1liAEBQg4KDHBheW1lbnRfdHlwZUIHCgVfbWVtb0IUChJfc2VuZGVyX3B1YmxpY19rZXlCDgoMX2V4cGlyeV90aW1lIjUKC1NhdHNQYXltZW50EhsKBmFtb3VudBgBIAEoBEgAUgZhbW91bnSIAQFCCQoHX2Ftb3VudCKOAQoNVG9rZW5zUGF5bWVudBI3ChB0b2tlbl9pZGVudGlmaWVyGAEgASgMQgf6QgR6AmggSABSD3Rva2VuSWRlbnRpZmllcogBARIkCgZhbW91bnQYAiABKAxCB/pCBHoCGBBIAVIGYW1vdW50iAEBQhMKEV90b2tlbl9pZGVudGlmaWVyQgkKB19hbW91bnQixgEKJkluaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXF1ZXN0Ei8KDW9uX2NoYWluX3V0eG8YASABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAyABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISJQoOdXNlcl9zaWduYXR1cmUYBCABKAxSDXVzZXJTaWduYXR1cmUiwwEKJ0luaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXNwb25zZRJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYASABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSSQoPZGVwb3NpdF9hZGRyZXNzGAIgASgLMiAuc3BhcmsuRGVwb3NpdEFkZHJlc3NRdWVyeVJlc3VsdFIOZGVwb3NpdEFkZHJlc3MisAMKF0luaXRpYXRlVXR4b1N3YXBSZXF1ZXN0Ei8KDW9uX2NoYWluX3V0eG8YASABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxI9CgxyZXF1ZXN0X3R5cGUYAiABKA4yGi5zcGFyay5VdHhvU3dhcFJlcXVlc3RUeXBlUgtyZXF1ZXN0VHlwZRIuChJjcmVkaXRfYW1vdW50X3NhdHMYAyABKARIAFIQY3JlZGl0QW1vdW50U2F0cxIiCgxtYXhfZmVlX3NhdHMYBCABKARIAFIKbWF4RmVlU2F0cxIjCg1zc3Bfc2lnbmF0dXJlGAUgASgMUgxzc3BTaWduYXR1cmUSJQoOdXNlcl9zaWduYXR1cmUYBiABKAxSDXVzZXJTaWduYXR1cmUSNwoIdHJhbnNmZXIYByABKAsyGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISQgoUc3BlbmRfdHhfc2lnbmluZ19qb2IYCCABKAsyES5zcGFyay5TaWduaW5nSm9iUhFzcGVuZFR4U2lnbmluZ0pvYkIICgZhbW91bnQi3wEKGEluaXRpYXRlVXR4b1N3YXBSZXNwb25zZRJLChdzcGVuZF90eF9zaWduaW5nX3Jlc3VsdBgBIAEoCzIULnNwYXJrLlNpZ25pbmdSZXN1bHRSFHNwZW5kVHhTaWduaW5nUmVzdWx0EisKCHRyYW5zZmVyGAIgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyEkkKD2RlcG9zaXRfYWRkcmVzcxgDIAEoCzIgLnNwYXJrLkRlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHRSDmRlcG9zaXRBZGRyZXNzIosBCgtFeGl0aW5nVHJlZRIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSUQoXdXNlcl9zaWduaW5nX2NvbW1pdG1lbnQYAiABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSFXVzZXJTaWduaW5nQ29tbWl0bWVudBIQCgN2aW4YAyABKA1SA3ZpbiKcAQofRXhpdFNpbmdsZU5vZGVUcmVlU2lnbmluZ1Jlc3VsdBIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSOwoOc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0Ug1zaWduaW5nUmVzdWx0EiMKDXZlcmlmeWluZ19rZXkYAyABKAxSDHZlcmlmeWluZ0tleSJNChhCaXRjb2luVHJhbnNhY3Rpb25PdXRwdXQSFAoFdmFsdWUYASABKANSBXZhbHVlEhsKCXBrX3NjcmlwdBgCIAEoDFIIcGtTY3JpcHQi8wEKGkV4aXRTaW5nbGVOb2RlVHJlZXNSZXF1ZXN0EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSNwoNZXhpdGluZ190cmVlcxgCIAMoCzISLnNwYXJrLkV4aXRpbmdUcmVlUgxleGl0aW5nVHJlZXMSFQoGcmF3X3R4GAMgASgMUgVyYXdUeBJKChBwcmV2aW91c19vdXRwdXRzGAQgAygLMh8uc3BhcmsuQml0Y29pblRyYW5zYWN0aW9uT3V0cHV0Ug9wcmV2aW91c091dHB1dHMibgobRXhpdFNpbmdsZU5vZGVUcmVlc1Jlc3BvbnNlEk8KD3NpZ25pbmdfcmVzdWx0cxgBIAMoCzImLnNwYXJrLkV4aXRTaW5nbGVOb2RlVHJlZVNpZ25pbmdSZXN1bHRSDnNpZ25pbmdSZXN1bHRzIloKHVF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXF1ZXN0EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkizwEKHlF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXNwb25zZRJoChFub2RlX2Rpc3RyaWJ1dGlvbhgBIAMoCzI7LnNwYXJrLlF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXNwb25zZS5Ob2RlRGlzdHJpYnV0aW9uRW50cnlSEG5vZGVEaXN0cmlidXRpb24aQwoVTm9kZURpc3RyaWJ1dGlvbkVudHJ5EhAKA2tleRgBIAEoBFIDa2V5EhQKBXZhbHVlGAIgASgEUgV2YWx1ZToCOAEimQEKGFF1ZXJ5Tm9kZXNCeVZhbHVlUmVxdWVzdBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EhQKBXZhbHVlGAIgASgDUgV2YWx1ZRIWCgZvZmZzZXQYAyABKANSBm9mZnNldBIUCgVsaW1pdBgEIAEoA1IFbGltaXQiwQEKGVF1ZXJ5Tm9kZXNCeVZhbHVlUmVzcG9uc2USQQoFbm9kZXMYASADKAsyKy5zcGFyay5RdWVyeU5vZGVzQnlWYWx1ZVJlc3BvbnNlLk5vZGVzRW50cnlSBW5vZGVzEhYKBm9mZnNldBgCIAEoA1IGb2Zmc2V0GkkKCk5vZGVzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSJQoFdmFsdWUYAiABKAsyDy5zcGFyay5UcmVlTm9kZVIFdmFsdWU6AjgBIrYBChlHZXRVdHhvc0ZvckFkZHJlc3NSZXF1ZXN0EhgKB2FkZHJlc3MYASABKAlSB2FkZHJlc3MSFgoGb2Zmc2V0GAIgASgEUgZvZmZzZXQSFAoFbGltaXQYAyABKARSBWxpbWl0EigKB25ldHdvcmsYBCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEicKD2V4Y2x1ZGVfY2xhaW1lZBgFIAEoCFIOZXhjbHVkZUNsYWltZWQiVwoaR2V0VXR4b3NGb3JBZGRyZXNzUmVzcG9uc2USIQoFdXR4b3MYASADKAsyCy5zcGFyay5VVFhPUgV1dHhvcxIWCgZvZmZzZXQYAiABKARSBm9mZnNldCJjChlRdWVyeVNwYXJrSW52b2ljZXNSZXF1ZXN0EhQKBWxpbWl0GAEgASgDUgVsaW1pdBIWCgZvZmZzZXQYAiABKANSBm9mZnNldBIYCgdpbnZvaWNlGAMgAygJUgdpbnZvaWNlIncKGlF1ZXJ5U3BhcmtJbnZvaWNlc1Jlc3BvbnNlEhYKBm9mZnNldBgBIAEoA1IGb2Zmc2V0EkEKEGludm9pY2Vfc3RhdHVzZXMYAiADKAsyFi5zcGFyay5JbnZvaWNlUmVzcG9uc2VSD2ludm9pY2VTdGF0dXNlcyLlAQoPSW52b2ljZVJlc3BvbnNlEhgKB2ludm9pY2UYASABKAlSB2ludm9pY2USLAoGc3RhdHVzGAIgASgOMhQuc3BhcmsuSW52b2ljZVN0YXR1c1IGc3RhdHVzEjoKDXNhdHNfdHJhbnNmZXIYAyABKAsyEy5zcGFyay5TYXRzVHJhbnNmZXJIAFIMc2F0c1RyYW5zZmVyEj0KDnRva2VuX3RyYW5zZmVyGAQgASgLMhQuc3BhcmsuVG9rZW5UcmFuc2ZlckgAUg10b2tlblRyYW5zZmVyQg8KDXRyYW5zZmVyX3R5cGUiOAoMU2F0c1RyYW5zZmVyEigKC3RyYW5zZmVyX2lkGAEgASgMQgf6QgR6AmgQUgp0cmFuc2ZlcklkIlkKDVRva2VuVHJhbnNmZXISSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgBIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaCKtAQoiSW5pdGlhdGVTd2FwUHJpbWFyeVRyYW5zZmVyUmVxdWVzdBI3Cgh0cmFuc2ZlchgBIAEoCzIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ugh0cmFuc2ZlchJOChNhZGFwdG9yX3B1YmxpY19rZXlzGAIgASgLMh4uc3BhcmsuQWRhcHRvclB1YmxpY0tleVBhY2thZ2VSEWFkYXB0b3JQdWJsaWNLZXlzIp0BCiNJbml0aWF0ZVN3YXBQcmltYXJ5VHJhbnNmZXJSZXNwb25zZRIrCgh0cmFuc2ZlchgBIAEoCzIPLnNwYXJrLlRyYW5zZmVyUgh0cmFuc2ZlchJJCg9zaWduaW5nX3Jlc3VsdHMYAiADKAsyIC5zcGFyay5MZWFmUmVmdW5kVHhTaWduaW5nUmVzdWx0Ug5zaWduaW5nUmVzdWx0cyLPAQoXQWRhcHRvclB1YmxpY0tleVBhY2thZ2USLAoSYWRhcHRvcl9wdWJsaWNfa2V5GAEgASgMUhBhZGFwdG9yUHVibGljS2V5EjkKGWRpcmVjdF9hZGFwdG9yX3B1YmxpY19rZXkYAiABKAxSFmRpcmVjdEFkYXB0b3JQdWJsaWNLZXkSSwojZGlyZWN0X2Zyb21fY3BmcF9hZGFwdG9yX3B1YmxpY19rZXkYAyABKAxSHmRpcmVjdEZyb21DcGZwQWRhcHRvclB1YmxpY0tleSLmAQoNV2FsbGV0U2V0dGluZxJCChlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUhZvd25lcklkZW50aXR5UHVibGljS2V5EicKD3ByaXZhdGVfZW5hYmxlZBgCIAEoCFIOcHJpdmF0ZUVuYWJsZWQSSQoabWFzdGVyX2lkZW50aXR5X3B1YmxpY19rZXkYAyABKAxCB/pCBHoCaCFIAFIXbWFzdGVySWRlbnRpdHlQdWJsaWNLZXmIAQFCHQobX21hc3Rlcl9pZGVudGl0eV9wdWJsaWNfa2V5IowCChpVcGRhdGVXYWxsZXRTZXR0aW5nUmVxdWVzdBIsCg9wcml2YXRlX2VuYWJsZWQYASABKAhIAVIOcHJpdmF0ZUVuYWJsZWSIAQESRAoec2V0X21hc3Rlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMSABSGnNldE1hc3RlcklkZW50aXR5UHVibGljS2V5EkgKIGNsZWFyX21hc3Rlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAMgASgISABSHGNsZWFyTWFzdGVySWRlbnRpdHlQdWJsaWNLZXlCHAoabWFzdGVyX2lkZW50aXR5X3B1YmxpY19rZXlCEgoQX3ByaXZhdGVfZW5hYmxlZCJaChtVcGRhdGVXYWxsZXRTZXR0aW5nUmVzcG9uc2USOwoOd2FsbGV0X3NldHRpbmcYASABKAsyFC5zcGFyay5XYWxsZXRTZXR0aW5nUg13YWxsZXRTZXR0aW5nIhsKGVF1ZXJ5V2FsbGV0U2V0dGluZ1JlcXVlc3QiWQoaUXVlcnlXYWxsZXRTZXR0aW5nUmVzcG9uc2USOwoOd2FsbGV0X3NldHRpbmcYASABKAsyFC5zcGFyay5XYWxsZXRTZXR0aW5nUg13YWxsZXRTZXR0aW5nKk0KB05ldHdvcmsSDwoLVU5TUEVDSUZJRUQQABILCgdNQUlOTkVUEAESCwoHUkVHVEVTVBACEgsKB1RFU1RORVQQAxIKCgZTSUdORVQQBCojCglEaXJlY3Rpb24SCAoETkVYVBAAEgwKCFBSRVZJT1VTEAEq/AMKDlRyYW5zZmVyU3RhdHVzEiQKIFRSQU5TRkVSX1NUQVRVU19TRU5ERVJfSU5JVElBVEVEEAASLAooVFJBTlNGRVJfU1RBVFVTX1NFTkRFUl9LRVlfVFdFQUtfUEVORElORxABEiYKIlRSQU5TRkVSX1NUQVRVU19TRU5ERVJfS0VZX1RXRUFLRUQQAhIoCiRUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfS0VZX1RXRUFLRUQQAxIqCiZUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfUkVGVU5EX1NJR05FRBAEEh0KGVRSQU5TRkVSX1NUQVRVU19DT01QTEVURUQQBRIbChdUUkFOU0ZFUl9TVEFUVVNfRVhQSVJFRBAGEhwKGFRSQU5TRkVSX1NUQVRVU19SRVRVUk5FRBAHEjAKLFRSQU5TRkVSX1NUQVRVU19TRU5ERVJfSU5JVElBVEVEX0NPT1JESU5BVE9SEAgSLQopVFJBTlNGRVJfU1RBVFVTX1JFQ0VJVkVSX0tFWV9UV0VBS19MT0NLRUQQCRIuCipUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfS0VZX1RXRUFLX0FQUExJRUQQChItCilUUkFOU0ZFUl9TVEFUVVNfQVBQTFlJTkdfU0VOREVSX0tFWV9UV0VBSxALKpoBCgxUcmFuc2ZlclR5cGUSEQoNUFJFSU1BR0VfU1dBUBAAEhQKEENPT1BFUkFUSVZFX0VYSVQQARIMCghUUkFOU0ZFUhACEg0KCVVUWE9fU1dBUBADEggKBFNXQVAQHhIQCgxDT1VOVEVSX1NXQVAQKBITCg9QUklNQVJZX1NXQVBfVjMQBBITCg9DT1VOVEVSX1NXQVBfVjMQBSomCgVPcmRlchIOCgpERVNDRU5ESU5HEAASDQoJQVNDRU5ESU5HEAEqnAEKFVByZWltYWdlUmVxdWVzdFN0YXR1cxIwCixQUkVJTUFHRV9SRVFVRVNUX1NUQVRVU19XQUlUSU5HX0ZPUl9QUkVJTUFHRRAAEisKJ1BSRUlNQUdFX1JFUVVFU1RfU1RBVFVTX1BSRUlNQUdFX1NIQVJFRBABEiQKIFBSRUlNQUdFX1JFUVVFU1RfU1RBVFVTX1JFVFVSTkVEEAIqigEKE1ByZWltYWdlUmVxdWVzdFJvbGUSIgoeUFJFSU1BR0VfUkVRVUVTVF9ST0xFX1JFQ0VJVkVSEAASIAocUFJFSU1BR0VfUkVRVUVTVF9ST0xFX1NFTkRFUhABEi0KKVBSRUlNQUdFX1JFUVVFU1RfUk9MRV9SRUNFSVZFUl9BTkRfU0VOREVSEAIqOAoTVXR4b1N3YXBSZXF1ZXN0VHlwZRIJCgVGaXhlZBAAEgoKBk1heEZlZRABEgoKBlJlZnVuZBACKk4KDUludm9pY2VTdGF0dXMSDQoJTk9UX0ZPVU5EEAASCwoHUEVORElORxABEg0KCUZJTkFMSVpFRBACEgwKCFJFVFVSTkVEEAQiBAgDEAMqgwMKDlRyZWVOb2RlU3RhdHVzEh0KGVRSRUVfTk9ERV9TVEFUVVNfQ1JFQVRJTkcQABIeChpUUkVFX05PREVfU1RBVFVTX0FWQUlMQUJMRRABEiUKIVRSRUVfTk9ERV9TVEFUVVNfRlJPWkVOX0JZX0lTU1VFUhACEiQKIFRSRUVfTk9ERV9TVEFUVVNfVFJBTlNGRVJfTE9DS0VEEAMSIQodVFJFRV9OT0RFX1NUQVRVU19TUExJVF9MT0NLRUQQBBIdChlUUkVFX05PREVfU1RBVFVTX1NQTElUVEVEEAUSHwobVFJFRV9OT0RFX1NUQVRVU19BR0dSRUdBVEVEEAYSHQoZVFJFRV9OT0RFX1NUQVRVU19PTl9DSEFJThAHEiMKH1RSRUVfTk9ERV9TVEFUVVNfQUdHUkVHQVRFX0xPQ0sQCBIbChdUUkVFX05PREVfU1RBVFVTX0VYSVRFRBAJEiEKHVRSRUVfTk9ERV9TVEFUVVNfUkVORVdfTE9DS0VEEAoyxxkKDFNwYXJrU2VydmljZRJpChhnZW5lcmF0ZV9kZXBvc2l0X2FkZHJlc3MSJC5zcGFyay5HZW5lcmF0ZURlcG9zaXRBZGRyZXNzUmVxdWVzdBolLnNwYXJrLkdlbmVyYXRlRGVwb3NpdEFkZHJlc3NSZXNwb25zZSIAEnwKH2dlbmVyYXRlX3N0YXRpY19kZXBvc2l0X2FkZHJlc3MSKi5zcGFyay5HZW5lcmF0ZVN0YXRpY0RlcG9zaXRBZGRyZXNzUmVxdWVzdBorLnNwYXJrLkdlbmVyYXRlU3RhdGljRGVwb3NpdEFkZHJlc3NSZXNwb25zZSIAEnAKG3N0YXJ0X2RlcG9zaXRfdHJlZV9jcmVhdGlvbhImLnNwYXJrLlN0YXJ0RGVwb3NpdFRyZWVDcmVhdGlvblJlcXVlc3QaJy5zcGFyay5TdGFydERlcG9zaXRUcmVlQ3JlYXRpb25SZXNwb25zZSIAEn8KJ2ZpbmFsaXplX3RyYW5zZmVyX3dpdGhfdHJhbnNmZXJfcGFja2FnZRIxLnNwYXJrLkZpbmFsaXplVHJhbnNmZXJXaXRoVHJhbnNmZXJQYWNrYWdlUmVxdWVzdBofLnNwYXJrLkZpbmFsaXplVHJhbnNmZXJSZXNwb25zZSIAElEKF3F1ZXJ5X3BlbmRpbmdfdHJhbnNmZXJzEhUuc3BhcmsuVHJhbnNmZXJGaWx0ZXIaHS5zcGFyay5RdWVyeVRyYW5zZmVyc1Jlc3BvbnNlIgASTQoTcXVlcnlfYWxsX3RyYW5zZmVycxIVLnNwYXJrLlRyYW5zZmVyRmlsdGVyGh0uc3BhcmsuUXVlcnlUcmFuc2ZlcnNSZXNwb25zZSIAElsKGWNsYWltX3RyYW5zZmVyX3R3ZWFrX2tleXMSJC5zcGFyay5DbGFpbVRyYW5zZmVyVHdlYWtLZXlzUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSIAElIKFHN0b3JlX3ByZWltYWdlX3NoYXJlEiAuc3BhcmsuU3RvcmVQcmVpbWFnZVNoYXJlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSIAEmYKF2dldF9zaWduaW5nX2NvbW1pdG1lbnRzEiMuc3BhcmsuR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVxdWVzdBokLnNwYXJrLkdldFNpZ25pbmdDb21taXRtZW50c1Jlc3BvbnNlIgASUwoQcHJvdmlkZV9wcmVpbWFnZRIdLnNwYXJrLlByb3ZpZGVQcmVpbWFnZVJlcXVlc3QaHi5zcGFyay5Qcm92aWRlUHJlaW1hZ2VSZXNwb25zZSIAEkEKCnF1ZXJ5X2h0bGMSFy5zcGFyay5RdWVyeUh0bGNSZXF1ZXN0Ghguc3BhcmsuUXVlcnlIdGxjUmVzcG9uc2UiABJBCgpyZW5ld19sZWFmEhcuc3BhcmsuUmVuZXdMZWFmUmVxdWVzdBoYLnNwYXJrLlJlbmV3TGVhZlJlc3BvbnNlIgASXAoZZ2V0X3NpZ25pbmdfb3BlcmF0b3JfbGlzdBIWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRolLnNwYXJrLkdldFNpZ25pbmdPcGVyYXRvckxpc3RSZXNwb25zZSIAEkQKC3F1ZXJ5X25vZGVzEhguc3BhcmsuUXVlcnlOb2Rlc1JlcXVlc3QaGS5zcGFyay5RdWVyeU5vZGVzUmVzcG9uc2UiABJKCg1xdWVyeV9iYWxhbmNlEhouc3BhcmsuUXVlcnlCYWxhbmNlUmVxdWVzdBobLnNwYXJrLlF1ZXJ5QmFsYW5jZVJlc3BvbnNlIgASagoZcXVlcnlfdXNlcl9zaWduZWRfcmVmdW5kcxIkLnNwYXJrLlF1ZXJ5VXNlclNpZ25lZFJlZnVuZHNSZXF1ZXN0GiUuc3BhcmsuUXVlcnlVc2VyU2lnbmVkUmVmdW5kc1Jlc3BvbnNlIgASeQoecXVlcnlfdW51c2VkX2RlcG9zaXRfYWRkcmVzc2VzEikuc3BhcmsuUXVlcnlVbnVzZWREZXBvc2l0QWRkcmVzc2VzUmVxdWVzdBoqLnNwYXJrLlF1ZXJ5VW51c2VkRGVwb3NpdEFkZHJlc3Nlc1Jlc3BvbnNlIgASeQoecXVlcnlfc3RhdGljX2RlcG9zaXRfYWRkcmVzc2VzEikuc3BhcmsuUXVlcnlTdGF0aWNEZXBvc2l0QWRkcmVzc2VzUmVxdWVzdBoqLnNwYXJrLlF1ZXJ5U3RhdGljRGVwb3NpdEFkZHJlc3Nlc1Jlc3BvbnNlIgASXAoTc3Vic2NyaWJlX3RvX2V2ZW50cxIfLnNwYXJrLlN1YnNjcmliZVRvRXZlbnRzUmVxdWVzdBogLnNwYXJrLlN1YnNjcmliZVRvRXZlbnRzUmVzcG9uc2UiADABEoYBCiNpbml0aWF0ZV9zdGF0aWNfZGVwb3NpdF91dHhvX3JlZnVuZBItLnNwYXJrLkluaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXF1ZXN0Gi4uc3BhcmsuSW5pdGlhdGVTdGF0aWNEZXBvc2l0VXR4b1JlZnVuZFJlc3BvbnNlIgASYQoWZXhpdF9zaW5nbGVfbm9kZV90cmVlcxIhLnNwYXJrLkV4aXRTaW5nbGVOb2RlVHJlZXNSZXF1ZXN0GiIuc3BhcmsuRXhpdFNpbmdsZU5vZGVUcmVlc1Jlc3BvbnNlIgASVgoTY29vcGVyYXRpdmVfZXhpdF92MhIdLnNwYXJrLkNvb3BlcmF0aXZlRXhpdFJlcXVlc3QaHi5zcGFyay5Db29wZXJhdGl2ZUV4aXRSZXNwb25zZSIAEnMKHmNsYWltX3RyYW5zZmVyX3NpZ25fcmVmdW5kc192MhImLnNwYXJrLkNsYWltVHJhbnNmZXJTaWduUmVmdW5kc1JlcXVlc3QaJy5zcGFyay5DbGFpbVRyYW5zZmVyU2lnblJlZnVuZHNSZXNwb25zZSIAEmwKG2ZpbmFsaXplX25vZGVfc2lnbmF0dXJlc192MhIkLnNwYXJrLkZpbmFsaXplTm9kZVNpZ25hdHVyZXNSZXF1ZXN0GiUuc3BhcmsuRmluYWxpemVOb2RlU2lnbmF0dXJlc1Jlc3BvbnNlIgASZgoZaW5pdGlhdGVfcHJlaW1hZ2Vfc3dhcF92MhIiLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVxdWVzdBojLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVzcG9uc2UiABJmChlpbml0aWF0ZV9wcmVpbWFnZV9zd2FwX3YzEiIuc3BhcmsuSW5pdGlhdGVQcmVpbWFnZVN3YXBSZXF1ZXN0GiMuc3BhcmsuSW5pdGlhdGVQcmVpbWFnZVN3YXBSZXNwb25zZSIAElEKEnN0YXJ0X2xlYWZfc3dhcF92MhIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ghwuc3BhcmsuU3RhcnRUcmFuc2ZlclJlc3BvbnNlIgASUAoRc3RhcnRfdHJhbnNmZXJfdjISGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdBocLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXNwb25zZSIAEl4KFWdldF91dHhvc19mb3JfYWRkcmVzcxIgLnNwYXJrLkdldFV0eG9zRm9yQWRkcmVzc1JlcXVlc3QaIS5zcGFyay5HZXRVdHhvc0ZvckFkZHJlc3NSZXNwb25zZSIAEl0KFHF1ZXJ5X3NwYXJrX2ludm9pY2VzEiAuc3BhcmsuUXVlcnlTcGFya0ludm9pY2VzUmVxdWVzdBohLnNwYXJrLlF1ZXJ5U3BhcmtJbnZvaWNlc1Jlc3BvbnNlIgASeQoeaW5pdGlhdGVfc3dhcF9wcmltYXJ5X3RyYW5zZmVyEikuc3BhcmsuSW5pdGlhdGVTd2FwUHJpbWFyeVRyYW5zZmVyUmVxdWVzdBoqLnNwYXJrLkluaXRpYXRlU3dhcFByaW1hcnlUcmFuc2ZlclJlc3BvbnNlIgASYAoVdXBkYXRlX3dhbGxldF9zZXR0aW5nEiEuc3BhcmsuVXBkYXRlV2FsbGV0U2V0dGluZ1JlcXVlc3QaIi5zcGFyay5VcGRhdGVXYWxsZXRTZXR0aW5nUmVzcG9uc2UiABJdChRxdWVyeV93YWxsZXRfc2V0dGluZxIgLnNwYXJrLlF1ZXJ5V2FsbGV0U2V0dGluZ1JlcXVlc3QaIS5zcGFyay5RdWVyeVdhbGxldFNldHRpbmdSZXNwb25zZSIAQixaKmdpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9zcGFya2IGcHJvdG8zCppWChFzcGFya190b2tlbi5wcm90bxILc3BhcmtfdG9rZW4aH2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8aC3NwYXJrLnByb3RvGhd2YWxpZGF0ZS92YWxpZGF0ZS5wcm90byKbAQoSVG9rZW5PdXRwdXRUb1NwZW5kEkYKG3ByZXZfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgBIAEoDEIH+kIEegJoIFIYcHJldlRva2VuVHJhbnNhY3Rpb25IYXNoEj0KG3ByZXZfdG9rZW5fdHJhbnNhY3Rpb25fdm91dBgCIAEoDVIYcHJldlRva2VuVHJhbnNhY3Rpb25Wb3V0Il8KElRva2VuVHJhbnNmZXJJbnB1dBJJChBvdXRwdXRzX3RvX3NwZW5kGAEgAygLMh8uc3BhcmtfdG9rZW4uVG9rZW5PdXRwdXRUb1NwZW5kUg5vdXRwdXRzVG9TcGVuZCKTAQoOVG9rZW5NaW50SW5wdXQSMwoRaXNzdWVyX3B1YmxpY19rZXkYASABKAxCB/pCBHoCaCFSD2lzc3VlclB1YmxpY0tleRI3ChB0b2tlbl9pZGVudGlmaWVyGAIgASgMQgf6QgR6AmggSABSD3Rva2VuSWRlbnRpZmllcogBAUITChFfdG9rZW5faWRlbnRpZmllciK/AwoQVG9rZW5DcmVhdGVJbnB1dBIzChFpc3N1ZXJfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIPaXNzdWVyUHVibGljS2V5EiYKCnRva2VuX25hbWUYAiABKAlCB/pCBHICGBRSCXRva2VuTmFtZRIqCgx0b2tlbl90aWNrZXIYAyABKAlCB/pCBHICGAZSC3Rva2VuVGlja2VyEiQKCGRlY2ltYWxzGAQgASgNQgj6QgUqAxj/AVIIZGVjaW1hbHMSJgoKbWF4X3N1cHBseRgFIAEoDEIH+kIEegJoEFIJbWF4U3VwcGx5EiEKDGlzX2ZyZWV6YWJsZRgGIAEoCFILaXNGcmVlemFibGUSSQoaY3JlYXRpb25fZW50aXR5X3B1YmxpY19rZXkYByABKAxCB/pCBHoCaCFIAFIXY3JlYXRpb25FbnRpdHlQdWJsaWNLZXmIAQESNAoOZXh0cmFfbWV0YWRhdGEYCCABKAxCCPpCBXoDGIAISAFSDWV4dHJhTWV0YWRhdGGIAQFCHQobX2NyZWF0aW9uX2VudGl0eV9wdWJsaWNfa2V5QhEKD19leHRyYV9tZXRhZGF0YSLHBAoLVG9rZW5PdXRwdXQSHQoCaWQYASABKAlCCPpCBXIDsAEBSABSAmlkiAEBEjEKEG93bmVyX3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSDm93bmVyUHVibGljS2V5EkEKFXJldm9jYXRpb25fY29tbWl0bWVudBgDIAEoDEIH+kIEegJoIUgBUhRyZXZvY2F0aW9uQ29tbWl0bWVudIgBARIxChJ3aXRoZHJhd19ib25kX3NhdHMYBCABKARIAlIQd2l0aGRyYXdCb25kU2F0c4gBARJMCiB3aXRoZHJhd19yZWxhdGl2ZV9ibG9ja19sb2NrdGltZRgFIAEoBEgDUh13aXRoZHJhd1JlbGF0aXZlQmxvY2tMb2NrdGltZYgBARI2ChB0b2tlbl9wdWJsaWNfa2V5GAYgASgMQgf6QgR6AmghSARSDnRva2VuUHVibGljS2V5iAEBEjcKEHRva2VuX2lkZW50aWZpZXIYCCABKAxCB/pCBHoCaCBIBVIPdG9rZW5JZGVudGlmaWVyiAEBEioKDHRva2VuX2Ftb3VudBgHIAEoDEIH+kIEegJoEFILdG9rZW5BbW91bnRCBQoDX2lkQhgKFl9yZXZvY2F0aW9uX2NvbW1pdG1lbnRCFQoTX3dpdGhkcmF3X2JvbmRfc2F0c0IjCiFfd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWVCEwoRX3Rva2VuX3B1YmxpY19rZXlCEwoRX3Rva2VuX2lkZW50aWZpZXIingIKElBhcnRpYWxUb2tlbk91dHB1dBIxChBvd25lcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRIsChJ3aXRoZHJhd19ib25kX3NhdHMYAiABKARSEHdpdGhkcmF3Qm9uZFNhdHMSRwogd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWUYAyABKARSHXdpdGhkcmF3UmVsYXRpdmVCbG9ja0xvY2t0aW1lEjIKEHRva2VuX2lkZW50aWZpZXIYBCABKAxCB/pCBHoCaCBSD3Rva2VuSWRlbnRpZmllchIqCgx0b2tlbl9hbW91bnQYBSABKAxCB/pCBHoCaBBSC3Rva2VuQW1vdW50IqMBChBGaW5hbFRva2VuT3V0cHV0ElEKFHBhcnRpYWxfdG9rZW5fb3V0cHV0GAEgASgLMh8uc3BhcmtfdG9rZW4uUGFydGlhbFRva2VuT3V0cHV0UhJwYXJ0aWFsVG9rZW5PdXRwdXQSPAoVcmV2b2NhdGlvbl9jb21taXRtZW50GAIgASgMQgf6QgR6AmghUhRyZXZvY2F0aW9uQ29tbWl0bWVudCKaBgoQVG9rZW5UcmFuc2FjdGlvbhIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEjwKCm1pbnRfaW5wdXQYAiABKAsyGy5zcGFya190b2tlbi5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSSAoOdHJhbnNmZXJfaW5wdXQYAyABKAsyHy5zcGFya190b2tlbi5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBJCCgxjcmVhdGVfaW5wdXQYCCABKAsyHS5zcGFya190b2tlbi5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0Ej0KDXRva2VuX291dHB1dHMYBCADKAsyGC5zcGFya190b2tlbi5Ub2tlbk91dHB1dFIMdG9rZW5PdXRwdXRzEloKI3NwYXJrX29wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXlzGAUgAygMQgz6QgmSAQYiBHoCaCFSH3NwYXJrT3BlcmF0b3JJZGVudGl0eVB1YmxpY0tleXMSOwoLZXhwaXJ5X3RpbWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgpleHBpcnlUaW1lEjIKB25ldHdvcmsYByABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yaxJUChhjbGllbnRfY3JlYXRlZF90aW1lc3RhbXAYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUhZjbGllbnRDcmVhdGVkVGltZXN0YW1wEk8KE2ludm9pY2VfYXR0YWNobWVudHMYCiADKAsyHi5zcGFya190b2tlbi5JbnZvaWNlQXR0YWNobWVudFISaW52b2ljZUF0dGFjaG1lbnRzEj8KGXZhbGlkaXR5X2R1cmF0aW9uX3NlY29uZHMYCyABKARIAVIXdmFsaWRpdHlEdXJhdGlvblNlY29uZHOIAQFCDgoMdG9rZW5faW5wdXRzQhwKGl92YWxpZGl0eV9kdXJhdGlvbl9zZWNvbmRzIpkDChhUb2tlblRyYW5zYWN0aW9uTWV0YWRhdGESWgojc3Bhcmtfb3BlcmF0b3JfaWRlbnRpdHlfcHVibGljX2tleXMYAiADKAxCDPpCCZIBBiIEegJoIVIfc3BhcmtPcGVyYXRvcklkZW50aXR5UHVibGljS2V5cxIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsSVAoYY2xpZW50X2NyZWF0ZWRfdGltZXN0YW1wGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIWY2xpZW50Q3JlYXRlZFRpbWVzdGFtcBJGChl2YWxpZGl0eV9kdXJhdGlvbl9zZWNvbmRzGAUgASgEQgr6QgcyBRisAigBUhd2YWxpZGl0eUR1cmF0aW9uU2Vjb25kcxJPChNpbnZvaWNlX2F0dGFjaG1lbnRzGAYgAygLMh4uc3BhcmtfdG9rZW4uSW52b2ljZUF0dGFjaG1lbnRSEmludm9pY2VBdHRhY2htZW50cyLJAwoXUGFydGlhbFRva2VuVHJhbnNhY3Rpb24SGAoHdmVyc2lvbhgBIAEoDVIHdmVyc2lvbhJjChp0b2tlbl90cmFuc2FjdGlvbl9tZXRhZGF0YRgCIAEoCzIlLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25NZXRhZGF0YVIYdG9rZW5UcmFuc2FjdGlvbk1ldGFkYXRhEjwKCm1pbnRfaW5wdXQYAyABKAsyGy5zcGFya190b2tlbi5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSSAoOdHJhbnNmZXJfaW5wdXQYBCABKAsyHy5zcGFya190b2tlbi5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBJCCgxjcmVhdGVfaW5wdXQYBSABKAsyHS5zcGFya190b2tlbi5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0ElMKFXBhcnRpYWxfdG9rZW5fb3V0cHV0cxgGIAMoCzIfLnNwYXJrX3Rva2VuLlBhcnRpYWxUb2tlbk91dHB1dFITcGFydGlhbFRva2VuT3V0cHV0c0IOCgx0b2tlbl9pbnB1dHMiwQMKFUZpbmFsVG9rZW5UcmFuc2FjdGlvbhIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEmMKGnRva2VuX3RyYW5zYWN0aW9uX21ldGFkYXRhGAIgASgLMiUuc3BhcmtfdG9rZW4uVG9rZW5UcmFuc2FjdGlvbk1ldGFkYXRhUhh0b2tlblRyYW5zYWN0aW9uTWV0YWRhdGESPAoKbWludF9pbnB1dBgDIAEoCzIbLnNwYXJrX3Rva2VuLlRva2VuTWludElucHV0SABSCW1pbnRJbnB1dBJICg50cmFuc2Zlcl9pbnB1dBgEIAEoCzIfLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNmZXJJbnB1dEgAUg10cmFuc2ZlcklucHV0EkIKDGNyZWF0ZV9pbnB1dBgFIAEoCzIdLnNwYXJrX3Rva2VuLlRva2VuQ3JlYXRlSW5wdXRIAFILY3JlYXRlSW5wdXQSTQoTZmluYWxfdG9rZW5fb3V0cHV0cxgGIAMoCzIdLnNwYXJrX3Rva2VuLkZpbmFsVG9rZW5PdXRwdXRSEWZpbmFsVG9rZW5PdXRwdXRzQg4KDHRva2VuX2lucHV0cyI4ChFJbnZvaWNlQXR0YWNobWVudBIjCg1zcGFya19pbnZvaWNlGAEgASgJUgxzcGFya0ludm9pY2UiXgoSU2lnbmF0dXJlV2l0aEluZGV4EicKCXNpZ25hdHVyZRgBIAEoDEIJ+kIGegQQQBhJUglzaWduYXR1cmUSHwoLaW5wdXRfaW5kZXgYAiABKA1SCmlucHV0SW5kZXgitAEKHklucHV0VHR4b1NpZ25hdHVyZXNQZXJPcGVyYXRvchJICg90dHhvX3NpZ25hdHVyZXMYASADKAsyHy5zcGFya190b2tlbi5TaWduYXR1cmVXaXRoSW5kZXhSDnR0eG9TaWduYXR1cmVzEkgKHG9wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSGW9wZXJhdG9ySWRlbnRpdHlQdWJsaWNLZXki8gIKF1N0YXJ0VHJhbnNhY3Rpb25SZXF1ZXN0EjcKE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxCB/pCBHoCaCFSEWlkZW50aXR5UHVibGljS2V5ElkKGXBhcnRpYWxfdG9rZW5fdHJhbnNhY3Rpb24YAiABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhdwYXJ0aWFsVG9rZW5UcmFuc2FjdGlvbhJ7CipwYXJ0aWFsX3Rva2VuX3RyYW5zYWN0aW9uX293bmVyX3NpZ25hdHVyZXMYAyADKAsyHy5zcGFya190b2tlbi5TaWduYXR1cmVXaXRoSW5kZXhSJnBhcnRpYWxUb2tlblRyYW5zYWN0aW9uT3duZXJTaWduYXR1cmVzEkYKGXZhbGlkaXR5X2R1cmF0aW9uX3NlY29uZHMYBCABKARCCvpCBzIFGKwCKAFSF3ZhbGlkaXR5RHVyYXRpb25TZWNvbmRzIq4BChhTdGFydFRyYW5zYWN0aW9uUmVzcG9uc2USVQoXZmluYWxfdG9rZW5fdHJhbnNhY3Rpb24YASABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SOwoNa2V5c2hhcmVfaW5mbxgCIAEoCzIWLnNwYXJrLlNpZ25pbmdLZXlzaGFyZVIMa2V5c2hhcmVJbmZvIvgCChhDb21taXRUcmFuc2FjdGlvblJlcXVlc3QSVQoXZmluYWxfdG9rZW5fdHJhbnNhY3Rpb24YASABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgCIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaBJ3CiJpbnB1dF90dHhvX3NpZ25hdHVyZXNfcGVyX29wZXJhdG9yGAMgAygLMisuc3BhcmtfdG9rZW4uSW5wdXRUdHhvU2lnbmF0dXJlc1Blck9wZXJhdG9yUh5pbnB1dFR0eG9TaWduYXR1cmVzUGVyT3BlcmF0b3ISQgoZb3duZXJfaWRlbnRpdHlfcHVibGljX2tleRgEIAEoDEIH+kIEegJoIVIWb3duZXJJZGVudGl0eVB1YmxpY0tleSK6AQoOQ29tbWl0UHJvZ3Jlc3MSUQoeY29tbWl0dGVkX29wZXJhdG9yX3B1YmxpY19rZXlzGAEgAygMQgz6QgmSAQYiBHoCaCFSG2NvbW1pdHRlZE9wZXJhdG9yUHVibGljS2V5cxJVCiB1bmNvbW1pdHRlZF9vcGVyYXRvcl9wdWJsaWNfa2V5cxgCIAMoDEIM+kIJkgEGIgR6AmghUh11bmNvbW1pdHRlZE9wZXJhdG9yUHVibGljS2V5cyKhAQoZQ29tbWl0VHJhbnNhY3Rpb25SZXNwb25zZRI+Cg1jb21taXRfc3RhdHVzGAEgASgOMhkuc3BhcmtfdG9rZW4uQ29tbWl0U3RhdHVzUgxjb21taXRTdGF0dXMSRAoPY29tbWl0X3Byb2dyZXNzGAIgASgLMhsuc3BhcmtfdG9rZW4uQ29tbWl0UHJvZ3Jlc3NSDmNvbW1pdFByb2dyZXNzIqYCChtCcm9hZGNhc3RUcmFuc2FjdGlvblJlcXVlc3QSNwoTaWRlbnRpdHlfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIRaWRlbnRpdHlQdWJsaWNLZXkSYAoZcGFydGlhbF90b2tlbl90cmFuc2FjdGlvbhgCIAEoCzIkLnNwYXJrX3Rva2VuLlBhcnRpYWxUb2tlblRyYW5zYWN0aW9uUhdwYXJ0aWFsVG9rZW5UcmFuc2FjdGlvbhJsCiJ0b2tlbl90cmFuc2FjdGlvbl9vd25lcl9zaWduYXR1cmVzGAMgAygLMh8uc3BhcmtfdG9rZW4uU2lnbmF0dXJlV2l0aEluZGV4Uh90b2tlblRyYW5zYWN0aW9uT3duZXJTaWduYXR1cmVzIoACChxCcm9hZGNhc3RUcmFuc2FjdGlvblJlc3BvbnNlEloKF2ZpbmFsX3Rva2VuX3RyYW5zYWN0aW9uGAEgASgLMiIuc3BhcmtfdG9rZW4uRmluYWxUb2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SPgoNY29tbWl0X3N0YXR1cxgCIAEoDjIZLnNwYXJrX3Rva2VuLkNvbW1pdFN0YXR1c1IMY29tbWl0U3RhdHVzEkQKD2NvbW1pdF9wcm9ncmVzcxgDIAEoCzIbLnNwYXJrX3Rva2VuLkNvbW1pdFByb2dyZXNzUg5jb21taXRQcm9ncmVzcyKSAQoZUXVlcnlUb2tlbk1ldGFkYXRhUmVxdWVzdBI5ChF0b2tlbl9pZGVudGlmaWVycxgBIAMoDEIM+kIJkgEGIgR6AmggUhB0b2tlbklkZW50aWZpZXJzEjoKEmlzc3Vlcl9wdWJsaWNfa2V5cxgCIAMoDEIM+kIJkgEGIgR6AmghUhBpc3N1ZXJQdWJsaWNLZXlzIvADCg1Ub2tlbk1ldGFkYXRhEjMKEWlzc3Vlcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg9pc3N1ZXJQdWJsaWNLZXkSJgoKdG9rZW5fbmFtZRgCIAEoCUIH+kIEcgIYFFIJdG9rZW5OYW1lEioKDHRva2VuX3RpY2tlchgDIAEoCUIH+kIEcgIYBlILdG9rZW5UaWNrZXISJAoIZGVjaW1hbHMYBCABKA1CCPpCBSoDGP8BUghkZWNpbWFscxImCgptYXhfc3VwcGx5GAUgASgMQgf6QgR6AmgQUgltYXhTdXBwbHkSIQoMaXNfZnJlZXphYmxlGAYgASgIUgtpc0ZyZWV6YWJsZRJJChpjcmVhdGlvbl9lbnRpdHlfcHVibGljX2tleRgHIAEoDEIH+kIEegJoIUgAUhdjcmVhdGlvbkVudGl0eVB1YmxpY0tleYgBARIyChB0b2tlbl9pZGVudGlmaWVyGAggASgMQgf6QgR6AmggUg90b2tlbklkZW50aWZpZXISNAoOZXh0cmFfbWV0YWRhdGEYCSABKAxCCPpCBXoDGIAISAFSDWV4dHJhTWV0YWRhdGGIAQFCHQobX2NyZWF0aW9uX2VudGl0eV9wdWJsaWNfa2V5QhEKD19leHRyYV9tZXRhZGF0YSJfChpRdWVyeVRva2VuTWV0YWRhdGFSZXNwb25zZRJBCg50b2tlbl9tZXRhZGF0YRgBIAMoCzIaLnNwYXJrX3Rva2VuLlRva2VuTWV0YWRhdGFSDXRva2VuTWV0YWRhdGEirAIKGFF1ZXJ5VG9rZW5PdXRwdXRzUmVxdWVzdBI4ChFvd25lcl9wdWJsaWNfa2V5cxgBIAMoDEIM+kIJkgEGIgR6AmghUg9vd25lclB1YmxpY0tleXMSOgoSaXNzdWVyX3B1YmxpY19rZXlzGAIgAygMQgz6QgmSAQYiBHoCaCFSEGlzc3VlclB1YmxpY0tleXMSOQoRdG9rZW5faWRlbnRpZmllcnMYBCADKAxCDPpCCZIBBiIEegJoIFIQdG9rZW5JZGVudGlmaWVycxIoCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yaxI1CgxwYWdlX3JlcXVlc3QYBSABKAsyEi5zcGFyay5QYWdlUmVxdWVzdFILcGFnZVJlcXVlc3QirQMKHVF1ZXJ5VG9rZW5UcmFuc2FjdGlvbnNSZXF1ZXN0EiwKCm91dHB1dF9pZHMYASADKAlCDfpCCpIBByIFcgOwAQFSCW91dHB1dElkcxI4ChFvd25lcl9wdWJsaWNfa2V5cxgCIAMoDEIM+kIJkgEGIgR6AmghUg9vd25lclB1YmxpY0tleXMSOgoSaXNzdWVyX3B1YmxpY19rZXlzGAMgAygMQgz6QgmSAQYiBHoCaCFSEGlzc3VlclB1YmxpY0tleXMSOQoRdG9rZW5faWRlbnRpZmllcnMYByADKAxCDPpCCZIBBiIEegJoIFIQdG9rZW5JZGVudGlmaWVycxJGChh0b2tlbl90cmFuc2FjdGlvbl9oYXNoZXMYBCADKAxCDPpCCZIBBiIEegJoIFIWdG9rZW5UcmFuc2FjdGlvbkhhc2hlcxIiCgVvcmRlchgIIAEoDjIMLnNwYXJrLk9yZGVyUgVvcmRlchIgCgVsaW1pdBgFIAEoA0IK+kIHIgUY6AcoAFIFbGltaXQSHwoGb2Zmc2V0GAYgASgDQgf6QgQiAigAUgZvZmZzZXQipgEKHlF1ZXJ5VG9rZW5UcmFuc2FjdGlvbnNSZXNwb25zZRJsCh50b2tlbl90cmFuc2FjdGlvbnNfd2l0aF9zdGF0dXMYASADKAsyJy5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uV2l0aFN0YXR1c1IbdG9rZW5UcmFuc2FjdGlvbnNXaXRoU3RhdHVzEhYKBm9mZnNldBgCIAEoA1IGb2Zmc2V0ItYBCiFPdXRwdXRXaXRoUHJldmlvdXNUcmFuc2FjdGlvbkRhdGESMAoGb3V0cHV0GAEgASgLMhguc3BhcmtfdG9rZW4uVG9rZW5PdXRwdXRSBm91dHB1dBJDChlwcmV2aW91c190cmFuc2FjdGlvbl9oYXNoGAIgASgMQgf6QgR6AmggUhdwcmV2aW91c1RyYW5zYWN0aW9uSGFzaBI6ChlwcmV2aW91c190cmFuc2FjdGlvbl92b3V0GAMgASgNUhdwcmV2aW91c1RyYW5zYWN0aW9uVm91dCLaAQoZUXVlcnlUb2tlbk91dHB1dHNSZXNwb25zZRKCAQomb3V0cHV0c193aXRoX3ByZXZpb3VzX3RyYW5zYWN0aW9uX2RhdGEYASADKAsyLi5zcGFya190b2tlbi5PdXRwdXRXaXRoUHJldmlvdXNUcmFuc2FjdGlvbkRhdGFSIm91dHB1dHNXaXRoUHJldmlvdXNUcmFuc2FjdGlvbkRhdGESOAoNcGFnZV9yZXNwb25zZRgCIAEoCzITLnNwYXJrLlBhZ2VSZXNwb25zZVIMcGFnZVJlc3BvbnNlImQKGFNwZW50VG9rZW5PdXRwdXRNZXRhZGF0YRIbCglvdXRwdXRfaWQYASABKAlSCG91dHB1dElkEisKEXJldm9jYXRpb25fc2VjcmV0GAIgASgMUhByZXZvY2F0aW9uU2VjcmV0Io4BCiRUb2tlblRyYW5zYWN0aW9uQ29uZmlybWF0aW9uTWV0YWRhdGESZgocc3BlbnRfdG9rZW5fb3V0cHV0c19tZXRhZGF0YRgBIAMoCzIlLnNwYXJrX3Rva2VuLlNwZW50VG9rZW5PdXRwdXRNZXRhZGF0YVIZc3BlbnRUb2tlbk91dHB1dHNNZXRhZGF0YSLMAgoaVG9rZW5UcmFuc2FjdGlvbldpdGhTdGF0dXMSSgoRdG9rZW5fdHJhbnNhY3Rpb24YASABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhB0b2tlblRyYW5zYWN0aW9uEjsKBnN0YXR1cxgCIAEoDjIjLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25TdGF0dXNSBnN0YXR1cxJmChVjb25maXJtYXRpb25fbWV0YWRhdGEYAyABKAsyMS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uQ29uZmlybWF0aW9uTWV0YWRhdGFSFGNvbmZpcm1hdGlvbk1ldGFkYXRhEj0KFnRva2VuX3RyYW5zYWN0aW9uX2hhc2gYBCABKAxCB/pCBHoCaCBSFHRva2VuVHJhbnNhY3Rpb25IYXNoIqwDChNGcmVlemVUb2tlbnNQYXlsb2FkEhgKB3ZlcnNpb24YASABKA1SB3ZlcnNpb24SMQoQb3duZXJfcHVibGljX2tleRgCIAEoDEIH+kIEegJoIVIOb3duZXJQdWJsaWNLZXkSNgoQdG9rZW5fcHVibGljX2tleRgDIAEoDEIH+kIEegJoIUgAUg50b2tlblB1YmxpY0tleYgBARI3ChB0b2tlbl9pZGVudGlmaWVyGAQgASgMQgf6QgR6AmggSAFSD3Rva2VuSWRlbnRpZmllcogBARI6Chlpc3N1ZXJfcHJvdmlkZWRfdGltZXN0YW1wGAUgASgEUhdpc3N1ZXJQcm92aWRlZFRpbWVzdGFtcBJIChxvcGVyYXRvcl9pZGVudGl0eV9wdWJsaWNfa2V5GAYgASgMQgf6QgR6AmghUhlvcGVyYXRvcklkZW50aXR5UHVibGljS2V5EicKD3Nob3VsZF91bmZyZWV6ZRgHIAEoCFIOc2hvdWxkVW5mcmVlemVCEwoRX3Rva2VuX3B1YmxpY19rZXlCEwoRX3Rva2VuX2lkZW50aWZpZXIioQEKE0ZyZWV6ZVRva2Vuc1JlcXVlc3QSVAoVZnJlZXplX3Rva2Vuc19wYXlsb2FkGAEgASgLMiAuc3BhcmtfdG9rZW4uRnJlZXplVG9rZW5zUGF5bG9hZFITZnJlZXplVG9rZW5zUGF5bG9hZBI0ChBpc3N1ZXJfc2lnbmF0dXJlGAIgASgMQgn6QgZ6BBBAGElSD2lzc3VlclNpZ25hdHVyZSKJAQoURnJlZXplVG9rZW5zUmVzcG9uc2USPQoTaW1wYWN0ZWRfb3V0cHV0X2lkcxgBIAMoCUIN+kIKkgEHIgVyA7ABAVIRaW1wYWN0ZWRPdXRwdXRJZHMSMgoVaW1wYWN0ZWRfdG9rZW5fYW1vdW50GAIgASgMUhNpbXBhY3RlZFRva2VuQW1vdW50KqcBChRUb2tlblRyYW5zYWN0aW9uVHlwZRImCiJUT0tFTl9UUkFOU0FDVElPTl9UWVBFX1VOU1BFQ0lGSUVEEAASIQodVE9LRU5fVFJBTlNBQ1RJT05fVFlQRV9DUkVBVEUQARIfChtUT0tFTl9UUkFOU0FDVElPTl9UWVBFX01JTlQQAhIjCh9UT0tFTl9UUkFOU0FDVElPTl9UWVBFX1RSQU5TRkVSEAMqUwoMQ29tbWl0U3RhdHVzEhYKEkNPTU1JVF9VTlNQRUNJRklFRBAAEhUKEUNPTU1JVF9QUk9DRVNTSU5HEAESFAoQQ09NTUlUX0ZJTkFMSVpFRBACKoYCChZUb2tlblRyYW5zYWN0aW9uU3RhdHVzEh0KGVRPS0VOX1RSQU5TQUNUSU9OX1NUQVJURUQQABIcChhUT0tFTl9UUkFOU0FDVElPTl9TSUdORUQQARIeChpUT0tFTl9UUkFOU0FDVElPTl9SRVZFQUxFRBAFEh8KG1RPS0VOX1RSQU5TQUNUSU9OX0ZJTkFMSVpFRBACEicKI1RPS0VOX1RSQU5TQUNUSU9OX1NUQVJURURfQ0FOQ0VMTEVEEAMSJgoiVE9LRU5fVFJBTlNBQ1RJT05fU0lHTkVEX0NBTkNFTExFRBAEEh0KGVRPS0VOX1RSQU5TQUNUSU9OX1VOS05PV04QCjLwBQoRU3BhcmtUb2tlblNlcnZpY2USYgoRc3RhcnRfdHJhbnNhY3Rpb24SJC5zcGFya190b2tlbi5TdGFydFRyYW5zYWN0aW9uUmVxdWVzdBolLnNwYXJrX3Rva2VuLlN0YXJ0VHJhbnNhY3Rpb25SZXNwb25zZSIAEmUKEmNvbW1pdF90cmFuc2FjdGlvbhIlLnNwYXJrX3Rva2VuLkNvbW1pdFRyYW5zYWN0aW9uUmVxdWVzdBomLnNwYXJrX3Rva2VuLkNvbW1pdFRyYW5zYWN0aW9uUmVzcG9uc2UiABJpChRxdWVyeV90b2tlbl9tZXRhZGF0YRImLnNwYXJrX3Rva2VuLlF1ZXJ5VG9rZW5NZXRhZGF0YVJlcXVlc3QaJy5zcGFya190b2tlbi5RdWVyeVRva2VuTWV0YWRhdGFSZXNwb25zZSIAEnUKGHF1ZXJ5X3Rva2VuX3RyYW5zYWN0aW9ucxIqLnNwYXJrX3Rva2VuLlF1ZXJ5VG9rZW5UcmFuc2FjdGlvbnNSZXF1ZXN0Gisuc3BhcmtfdG9rZW4uUXVlcnlUb2tlblRyYW5zYWN0aW9uc1Jlc3BvbnNlIgASZgoTcXVlcnlfdG9rZW5fb3V0cHV0cxIlLnNwYXJrX3Rva2VuLlF1ZXJ5VG9rZW5PdXRwdXRzUmVxdWVzdBomLnNwYXJrX3Rva2VuLlF1ZXJ5VG9rZW5PdXRwdXRzUmVzcG9uc2UiABJWCg1mcmVlemVfdG9rZW5zEiAuc3BhcmtfdG9rZW4uRnJlZXplVG9rZW5zUmVxdWVzdBohLnNwYXJrX3Rva2VuLkZyZWV6ZVRva2Vuc1Jlc3BvbnNlIgASbgoVYnJvYWRjYXN0X3RyYW5zYWN0aW9uEiguc3BhcmtfdG9rZW4uQnJvYWRjYXN0VHJhbnNhY3Rpb25SZXF1ZXN0Gikuc3BhcmtfdG9rZW4uQnJvYWRjYXN0VHJhbnNhY3Rpb25SZXNwb25zZSIAQjJaMGdpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9zcGFya190b2tlbmIGcHJvdG8zCqUECgptb2NrLnByb3RvEgRtb2NrGhtnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8iQAobQ2xlYW5VcFByZWltYWdlU2hhcmVSZXF1ZXN0EiEKDHBheW1lbnRfaGFzaBgBIAEoDFILcGF5bWVudEhhc2giTQoYVXBkYXRlTm9kZXNTdGF0dXNSZXF1ZXN0EhkKCG5vZGVfaWRzGAEgAygJUgdub2RlSWRzEhYKBnN0YXR1cxgCIAEoCVIGc3RhdHVzIjEKElRyaWdnZXJUYXNrUmVxdWVzdBIbCgl0YXNrX25hbWUYASABKAlSCHRhc2tOYW1lMvoBCgtNb2NrU2VydmljZRJWChdjbGVhbl91cF9wcmVpbWFnZV9zaGFyZRIhLm1vY2suQ2xlYW5VcFByZWltYWdlU2hhcmVSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IgASTwoTdXBkYXRlX25vZGVzX3N0YXR1cxIeLm1vY2suVXBkYXRlTm9kZXNTdGF0dXNSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IgASQgoMdHJpZ2dlcl90YXNrEhgubW9jay5UcmlnZ2VyVGFza1JlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiAEIrWilnaXRodWIuY29tL2xpZ2h0c3BhcmtkZXYvc3BhcmsvcHJvdG8vbW9ja2IGcHJvdG8zCuoHChFzcGFya19hdXRobi5wcm90bxILc3BhcmtfYXV0aG4ieAoJQ2hhbGxlbmdlEhgKB3ZlcnNpb24YASABKAVSB3ZlcnNpb24SHAoJdGltZXN0YW1wGAIgASgDUgl0aW1lc3RhbXASFAoFbm9uY2UYAyABKAxSBW5vbmNlEh0KCnB1YmxpY19rZXkYBCABKAxSCXB1YmxpY0tleSKFAQoSUHJvdGVjdGVkQ2hhbGxlbmdlEhgKB3ZlcnNpb24YASABKAVSB3ZlcnNpb24SNAoJY2hhbGxlbmdlGAIgASgLMhYuc3BhcmtfYXV0aG4uQ2hhbGxlbmdlUgljaGFsbGVuZ2USHwoLc2VydmVyX2htYWMYAyABKAxSCnNlcnZlckhtYWMiNAoTR2V0Q2hhbGxlbmdlUmVxdWVzdBIdCgpwdWJsaWNfa2V5GAEgASgMUglwdWJsaWNLZXkiaAoUR2V0Q2hhbGxlbmdlUmVzcG9uc2USUAoTcHJvdGVjdGVkX2NoYWxsZW5nZRgBIAEoCzIfLnNwYXJrX2F1dGhuLlByb3RlY3RlZENoYWxsZW5nZVIScHJvdGVjdGVkQ2hhbGxlbmdlIqcBChZWZXJpZnlDaGFsbGVuZ2VSZXF1ZXN0ElAKE3Byb3RlY3RlZF9jaGFsbGVuZ2UYASABKAsyHy5zcGFya19hdXRobi5Qcm90ZWN0ZWRDaGFsbGVuZ2VSEnByb3RlY3RlZENoYWxsZW5nZRIcCglzaWduYXR1cmUYAiABKAxSCXNpZ25hdHVyZRIdCgpwdWJsaWNfa2V5GAMgASgMUglwdWJsaWNLZXkicQoXVmVyaWZ5Q2hhbGxlbmdlUmVzcG9uc2USIwoNc2Vzc2lvbl90b2tlbhgBIAEoCVIMc2Vzc2lvblRva2VuEjEKFGV4cGlyYXRpb25fdGltZXN0YW1wGAIgASgDUhNleHBpcmF0aW9uVGltZXN0YW1wMswBChFTcGFya0F1dGhuU2VydmljZRJWCg1nZXRfY2hhbGxlbmdlEiAuc3BhcmtfYXV0aG4uR2V0Q2hhbGxlbmdlUmVxdWVzdBohLnNwYXJrX2F1dGhuLkdldENoYWxsZW5nZVJlc3BvbnNlIgASXwoQdmVyaWZ5X2NoYWxsZW5nZRIjLnNwYXJrX2F1dGhuLlZlcmlmeUNoYWxsZW5nZVJlcXVlc3QaJC5zcGFya19hdXRobi5WZXJpZnlDaGFsbGVuZ2VSZXNwb25zZSIAQjJaMGdpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9zcGFya19hdXRobmIGcHJvdG8z";
|
|
8876
8879
|
function getSparkDescriptorBytes() {
|
|
8877
8880
|
const binaryString = atob(SPARK_DESCRIPTORS_BASE64);
|
|
8878
8881
|
const bytes = new Uint8Array(binaryString.length);
|
|
@@ -8898,7 +8901,6 @@ function getRegistry() {
|
|
|
8898
8901
|
return _registry;
|
|
8899
8902
|
}
|
|
8900
8903
|
try {
|
|
8901
|
-
console.log("Loading embedded protobuf descriptors...");
|
|
8902
8904
|
const descriptorBytes = getSparkDescriptorBytes();
|
|
8903
8905
|
const descriptorSet = FileDescriptorSet.decode(descriptorBytes);
|
|
8904
8906
|
_registry = {
|
|
@@ -8907,7 +8909,6 @@ function getRegistry() {
|
|
|
8907
8909
|
messageMap: /* @__PURE__ */ new Map()
|
|
8908
8910
|
};
|
|
8909
8911
|
for (const fileDescriptor of descriptorSet.file) {
|
|
8910
|
-
console.log(`Processing proto file: ${fileDescriptor.name}`);
|
|
8911
8912
|
_registry.fileMap.set(fileDescriptor.name, fileDescriptor);
|
|
8912
8913
|
if (fileDescriptor.messageType) {
|
|
8913
8914
|
for (const messageDescriptor of fileDescriptor.messageType) {
|
|
@@ -10501,52 +10502,11 @@ function sortInvoiceAttachments(attachments) {
|
|
|
10501
10502
|
if (!attachments || attachments.length === 0) {
|
|
10502
10503
|
return attachments;
|
|
10503
10504
|
}
|
|
10504
|
-
|
|
10505
|
-
|
|
10506
|
-
const
|
|
10507
|
-
|
|
10508
|
-
throw new SparkValidationError(
|
|
10509
|
-
`invoice attachment at index ${i} cannot be null`,
|
|
10510
|
-
{
|
|
10511
|
-
field: `invoiceAttachments[${i}]`,
|
|
10512
|
-
index: i
|
|
10513
|
-
}
|
|
10514
|
-
);
|
|
10515
|
-
}
|
|
10516
|
-
const invoice = attachment.sparkInvoice;
|
|
10517
|
-
let idBytes;
|
|
10518
|
-
try {
|
|
10519
|
-
const decoded = bech32m4.decode(invoice, 500);
|
|
10520
|
-
const payload = SparkAddress.decode(bech32m4.fromWords(decoded.words));
|
|
10521
|
-
if (!payload.sparkInvoiceFields || !payload.sparkInvoiceFields.id) {
|
|
10522
|
-
throw new Error("missing spark invoice fields or id");
|
|
10523
|
-
}
|
|
10524
|
-
idBytes = payload.sparkInvoiceFields.id;
|
|
10525
|
-
} catch (err) {
|
|
10526
|
-
throw new SparkValidationError(`invalid invoice at ${i}`, {
|
|
10527
|
-
field: `invoiceAttachments[${i}].sparkInvoice`,
|
|
10528
|
-
index: i,
|
|
10529
|
-
value: invoice,
|
|
10530
|
-
error: err
|
|
10531
|
-
});
|
|
10532
|
-
}
|
|
10533
|
-
if (!idBytes || idBytes.length !== 16) {
|
|
10534
|
-
throw new SparkValidationError(`invalid invoice id at ${i}`, {
|
|
10535
|
-
field: `invoiceAttachments[${i}].sparkInvoice`,
|
|
10536
|
-
index: i
|
|
10537
|
-
});
|
|
10538
|
-
}
|
|
10539
|
-
keyed.push({ id: idBytes, attachment });
|
|
10540
|
-
}
|
|
10541
|
-
keyed.sort((a, b) => {
|
|
10542
|
-
for (let j = 0; j < a.id.length && j < b.id.length; j++) {
|
|
10543
|
-
const av = a.id[j];
|
|
10544
|
-
const bv = b.id[j];
|
|
10545
|
-
if (av !== bv) return av - bv;
|
|
10546
|
-
}
|
|
10547
|
-
return a.id.length - b.id.length;
|
|
10505
|
+
return [...attachments].sort((a, b) => {
|
|
10506
|
+
const invoiceA = a.sparkInvoice;
|
|
10507
|
+
const invoiceB = b.sparkInvoice;
|
|
10508
|
+
return invoiceA < invoiceB ? -1 : invoiceA > invoiceB ? 1 : 0;
|
|
10548
10509
|
});
|
|
10549
|
-
return keyed.map((k) => k.attachment);
|
|
10550
10510
|
}
|
|
10551
10511
|
async function hashPartialTokenTransaction(partialTokenTransaction) {
|
|
10552
10512
|
if (!partialTokenTransaction) {
|
|
@@ -12302,6 +12262,31 @@ var UserRequest = `
|
|
|
12302
12262
|
`;
|
|
12303
12263
|
|
|
12304
12264
|
// src/graphql/client.ts
|
|
12265
|
+
var RETRYABLE_STATUS_CODES = /* @__PURE__ */ new Set([
|
|
12266
|
+
502,
|
|
12267
|
+
// Bad Gateway
|
|
12268
|
+
503,
|
|
12269
|
+
// Service Unavailable
|
|
12270
|
+
504
|
|
12271
|
+
// Gateway Timeout
|
|
12272
|
+
]);
|
|
12273
|
+
function createRetryFetch(baseFetch, maxRetries = 5, baseDelayMs = 1e3) {
|
|
12274
|
+
return async (input, init) => {
|
|
12275
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
12276
|
+
const response = await baseFetch(input, init);
|
|
12277
|
+
if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < maxRetries) {
|
|
12278
|
+
const delay = Math.min(baseDelayMs * Math.pow(2, attempt), 1e4);
|
|
12279
|
+
console.warn(
|
|
12280
|
+
`[SspClient] HTTP ${response.status} (attempt ${attempt + 1}/${maxRetries + 1}), retrying in ${delay}ms`
|
|
12281
|
+
);
|
|
12282
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
12283
|
+
continue;
|
|
12284
|
+
}
|
|
12285
|
+
return response;
|
|
12286
|
+
}
|
|
12287
|
+
throw new Error("Retry loop exited unexpectedly");
|
|
12288
|
+
};
|
|
12289
|
+
}
|
|
12305
12290
|
var SspClient = class {
|
|
12306
12291
|
requester;
|
|
12307
12292
|
signer;
|
|
@@ -12312,6 +12297,7 @@ var SspClient = class {
|
|
|
12312
12297
|
this.authProvider = new SparkAuthProvider();
|
|
12313
12298
|
const { fetch } = getFetch();
|
|
12314
12299
|
const options = config.sspClientOptions;
|
|
12300
|
+
const retryFetch = createRetryFetch(fetch);
|
|
12315
12301
|
this.requester = new Requester(
|
|
12316
12302
|
new NodeKeyCache(DefaultCrypto),
|
|
12317
12303
|
options.schemaEndpoint || `graphql/spark/2025-03-19`,
|
|
@@ -12320,7 +12306,7 @@ var SspClient = class {
|
|
|
12320
12306
|
options.baseUrl,
|
|
12321
12307
|
DefaultCrypto,
|
|
12322
12308
|
void 0,
|
|
12323
|
-
|
|
12309
|
+
retryFetch
|
|
12324
12310
|
);
|
|
12325
12311
|
}
|
|
12326
12312
|
async executeRawQuery(query, needsAuth = true) {
|
|
@@ -13375,22 +13361,24 @@ var BaseTransferService = class {
|
|
|
13375
13361
|
signingCommitments.signingCommitments.slice(2 * leaves.length)
|
|
13376
13362
|
);
|
|
13377
13363
|
const sparkFrost2 = getSparkFrost();
|
|
13378
|
-
const
|
|
13379
|
-
|
|
13380
|
-
|
|
13381
|
-
|
|
13382
|
-
|
|
13383
|
-
|
|
13384
|
-
|
|
13385
|
-
|
|
13386
|
-
|
|
13387
|
-
|
|
13388
|
-
|
|
13389
|
-
|
|
13390
|
-
|
|
13391
|
-
|
|
13392
|
-
|
|
13393
|
-
|
|
13364
|
+
const encryptedKeyTweaksEntries = await Promise.all(
|
|
13365
|
+
Array.from(keyTweakInputMap.entries()).map(async ([key, value]) => {
|
|
13366
|
+
const protoToEncrypt = {
|
|
13367
|
+
leavesToSend: value
|
|
13368
|
+
};
|
|
13369
|
+
const protoToEncryptBinary = SendLeafKeyTweaks.encode(protoToEncrypt).finish();
|
|
13370
|
+
const operator = this.config.getSigningOperators()[key];
|
|
13371
|
+
if (!operator) {
|
|
13372
|
+
throw new SparkValidationError("Operator not found");
|
|
13373
|
+
}
|
|
13374
|
+
const encryptedProto = await sparkFrost2.encryptEcies(
|
|
13375
|
+
protoToEncryptBinary,
|
|
13376
|
+
hexToBytes9(operator.identityPublicKey)
|
|
13377
|
+
);
|
|
13378
|
+
return [key, Uint8Array.from(encryptedProto)];
|
|
13379
|
+
})
|
|
13380
|
+
);
|
|
13381
|
+
const encryptedKeyTweaks = Object.fromEntries(encryptedKeyTweaksEntries);
|
|
13394
13382
|
const transferPackage = {
|
|
13395
13383
|
leavesToSend: cpfpLeafSigningJobs,
|
|
13396
13384
|
keyTweakPackage: encryptedKeyTweaks,
|
|
@@ -13436,22 +13424,24 @@ var BaseTransferService = class {
|
|
|
13436
13424
|
paymentHash
|
|
13437
13425
|
);
|
|
13438
13426
|
const sparkFrost2 = getSparkFrost();
|
|
13439
|
-
const
|
|
13440
|
-
|
|
13441
|
-
|
|
13442
|
-
|
|
13443
|
-
|
|
13444
|
-
|
|
13445
|
-
|
|
13446
|
-
|
|
13447
|
-
|
|
13448
|
-
|
|
13449
|
-
|
|
13450
|
-
|
|
13451
|
-
|
|
13452
|
-
|
|
13453
|
-
|
|
13454
|
-
|
|
13427
|
+
const encryptedKeyTweaksEntries = await Promise.all(
|
|
13428
|
+
Array.from(keyTweakInputMap.entries()).map(async ([key, value]) => {
|
|
13429
|
+
const protoToEncrypt = {
|
|
13430
|
+
leavesToSend: value
|
|
13431
|
+
};
|
|
13432
|
+
const protoToEncryptBinary = SendLeafKeyTweaks.encode(protoToEncrypt).finish();
|
|
13433
|
+
const operator = this.config.getSigningOperators()[key];
|
|
13434
|
+
if (!operator) {
|
|
13435
|
+
throw new SparkValidationError("Operator not found");
|
|
13436
|
+
}
|
|
13437
|
+
const encryptedProto = await sparkFrost2.encryptEcies(
|
|
13438
|
+
protoToEncryptBinary,
|
|
13439
|
+
hexToBytes9(operator.identityPublicKey)
|
|
13440
|
+
);
|
|
13441
|
+
return [key, Uint8Array.from(encryptedProto)];
|
|
13442
|
+
})
|
|
13443
|
+
);
|
|
13444
|
+
const encryptedKeyTweaks = Object.fromEntries(encryptedKeyTweaksEntries);
|
|
13455
13445
|
const transferPackage = {
|
|
13456
13446
|
leavesToSend: cpfpLeafSigningJobs,
|
|
13457
13447
|
keyTweakPackage: encryptedKeyTweaks,
|
|
@@ -13578,19 +13568,25 @@ var BaseTransferService = class {
|
|
|
13578
13568
|
}
|
|
13579
13569
|
async prepareSendTransferKeyTweaks(transferID, receiverIdentityPubkey, leaves, cpfpRefundSignatureMap, directRefundSignatureMap, directFromCpfpRefundSignatureMap) {
|
|
13580
13570
|
const leavesTweaksMap = /* @__PURE__ */ new Map();
|
|
13581
|
-
|
|
13582
|
-
|
|
13583
|
-
|
|
13584
|
-
|
|
13585
|
-
|
|
13586
|
-
|
|
13587
|
-
leaf
|
|
13588
|
-
|
|
13589
|
-
|
|
13590
|
-
|
|
13591
|
-
|
|
13592
|
-
|
|
13593
|
-
|
|
13571
|
+
const results = await Promise.all(
|
|
13572
|
+
leaves.map(async (leaf) => {
|
|
13573
|
+
const cpfpRefundSignature = cpfpRefundSignatureMap.get(leaf.leaf.id);
|
|
13574
|
+
const directRefundSignature = directRefundSignatureMap.get(
|
|
13575
|
+
leaf.leaf.id
|
|
13576
|
+
);
|
|
13577
|
+
const directFromCpfpRefundSignature = directFromCpfpRefundSignatureMap.get(leaf.leaf.id);
|
|
13578
|
+
return await this.prepareSingleSendTransferKeyTweak(
|
|
13579
|
+
transferID,
|
|
13580
|
+
leaf,
|
|
13581
|
+
receiverIdentityPubkey,
|
|
13582
|
+
cpfpRefundSignature,
|
|
13583
|
+
directRefundSignature,
|
|
13584
|
+
directFromCpfpRefundSignature
|
|
13585
|
+
);
|
|
13586
|
+
})
|
|
13587
|
+
);
|
|
13588
|
+
for (const result of results) {
|
|
13589
|
+
for (const [identifier, leafTweak] of result) {
|
|
13594
13590
|
leavesTweaksMap.set(identifier, [
|
|
13595
13591
|
...leavesTweaksMap.get(identifier) || [],
|
|
13596
13592
|
leafTweak
|
|
@@ -13675,15 +13671,10 @@ var TransferService = class extends BaseTransferService {
|
|
|
13675
13671
|
super(config, connectionManager, signingService);
|
|
13676
13672
|
}
|
|
13677
13673
|
async claimTransfer(transfer, leaves) {
|
|
13678
|
-
let proofMap;
|
|
13679
13674
|
if (transfer.status === 2 /* TRANSFER_STATUS_SENDER_KEY_TWEAKED */) {
|
|
13680
|
-
|
|
13675
|
+
await this.claimTransferTweakKeys(transfer, leaves);
|
|
13681
13676
|
}
|
|
13682
|
-
const signatures = await this.claimTransferSignRefunds(
|
|
13683
|
-
transfer,
|
|
13684
|
-
leaves,
|
|
13685
|
-
proofMap
|
|
13686
|
-
);
|
|
13677
|
+
const signatures = await this.claimTransferSignRefunds(transfer, leaves);
|
|
13687
13678
|
return await this.finalizeNodeSignatures(signatures);
|
|
13688
13679
|
}
|
|
13689
13680
|
// When transferIds is not provided, all pending transfers for the receiver will be returned.
|
|
@@ -13734,31 +13725,33 @@ var TransferService = class extends BaseTransferService {
|
|
|
13734
13725
|
}
|
|
13735
13726
|
async verifyPendingTransfer(transfer) {
|
|
13736
13727
|
const leafPubKeyMap = /* @__PURE__ */ new Map();
|
|
13737
|
-
|
|
13738
|
-
|
|
13739
|
-
|
|
13740
|
-
|
|
13741
|
-
|
|
13742
|
-
|
|
13743
|
-
|
|
13744
|
-
|
|
13745
|
-
|
|
13746
|
-
|
|
13747
|
-
|
|
13748
|
-
|
|
13749
|
-
|
|
13750
|
-
|
|
13751
|
-
|
|
13752
|
-
|
|
13753
|
-
|
|
13754
|
-
|
|
13755
|
-
|
|
13756
|
-
|
|
13757
|
-
|
|
13758
|
-
|
|
13759
|
-
|
|
13760
|
-
|
|
13761
|
-
|
|
13728
|
+
await Promise.all(
|
|
13729
|
+
transfer.leaves.map(async (leaf) => {
|
|
13730
|
+
if (!leaf.leaf) {
|
|
13731
|
+
throw new Error("Leaf is undefined");
|
|
13732
|
+
}
|
|
13733
|
+
const encoder = new TextEncoder();
|
|
13734
|
+
const leafIdBytes = encoder.encode(leaf.leaf.id);
|
|
13735
|
+
const transferIdBytes = encoder.encode(transfer.id);
|
|
13736
|
+
const payload = new Uint8Array([
|
|
13737
|
+
...leafIdBytes,
|
|
13738
|
+
...transferIdBytes,
|
|
13739
|
+
...leaf.secretCipher
|
|
13740
|
+
]);
|
|
13741
|
+
const payloadHash = sha25610(payload);
|
|
13742
|
+
if (!secp256k110.verify(
|
|
13743
|
+
leaf.signature,
|
|
13744
|
+
payloadHash,
|
|
13745
|
+
transfer.senderIdentityPublicKey
|
|
13746
|
+
)) {
|
|
13747
|
+
throw new Error("Signature verification failed");
|
|
13748
|
+
}
|
|
13749
|
+
const leafSecret = await this.config.signer.decryptEcies(
|
|
13750
|
+
leaf.secretCipher
|
|
13751
|
+
);
|
|
13752
|
+
leafPubKeyMap.set(leaf.leaf.id, leafSecret);
|
|
13753
|
+
})
|
|
13754
|
+
);
|
|
13762
13755
|
return leafPubKeyMap;
|
|
13763
13756
|
}
|
|
13764
13757
|
async queryTransfer(transferId) {
|
|
@@ -13820,29 +13813,31 @@ var TransferService = class extends BaseTransferService {
|
|
|
13820
13813
|
async sendTransferSignRefundInternal(leaves, receiverIdentityPubkey, expiryTime, forSwap) {
|
|
13821
13814
|
const transferId = uuidv7();
|
|
13822
13815
|
const leafDataMap = /* @__PURE__ */ new Map();
|
|
13823
|
-
|
|
13824
|
-
|
|
13825
|
-
|
|
13826
|
-
|
|
13827
|
-
|
|
13828
|
-
|
|
13829
|
-
|
|
13830
|
-
|
|
13831
|
-
|
|
13832
|
-
|
|
13833
|
-
|
|
13834
|
-
|
|
13835
|
-
|
|
13836
|
-
|
|
13837
|
-
|
|
13838
|
-
|
|
13839
|
-
|
|
13840
|
-
|
|
13841
|
-
|
|
13842
|
-
|
|
13843
|
-
|
|
13844
|
-
|
|
13845
|
-
|
|
13816
|
+
await Promise.all(
|
|
13817
|
+
leaves.map(async (leaf) => {
|
|
13818
|
+
const signingNonceCommitment = await this.config.signer.getRandomSigningCommitment();
|
|
13819
|
+
const directSigningNonceCommitment = await this.config.signer.getRandomSigningCommitment();
|
|
13820
|
+
const directFromCpfpRefundSigningNonceCommitment = await this.config.signer.getRandomSigningCommitment();
|
|
13821
|
+
const tx = getTxFromRawTxBytes(leaf.leaf.nodeTx);
|
|
13822
|
+
const refundTx = getTxFromRawTxBytes(leaf.leaf.refundTx);
|
|
13823
|
+
const directTx = leaf.leaf.directTx.length > 0 ? getTxFromRawTxBytes(leaf.leaf.directTx) : void 0;
|
|
13824
|
+
const directRefundTx = leaf.leaf.directRefundTx.length > 0 ? getTxFromRawTxBytes(leaf.leaf.directRefundTx) : void 0;
|
|
13825
|
+
const directFromCpfpRefundTx = leaf.leaf.directFromCpfpRefundTx.length > 0 ? getTxFromRawTxBytes(leaf.leaf.directFromCpfpRefundTx) : void 0;
|
|
13826
|
+
leafDataMap.set(leaf.leaf.id, {
|
|
13827
|
+
keyDerivation: leaf.keyDerivation,
|
|
13828
|
+
receivingPubkey: receiverIdentityPubkey,
|
|
13829
|
+
signingNonceCommitment,
|
|
13830
|
+
directSigningNonceCommitment,
|
|
13831
|
+
tx,
|
|
13832
|
+
directTx,
|
|
13833
|
+
refundTx,
|
|
13834
|
+
directRefundTx,
|
|
13835
|
+
directFromCpfpRefundTx,
|
|
13836
|
+
directFromCpfpRefundSigningNonceCommitment,
|
|
13837
|
+
vout: leaf.leaf.vout
|
|
13838
|
+
});
|
|
13839
|
+
})
|
|
13840
|
+
);
|
|
13846
13841
|
const signingJobs = await this.prepareRefundSoSigningJobs(
|
|
13847
13842
|
leaves,
|
|
13848
13843
|
leafDataMap
|
|
@@ -13904,65 +13899,71 @@ var TransferService = class extends BaseTransferService {
|
|
|
13904
13899
|
}
|
|
13905
13900
|
async prepareRefundSoSigningJobs(leaves, leafDataMap, isForClaim) {
|
|
13906
13901
|
const signingJobs = [];
|
|
13907
|
-
|
|
13908
|
-
|
|
13909
|
-
|
|
13910
|
-
|
|
13911
|
-
|
|
13912
|
-
|
|
13913
|
-
|
|
13914
|
-
|
|
13915
|
-
|
|
13916
|
-
|
|
13917
|
-
|
|
13918
|
-
|
|
13919
|
-
|
|
13920
|
-
|
|
13921
|
-
|
|
13922
|
-
|
|
13923
|
-
|
|
13924
|
-
|
|
13925
|
-
|
|
13926
|
-
|
|
13927
|
-
|
|
13928
|
-
|
|
13929
|
-
|
|
13930
|
-
|
|
13931
|
-
|
|
13932
|
-
|
|
13933
|
-
|
|
13934
|
-
|
|
13935
|
-
|
|
13936
|
-
|
|
13937
|
-
|
|
13938
|
-
|
|
13939
|
-
|
|
13940
|
-
|
|
13941
|
-
refundSigningData.
|
|
13942
|
-
|
|
13943
|
-
|
|
13944
|
-
|
|
13945
|
-
|
|
13946
|
-
|
|
13947
|
-
|
|
13948
|
-
|
|
13949
|
-
|
|
13950
|
-
|
|
13951
|
-
|
|
13952
|
-
|
|
13953
|
-
|
|
13954
|
-
|
|
13955
|
-
|
|
13956
|
-
|
|
13957
|
-
|
|
13958
|
-
|
|
13959
|
-
|
|
13960
|
-
|
|
13902
|
+
const results = await Promise.all(
|
|
13903
|
+
leaves.map(async (leaf) => {
|
|
13904
|
+
const refundSigningData = leafDataMap.get(leaf.leaf.id);
|
|
13905
|
+
if (!refundSigningData) {
|
|
13906
|
+
throw new Error(`Leaf data not found for leaf ${leaf.leaf.id}`);
|
|
13907
|
+
}
|
|
13908
|
+
const nodeTx = getTxFromRawTxBytes(leaf.leaf.nodeTx);
|
|
13909
|
+
let directNodeTx;
|
|
13910
|
+
if (leaf.leaf.directTx.length > 0) {
|
|
13911
|
+
directNodeTx = getTxFromRawTxBytes(leaf.leaf.directTx);
|
|
13912
|
+
}
|
|
13913
|
+
const currRefundTx = getTxFromRawTxBytes(leaf.leaf.refundTx);
|
|
13914
|
+
const currentSequence = currRefundTx.getInput(0).sequence;
|
|
13915
|
+
if (!currentSequence) {
|
|
13916
|
+
throw new SparkValidationError("Invalid refund transaction", {
|
|
13917
|
+
field: "sequence",
|
|
13918
|
+
value: currRefundTx.getInput(0),
|
|
13919
|
+
expected: "Non-null sequence"
|
|
13920
|
+
});
|
|
13921
|
+
}
|
|
13922
|
+
const refundTxsParams = {
|
|
13923
|
+
nodeTx,
|
|
13924
|
+
directNodeTx,
|
|
13925
|
+
sequence: currentSequence,
|
|
13926
|
+
receivingPubkey: refundSigningData.receivingPubkey,
|
|
13927
|
+
network: this.config.getNetwork()
|
|
13928
|
+
};
|
|
13929
|
+
const { cpfpRefundTx, directRefundTx, directFromCpfpRefundTx } = isForClaim ? createCurrentTimelockRefundTxs(refundTxsParams) : createDecrementedTimelockRefundTxs(refundTxsParams);
|
|
13930
|
+
const isZeroNode = !getCurrentTimelock(nodeTx.getInput(0).sequence);
|
|
13931
|
+
refundSigningData.refundTx = cpfpRefundTx;
|
|
13932
|
+
refundSigningData.directRefundTx = directRefundTx && !isZeroNode ? directRefundTx : void 0;
|
|
13933
|
+
refundSigningData.directFromCpfpRefundTx = directFromCpfpRefundTx;
|
|
13934
|
+
const cpfpRefundNonceCommitmentProto = refundSigningData.signingNonceCommitment;
|
|
13935
|
+
const directRefundNonceCommitmentProto = refundSigningData.directSigningNonceCommitment;
|
|
13936
|
+
const directFromCpfpRefundNonceCommitmentProto = refundSigningData.directFromCpfpRefundSigningNonceCommitment;
|
|
13937
|
+
const signingPublicKey = await this.config.signer.getPublicKeyFromDerivation(
|
|
13938
|
+
refundSigningData.keyDerivation
|
|
13939
|
+
);
|
|
13940
|
+
return {
|
|
13941
|
+
leafId: leaf.leaf.id,
|
|
13942
|
+
refundTxSigningJob: {
|
|
13943
|
+
signingPublicKey,
|
|
13944
|
+
rawTx: cpfpRefundTx.toBytes(),
|
|
13945
|
+
signingNonceCommitment: cpfpRefundNonceCommitmentProto.commitment
|
|
13946
|
+
},
|
|
13947
|
+
directRefundTxSigningJob: directRefundTx && !isZeroNode ? {
|
|
13948
|
+
signingPublicKey,
|
|
13949
|
+
rawTx: directRefundTx.toBytes(),
|
|
13950
|
+
signingNonceCommitment: directRefundNonceCommitmentProto.commitment
|
|
13951
|
+
} : void 0,
|
|
13952
|
+
directFromCpfpRefundTxSigningJob: directFromCpfpRefundTx ? {
|
|
13953
|
+
signingPublicKey,
|
|
13954
|
+
rawTx: directFromCpfpRefundTx.toBytes(),
|
|
13955
|
+
signingNonceCommitment: directFromCpfpRefundNonceCommitmentProto.commitment
|
|
13956
|
+
} : void 0
|
|
13957
|
+
};
|
|
13958
|
+
})
|
|
13959
|
+
);
|
|
13960
|
+
for (const result of results) {
|
|
13961
|
+
signingJobs.push(result);
|
|
13961
13962
|
}
|
|
13962
13963
|
return signingJobs;
|
|
13963
13964
|
}
|
|
13964
13965
|
async claimTransferTweakKeys(transfer, leaves) {
|
|
13965
|
-
const
|
|
13966
|
+
const leavesTweaksMap = await this.prepareClaimLeavesKeyTweaks(leaves);
|
|
13966
13967
|
const errors = [];
|
|
13967
13968
|
const promises = Object.entries(this.config.getSigningOperators()).map(
|
|
13968
13969
|
async ([identifier, operator]) => {
|
|
@@ -14000,14 +14001,13 @@ var TransferService = class extends BaseTransferService {
|
|
|
14000
14001
|
if (errors.length > 0) {
|
|
14001
14002
|
throw errors[0];
|
|
14002
14003
|
}
|
|
14003
|
-
return proofMap;
|
|
14004
14004
|
}
|
|
14005
14005
|
async prepareClaimLeavesKeyTweaks(leaves) {
|
|
14006
14006
|
const leafDataMap = /* @__PURE__ */ new Map();
|
|
14007
|
-
const
|
|
14008
|
-
|
|
14009
|
-
|
|
14010
|
-
|
|
14007
|
+
const results = await Promise.all(
|
|
14008
|
+
leaves.map((leaf) => this.prepareClaimLeafKeyTweaks(leaf))
|
|
14009
|
+
);
|
|
14010
|
+
for (const { leafKeyTweaks: leafData } of results) {
|
|
14011
14011
|
for (const [identifier, leafTweak] of leafData) {
|
|
14012
14012
|
leafDataMap.set(identifier, [
|
|
14013
14013
|
...leafDataMap.get(identifier) || [],
|
|
@@ -14015,7 +14015,7 @@ var TransferService = class extends BaseTransferService {
|
|
|
14015
14015
|
]);
|
|
14016
14016
|
}
|
|
14017
14017
|
}
|
|
14018
|
-
return
|
|
14018
|
+
return leafDataMap;
|
|
14019
14019
|
}
|
|
14020
14020
|
async prepareClaimLeafKeyTweaks(leaf) {
|
|
14021
14021
|
const signingOperators = this.config.getSigningOperators();
|
|
@@ -14062,24 +14062,26 @@ var TransferService = class extends BaseTransferService {
|
|
|
14062
14062
|
}
|
|
14063
14063
|
return { leafKeyTweaks: leafTweaksMap, proofs: shares[0].proofs };
|
|
14064
14064
|
}
|
|
14065
|
-
async claimTransferSignRefunds(transfer, leafKeys
|
|
14065
|
+
async claimTransferSignRefunds(transfer, leafKeys) {
|
|
14066
14066
|
const leafDataMap = /* @__PURE__ */ new Map();
|
|
14067
|
-
|
|
14068
|
-
|
|
14069
|
-
|
|
14070
|
-
|
|
14071
|
-
|
|
14072
|
-
|
|
14073
|
-
|
|
14074
|
-
|
|
14075
|
-
|
|
14076
|
-
|
|
14077
|
-
|
|
14078
|
-
|
|
14079
|
-
|
|
14080
|
-
|
|
14081
|
-
|
|
14082
|
-
|
|
14067
|
+
await Promise.all(
|
|
14068
|
+
leafKeys.map(async (leafKey) => {
|
|
14069
|
+
const tx = getTxFromRawTxBytes(leafKey.leaf.nodeTx);
|
|
14070
|
+
const directTx = leafKey.leaf.directTx.length > 0 ? getTxFromRawTxBytes(leafKey.leaf.directTx) : void 0;
|
|
14071
|
+
leafDataMap.set(leafKey.leaf.id, {
|
|
14072
|
+
keyDerivation: leafKey.newKeyDerivation,
|
|
14073
|
+
receivingPubkey: await this.config.signer.getPublicKeyFromDerivation(
|
|
14074
|
+
leafKey.newKeyDerivation
|
|
14075
|
+
),
|
|
14076
|
+
signingNonceCommitment: await this.config.signer.getRandomSigningCommitment(),
|
|
14077
|
+
directSigningNonceCommitment: await this.config.signer.getRandomSigningCommitment(),
|
|
14078
|
+
directFromCpfpRefundSigningNonceCommitment: await this.config.signer.getRandomSigningCommitment(),
|
|
14079
|
+
tx,
|
|
14080
|
+
directTx,
|
|
14081
|
+
vout: leafKey.leaf.vout
|
|
14082
|
+
});
|
|
14083
|
+
})
|
|
14084
|
+
);
|
|
14083
14085
|
const signingJobs = await this.prepareRefundSoSigningJobs(
|
|
14084
14086
|
leafKeys,
|
|
14085
14087
|
leafDataMap,
|
|
@@ -14089,14 +14091,6 @@ var TransferService = class extends BaseTransferService {
|
|
|
14089
14091
|
this.config.getCoordinatorAddress()
|
|
14090
14092
|
);
|
|
14091
14093
|
let resp;
|
|
14092
|
-
const secretProofMap = {};
|
|
14093
|
-
if (proofMap) {
|
|
14094
|
-
for (const [leafId, proof] of proofMap.entries()) {
|
|
14095
|
-
secretProofMap[leafId] = {
|
|
14096
|
-
proofs: proof
|
|
14097
|
-
};
|
|
14098
|
-
}
|
|
14099
|
-
}
|
|
14100
14094
|
try {
|
|
14101
14095
|
resp = await sparkClient.claim_transfer_sign_refunds_v2({
|
|
14102
14096
|
transferId: transfer.id,
|
|
@@ -14671,9 +14665,7 @@ var CoopExitService = class extends BaseTransferService {
|
|
|
14671
14665
|
const signingJob = {
|
|
14672
14666
|
leafId: leaf.leaf.id,
|
|
14673
14667
|
refundTxSigningJob: {
|
|
14674
|
-
signingPublicKey
|
|
14675
|
-
leaf.keyDerivation
|
|
14676
|
-
),
|
|
14668
|
+
signingPublicKey,
|
|
14677
14669
|
rawTx: cpfpRefundTx.toBytes(),
|
|
14678
14670
|
signingNonceCommitment: signingNonceCommitment.commitment
|
|
14679
14671
|
},
|
|
@@ -14724,13 +14716,13 @@ var CoopExitService = class extends BaseTransferService {
|
|
|
14724
14716
|
});
|
|
14725
14717
|
} catch (error) {
|
|
14726
14718
|
throw new SparkRequestError("Failed to initiate cooperative exit", {
|
|
14727
|
-
operation: "
|
|
14719
|
+
operation: "cooperative_exit_v2",
|
|
14728
14720
|
error
|
|
14729
14721
|
});
|
|
14730
14722
|
}
|
|
14731
14723
|
if (!response.transfer) {
|
|
14732
14724
|
throw new SparkRequestError("Failed to initiate cooperative exit", {
|
|
14733
|
-
operation: "
|
|
14725
|
+
operation: "cooperative_exit_v2",
|
|
14734
14726
|
error: new Error("No transfer in response")
|
|
14735
14727
|
});
|
|
14736
14728
|
}
|
|
@@ -15192,7 +15184,7 @@ var DepositService = class {
|
|
|
15192
15184
|
});
|
|
15193
15185
|
} catch (error) {
|
|
15194
15186
|
throw new SparkRequestError("Failed to finalize node signatures", {
|
|
15195
|
-
operation: "
|
|
15187
|
+
operation: "finalize_node_signatures_v2",
|
|
15196
15188
|
error
|
|
15197
15189
|
});
|
|
15198
15190
|
}
|
|
@@ -15492,7 +15484,7 @@ var LightningService = class {
|
|
|
15492
15484
|
});
|
|
15493
15485
|
} catch (error) {
|
|
15494
15486
|
throw new SparkRequestError("Failed to initiate preimage swap", {
|
|
15495
|
-
operation: "
|
|
15487
|
+
operation: "initiate_preimage_swap_v3",
|
|
15496
15488
|
error
|
|
15497
15489
|
});
|
|
15498
15490
|
}
|
|
@@ -15574,12 +15566,13 @@ var SigningService = class {
|
|
|
15574
15566
|
expected: "Non-null signing commitments"
|
|
15575
15567
|
});
|
|
15576
15568
|
}
|
|
15569
|
+
const publicKey = await this.config.signer.getPublicKeyFromDerivation(
|
|
15570
|
+
leaf.keyDerivation
|
|
15571
|
+
);
|
|
15577
15572
|
const signingResult = await this.config.signer.signFrost({
|
|
15578
15573
|
message: sighash,
|
|
15579
15574
|
keyDerivation: leaf.keyDerivation,
|
|
15580
|
-
publicKey
|
|
15581
|
-
leaf.keyDerivation
|
|
15582
|
-
),
|
|
15575
|
+
publicKey,
|
|
15583
15576
|
selfCommitment: signingCommitment,
|
|
15584
15577
|
statechainCommitments: signingCommitments,
|
|
15585
15578
|
adaptorPubKey: new Uint8Array(),
|
|
@@ -15587,9 +15580,7 @@ var SigningService = class {
|
|
|
15587
15580
|
});
|
|
15588
15581
|
leafSigningJobs.push({
|
|
15589
15582
|
leafId: leaf.leaf.id,
|
|
15590
|
-
signingPublicKey:
|
|
15591
|
-
leaf.keyDerivation
|
|
15592
|
-
),
|
|
15583
|
+
signingPublicKey: publicKey,
|
|
15593
15584
|
rawTx: refundTx.toBytes(),
|
|
15594
15585
|
signingNonceCommitment: signingCommitment.commitment,
|
|
15595
15586
|
userSignature: signingResult,
|
|
@@ -20356,7 +20347,7 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
|
|
|
20356
20347
|
* @param tokenIdentifiers - Optional array of token identifiers to filter by
|
|
20357
20348
|
* @param outputIds - Optional array of output IDs to filter by
|
|
20358
20349
|
* @param order - Optional order for results ("ASCENDING" or "DESCENDING", defaults to "DESCENDING")
|
|
20359
|
-
* @param pageSize - Optional page size (defaults to
|
|
20350
|
+
* @param pageSize - Optional page size (defaults to 50)
|
|
20360
20351
|
* @param offset - Optional offset for pagination (defaults to 0)
|
|
20361
20352
|
* @returns Promise resolving to array of token transactions with their current status
|
|
20362
20353
|
*/
|
|
@@ -20379,7 +20370,7 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
|
|
|
20379
20370
|
tokenIdentifiers,
|
|
20380
20371
|
outputIds,
|
|
20381
20372
|
order,
|
|
20382
|
-
pageSize: pageSize ??
|
|
20373
|
+
pageSize: pageSize ?? 50,
|
|
20383
20374
|
offset: offset ?? 0
|
|
20384
20375
|
});
|
|
20385
20376
|
}
|
|
@@ -21871,6 +21862,9 @@ var ConnectionManager = class _ConnectionManager {
|
|
|
21871
21862
|
}
|
|
21872
21863
|
return serverTime;
|
|
21873
21864
|
}
|
|
21865
|
+
isTimeSynced() {
|
|
21866
|
+
return this.timeSync.isSynced();
|
|
21867
|
+
}
|
|
21874
21868
|
getMonotonicTime() {
|
|
21875
21869
|
return getMonotonicTime();
|
|
21876
21870
|
}
|
|
@@ -22048,39 +22042,6 @@ var ConnectionManager = class _ConnectionManager {
|
|
|
22048
22042
|
prepareMetadata(metadata) {
|
|
22049
22043
|
return metadata;
|
|
22050
22044
|
}
|
|
22051
|
-
recordTimeSync(dateHeader, serverProcessingTimeMs, sendTime, receiveTime) {
|
|
22052
|
-
this.timeSync.recordSync(
|
|
22053
|
-
dateHeader,
|
|
22054
|
-
serverProcessingTimeMs,
|
|
22055
|
-
sendTime,
|
|
22056
|
-
receiveTime
|
|
22057
|
-
);
|
|
22058
|
-
}
|
|
22059
|
-
processResponseForTimeSync(result, firstResponse, sendTime) {
|
|
22060
|
-
if (!firstResponse) return false;
|
|
22061
|
-
const receiveTime = this.getMonotonicTime();
|
|
22062
|
-
if (typeof result.value === "object" && result.value !== null) {
|
|
22063
|
-
const responseObj = result.value;
|
|
22064
|
-
if (responseObj.header && responseObj.header instanceof Metadata) {
|
|
22065
|
-
const dateHeader = responseObj.header.get(
|
|
22066
|
-
_ConnectionManager.DATE_HEADER
|
|
22067
|
-
)?.[0];
|
|
22068
|
-
const processingTimeHeader = responseObj.header.get(
|
|
22069
|
-
_ConnectionManager.PROCESSING_TIME_HEADER
|
|
22070
|
-
)?.[0];
|
|
22071
|
-
if (dateHeader && processingTimeHeader) {
|
|
22072
|
-
const serverProcessingTimeMs = parseFloat(processingTimeHeader);
|
|
22073
|
-
this.recordTimeSync(
|
|
22074
|
-
dateHeader,
|
|
22075
|
-
serverProcessingTimeMs,
|
|
22076
|
-
sendTime,
|
|
22077
|
-
receiveTime
|
|
22078
|
-
);
|
|
22079
|
-
}
|
|
22080
|
-
}
|
|
22081
|
-
}
|
|
22082
|
-
return true;
|
|
22083
|
-
}
|
|
22084
22045
|
createAuthnMiddleware() {
|
|
22085
22046
|
return async function* (call, options) {
|
|
22086
22047
|
const metadata = this.prepareMetadata(Metadata(options.metadata));
|
|
@@ -22095,28 +22056,34 @@ var ConnectionManager = class _ConnectionManager {
|
|
|
22095
22056
|
const metadata = this.prepareMetadata(Metadata(options.metadata));
|
|
22096
22057
|
const authToken = await this.authenticate(address);
|
|
22097
22058
|
const sendTime = this.getMonotonicTime();
|
|
22059
|
+
const receiveTime = { value: 0 };
|
|
22098
22060
|
try {
|
|
22099
22061
|
const generator = call.next(call.request, {
|
|
22100
22062
|
...options,
|
|
22101
|
-
metadata: metadata.set("Authorization", `Bearer ${authToken}`)
|
|
22063
|
+
metadata: metadata.set("Authorization", `Bearer ${authToken}`),
|
|
22064
|
+
onHeader: (header) => {
|
|
22065
|
+
receiveTime.value = this.getMonotonicTime();
|
|
22066
|
+
const dateHeader = header.get(_ConnectionManager.DATE_HEADER);
|
|
22067
|
+
const processingTimeHeader = header.get(
|
|
22068
|
+
_ConnectionManager.PROCESSING_TIME_HEADER
|
|
22069
|
+
);
|
|
22070
|
+
if (dateHeader && processingTimeHeader) {
|
|
22071
|
+
const serverProcessingTimeMs = parseFloat(processingTimeHeader);
|
|
22072
|
+
this.timeSync.recordSync(
|
|
22073
|
+
dateHeader,
|
|
22074
|
+
serverProcessingTimeMs,
|
|
22075
|
+
sendTime,
|
|
22076
|
+
receiveTime.value
|
|
22077
|
+
);
|
|
22078
|
+
}
|
|
22079
|
+
}
|
|
22102
22080
|
});
|
|
22103
|
-
let firstResponse = true;
|
|
22104
22081
|
let result = await generator.next();
|
|
22105
22082
|
while (!result.done) {
|
|
22106
|
-
if (firstResponse) {
|
|
22107
|
-
firstResponse = this.processResponseForTimeSync(
|
|
22108
|
-
result,
|
|
22109
|
-
firstResponse,
|
|
22110
|
-
sendTime
|
|
22111
|
-
);
|
|
22112
|
-
}
|
|
22113
22083
|
yield result.value;
|
|
22114
22084
|
result = await generator.next();
|
|
22115
22085
|
}
|
|
22116
22086
|
if (result.value !== void 0) {
|
|
22117
|
-
if (firstResponse) {
|
|
22118
|
-
this.processResponseForTimeSync(result, firstResponse, sendTime);
|
|
22119
|
-
}
|
|
22120
22087
|
return result.value;
|
|
22121
22088
|
}
|
|
22122
22089
|
} catch (error) {
|
|
@@ -22451,7 +22418,6 @@ export {
|
|
|
22451
22418
|
getNextTransactionSequence,
|
|
22452
22419
|
getEphemeralAnchorOutput,
|
|
22453
22420
|
isEphemeralAnchorOutput,
|
|
22454
|
-
constructUnilateralExitTxs,
|
|
22455
22421
|
constructUnilateralExitFeeBumpPackages,
|
|
22456
22422
|
hash160,
|
|
22457
22423
|
constructFeeBumpTx,
|