@indigo-labs/indigo-sdk 0.3.15 → 0.3.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/.github/workflows/ci.yml +2 -4
  2. package/dist/index.d.mts +40 -8
  3. package/dist/index.d.ts +40 -8
  4. package/dist/index.js +125 -69
  5. package/dist/index.mjs +124 -71
  6. package/package.json +2 -1
  7. package/scripts/bench.sh +62 -0
  8. package/src/contracts/iasset/helpers.ts +1 -1
  9. package/src/contracts/poll/types-poll-new.ts +10 -5
  10. package/src/contracts/rob/helpers.ts +122 -43
  11. package/src/contracts/rob/transactions.ts +12 -3
  12. package/src/contracts/rob-leverage/helpers.ts +4 -1
  13. package/src/contracts/stability-pool/types-new.ts +11 -5
  14. package/src/contracts/stableswap/transactions.ts +1 -5
  15. package/src/contracts/staking/types-new.ts +5 -3
  16. package/src/contracts/treasury/transactions.ts +8 -2
  17. package/src/validators/cdp-creator-validator.ts +1 -1
  18. package/src/validators/cdp-redeem-validator.ts +1 -1
  19. package/src/validators/cdp-validator.ts +1 -1
  20. package/src/validators/collector-validator.ts +1 -1
  21. package/src/validators/execute-validator.ts +1 -1
  22. package/src/validators/governance-validator.ts +1 -1
  23. package/src/validators/iasset-validator.ts +1 -1
  24. package/src/validators/interest-collection-validator.ts +1 -1
  25. package/src/validators/interest-oracle-validator.ts +1 -1
  26. package/src/validators/poll-manager-validator.ts +1 -1
  27. package/src/validators/poll-shard-validator.ts +1 -1
  28. package/src/validators/price-oracle-validator.ts +1 -1
  29. package/src/validators/pyth-feed-validator.ts +1 -1
  30. package/src/validators/rob-validator.ts +1 -1
  31. package/src/validators/stability-pool-validator.ts +1 -1
  32. package/src/validators/stableswap-validator.ts +1 -1
  33. package/src/validators/staking-validator.ts +1 -1
  34. package/src/validators/treasury-validator.ts +1 -1
  35. package/src/validators/version-record-policy.ts +1 -1
  36. package/tests/cdp/actions.ts +1 -1
  37. package/tests/cdp/cdp-queries.ts +1 -1
  38. package/tests/cdp/cdp.test.ts +1 -1
  39. package/tests/cdp/transactions-mutated.ts +1 -1
  40. package/tests/gov/gov.test.ts +78 -12
  41. package/tests/interest-collection/interest-collection.test.ts +5 -5
  42. package/tests/rob/rob-leverage.test.ts +12 -27
  43. package/tests/rob/rob.test.ts +56 -52
  44. package/tests/stability-pool.test.ts +7 -4
  45. package/tests/stableswap/stableswap.test.ts +1 -1
  46. package/tests/treasury/actions.ts +67 -0
  47. package/tests/{queries → treasury}/treasury-queries.ts +11 -2
  48. package/tests/treasury/treasury.test.ts +342 -0
  49. package/vitest.config.ts +1 -1
  50. package/tests/treasury.test.ts +0 -242
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indigo-labs/indigo-sdk",
3
- "version": "0.3.15",
3
+ "version": "0.3.17",
4
4
  "description": "Indigo SDK for interacting with Indigo endpoints via lucid-evolution",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -39,6 +39,7 @@
39
39
  ],
40
40
  "author": "3rd Eye Labs",
41
41
  "license": "MIT",
42
+ "packageManager": "pnpm@10.33.4",
42
43
  "dependencies": {
43
44
  "@3rd-eye-labs/cardano-offchain-common": "1.2.0",
44
45
  "@evolution-sdk/evolution": "^0.3.22",
@@ -0,0 +1,62 @@
1
+ #!/bin/bash
2
+
3
+ # Runs the testsuite X times and collects the mem spent for each run,
4
+ # at the end, it summarises the results (max, median, avg).
5
+ # It's best to run just a single test using `.only` so it's quick.
6
+ #
7
+ # Usage: ./bench.sh <test-file> <benchmark-name> <runs>
8
+ # Example: ./bench.sh interest-collection.test.ts "Interest Collection - Batch Collect 13 CDPs" 20
9
+
10
+ if [ "$#" -ne 3 ]; then
11
+ echo "Usage: $0 <test-file> <benchmark-name> <runs>"
12
+ echo "Example: $0 interest-collection.test.ts \"Interest Collection - Batch Collect 13 CDPs\" 20"
13
+ exit 1
14
+ fi
15
+
16
+ test_file="$1"
17
+ benchmark_name="$2"
18
+ runs="$3"
19
+
20
+ if ! [[ "$runs" =~ ^[0-9]+$ ]] || [ "$runs" -lt 1 ]; then
21
+ echo "Error: <runs> must be a positive integer"
22
+ exit 1
23
+ fi
24
+
25
+ total=0
26
+ values=()
27
+
28
+ for i in $(seq 1 $runs); do
29
+ echo -n "Run $i/$runs... "
30
+ output=$(pnpm test "$test_file" 2>&1)
31
+ mem=$(echo "$output" | grep "$benchmark_name" | grep -oP "'\d+\.\d+%'" | head -1 | tr -d "'%")
32
+
33
+ if [ -z "$mem" ]; then
34
+ echo "ERROR: benchmark '$benchmark_name' not found in output — aborting"
35
+ exit 1
36
+ fi
37
+
38
+ echo "Memory: ${mem}%"
39
+ values+=("$mem")
40
+ total=$(echo "$total + $mem" | bc)
41
+ done
42
+
43
+ sorted=($(printf '%s\n' "${values[@]}" | sort -n))
44
+
45
+ avg=$(echo "scale=3; $total / $runs" | bc)
46
+ min=${sorted[0]}
47
+ max=${sorted[$runs-1]}
48
+
49
+ mid=$(($runs / 2))
50
+ if (( $runs % 2 == 0 )); then
51
+ median=$(echo "scale=3; (${sorted[$mid-1]} + ${sorted[$mid]}) / 2" | bc)
52
+ else
53
+ median=${sorted[$mid]}
54
+ fi
55
+
56
+ echo ""
57
+ echo "=== Benchmark: $benchmark_name ==="
58
+ echo "=== Test file: $test_file | Runs: $runs ==="
59
+ echo "Average : ${avg}%"
60
+ echo "Minimum : ${min}%"
61
+ echo "Maximum : ${max}%"
62
+ echo "Median : ${median}%"
@@ -32,7 +32,7 @@ import { AssetClass } from '@3rd-eye-labs/cardano-offchain-common';
32
32
  import * as Core from '@evolution-sdk/evolution';
33
33
  import { decodePriceUpdate, decodePythMessage } from '../../utils/pyth';
34
34
 
35
- export const MAX_COLLATERAL_ASSETS_COUNT_PER_IASSET = 8;
35
+ export const MAX_COLLATERAL_ASSETS_COUNT_PER_IASSET = 9;
36
36
 
37
37
  type Interval = {
38
38
  validFrom: number;
@@ -119,19 +119,24 @@ export function serialisePollShardRedeemer(r: PollShardRedeemer): string {
119
119
  return Data.withSchema(PollShardRedeemerSchema).toCBORHex(r);
120
120
  }
121
121
 
122
- export function parsePollShardRedeemer(datum: string): O.Option<PollShardRedeemer> {
122
+ export function parsePollShardRedeemer(
123
+ datum: string,
124
+ ): O.Option<PollShardRedeemer> {
123
125
  try {
124
126
  return O.some(
125
- Data.withSchema(PollShardRedeemerSchema, DEFAULT_SCHEMA_OPTIONS).fromCBORHex(
126
- datum,
127
- ),
127
+ Data.withSchema(
128
+ PollShardRedeemerSchema,
129
+ DEFAULT_SCHEMA_OPTIONS,
130
+ ).fromCBORHex(datum),
128
131
  );
129
132
  } catch (_) {
130
133
  return O.none;
131
134
  }
132
135
  }
133
136
 
134
- export function parsePollShardRedeemerOrThrow(datum: string): PollShardRedeemer {
137
+ export function parsePollShardRedeemerOrThrow(
138
+ datum: string,
139
+ ): PollShardRedeemer {
135
140
  return F.pipe(
136
141
  parsePollShardRedeemer(datum),
137
142
  O.match(() => {
@@ -8,6 +8,7 @@ import {
8
8
  } from '@lucid-evolution/lucid';
9
9
  import {
10
10
  RobDatum,
11
+ RobOrderType,
11
12
  parseRobDatumOrThrow,
12
13
  serialiseRobDatum,
13
14
  serialiseRobRedeemer,
@@ -21,7 +22,7 @@ import {
21
22
  option as O,
22
23
  ord as Ord,
23
24
  } from 'fp-ts';
24
- import { CurrencySymbolSP, SystemParams } from '../../types/system-params';
25
+ import { SystemParams } from '../../types/system-params';
25
26
  import { match, P } from 'ts-pattern';
26
27
  import { getInlineDatumOrThrow } from '../../utils/lucid-utils';
27
28
  import {
@@ -49,16 +50,17 @@ export const MIN_ROB_COLLATERAL_AMT = 3_000_000n;
49
50
  * The amount of collateral asset available in the ROB when buy order. In case of ADA, take
50
51
  * into account the min UTXO collateral.
51
52
  */
52
- export function robCollateralAmtToSpend(utxo: UTxO, datum: RobDatum): bigint {
53
- return match(datum.orderType)
53
+ export function robCollateralAmtToSpend(
54
+ robAssets: Assets,
55
+ robOrderType: RobOrderType,
56
+ ): bigint {
57
+ return match(robOrderType)
54
58
  .returnType<bigint>()
55
59
  .with({ BuyIAssetOrder: P.select() }, (content) => {
56
60
  if (isSameAssetClass(adaAssetClass, content.collateralAsset)) {
57
- return zeroNegatives(
58
- lovelacesAmt(utxo.assets) - MIN_ROB_COLLATERAL_AMT,
59
- );
61
+ return zeroNegatives(lovelacesAmt(robAssets) - MIN_ROB_COLLATERAL_AMT);
60
62
  } else {
61
- return assetClassValueOf(utxo.assets, content.collateralAsset);
63
+ return assetClassValueOf(robAssets, content.collateralAsset);
62
64
  }
63
65
  })
64
66
  .otherwise(() => {
@@ -70,17 +72,18 @@ export function robCollateralAmtToSpend(utxo: UTxO, datum: RobDatum): bigint {
70
72
  * The amount if iassets available in ROB when sell order.
71
73
  */
72
74
  export function robIAssetAmtToSpend(
73
- utxo: UTxO,
74
- datum: RobDatum,
75
- iassetCurrencySymbol: CurrencySymbolSP,
76
- ) {
77
- return match(datum.orderType)
75
+ robAssets: Assets,
76
+ robOrderType: RobOrderType,
77
+ /**
78
+ * This has to be assetclass having policyID of Indigo iAssets,
79
+ * and the asset name being the ROB datum iasset.
80
+ */
81
+ robIasset: AssetClass,
82
+ ): bigint {
83
+ return match(robOrderType)
78
84
  .returnType<bigint>()
79
85
  .with({ SellIAssetOrder: P.any }, (_) => {
80
- return assetClassValueOf(utxo.assets, {
81
- currencySymbol: fromHex(iassetCurrencySymbol.unCurrencySymbol),
82
- tokenName: datum.iasset,
83
- });
86
+ return assetClassValueOf(robAssets, robIasset);
84
87
  })
85
88
  .otherwise(() => {
86
89
  throw new Error('IAssets to spend is relevant only for Sell orders.');
@@ -91,21 +94,80 @@ export function robIAssetAmtToSpend(
91
94
  * Amount to spend from the ROB universal for Buy and sell orders.
92
95
  */
93
96
  export function robAmtToSpend(
94
- utxo: UTxO,
95
- datum: RobDatum,
96
- iassetCurrencySymbol: CurrencySymbolSP,
97
+ robAssets: Assets,
98
+ robOrderType: RobOrderType,
99
+ /**
100
+ * This has to be assetclass having policyID of Indigo iAssets,
101
+ * and the asset name being the ROB datum iasset.
102
+ */
103
+ robIasset: AssetClass,
97
104
  ): bigint {
98
- return match(datum.orderType)
99
- .with({ BuyIAssetOrder: P.any }, () => robCollateralAmtToSpend(utxo, datum))
105
+ return match(robOrderType)
106
+ .with({ BuyIAssetOrder: P.any }, () =>
107
+ robCollateralAmtToSpend(robAssets, robOrderType),
108
+ )
100
109
  .with({ SellIAssetOrder: P.any }, () =>
101
- robIAssetAmtToSpend(utxo, datum, iassetCurrencySymbol),
110
+ robIAssetAmtToSpend(robAssets, robOrderType, robIasset),
102
111
  )
103
112
  .exhaustive();
104
113
  }
105
114
 
115
+ type FilledResult = { asset: AssetClass; filledAmt: bigint };
116
+
117
+ /**
118
+ * The assets that have filled the order and are able to be claimed.
119
+ */
120
+ export function robBuyOrderFilledAssets(
121
+ robAssets: Assets,
122
+ robOrderType: RobOrderType,
123
+ /**
124
+ * This has to be assetclass having policyID of Indigo iAssets,
125
+ * and the asset name being the ROB datum iasset.
126
+ */
127
+ robIasset: AssetClass,
128
+ ): FilledResult {
129
+ return match(robOrderType)
130
+ .returnType<FilledResult>()
131
+ .with({ BuyIAssetOrder: P.any }, () => {
132
+ return {
133
+ asset: robIasset,
134
+ filledAmt: assetClassValueOf(robAssets, robIasset),
135
+ };
136
+ })
137
+ .otherwise(() => {
138
+ throw new Error('Expected only buy order.');
139
+ });
140
+ }
141
+
142
+ /**
143
+ * The assets that have filled the order and are able to be claimed.
144
+ */
145
+ export function robSellOrderFilledAssets(
146
+ robAssets: Assets,
147
+ robOrderType: RobOrderType,
148
+ ): FilledResult[] {
149
+ return match(robOrderType)
150
+ .returnType<FilledResult[]>()
151
+ .with({ SellIAssetOrder: P.select() }, (content) => {
152
+ return content.allowedCollateralAssets.map(([asset, _]) => {
153
+ return {
154
+ asset: asset,
155
+ filledAmt:
156
+ assetClassValueOf(robAssets, asset) -
157
+ (isSameAssetClass(asset, adaAssetClass)
158
+ ? MIN_ROB_COLLATERAL_AMT
159
+ : 0n),
160
+ } satisfies FilledResult;
161
+ });
162
+ })
163
+ .otherwise(() => {
164
+ throw new Error('Expected only sell order.');
165
+ });
166
+ }
167
+
106
168
  export function robBuyOrderSummary(
107
- utxo: UTxO,
108
- datum: RobDatum,
169
+ robAssets: Assets,
170
+ robOrderType: RobOrderType,
109
171
  oraclePrice: Rational,
110
172
  ): {
111
173
  /**
@@ -117,7 +179,7 @@ export function robBuyOrderSummary(
117
179
  */
118
180
  payoutIAsset: bigint;
119
181
  } {
120
- const redeemable = robCollateralAmtToSpend(utxo, datum);
182
+ const redeemable = robCollateralAmtToSpend(robAssets, robOrderType);
121
183
 
122
184
  const payoutAmt = iassetValueOfCollateral(redeemable, oraclePrice);
123
185
 
@@ -131,11 +193,11 @@ export function robBuyOrderSummary(
131
193
  * In case it's applied to a sell order instead, it will throw an error.
132
194
  */
133
195
  export function isBuyOrderFullyRedeemed(
134
- utxo: UTxO,
135
- datum: RobDatum,
196
+ robAssets: Assets,
197
+ robOrderType: RobOrderType,
136
198
  oraclePrice: Rational,
137
199
  ): boolean {
138
- const summary = robBuyOrderSummary(utxo, datum, oraclePrice);
200
+ const summary = robBuyOrderSummary(robAssets, robOrderType, oraclePrice);
139
201
 
140
202
  return summary.redeemableCollateral <= 0n || summary.payoutIAsset <= 0n;
141
203
  }
@@ -144,21 +206,25 @@ export function isBuyOrderFullyRedeemed(
144
206
  * Use the limit prices to decide fully redeemed.
145
207
  */
146
208
  export function isFullyRedeemed(
147
- utxo: UTxO,
148
- datum: RobDatum,
149
- iassetCurrencySymbol: CurrencySymbolSP,
209
+ robAssets: Assets,
210
+ robOrderType: RobOrderType,
211
+ /**
212
+ * This has to be assetclass having policyID of Indigo iAssets,
213
+ * and the asset name being the ROB datum iasset.
214
+ */
215
+ robIasset: AssetClass,
150
216
  ): boolean {
151
- return match(datum.orderType)
217
+ return match(robOrderType)
152
218
  .returnType<boolean>()
153
219
  .with({ BuyIAssetOrder: P.select() }, (content) =>
154
- isBuyOrderFullyRedeemed(utxo, datum, content.maxPrice),
220
+ isBuyOrderFullyRedeemed(robAssets, robOrderType, content.maxPrice),
155
221
  )
156
222
 
157
223
  .with({ SellIAssetOrder: P.select() }, (content) => {
158
224
  const iassetToSpend = robIAssetAmtToSpend(
159
- utxo,
160
- datum,
161
- iassetCurrencySymbol,
225
+ robAssets,
226
+ robOrderType,
227
+ robIasset,
162
228
  );
163
229
 
164
230
  const payoutAmts = content.allowedCollateralAssets.map((c) =>
@@ -353,7 +419,7 @@ export function calculateTotalCollateralForRedemption(
353
419
  (content) =>
354
420
  isSameAssetClass(content.collateralAsset, collateralAsset) &&
355
421
  rationalToFloat(content.maxPrice) >= rationalToFloat(iassetPrice) &&
356
- !isBuyOrderFullyRedeemed(utxo, datum, iassetPrice),
422
+ !isBuyOrderFullyRedeemed(utxo.assets, datum.orderType, iassetPrice),
357
423
  )
358
424
  .otherwise(() => false);
359
425
 
@@ -362,7 +428,10 @@ export function calculateTotalCollateralForRedemption(
362
428
  }
363
429
 
364
430
  // We constrained in the logic above that the ROB is a buy order and is not yet fully redeemed.
365
- const collateralToSpend = robCollateralAmtToSpend(utxo, datum);
431
+ const collateralToSpend = robCollateralAmtToSpend(
432
+ utxo.assets,
433
+ datum.orderType,
434
+ );
366
435
 
367
436
  return O.some(collateralToSpend);
368
437
  }),
@@ -413,7 +482,7 @@ export function randomRobsSubsetSatisfyingTargetCollateral(
413
482
  )
414
483
  // Only buy order types
415
484
  .otherwise(() => false) &&
416
- !isBuyOrderFullyRedeemed(utxo, datum, iassetPrice),
485
+ !isBuyOrderFullyRedeemed(utxo.assets, datum.orderType, iassetPrice),
417
486
  ),
418
487
  ),
419
488
  );
@@ -425,7 +494,10 @@ export function randomRobsSubsetSatisfyingTargetCollateral(
425
494
  for (let i = 0; i < shuffled.length; i++) {
426
495
  const element = shuffled[i];
427
496
 
428
- const lovelacesToSpend = robCollateralAmtToSpend(element[0], element[1]);
497
+ const lovelacesToSpend = robCollateralAmtToSpend(
498
+ element[0].assets,
499
+ element[1].orderType,
500
+ );
429
501
 
430
502
  const remainingToRedeem = targetCollateralToSpend - runningSum;
431
503
  const remainingToPayout = iassetValueOfCollateral(
@@ -438,7 +510,11 @@ export function randomRobsSubsetSatisfyingTargetCollateral(
438
510
  if (result.length > 0 && remainingToPayout <= 0n) {
439
511
  const last = result[result.length - 1];
440
512
 
441
- const lastSummary = robBuyOrderSummary(last[0], last[1], iassetPrice);
513
+ const lastSummary = robBuyOrderSummary(
514
+ last[0].assets,
515
+ last[1].orderType,
516
+ iassetPrice,
517
+ );
442
518
 
443
519
  // Pop the smallest collected when the current is larger.
444
520
  if (lastSummary.redeemableCollateral < lovelacesToSpend) {
@@ -453,7 +529,7 @@ export function randomRobsSubsetSatisfyingTargetCollateral(
453
529
  result,
454
530
  element,
455
531
  Ord.contramap<bigint, [UTxO, RobDatum]>(
456
- ([utxo, dat]) => robCollateralAmtToSpend(utxo, dat),
532
+ ([utxo, dat]) => robCollateralAmtToSpend(utxo.assets, dat.orderType),
457
533
  // From highest to lowest
458
534
  )(Ord.reverse(BigIntOrd)),
459
535
  );
@@ -462,7 +538,10 @@ export function randomRobsSubsetSatisfyingTargetCollateral(
462
538
  // When more items than max allowed, pop the one with smallest value
463
539
  if (result.length > maxLrpsInTx) {
464
540
  const popped = result.pop()!;
465
- runningSum -= robCollateralAmtToSpend(popped[0], popped[1]);
541
+ runningSum -= robCollateralAmtToSpend(
542
+ popped[0].assets,
543
+ popped[1].orderType,
544
+ );
466
545
  }
467
546
 
468
547
  if (runningSum >= targetCollateralToSpend) {
@@ -276,7 +276,12 @@ export async function adjustRob(
276
276
  // The claim case
277
277
  if (
278
278
  adjustmentAmt === 0n &&
279
- isFullyRedeemed(robUtxo, robDatum, sysParams.cdpParams.cdpAssetSymbol)
279
+ isFullyRedeemed(robUtxo.assets, robDatum.orderType, {
280
+ currencySymbol: fromHex(
281
+ sysParams.cdpParams.cdpAssetSymbol.unCurrencySymbol,
282
+ ),
283
+ tokenName: robDatum.iasset,
284
+ })
280
285
  ) {
281
286
  throw new Error(
282
287
  "When there's no more lovelaces to spend, use close instead of claim.",
@@ -286,8 +291,12 @@ export async function adjustRob(
286
291
  // Negative adjust case
287
292
  if (
288
293
  adjustmentAmt < 0 &&
289
- robAmtToSpend(robUtxo, robDatum, sysParams.cdpParams.cdpAssetSymbol) <=
290
- -adjustmentAmt
294
+ robAmtToSpend(robUtxo.assets, robDatum.orderType, {
295
+ currencySymbol: fromHex(
296
+ sysParams.cdpParams.cdpAssetSymbol.unCurrencySymbol,
297
+ ),
298
+ tokenName: robDatum.iasset,
299
+ }) <= -adjustmentAmt
291
300
  ) {
292
301
  throw new Error(
293
302
  "Can't adjust negatively by more than available. Also, for adjusting by exactly the amount deposited, a close action should be used instead.",
@@ -192,7 +192,10 @@ export function summarizeActualLeverageRedemptions(
192
192
  return acc;
193
193
  }
194
194
 
195
- const collateralToSpend = robCollateralAmtToSpend(lrp[0], lrp[1]);
195
+ const collateralToSpend = robCollateralAmtToSpend(
196
+ lrp[0].assets,
197
+ lrp[1].orderType,
198
+ );
196
199
 
197
200
  if (collateralToSpend === 0n) {
198
201
  return acc;
@@ -236,18 +236,24 @@ export function serialiseStabilityPoolRedeemer(
236
236
  ).toCBORHex(r);
237
237
  }
238
238
 
239
- export function parseStabilityPoolRedeemer(datum: string): O.Option<StabilityPoolRedeemer> {
239
+ export function parseStabilityPoolRedeemer(
240
+ datum: string,
241
+ ): O.Option<StabilityPoolRedeemer> {
240
242
  try {
241
- return O.some(Data.withSchema(StabilityPoolRedeemerSchema, DEFAULT_SCHEMA_OPTIONS).fromCBORHex(
242
- datum,
243
- )
243
+ return O.some(
244
+ Data.withSchema(
245
+ StabilityPoolRedeemerSchema,
246
+ DEFAULT_SCHEMA_OPTIONS,
247
+ ).fromCBORHex(datum),
244
248
  );
245
249
  } catch (_) {
246
250
  return O.none;
247
251
  }
248
252
  }
249
253
 
250
- export function parseStabilityPoolRedeemerOrThrow(datum: string): StabilityPoolRedeemer {
254
+ export function parseStabilityPoolRedeemerOrThrow(
255
+ datum: string,
256
+ ): StabilityPoolRedeemer {
251
257
  return F.pipe(
252
258
  parseStabilityPoolRedeemer(datum),
253
259
  O.match(() => {
@@ -12,13 +12,11 @@ import {
12
12
  toHex,
13
13
  TxBuilder,
14
14
  UTxO,
15
- validatorToScriptHash,
16
15
  } from '@lucid-evolution/lucid';
17
16
  import {
18
17
  fromSystemParamsScriptRef,
19
18
  SystemParams,
20
19
  } from '../../types/system-params';
21
- import { mkStableswapValidatorFromSP } from './scripts';
22
20
  import { estimateUtxoMinLovelace } from '../../utils/lucid-utils';
23
21
  import {
24
22
  parseStableswapOrderDatumOrThrow,
@@ -135,9 +133,7 @@ export async function createStableswapOrder(
135
133
 
136
134
  return lucid.newTx().pay.ToContract(
137
135
  credentialToAddress(lucid.config().network!, {
138
- hash: validatorToScriptHash(
139
- mkStableswapValidatorFromSP(params.stableswapParams),
140
- ),
136
+ hash: params.validatorHashes.stableswapHash,
141
137
  type: 'Script',
142
138
  }),
143
139
  {
@@ -75,9 +75,11 @@ export function serialiseStakingRedeemer(r: StakingRedeemer): string {
75
75
 
76
76
  export function parseStakingRedeemer(datum: string): O.Option<StakingRedeemer> {
77
77
  try {
78
- return O.some(Data.withSchema(StakingRedeemerSchema, DEFAULT_SCHEMA_OPTIONS).fromCBORHex(
79
- datum,
80
- ),
78
+ return O.some(
79
+ Data.withSchema(
80
+ StakingRedeemerSchema,
81
+ DEFAULT_SCHEMA_OPTIONS,
82
+ ).fromCBORHex(datum),
81
83
  );
82
84
  } catch (_) {
83
85
  return O.none;
@@ -238,14 +238,14 @@ export async function treasurySplit(
238
238
  (_) => new Error('Expected a single treasury UTXO'),
239
239
  );
240
240
 
241
- const assets = Object.keys(treasuryUtxo.assets);
241
+ const [adaAsset, ...nonAdaAssets] = Object.keys(treasuryUtxo.assets);
242
242
 
243
243
  const tx = lucid
244
244
  .newTx()
245
245
  .collectFrom([treasuryUtxo], serialiseTreasuryRedeemer('Split'))
246
246
  .readFrom([treasuryScriptRefUtxo]);
247
247
 
248
- for (const asset of assets) {
248
+ for (const asset of A.reverse(nonAdaAssets.sort())) {
249
249
  tx.pay.ToContract(
250
250
  mkTreasuryAddr(lucid, sysParams),
251
251
  { kind: 'inline', value: Data.void() },
@@ -253,6 +253,12 @@ export async function treasurySplit(
253
253
  );
254
254
  }
255
255
 
256
+ tx.pay.ToContract(
257
+ mkTreasuryAddr(lucid, sysParams),
258
+ { kind: 'inline', value: Data.void() },
259
+ { [adaAsset]: treasuryUtxo.assets[adaAsset] },
260
+ );
261
+
256
262
  return tx;
257
263
  }
258
264
 
@@ -3,5 +3,5 @@ export const _cdpCreatorValidator = {
3
3
  type: 'PlutusScriptV3',
4
4
  description: 'Generated by Aiken',
5
5
  cborHex:
6
- '59296c592969010100229800aba2aba1aba0aab9faab9eaab9dab9cab9a488888888c96600264653001300a00198051805800cdc3a4005300a0024888966002600460146ea800e33001300b3754007370e90024dc3a4001300a375400891111919912cc004c014012264b300130170018992cc004c01cc04cdd5000c4c8c8c8c8c8c8c8c8c8ca60026eb4c0840066044003375c6042015375a6042013375a6042011375a604200f375a604200d375a604200b375a6042009375a6042007375a6042004911111111112cc004c0b402a26464b3001301e001899192cc004c0c400a03b1640b86eb4c0bc004c0acdd5001456600260440031323259800981880140762c8170dd6981780098159baa0028acc004c07c0062b3001302b375400501b8b20588b205040a08140c0a4dd5000981600545902a0c084004c080004c07c004c078004c074004c070004c06c004c068004c064004c050dd5000c59011180b000c5901418091baa00b8acc004c0240122b3001301237540170028b20268acc004c0180122b3001301237540170028b20268b201e403c80786600246028602a602a602a602a602a602a003374a900048c050c0540064446466446600400400244b3001001801c4c8cc896600266e4401c00a2b30013371e00e0051001803202c899802802980e802202c375c602c0026eb4c05c004c064005017191919800800803112cc00400600713233225980099b910090028acc004cdc78048014400600c80ba26600a00a603c00880b8dd7180b8009bab3018001301a0014060297adef6c6014800244646600200200644b30010018a5eb8226644b3001300500289980c00119802002000c4cc010010005013180b800980c000a02a9b884800246028602a602a602a602a0032232330010010032233003001300200292cc004c014c040dd5000c4c050c044dd5000c5900e48c050c054c054006601e6ea8026444b300130060018a5eb7bdb182264646600200297adef6c602259800800c4cc060cdd81ba9006374c00697adef6c608994c004dd7180b000cdd5980b800cc06c0092225980099b9000a00389980e19bb037520146e9801c0162b30013371e01400713301c337606ea4028dd3003800c4cc070cdd81ba9003374c0046600c00c00280b90170c0640050171919800800a5eb7bdb1808966002003133017337606ea4010dd4001a5eb7bdb1822653001375c602a003375a602c003301a00248896600266e4002000e26603666ec0dd48041ba80070058acc004cdc7804001c4cc06ccdd81ba9008375000e00313301b337606ea400cdd400119803003000a02c40583018001405880824464b30013006001899192cc004c06400a0091640586eb8c05c004c04cdd5001c566002601400315980098099baa0038014590144590102020301137540052259800980298089baa0028991919912cc004c06800e00b16405c6eb4c05c004dd6980b801180b80098091baa0028b201e912cc004c014c044dd500144c8c8cc896600260340070058b202e375c602e0026eb8c05c008c05c004c048dd500145900f48888c8cc0040040148966002003133018337606ea4014dd400225eb7bdb1822653001375c602c003375a602e003301b00248896600266e4002400e26603866ec0dd48049ba80080058acc004cdc7804801c6600201300880148cc074cdd81ba900a37500020051001401d13301c337606ea400cdd400119803003000a02e405c3019001405d222232330010010052259800800c4cc060cdd81ba9005374c00897adef6c608994c004dd7180b000cdd5980b800cc06c0092225980099b9000900389980e19bb037520126e980200162b30013371e01200719800804c02200523301d337606ea4028dd30008014400500744cc070cdd81ba9003374c0046600c00c00280b90170c064005017496600200314a314a0809224444464b3001300900180144c00c00501319b8000400392cc004c010c040dd5000c48c8cdd7980b18099baa301630133754004002602a60246ea800a246466ebcc058c04cdd5001000980a98091baa0024039370290004dc4a4009370e90044dd2a40049111111111111111111111114c00488c8cc00400400c896600200314c0103d87a80008992cc004cdd7981818169baa0010048980e19817800a5eb8226600600660620048150c0bc00502d488c0866002005375c605a60546ea80066eb8c060c0a8dd5000a02e94c004dd7181618149baa0019bae3017302937540034800900e488c966002603c003132598009818000c4cc03cc0bc00400e2c8168c0acdd5001c5660026044003132598009818000c4cc038c0bc00400e2c8168c0acdd5001c566002603e0031323259800981880140122c8170dd7181780098159baa0038b205040a08140c0a4dd50014888c96600200314a31598009818000c4c8ca60026eb8c0c40066eb4c0c4c0c80066eb8c0c40092225980099b8f001489008acc004cdc7801a441008acc004c090c0c0dd5003c56600266e252000002899b89002482026fb80a294102e44cdc4a40000048172294102e4528205c18188009bac302f0018a5040b48168c8cc004004ca60020030059919800800802912cc004006297adef6c608991981919bb0302f001374c64660020026eacc0c4008896600200314bd6f7b63044c8cc0d4cdd818190009ba8300f375a606600266006006606e004606a0028198cc00c00cc0d0008c0c8005030200222259800801440062653001004981a001e6002005375c605e00337566060003222223259800980a800c00a260060028198c8ca6002003006802a00222259800801440062653001004981f001e6002005375c6072003375a6074003005406c8020c0f000903a2809a020401060640048180896600200314bd7044c8cc88cc88cc008008004896600200310038991981a9ba733035375200a6606a60640026606a606600297ae0330030033037002303500140cc6eacc0c000cdd718168009980180198190011818000a05c488888cc8966002604402b198009b804800644b30010018a4d13259800800c5268992cc004cdc81bae30323036003375c60640031330040043303500130370028a99818a49326b65797320696e206173736f63696174697665206c697374206172656e277420696e20617363656e64696e67206f72646572001640c0606a0028198c0d4005032488cc88c088cc0d4dd419b82375a606c0046eb4c0d8004cc0d4dd419b82375a606c606e0046eb4c0d8c0dc0052f5c060626ea8008c0c4dd5000c8966002604800314c0103d87a80008acc004cdc4000a400113020330333020330333750601a004660666ea0c0340052f5c097ae089810198199810198199ba800233033375000297ae04bd70205c40b9230333034303430343034303430343034001911919800800801912cc0040062980103d87a80008992cc004cdd78021819800c4c08ccc0d8c0d00052f5c1133003003303800240c4606c00281a24464b300130250018acc004c094c0c4dd500145300103d87a80008a6103d879800040bd1598009813000c566002604c60626ea800a2980103d87a80008a6103d87b800040bd13322598009815800c4c96600266e2000c0062980103d87980008acc004cdc4000801c530103d87b80008a6103d87a800040c88190dd6981b981a1baa0048acc004c09c006298103d87b80008a6103d879800040c48188dd6981a98191baa00330313754004817902f18181baa0029180f998191ba8001330324c10101004bd70488889660026602200800b15980099baf301b3034375400a007198009bab30223034375400b002800a0108a5040c514a0818a460666068606860680032303330343034303430343034303430343034303400191819981a181a181a181a181a181a181a181a181a181a000c8c0ccc0d0c0d0c0d0c0d0c0d0c0d0c0d0c0d0006605e6ea8c0c8c0bcdd50144c0bcdd5012a4444444444444453001222598008014530103d87a80008acc004c0d00062606066086608800497ae08cc00400e608a0053012001400c81f10424c03803a444b30013371000290004520008acc004c0d00062900144c966002606a66e1800920048cc0040126002007337060049002200889800cc00401260020073370660260049002200840fc6e0800903e207c9192cc004c0ccc0fcdd5000c4c10cc100dd5000c54cc0f9241263c65787065637465643e2044656e6f6d696e61746f722063616e6e6f74206265207a65726f2e001640f46601a6eb4c108c0fcdd50009bad302d303f37540032302e330413259800981b981f9baa0018992cc004c0e0c100dd5181798209baa3044304137540071301a33043375000297ae08980d198219ba833700002900125eb8103e1bad304330403754003100140f46084607e6ea8c108c0fcdd500099820992cc004c0dcc0fcdd5000c4c966002607060806ea8c0bcc104dd5181798209baa0038980d198219ba80014bd7044c068cc10cdd41809000a5eb8103e1bad304330403754003100140f46084607e6ea8c0b4c0fcdd5000a5eb826084005375c608200530420019bac3041001488888888a60026012013300700791112cc004c0f8006200919800802400e6464004601a0026609a66ec0dd48011ba80014bd6f7b630488888c966002606000300289801800a09c329800802402200f222229800802c00e009002800a00c40c8a05c81590484c12c0126eb4c1280126eb0c12800a6eb0c128c12c00922222229800912cc004cdc4000a400114c0103d87a8000899804801000a09a9114c00400e6eb8c150c144dd50014dd7181f98289baa002800a01098290024dd69828802244446464646464653001375a60b6003305b305c0019bad305b008998050091bad305b0069bad305b0049bad305b00248888896600260a260ba6ea800e264b30013375e60c460be6ea80041422b3001330363756609a60be6ea8c134c17cdd50009831182f9baa0658992cc004c14cc17cdd5000c4c9660033001306430613754005303a33063306430613754609e60c26ea800d2f5c130013306330503306330643061375400697ae04bd704c0dcc190c184dd5033d30103d87a800040a913259800982a98309baa0018992cc004cc0e8dd5982898319baa305130633754002605660c66ea81a6264b3001305730633754003132598009834800c4c96600260b260ca6ea80062646464646464646465300130720019bae30720099bad307200898390034c1c801660e40093072003992cc004c1c00062b3001304b306f0018b44c19cc1bc00506d4590711baa30720024888888896600260f601313305a307a00f13305a00513305a00413305a00313305a00213305b008132598009835983b9baa0018992cc004cc140dd59833983c9baa30673079375400260c660f26ea81fe264b300130713079375400313259800983f800c4c8c96600260e060f86ea800a264646464646464646464653001308b010019bae308b0100b9bad308b010099845808044c22c0401e61160200d308b010059845808024dd6984580801cc9660026112020031598009832184400800c5a261000261100200284300a2c845008dd518458080124444444444b300130960100b89983a184a8080a09983380389983a00309983a80289983a80209983a8018992cc004c21804006264b300130980100189983b184b8080080c459095011849809baa00b8acc004c228040062b300130930137540170178b2128028b2120024240046122026ea802a2c849808611602002611402002611202002611002002610e02002610c02002610a0200261080200261060200261040200260fa6ea800a2c83d0566002b30013375e60aa660fc608660f86ea8208052f5c060fe60f86ea8c1fcc1f0dd51835183e1baa01a899baf30553307e3043307c37541040297ae0307f307c375460fe60f86ea8c1a8c1f0dd5002452820f28acc004cdc79bae307f307c375402e6eb8c1fcc1f0dd5000c4c96600260e060f86ea8006264b300133055375660d860fc6ea8c1b0c1f8dd50009834183f1baa0038992cc004c1c8c1f8dd5000c4c8c8c8cc896600261100200713259800983c1842009baa001899192cc004c22c0400a264b300198008214c1bcc22004dd504700d30103d87a8000416d13259800983e1844009baa0018acc00660026118026112026ea800660f0661160260c4661160260ac6112026ea823c052f5c097ae098149984580983c1984580983c1984580983c19845809ba90454bd7019845809846009844809baa0243308b013077308901375401c66116026ea00f8cc22c04c1e0cc22c04dd401799845809ba8337006eb4c23004c22404dd5005acc004cdc41bad3070308901375401605f13370666e0ccdc119b823370205e6eb4c1c0c22404dd50059bad308c01308901375460ee6112026ea802d208080a0f6f4acdbe01b48202c227efa8052080897a8a9984380a49015a001642180497ae04bd7025eb812f5c19800982f98381844809baa08f01983b9844809baa00e81c2074a60103d87a8000414915980099912cc004c96600261000200314a3159800984180800c528c5282112024224046114026ea8cc158c23804c22c04dd50011847009845809baa0018992cc004c1fc00629462b30013083010018a518a50422404844808c22804dd51982b183c9845809baa0023079308b01375400314a0844008c11cc158c22404dd503f9823983c1984580983c1984580983119845809ba83370205e6eb4c13cc22404dd504780a5eb80cc22c06600294698103d87a8000a60103d879800042180497ae03308b0130783308b0130623308b01375066e000bcdd698279844809baa08f014bd701984580cc00528d300103d87a8000a60103d879800042180497ae04bd7044c96600266ebcc1d0c22804dd5040009ba69800983018389845009baa09001800c0fd03b456600264b3001307e308a013754003133223371266e08dd69848008009bad309001309101002337046eb4c24004008dd69848009848808009845809baa308e01308b0137540026116026ea8cc168010c128c1ecc22c04dd5008459088011982c01c81fc56600260ea07f15980099b89375a609e6114026ea803c0e62b300132323298009bad3090010019bad3090013091010019bae3052308d01375412603375660a8611a026ea820c06612002004911112cc004c1f401626464b30010018cc00411e6106026612c0200497ae0981a1984b009841809984b00a6103d87a80003309601085014bd7025eb83300198009bae3097013094013754007375c6104026128026ea800e00e83ca910100a441008032096a6103d87a80004199159800984c00800c4c8cc8966002611402003159800984b809baa003801459098014566002611c02003159800984b809baa003801459098014566002611602003159800984b809baa00380145909801456600266e1d20060018acc004c25c04dd5001c00a2c84c00a2b300130710018991919194c004c278040066eb4c2780400e6eb4c278040092225980098510080244cc20004c2840401c566002612202613a026ea800e264646644b300130a601003806c590a3011bad30a301001375c614602004614602002613c026ea800e2c84d80a2c84f808613c02002613a02002613802002612e026ea800e2b30013370e9005000c566002612e026ea800e005164260051642500484a0090940121280242500484a0084cdd780099ba548020cc25c04010cc25c04dd40041984b809ba80073309701086014bd70184a009baa0013259800984400984a009baa0018984c00984a809baa0018b21240233060004306d33096013097013094013754612e0200297ae08b212a02425404660fe09a466ebcc25c04c25004dd5184b80984a009baa308201309401375400200460d666128026ea400d2f5c114a284780861200200264b30015980099b8900148002294229410890144cc2380530106d8799f4040ff003308e014c10100003308e014c10100004bd7044cc23804c23c04008cc23804dd40009984700a610100004bd70211202375a611c02611e02002661180200266118026ea16600266e240fd20008a4001132337066eb4c23804004dd69847009847808009845009baa33059305403f30493071308a01375404a8438092f5c114a31533088014901243c65787065637465643e204d757374207061792064656274206d696e74696e67206665650016421c05153308801491253c65787065637465643e204d696e20636f6c6c61746572616c20756e7361746973666965640016421c05153308801491213c65787065637465643e204e6f6e706f736974697665206d696e74656420616d740016421c05153308801491203c65787065637465643e20556e646572636f6c6c61746572697a6564204344500016421c05153308801491223c65787065637465643e204d696e7465642076616c756520697320696e76616c69640016421c0460f0661160260ee6112026ea823c04cc22c04c23004c22404dd501225eb822a6610e029201203c65787065637465643e20496e636f72726563742074782076616c69646974790016421805153308701491203c65787065637465643e20434450206f757470757420697320696e76616c69640016421805164218046607407605908401422404646644b3001307d0018801456600260ea00313305900230543304248050006264b3001307e308a0137540031308e01308b0137540031642200464b3001308201308a01375400314c0103d87a80008983d19846809982d0019847009845809baa0014bd702110023233225980099b8800248002260f86611e0260f86611e026ea0c1a4004cc23c04dd4183480125eb812f5c1159800983c00144c1f0cc23c04c1f0cc23c04dd400099847809ba80024bd7025eb82298103d87a8000422804845008dd69847008009bad308e01308f01001308a01375460a866084900a1833000a10e02421c0464b3001307c0018acc006600294294294508601454cc21c05240101570016898241846009844809baa002421805159800984000800c4c96600264b3001308201308a0137540031337126eb4c1e4c22c04dd50011bad308e01308b01375400316422004611a026114026ea8c1e0c22804dd5182b9845009baa080018a9984400a48101580016898249846809845009baa001421c0464b300133061375660f06114026ea8004c23404c22804dd5001c4c96600260fc6114026ea800626464646644b30013094010038998399849808028803459091011848808009bad309101002309101001309001001308b0137540031642200460e460e26114026ea80062c843808c96600260fa00313259800983f1845009baa0018983c9845809baa308e01308b01375400316422004660786eb0c1e0c22804dd5040009bad308d01308a013754063159800984080800c4c96600260fc6114026ea80062611c026116026ea80062c844008cc0f0dd618389845009baa08001375a611a026114026ea80c62a66110029201014f0016421c04843808c22004dd501844c96600260fa6112026ea8006264b3001307e308a01375400313232325980098490080144cc1c4c2440400c4c134c24404c23804dd500245908f011848008009848008009845809baa0018b211002308d01308a01375400316421c04660aa6eacc140c22404dd503f98149984580983119845809846009844809baa0024bd7025eb8108601210c0230870137540026eb4c1bcc22004dd500698279843809baa00c8b211002375a611202002610a026ea80062c841008c21c040122c842808dd69842808009bad308501003308501001308401001307f37540031641f060cc60ca60fc6ea8c1b0c1f8dd5000c5907b184000983e9baa0018b20f43302e0300248a9983d2491b3c65787065637465643e2077726f6e6720636f6c6c206173736574001641e5153307a491193c65787065637465643e204d697865642076657273696f6e73001641e460fc0031641f060f46ea80062c83b8c184c180c1e4dd51833983c9baa0018b20ec307b307837540031641d4660520560351641e0307200130710013070001306f001306e001306d001306c001306b0013066375400316418c60d000316419860c86ea80062c8308c12cc128c18cdd5182898319baa0018b20c030653062375400316417c6602602a6eb4c1900322a660be92012b3c65787065637465643e2043445043726561746f72206f757470757420646f6573206e6f74206d61746368001641786e9520048b20ba33011012375a60c4019153305d4901203c65787065637465643e2043445043726561746f724e4654206d697373696e670016417116417060c260bc6ea800e2c82d860b600260b400260b200260b000260ae00260ac0041159800981300ac4cc88ca6002660140020472232598009814000c4c8c96600260760050048b2070375c6072002606a6ea800e2b3001302c001899192cc004c0ec00a0091640e06eb8c0e4004c0d4dd5001c590322064303337540053758606a606c606c005300300348889660026052606a6ea8012264b30013300e3756604a606e6ea8c094c0dcdd5000981d181b9baa03d8992cc006600200f301f3038375407d4c103d87a8000402d13259800981e800c4c966002605a60726ea80062646464646465300130430019bad30430049bad30430039bad30430024888966002609000b1329800899912cc004c0e8006264b3001304c0018992cc004c0f0c120dd5000c4c8c8c96600260a00051332259800982098269baa00289919192cc004c15400a26603c60a8006264b300130450018992cc004c15c00626464b300130480018992cc004c16800626604660b200201316415c60aa6ea800a2b3001304c00189919194c004dd6982d800cdd6982d801cdd6982d8012444b3001305f00480745905c0c16c004c168004c154dd500145905220a43053375400260ac00316415060a46ea800a2b300130490018acc004c148dd500140162c829a2c827904f18281baa0018b20a430530013053001304e375400516412c609e00626606a00244b3001002804c4c9660026084609c6ea800626464653001375a60aa003375c60aa007375c60aa0049112cc004c1640122601060b201316415830550013054001304f375400316413060a2004827a2c8268dd61827000982700098249baa0018b208c304b0018b20923047375400f159800981f000c566002608e6ea801e0051641211641108220566002b3001301f3044375400314a314a08212264b30010018800c54cc11124012043445043726561746f72206f757470757420646f6573206e6f74206d61746368001001410d3001011980f1982380725eb8298107d87b9fd87980ff00980d982418229baa04ba6103d87a8000405d16410860886ea801660886ea80066eb4c12002d22259800981d80144c966002609a00313259800981e98249baa00189919191919194c004c14c0066eb8c14c01a60a600930530039829801244444b3001305900689981c182c00509981c00189981c00109981c00089981c0028084590560c14c004c148004c144004c140004c13c004c128dd5000c590471826000c5904a18241baa0048acc004c0fc00a264b3001304d0018992cc004c0f4c124dd5000c4c8c8c8c8c8ca600260a6003375c60a600d30530049829801cc14c0092222259800982c80344cc0e0c1600284cc0e000c4cc0e00084cc0e00044cc0e00140422c82b060a600260a400260a200260a0002609e00260946ea80062c8238c1300062c8250c120dd500245660026078005132598009826800c4c966002607a60926ea800626464646464646464653001375a60ac003375c60ac013375a60ac00f3056006982b002cc15801260ac00730560024888888896600260be01313303d305e01013303000513303d00413303e00313303e00213303e0010168b20b8182b000982a800982a0009829800982900098288009828000982780098251baa0018b208e304c0018b20943048375400915980099b874801800a264b3001304d0018992cc004c0f4c124dd5000c4c8c8c8c8c8c8c8c8ca60026eb4c1580066eb8c1580266eb4c15801e60ac00d3056005982b0024c15800e60ac004911111112cc004c17c02626607a60bc02026606000a26607a00826607c00626607c00426607c00202d1641703056001305500130540013053001305200130510013050001304f001304a375400316411c609800316412860906ea80122b300130220028992cc004c134006264b3001303d30493754003132323232323232323298009bae30560019bae3056009982b003cc15801a60ac00b30560049bad30560039bad30560024888888896600260be01313303d305e01013303e00613303e00513303e00413303f0030168b20b8182b000982a800982a0009829800982900098288009828000982780098251baa0018b208e304c0018b20943048375400915980099b874802800a264b3001304d0018992cc004c0f4c124dd5000c4c8c8c8c8c8c8c8c8c8c8ca60026eb8c1600066eb8c16002e60b00133058008982c003cc96600260ac0031598009818982a800c5a2609a60aa002829a2c82b8dd5182c0034c96600260ac0031598009818982a800c5a2609a60aa002829a2c82b8dd5182c002cc1600126eb4c16000e6eb4c1600092222222222598009831805c4cc104c1880504cc1080204cc10801c4cc1080184cc10c00c06a2c830060b000260ae00260ac00260aa00260a800260a600260a400260a200260a0002609e00260946ea80062c8238c1300062c8250c120dd5002456600266e1d200c0028992cc004c134006264b3001303d3049375400313232323232323232323232329800982c800cdd6982c8064dd6982c805cdd6982c8054dd6982c804cdd6982c8044dd6982c803cdd6982c8034dd6982c802cdd6982c8024dd6982c801244444444444b3001306500c899822983200709981600580e4590620c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c128dd5000c590471826000c5904a18241baa0048acc004cdc3a401c005132598009826800c4c966002607a60926ea80062646644b3001305100189981b1bac30500012259800801402a2646644b300130560018992cc004c118c148dd5000c4c8c96600260b20051300730590088b20ac375c60ae00260a66ea80062c8280c1540062c8298dd71829800982a0009bac305200241411641386eb4c138004c13c004c128dd5000c590471826000c5904a18241baa0048acc004cdc3a40200051323259800982700140162c8258dd7182600098241baa0048b208a41148229045208a41148229045208a1823804c590450c10c004c108004c104004c100004c0fc004c0e8dd5000c5903718109810181c9baa30273039375460780031640e93001007981d981e181e181e181e181e181c1baa03ea60103d8798000402d03440e46074606e6ea8c094c0dcdd5000c54cc0d5241253c65787065637465643e2043445043726561746f72204e46542069732070726573656e742e001640d06072606c6ea80122c81986eb0c0d0004888c966002604c0031323259800981c80140122c81b0dd7181b80098199baa0038acc004c0a80062646644b3001303a00189980f9bac30390012259800801401e33001009981d80144c004c0f000900920728b206e375a606e002607000260666ea800e2c818103018189baa002302f375404b132332259800981298189baa0018992cc004c0a8c0c8dd5000c4cc89660026072003132598009814981a9baa00189919912cc004c0f40062660446eb0c0f00048966002005132598009817981d9baa001899191980080098071bab3028303e375406844b30010018a508acc004cdc79bae30420010038a518998010011821800a07841006eb8c0fcc0f0dd5000c5903919198008009bac302a303c375400e44b30010018a60103d87a80008992cc006600266ebc00530103d87a8000a50a5140ed100189980180198210012076325980099b8f375c60820020171302d33040304130420014bd7045300103d87a800040ec6eb0c10000503e44c8c8cc896600260860071300530430068b2080375c60800026eb8c100008c100004dd6181f00120788b2074375a60740026076002606c6ea80062c8198c074c070c0d4dd51811981a9baa30380018b206c375c606c60666ea800660026eb0c084c0ccdd5014cc08cc0ccdd501cd30103d879800040191640c0606a60646ea8c0d4c0c8dd5181018191baa3035303237540031640bc6002002660106eb0c0ccc0c0dd5013010912cc004006297ae08998199818181a00099801001181a800a06440b08160888c8cc0740108c008c080c0c8dd5000acc004c08cc0bcdd5000c48cc020dd5980f98189baa00100389180e4c004dd5980f98189baa0019bae303430313754007375c603e60626ea800d01e205a222223232330010010072259800800c528456600264b300130040018acc004cdd7980e981b1baa0010078cc004dd59812181b1baa001803401500a452820668a5040cc607000314a3133002002303900140c881b0c03c0103013301400530120044590080c028004c014dd5005452689b2b200415330024911d3c65787065637465643e204e6f204344507320617265207370656e742e001601',
6
+ '592544592541010100229800aba2aba1aba0aab9faab9eaab9dab9cab9a488888888c96600264653001300a00198051805800cdc3a4005300a0024888966002600460146ea800e33001300b3754007370e90024dc3a4001300a375400891111919912cc004c014012264b300130170018992cc004c01cc04cdd5000c4c8c8c8c8c8c8c8c8c8ca60026eb4c0840066044003375c6042015375a6042013375a6042011375a604200f375a604200d375a604200b375a6042009375a6042007375a6042004911111111112cc004c0b402a26464b3001301e001899192cc004c0c400a03b1640b86eb4c0bc004c0acdd5001456600260440031323259800981880140762c8170dd6981780098159baa0028acc004c07c0062b3001302b375400501b8b20588b205040a08140c0a4dd5000981600545902a0c084004c080004c07c004c078004c074004c070004c06c004c068004c064004c050dd5000c59011180b000c5901418091baa00b8acc004c0240122b3001301237540170028b20268acc004c0180122b3001301237540170028b20268b201e403c80786600246028602a602a602a602a602a602a00323014301500191119199119801001000912cc004006007132325980099b910060018acc004cdc7803000c4dd6980c001401501544cc010010c07000d0151bae30160013019001405c64646600200200c44b3001001801c4c8c96600266e440200062b30013371e0100031375660320050054059133004004301d00340586eb8c05c004c0680050180a5eb7bdb18052000911919800800801912cc004006297ae0899912cc004c01400a26603000466008008003133004004001404c602e002603000280aa6e2120009180a180a980a980a980a800c88c8cc00400400c88cc00c004c00800a4b30013005301037540031301430113754003164039230143015301500198079baa009911980a19bb037520046ea00052f5bded8c12232598009803000c4c8c96600260320050048b202c375c602e00260266ea800e2b3001300a0018acc004c04cdd5001c00a2c80a22c808101018089baa002912cc004c014c044dd500144c8c8cc896600260340070058b202e375a602e0026eb4c05c008c05c004c048dd500145900f48966002600a60226ea800a264646644b3001301a003802c590171bae3017001375c602e004602e00260246ea800a2c807a4b300130043010375400312323375e602c60266ea8c058c04cdd5001000980a98091baa002891919baf301630133754004002602a60246ea800900e4dd2a4001371290024dc3a4011374a90012444444444444444444530012232330010010032259800800c5a264b30013375e605660506ea80040122602e60506ea800626600600660580048128c0a8005028488c0726002005375c6050604a6ea80066eb8c050c094dd5000a0269112cc004c064006297adef6c6089981419bb037520066e98cc0300080052f5bded8c0811a4464b300130190018992cc004c0ac00626601660540020071640a0604c6ea800e2b3001301d0018992cc004c0ac00626601460540020071640a0604c6ea800e2b3001301a001899192cc004c0b000a0091640a46eb8c0a8004c098dd5001c590232046408c60486ea800a444664530013259800980e18141baa00189bad3029302c3756605860526ea800629000204c302b0019bab0029baf302b302c001912cc004c084c0a4dd5002c4cdc4800801456600266e2400400a266e24008cdc0000a410137dc0514a0813902724444b30010038acc004c00801a2660020089000452820528992cc004cdd7a61014000302c0018acc004cc008014dd6981698181bab302d001898019ba630310048a5040a915980099801002a4001130030078a5040a88150c0bc00d02d0dd3001194c004006009223302b0023302b374c00297ae04004444b3001002899800a6103d87a80004bd6f7b63044c8cc896600266e452201000028acc004cdc7a441000028998021806998171816001a5eb80006266008980103d87a800000540a5198008034006446600c0046606000a00280310291bae3029001302e003302c00240a8911114c004888c8cc0640108c008c070c0b4dd5000acc004c078c0a8dd5000c48cc020dd5980d98161baa00100389180c4c004dd5980d98161baa0019bae302f302c3754007375c603660586ea800d01a205094c004dd7181618149baa0019bae30183029375400348009004488888c8c8cc00400401c896600200314a1159800992cc004c0100062b30013375e603260626ea800401e330013756604060626ea800600d005402914a08172294102e1819800c528c4cc008008c0d000502d2062300f004488966002603c025198009119911808198189ba8337046eb4c0c8008dd69819000998189ba8337046eb4c0c8c0cc008dd698191819800a5eb80c0b4dd500118169baa0019b80480066e052000918179818181818181818181818181818000c88c8cc00400400c88c96600266ebc010c0bc00626060003133003003303400240b460640032232598009810800c5660026042605a6ea800a298103d87a80008a6103d879800040ad1598009811000c5660026044605a6ea800a2980103d87a80008a6103d87b800040ad13322598009813800c4c96600266e2000c0062980103d87980008acc004cdc4000801c530103d87b80008a6103d87a800040b88170dd6981998181baa0048acc004c08c006298103d87b80008a6103d879800040b48168dd6981898171baa003302d3754004815902b18161baa00291806998171ba80013302e4c10101004bd70488889660026602400800b15980099baf30183030375400a007198009bab301f3030375400b002800a0128a5040b514a0816a4605e6060606060600032302f303030303030303030303030303030303030001918179818181818181818181818181818181818181818000c8c0bcc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000660566ea8c0b8c0acdd50124c0acdd5010a44444444444445300122259800980e000c660020073040304000299b800014800d003456600266e2520020018cc00400e60800053010001400d1598009817800c4c0fc00a2a66074921146578706563745f61743a206e6f7420666f756e64001640e481c903948966002605c00314c103d87a80008acc004cdc4000a40011301c3303d301c3303d3750601c0046607a6ea0c0380052f5c097ae08980e1981e980e1981e9ba80023303d375000297ae04bd70207040e12225980099b8800148002290004566002605e00314800a264b300130303370c0049002466002009300100399b830024801100444c0066002009300100399b833011002480110042074370400481c90394888966002606000310048991919800800803112cc00400626608466ec0dd48031ba60034bd6f7b63044c8cc896600266e4402400a2b30013371e0120051325980099baf4c101a000374c003100289982319bb037520146e9800400904119198008009bab30440042259800800c4cc11ccdd81ba900a375001297adef6c6089919912cc004cdc8806801456600266e3c03400a264b30013370e002603801b100289982599bb0375201c6ea0cdc0000806801208c375a609000713304a337606ea4034dd4006002208a89982500199802802800a08a375c608a00260940046090002823226608a66ec0dd48049ba600600441011330450033300500500141006eb8c100004c114008c10c00504119811801000a0749180d9981e192cc004c0c8c0e8dd5000c4c966002606660766ea8c0acc0f0dd5181f981e1baa0038980d1981f1ba80014bd7044c068cc0f8dd419b80001480092f5c081c8dd6981f181d9baa0018800a070303d303a3754607a60746ea8004cc0f0c966002606460746ea8006264b30013033303b3754605660786ea8c0acc0f0dd5001c4c068cc0f8dd4000a5eb82260346607c6ea0c0400052f5c081c8dd6981f181d9baa0018800a070303d303a3754605260746ea80052f5c1303d0029bae303c002981e800cdd6181e000a444444445300130090099803803c8c966002606e60866ea80062608e60886ea80062a66084921263c65787065637465643e2044656e6f6d696e61746f722063616e6e6f74206265207a65726f2e00164104660126eb4c118c10cdd50009bad3032304337540032229800801cdd7182418229baa0029bae303430453754005001402530460049bad30450049bac30450029bac30453046002488888888c8c8c8c8c8c8ca60026eb4c15000660a860aa003375a60a8017375a60a800f3300f010375a60a800d375a60a8009375a60a800491111112cc004cdd7982d982c1baa0030498acc004cc0d0dd59823982c1baa30473058375400660b660b06ea817a264b300198009980b8081bad305c00d981b9982d982e182c9baa30483059375400897ae098009982d981d1982d982e182c9baa0044bd7025eb82606060b860b26ea817e980103d87a8000409d132598009981b1bab3049305a3754609260b46ea8004c09cc168dd503044c966002609c60b46ea8006264b300130600018992cc004c140c170dd5000c4c8c8c8c8c8c8c8c8ca600260d2003375c60d2013375a60d201130690069834802cc1a401260d200732598009833800c566002608e60cc003168982f1833000a0c88b20d0375460d2004911111112cc004c1c80262660a460e201e2660a400a2660a40082660a40062660a40042660a6010264b30013304b375660bc60de6ea8c178c1bcdd5000982d18379baa0758992cc004c19cc1bcdd5000c4c96600260ea0031323259800983318391baa002899191919191919191919194c004c204040066eb8c2040402e6eb4c204040266102020113081010079840808034c20404016610202009375a6102020073259800983f800c56600260be60fc003168983b183f000a0f88b210002375461020200491111111112cc004c2300402e2660d66116020282660c400e2660d600c2660d800a2660d80082660d8006264b3001307c0018992cc004c238040062660da611a0200203116422c046112026ea802e2b30013080010018acc004c22404dd5005c05e2c84500a2c843009086011843809baa00a8b211202184080800984000800983f800983f000983e800983e000983d800983d000983c800983c00098399baa0028b20e0159800acc004cdd798281983a181f18391baa0784bd70183a98391baa30753072375460c260e46ea8066266ebcc140cc1d0c0f8c1c8dd503c25eb80c1d4c1c8dd5183a98391baa30613072375400914a0837a2b30013371e6eb8c1d4c1c8dd500b1bae30753072375400313259800998279bab30623073375460c460e66ea8004c178c1ccdd500144c96600260ce60e66ea800626464646644b3001307d0038992cc004c1b4c1e4dd5000c4c8c96600261000200513259800cc0040f260ca60fa6ea820c0698103d87a80004155159800cc004cc0ec0d009e60bc660fe60b6660fe609e60fa6ea820c052f5c097ae098129983f982f1983f982f1983f982f1983f9ba903e4bd701983f984000983e9baa0213307f306c307d3754018660fe6ea00d8cc1fcc178cc1fcdd40149983f9ba8337006eb4c20004c1f4dd50052cc004cdc41bad3065307d375401405313370666e0ccdc119b82337020526eb4c194c1f4dd50051bad308001307d375460d860fa6ea8029208080a0f6f4acdbe01b48202c227efa8052080897a8a9983da481015a001641e897ae04bd7025eb812f5c19800982a1832983e9baa083019836183e9baa00c8152070a60103d87a8000412d15980099912cc004c96600260e800314a3159800983b800c528c52820fa41f460fc6ea8cc13cc20804c1fcdd5001184100983f9baa0018992cc004c1cc00629462b300130770018a518a5041f483e8c1f8dd5198279837183f9baa002306e307f375400314a083e0c100c13cc1f4dd50399820182f1983f982f1983f982d9983f9ba8337020526eb4c120c1f4dd504180a5eb80cc1fe600294698103d87a8000a60103d879800041e897ae03307f305e3307f305b3307f375066e000a4dd69824183e9baa083014bd701983fcc00528d300103d87a8000a60103d879800041e897ae04bd7044c96600266ebcc1a4c1f8dd503a1ba69800982a9833183f1baa08401800c0dd039456600264b30013072307e3754003133223371266e08dd69842008009bad308401308501002337046eb4c21004008dd6984200984280800983f9baa308201307f375400260fe6ea8cc15000cc0ecc1bcc1fcdd500745907c1982201581bc56600260d406f15980099b89375a609060fc6ea80340ae2b300132323298009bad3084010019bad3084013085010019bae304b308101375410e033756609a6102026ea81de610802004911112cc004c1c801626464b30010018cc0040fe60d2661140200497ae09818198450098349984500a6103d87a80003308a010794bd7025eb83300198009bae308b013088013754007375c60ee6110026ea800e00e831a910100a441008032098a6103d87a80004179159800984600800c4c8cc896600260fc0031598009845809baa00380145908c0145660026104020031598009845809baa00380145908c01456600260fe0031598009845809baa00380145908c01456600266e1d20060018acc004c22c04dd5001c00a2c84600a2b3001306a0018991919194c004c248040066eb4c2480400e6eb4c2480400922259800984b0080244cc1d4c2540401c566002610a026122026ea800e264646644b3001309a01003806c59097011bad309701001375c612e02004612e020026124026ea800e2c84780a2c8498086124020026122020026120020026116026ea800e2b30013370e9005000c5660026116026ea800e0051642300516422004844009088012110024220048440084cdd780099ba548020cc22c04010cc22c04dd400419845809ba80073308b0107a4bd701844009baa0013305900430663308a01308b01308801375461160200297ae08b211202422404660e808c466ebcc22c04c22004dd51845809844009baa3077308801375400200460c866110026ea400d2f5c114a284180861080200264b30015980099b89001480022942294107d44cc2080530106d8799f4040ff0033082014c101000033082014c10100004bd7044cc20804c20c04008cc20804dd40009984100a610100004bd7020fa375a610402610602002661000200266100026ea16600266e240dd20008a4001132337066eb4c20804004dd6984100984180800983f1baa33053304d037303a3066307e375404483d92f5c114a3153307c4901243c65787065637465643e204d757374207061792064656274206d696e74696e6720666565001641ed153307c491253c65787065637465643e204d696e20636f6c6c61746572616c20756e736174697366696564001641ed153307c491213c65787065637465643e204e6f6e706f736974697665206d696e74656420616d74001641ed153307c491203c65787065637465643e20556e646572636f6c6c61746572697a656420434450001641ed153307c491223c65787065637465643e204d696e7465642076616c756520697320696e76616c6964001641ec60bc660fe60d860fa6ea820c04cc1fcc20004c1f4dd5010a5eb822a660f69201203c65787065637465643e20496e636f72726563742074782076616c6964697479001641e9153307b491203c65787065637465643e20434450206f757470757420697320696e76616c6964001641e907941f8646644b300130720018801456600260d6003133054002304e3303c48050006264b30013073307f3754003130830130800137540031641f464b30013077307f375400314c103d87a80008983099841009982a8019841809840009baa0014bd7020fa3233225980099b8800248002260c6661080260c666108026ea0c154004cc21004dd4182a80125eb812f5c1159800983700144c18ccc21004c18ccc21004dd400099842009ba80024bd7025eb82298103d87a800041fc83f8dd69841808009bad308301308401001307f3754609c66078900a1829000a0f841f064b300130710018acc006600294294294507b454cc1f12401015700168981d184080983f1baa00241ed159800983a800c4c96600264b30013077307f37540031337126eb4c1bcc20004dd50011bad30830130800137540031641f461040260fe6ea8c1b8c1fcdd51828983f9baa0758a9983ea481015800168981d984100983f9baa00141f064b30013305b375660dc60fe6ea8004c20804c1fcdd5001c4c96600260e660fe6ea800626464646644b30013089010038998349844008028803459086011843008009bad30860100230860100130850100130800137540031641f460d060ce60fe6ea80062c83e0c96600260e40031306e307f37546607a6eb0c1b8c1fcdd503a9bad308201307f375405b159800983b000c4cc0f4dd61833983f9baa075375a61040260fe6ea80b62a660fa9201014f001641f083e0c1f4dd501644c96600260e460fc6ea80062646464b30013086010028998331842808018981f1842809841009baa0048b210602308401001308401001307f37540031641f06609e6eacc128c1f8dd503a18131984000982e1984000984080983f1baa0024bd7025eb8107b20f6307c37540026eb4c194c1f4dd50061824983e1baa00b8b20fa375a60fc00260f46ea80062c83b8c1f00122c83d0dd6983d0009bad307a003307a0013079001307437540031641c460b860b660e66ea8c188c1ccdd5000c5907019818015010c54cc1c12411b3c65787065637465643e2077726f6e6720636f6c6c206173736574001641bd1533070491193c65787065637465643e204d697865642076657273696f6e73001641bc60e80031641c860e06ea80062c8368c160c15cc1bcdd5182f18379baa0018b20d83302c0260178b20de18348009834000983380098330009832800983200098318009831000982e9baa0018b20b4305f0018b20ba305b37540031641606086608460b46ea8c124c168dd5000c590571980b8089bad305c00b8a9982ba4812b3c65787065637465643e2043445043726561746f72206f757470757420646f6573206e6f74206d61746368001641586e9520048a9982b249203c65787065637465643e2043445043726561746f724e4654206d697373696e670016415516415430540013053001305200130510013050001304f001304e0041159800981100944cc88ca60026601600203f2232598009812000c4c8c966002606e0050048b2068375c606a00260626ea800e2b30013028001899192cc004c0dc00a0091640d06eb8c0d4004c0c4dd5001c5902e205c302f37540053758606260646064005300300348889660026601c6eacc084c0c8dd5002181a98191baa0388992cc006600200d301b303337540734c0103d87a8000402d13259800981c000c4c966002605060686ea800626464646464653001303e0019bad303e0049bad303e0039bad303e0024888966002608600b1329800899912cc004c0d4006264b300130470018992cc004c0dcc10cdd5000c4c8c8c96600260960051332259800981e18241baa00289919192cc004c14000a26603a609e006264b300130400018992cc004c14800626464b300130430018992cc004c15400626604460a800201316414860a06ea800a2b3001304700189919194c004dd6982b000cdd6982b001cdd6982b0012444b3001305a0048074590570c158004c154004c140dd500145904d209a304e375400260a200316413c609a6ea800a2b300130440018acc004c134dd500140162c82722c825104a18259baa0018b209a304e001304e00130493754005164118609400626606200244b3001002804c4c966002607a60926ea800626464653001375a60a0003375c60a0007375c60a00049112cc004c1500122601060a80131641443050001304f001304a375400316411c609800482522c8240dd61824800982480098221baa0018b208230460018b20883042375400f159800981c800c56600260846ea801e00516410d1640fc81f8566002603e607e6ea8006264b30010018800c54cc0fd2412043445043726561746f72206f757470757420646f6573206e6f74206d6174636800100140f93001010980f1982100725eb8298107d87b9fd87980ff00980b982198201baa046a6103d87a800040591640f4607e6ea8016607e6ea80066eb4c10c02d22259800981b00144c966002609000313259800981c18221baa00189919191919194c004c1380066eb8c13801a609c009304e0039827001244444b3001305400689981a182980509981a00189981a00109981a00089981a0028084590510c138004c134004c130004c12c004c128004c114dd5000c590421823800c5904518219baa0048acc004c0e800a264b300130480018992cc004c0e0c110dd5000c4c8c8c8c8c8ca6002609c003375c609c00d304e0049827001cc1380092222259800982a00344cc0d0c14c0284cc0d000c4cc0d00084cc0d00044cc0d00140422c8288609c002609a002609800260960026094002608a6ea80062c8210c11c0062c8228c10cdd50024566002606e005132598009824000c4c966002607060886ea800626464646464646464653001375a60a2003375c60a2013375a60a200f30510069828802cc14401260a200730510024888888896600260b4013133039305901013303000513303900413303a00313303a00213303a0010168b20ae1828800982800098278009827000982680098260009825800982500098229baa0018b208430470018b208a3043375400915980099b874801800a264b300130480018992cc004c0e0c110dd5000c4c8c8c8c8c8c8c8c8ca60026eb4c1440066eb8c1440266eb4c14401e60a200d305100598288024c14400e60a2004911111112cc004c16802626607260b202026606000a26607200826607400626607400426607400202d16415c30510013050001304f001304e001304d001304c001304b001304a00130453754003164108608e00316411460866ea80122b300130220028992cc004c120006264b3001303830443754003132323232323232323298009bae30510019bae30510099828803cc14401a60a200b30510049bad30510039bad30510024888888896600260b4013133039305901013303a00613303a00513303a00413303b0030168b20ae1828800982800098278009827000982680098260009825800982500098229baa0018b208430470018b208a3043375400915980099b874802800a264b300130480018992cc004c0e0c110dd5000c4c8c8c8c8c8c8c8c8c8c8ca60026eb8c14c0066eb8c14c02e60a601330530089829803cc96600260a200315980098189828000c5a2609060a000282722c8290dd518298034c96600260a200315980098189828000c5a2609060a000282722c8290dd51829802cc14c0126eb4c14c00e6eb4c14c009222222222259800982f005c4cc0f4c1740504cc0f80204cc0f801c4cc0f80184cc0fc00c06a2c82d860a600260a400260a200260a0002609e002609c002609a002609800260960026094002608a6ea80062c8210c11c0062c8228c10cdd5002456600266e1d200c0028992cc004c120006264b300130383044375400313232323232323232323232329800982a000cdd6982a0064dd6982a005cdd6982a0054dd6982a004cdd6982a0044dd6982a003cdd6982a0034dd6982a002cdd6982a0024dd6982a001244444444444b3001306000c899820982f80709981580580e45905d0c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c128004c114dd5000c590421823800c5904518219baa0048acc004cdc3a401c005132598009824000c4c966002607060886ea80062646644b3001304c0018998191bac304b0012259800801402a2646644b300130510018992cc004c104c134dd5000c4c8c96600260a80051300730540088b20a2375c60a4002609c6ea80062c8258c1400062c8270dd7182700098278009bac304d002412d1641246eb4c124004c128004c114dd5000c590421823800c5904518219baa0048acc004cdc3a40200051323259800982480140162c8230dd7182380098219baa0048b20804100820104020804100820104020801821004c590400c0f8004c0f4004c0f0004c0ec004c0e8004c0d4dd5000c59032180e980e181a1baa302330343754606e0031640d53001006981b181b981b981b981b981b98199baa039a60103d8798000402d02f40d0606a60646ea80122a66060921253c65787065637465643e2043445043726561746f72204e46542069732070726573656e742e001640bc3758606000244464b30013022001899192cc004c0d400a0091640c86eb8c0cc004c0bcdd5001c566002604c003132332259800981b000c4cc070dd6181a800912cc00400a00f19800804cc0dc00a26002607000480490354590331bad30330013034001302f37540071640b08160c0b4dd500118159baa02189919912cc004c094c0b4dd5000c4cc8966002606800313259800981218181baa00189919912cc004c0e000626603c6eb0c0dc0048966002005132598009815181b1baa0018991925159800991980080098069bab30243039375405e44b30013371e6eb8c0f400400e2946266004004607c00281ba2934590351bae303a303737540031640d064660020026eb0c098c0dcdd5003912cc004006298103d87a80008992cc006600266ebc00530103d87a8000a50a5140d91001899801801981e801206c325980099b8f375c60780020171301a3303b303c303d0014bd7045300103d87a800040d86eb0c0ec00503944c8c8cc8966002607c00713005303e0068b2076375c60760026eb8c0ec008c0ec004dd6181c801206e8b206a375a606a002606c00260626ea80062c8170c064c060c0c0dd5180f98181baa30330018b2062375c6062605c6ea800660026eb0c074c0b8dd50124c078c0b8dd501a530103d879800040191640ac6002002605e60586ea8c0bcc0b0dd5198049bac302f302c375404403a44b30010018a5eb8226605e605860600026600400460620028171028205006026602800a60240088b2010180500098029baa00a8a4d1365640082a6600492011d3c65787065637465643e204e6f204344507320617265207370656e742e001601',
7
7
  };