@vultisig/rujira 1.0.0
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 +23 -0
- package/README.md +254 -0
- package/dist/assets/amount.d.ts +80 -0
- package/dist/assets/amount.d.ts.map +1 -0
- package/dist/assets/amount.js +186 -0
- package/dist/assets/asset.d.ts +43 -0
- package/dist/assets/asset.d.ts.map +1 -0
- package/dist/assets/asset.js +1 -0
- package/dist/assets/formats.d.ts +54 -0
- package/dist/assets/formats.d.ts.map +1 -0
- package/dist/assets/formats.js +164 -0
- package/dist/assets/index.d.ts +27 -0
- package/dist/assets/index.d.ts.map +1 -0
- package/dist/assets/index.js +45 -0
- package/dist/assets/registry.d.ts +37 -0
- package/dist/assets/registry.d.ts.map +1 -0
- package/dist/assets/registry.js +487 -0
- package/dist/assets/router.d.ts +44 -0
- package/dist/assets/router.d.ts.map +1 -0
- package/dist/assets/router.js +142 -0
- package/dist/client.d.ts +70 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +250 -0
- package/dist/config/constants.d.ts +25 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +36 -0
- package/dist/config.d.ts +41 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +72 -0
- package/dist/discovery/discovery.d.ts +39 -0
- package/dist/discovery/discovery.d.ts.map +1 -0
- package/dist/discovery/discovery.js +250 -0
- package/dist/discovery/graphql-client.d.ts +46 -0
- package/dist/discovery/graphql-client.d.ts.map +1 -0
- package/dist/discovery/graphql-client.js +137 -0
- package/dist/discovery/index.d.ts +9 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +7 -0
- package/dist/discovery/types.d.ts +62 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +5 -0
- package/dist/easy-routes.d.ts +216 -0
- package/dist/easy-routes.d.ts.map +1 -0
- package/dist/easy-routes.js +241 -0
- package/dist/errors.d.ts +65 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +184 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/modules/assets.d.ts +68 -0
- package/dist/modules/assets.d.ts.map +1 -0
- package/dist/modules/assets.js +127 -0
- package/dist/modules/deposit.d.ts +152 -0
- package/dist/modules/deposit.d.ts.map +1 -0
- package/dist/modules/deposit.js +233 -0
- package/dist/modules/index.d.ts +12 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/index.js +9 -0
- package/dist/modules/orderbook.d.ts +80 -0
- package/dist/modules/orderbook.d.ts.map +1 -0
- package/dist/modules/orderbook.js +320 -0
- package/dist/modules/swap.d.ts +48 -0
- package/dist/modules/swap.d.ts.map +1 -0
- package/dist/modules/swap.js +318 -0
- package/dist/modules/withdraw.d.ts +46 -0
- package/dist/modules/withdraw.d.ts.map +1 -0
- package/dist/modules/withdraw.js +218 -0
- package/dist/services/fee-estimator.d.ts +14 -0
- package/dist/services/fee-estimator.d.ts.map +1 -0
- package/dist/services/fee-estimator.js +89 -0
- package/dist/services/price-impact.d.ts +11 -0
- package/dist/services/price-impact.d.ts.map +1 -0
- package/dist/services/price-impact.js +58 -0
- package/dist/signer/index.d.ts +3 -0
- package/dist/signer/index.d.ts.map +1 -0
- package/dist/signer/index.js +1 -0
- package/dist/signer/keysign-builder.d.ts +21 -0
- package/dist/signer/keysign-builder.d.ts.map +1 -0
- package/dist/signer/keysign-builder.js +106 -0
- package/dist/signer/types.d.ts +81 -0
- package/dist/signer/types.d.ts.map +1 -0
- package/dist/signer/types.js +8 -0
- package/dist/signer/vultisig-provider.d.ts +33 -0
- package/dist/signer/vultisig-provider.d.ts.map +1 -0
- package/dist/signer/vultisig-provider.js +242 -0
- package/dist/types.d.ts +375 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +18 -0
- package/dist/utils/cache.d.ts +87 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +124 -0
- package/dist/utils/denom-conversion.d.ts +47 -0
- package/dist/utils/denom-conversion.d.ts.map +1 -0
- package/dist/utils/denom-conversion.js +105 -0
- package/dist/utils/encoding.d.ts +17 -0
- package/dist/utils/encoding.d.ts.map +1 -0
- package/dist/utils/encoding.js +55 -0
- package/dist/utils/format.d.ts +108 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +213 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/memo.d.ts +107 -0
- package/dist/utils/memo.d.ts.map +1 -0
- package/dist/utils/memo.js +190 -0
- package/dist/utils/rate-limiter.d.ts +38 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +67 -0
- package/dist/utils/type-guards.d.ts +22 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +27 -0
- package/dist/validation/address-validator.d.ts +15 -0
- package/dist/validation/address-validator.d.ts.map +1 -0
- package/dist/validation/address-validator.js +75 -0
- package/package.json +98 -0
- package/src/__tests__/live/README.md +47 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { findAssetByFormat } from './registry.js';
|
|
2
|
+
/**
|
|
3
|
+
* Convert asset to THORChain format
|
|
4
|
+
*/
|
|
5
|
+
export function toThorchainFormat(asset) {
|
|
6
|
+
return asset.formats.thorchain;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Convert asset to FIN format
|
|
10
|
+
*/
|
|
11
|
+
export function toFinFormat(asset) {
|
|
12
|
+
return asset.formats.fin;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Convert asset to L1/native format
|
|
16
|
+
*/
|
|
17
|
+
export function toL1Format(asset) {
|
|
18
|
+
return asset.formats.l1;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Parse asset identifier from any format
|
|
22
|
+
*/
|
|
23
|
+
export function parseAsset(input) {
|
|
24
|
+
return findAssetByFormat(input);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Normalize THORChain pool name to standard format
|
|
28
|
+
*/
|
|
29
|
+
export function normalizeThorchainPool(pool) {
|
|
30
|
+
// Convert to uppercase and ensure proper format
|
|
31
|
+
const upper = pool.toUpperCase();
|
|
32
|
+
// Handle special cases
|
|
33
|
+
if (upper === 'BTC.BTC')
|
|
34
|
+
return 'BTC.BTC';
|
|
35
|
+
if (upper === 'ETH.ETH')
|
|
36
|
+
return 'ETH.ETH';
|
|
37
|
+
if (upper === 'THOR.RUNE')
|
|
38
|
+
return 'THOR.RUNE';
|
|
39
|
+
// Handle ERC20 tokens - ensure contract address is uppercase
|
|
40
|
+
if (upper.includes('-0X')) {
|
|
41
|
+
const [chainSymbol, contract] = upper.split('-');
|
|
42
|
+
return `${chainSymbol}-${contract}`;
|
|
43
|
+
}
|
|
44
|
+
return upper;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Normalize FIN format to lowercase with hyphens
|
|
48
|
+
*/
|
|
49
|
+
export function normalizeFinFormat(format) {
|
|
50
|
+
return format.toLowerCase().replace(/[^a-z0-9-]/g, '-');
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Extract chain from THORChain format
|
|
54
|
+
*/
|
|
55
|
+
export function extractChainFromThorchain(thorchainFormat) {
|
|
56
|
+
const parts = thorchainFormat.split('.');
|
|
57
|
+
if (parts.length < 2) {
|
|
58
|
+
throw new Error(`Invalid THORChain format: ${thorchainFormat}`);
|
|
59
|
+
}
|
|
60
|
+
const chainMap = {
|
|
61
|
+
BTC: 'bitcoin',
|
|
62
|
+
ETH: 'ethereum',
|
|
63
|
+
THOR: 'thorchain',
|
|
64
|
+
AVAX: 'avalanche',
|
|
65
|
+
GAIA: 'cosmos',
|
|
66
|
+
DOGE: 'dogecoin',
|
|
67
|
+
LTC: 'litecoin',
|
|
68
|
+
BCH: 'bitcoincash',
|
|
69
|
+
BNB: 'binance',
|
|
70
|
+
BASE: 'base',
|
|
71
|
+
XRP: 'xrp',
|
|
72
|
+
};
|
|
73
|
+
return chainMap[parts[0]] || parts[0].toLowerCase();
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Extract symbol from THORChain format
|
|
77
|
+
*/
|
|
78
|
+
export function extractSymbolFromThorchain(thorchainFormat) {
|
|
79
|
+
const parts = thorchainFormat.split('.');
|
|
80
|
+
if (parts.length < 2) {
|
|
81
|
+
throw new Error(`Invalid THORChain format: ${thorchainFormat}`);
|
|
82
|
+
}
|
|
83
|
+
// Handle contract addresses
|
|
84
|
+
const symbolPart = parts[1];
|
|
85
|
+
if (symbolPart.includes('-')) {
|
|
86
|
+
return symbolPart.split('-')[0];
|
|
87
|
+
}
|
|
88
|
+
return symbolPart;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Extract contract from THORChain format (if present)
|
|
92
|
+
*/
|
|
93
|
+
export function extractContractFromThorchain(thorchainFormat) {
|
|
94
|
+
const parts = thorchainFormat.split('.');
|
|
95
|
+
if (parts.length < 2)
|
|
96
|
+
return undefined;
|
|
97
|
+
const symbolPart = parts[1];
|
|
98
|
+
if (symbolPart.includes('-0X')) {
|
|
99
|
+
return symbolPart.split('-')[1];
|
|
100
|
+
}
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Build THORChain format from components
|
|
105
|
+
*/
|
|
106
|
+
export function buildThorchainFormat(chain, symbol, contract) {
|
|
107
|
+
const chainPrefix = chain.toUpperCase();
|
|
108
|
+
if (contract) {
|
|
109
|
+
return `${chainPrefix}.${symbol.toUpperCase()}-${contract.toUpperCase()}`;
|
|
110
|
+
}
|
|
111
|
+
return `${chainPrefix}.${symbol.toUpperCase()}`;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Build FIN format from components
|
|
115
|
+
*/
|
|
116
|
+
export function buildFinFormat(chain, symbol, contract) {
|
|
117
|
+
let format = `${chain.toLowerCase()}-${symbol.toLowerCase()}`;
|
|
118
|
+
if (contract) {
|
|
119
|
+
format += `-${contract.toLowerCase()}`;
|
|
120
|
+
}
|
|
121
|
+
return format;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Convert between any two formats
|
|
125
|
+
*/
|
|
126
|
+
export function convertFormat(input, targetFormat) {
|
|
127
|
+
const asset = parseAsset(input);
|
|
128
|
+
if (!asset)
|
|
129
|
+
return null;
|
|
130
|
+
switch (targetFormat) {
|
|
131
|
+
case 'l1':
|
|
132
|
+
return toL1Format(asset);
|
|
133
|
+
case 'thorchain':
|
|
134
|
+
return toThorchainFormat(asset);
|
|
135
|
+
case 'fin':
|
|
136
|
+
return toFinFormat(asset);
|
|
137
|
+
default:
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Detect format type of input string
|
|
143
|
+
*/
|
|
144
|
+
export function detectFormat(input) {
|
|
145
|
+
const normalized = input.toLowerCase();
|
|
146
|
+
// FIN special formats first (before THORChain, since thor.xxx overlaps)
|
|
147
|
+
// Test thor.xxx against original input so uppercase THOR.RUNE isn't matched
|
|
148
|
+
if (/^x\/[a-z]+$/.test(normalized) || /^thor\.[a-z]+$/.test(input) || /^(rune|tcy)$/.test(normalized)) {
|
|
149
|
+
return 'fin';
|
|
150
|
+
}
|
|
151
|
+
// THORChain format: CHAIN.SYMBOL or CHAIN.SYMBOL-CONTRACT
|
|
152
|
+
if (/^[a-z]+\.[a-z]+(-.+)?$/i.test(input)) {
|
|
153
|
+
return 'thorchain';
|
|
154
|
+
}
|
|
155
|
+
// FIN format: chain-symbol or chain-symbol-contract (chain is 2-5 chars)
|
|
156
|
+
if (/^[a-z]{2,5}-[a-z0-9]+(-.+)?$/.test(normalized)) {
|
|
157
|
+
return 'fin';
|
|
158
|
+
}
|
|
159
|
+
// L1 format: symbol or contract address
|
|
160
|
+
if (/^0x[a-f0-9]{40}$/i.test(input) || /^[a-z]{2,5}$/i.test(input)) {
|
|
161
|
+
return 'l1';
|
|
162
|
+
}
|
|
163
|
+
return 'unknown';
|
|
164
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset registry - Unified asset and decimal handling for THORChain layers
|
|
3
|
+
*
|
|
4
|
+
* This module provides a unified interface for handling assets and amounts
|
|
5
|
+
* across three layers: native L1, THORChain, and Rujira FIN.
|
|
6
|
+
*/
|
|
7
|
+
export type { Asset, Layer, Quote } from './asset.js';
|
|
8
|
+
import type { Layer } from './asset.js';
|
|
9
|
+
export { Amount } from './amount.js';
|
|
10
|
+
import { Amount } from './amount.js';
|
|
11
|
+
export { finToNative, finToThorchain, nativeToFin, nativeToThorchain, thorchainToFin, thorchainToNative, } from './amount.js';
|
|
12
|
+
export { findAssetByFormat, getAllAssets, getAsset, KNOWN_ASSETS } from './registry.js';
|
|
13
|
+
export { buildFinFormat, buildThorchainFormat, convertFormat, detectFormat, extractChainFromThorchain, extractContractFromThorchain, extractSymbolFromThorchain, normalizeFinFormat, normalizeThorchainPool, parseAsset, toFinFormat, toL1Format, toThorchainFormat, } from './formats.js';
|
|
14
|
+
export { SwapRouter } from './router.js';
|
|
15
|
+
/**
|
|
16
|
+
* Create an Amount from a human-readable string and asset ID
|
|
17
|
+
*/
|
|
18
|
+
export declare function createAmount(human: string, assetId: string, layer?: Layer): Amount;
|
|
19
|
+
/**
|
|
20
|
+
* Parse an asset from any format and create an amount
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseAmount(human: string, assetFormat: string, layer?: Layer): Amount;
|
|
23
|
+
/**
|
|
24
|
+
* Quick conversion between layers
|
|
25
|
+
*/
|
|
26
|
+
export declare function convert(amount: Amount, targetLayer: Layer): Amount;
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/assets/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAGvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EACL,WAAW,EACX,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,iBAAiB,GAClB,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAIvF,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,yBAAyB,EACzB,4BAA4B,EAC5B,0BAA0B,EAC1B,kBAAkB,EAClB,sBAAsB,EACtB,UAAU,EACV,WAAW,EACX,UAAU,EACV,iBAAiB,GAClB,MAAM,cAAc,CAAA;AAIrB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAIxC;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,KAAgB,GAAG,MAAM,CAM5F;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,KAAgB,GAAG,MAAM,CAM/F;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,GAAG,MAAM,CAElE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset registry - Unified asset and decimal handling for THORChain layers
|
|
3
|
+
*
|
|
4
|
+
* This module provides a unified interface for handling assets and amounts
|
|
5
|
+
* across three layers: native L1, THORChain, and Rujira FIN.
|
|
6
|
+
*/
|
|
7
|
+
// Amount class and conversion utilities
|
|
8
|
+
export { Amount } from './amount.js';
|
|
9
|
+
import { Amount } from './amount.js';
|
|
10
|
+
export { finToNative, finToThorchain, nativeToFin, nativeToThorchain, thorchainToFin, thorchainToNative, } from './amount.js';
|
|
11
|
+
// Asset registry
|
|
12
|
+
export { findAssetByFormat, getAllAssets, getAsset, KNOWN_ASSETS } from './registry.js';
|
|
13
|
+
import { getAsset } from './registry.js';
|
|
14
|
+
// Format converters
|
|
15
|
+
export { buildFinFormat, buildThorchainFormat, convertFormat, detectFormat, extractChainFromThorchain, extractContractFromThorchain, extractSymbolFromThorchain, normalizeFinFormat, normalizeThorchainPool, parseAsset, toFinFormat, toL1Format, toThorchainFormat, } from './formats.js';
|
|
16
|
+
import { parseAsset } from './formats.js';
|
|
17
|
+
// Swap router
|
|
18
|
+
export { SwapRouter } from './router.js';
|
|
19
|
+
// Convenience functions
|
|
20
|
+
/**
|
|
21
|
+
* Create an Amount from a human-readable string and asset ID
|
|
22
|
+
*/
|
|
23
|
+
export function createAmount(human, assetId, layer = 'native') {
|
|
24
|
+
const asset = getAsset(assetId);
|
|
25
|
+
if (!asset) {
|
|
26
|
+
throw new Error(`Unknown asset: ${assetId}`);
|
|
27
|
+
}
|
|
28
|
+
return Amount.from(human, asset, layer);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Parse an asset from any format and create an amount
|
|
32
|
+
*/
|
|
33
|
+
export function parseAmount(human, assetFormat, layer = 'native') {
|
|
34
|
+
const asset = parseAsset(assetFormat);
|
|
35
|
+
if (!asset) {
|
|
36
|
+
throw new Error(`Cannot parse asset format: ${assetFormat}`);
|
|
37
|
+
}
|
|
38
|
+
return Amount.from(human, asset, layer);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Quick conversion between layers
|
|
42
|
+
*/
|
|
43
|
+
export function convert(amount, targetLayer) {
|
|
44
|
+
return amount.toLayer(targetLayer);
|
|
45
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Asset } from './asset.js';
|
|
2
|
+
/**
|
|
3
|
+
* Registry of known assets with their formats and decimal specifications
|
|
4
|
+
* Complete Rujira asset coverage with correct FIN denom formats
|
|
5
|
+
*/
|
|
6
|
+
export declare const KNOWN_ASSETS: Record<string, Asset>;
|
|
7
|
+
/**
|
|
8
|
+
* Get asset by ID
|
|
9
|
+
*/
|
|
10
|
+
export declare function getAsset(id: string): Asset | null;
|
|
11
|
+
/**
|
|
12
|
+
* Get all known assets
|
|
13
|
+
*/
|
|
14
|
+
export declare function getAllAssets(): Asset[];
|
|
15
|
+
/**
|
|
16
|
+
* Find asset by any format
|
|
17
|
+
*/
|
|
18
|
+
export declare function findAssetByFormat(format: string): Asset | null;
|
|
19
|
+
/**
|
|
20
|
+
* Get assets by chain
|
|
21
|
+
*/
|
|
22
|
+
export declare function getAssetsByChain(chain: string): Asset[];
|
|
23
|
+
/**
|
|
24
|
+
* Get all supported chains
|
|
25
|
+
*/
|
|
26
|
+
export declare function getSupportedChains(): string[];
|
|
27
|
+
/**
|
|
28
|
+
* Get asset statistics
|
|
29
|
+
*/
|
|
30
|
+
export declare function getAssetStats(): {
|
|
31
|
+
totalAssets: number;
|
|
32
|
+
supportedChains: number;
|
|
33
|
+
nativeAssets: number;
|
|
34
|
+
tokenAssets: number;
|
|
35
|
+
chains: string[];
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/assets/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CA4a9C,CAAA;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAEjD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,KAAK,EAAE,CAEtC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAe9D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAEvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAM7C;AAED;;GAEG;AACH,wBAAgB,aAAa;;;;;;EAa5B"}
|