@decentrys/ui-sdk 0.1.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/LICENSE +21 -0
- package/README.md +51 -0
- package/dist/browser/decentrys-ui.js +1733 -0
- package/dist/browser/decentrys-ui.mjs +1681 -0
- package/dist/browser/react-dom-global.d.ts +6 -0
- package/dist/browser/react-dom-global.d.ts.map +1 -0
- package/dist/browser/react-dom-global.js +18 -0
- package/dist/browser/react-dom-global.js.map +1 -0
- package/dist/browser/react-global.d.ts +25 -0
- package/dist/browser/react-global.d.ts.map +1 -0
- package/dist/browser/react-global.js +39 -0
- package/dist/browser/react-global.js.map +1 -0
- package/dist/browser/react-jsx-runtime.d.ts +17 -0
- package/dist/browser/react-jsx-runtime.d.ts.map +1 -0
- package/dist/browser/react-jsx-runtime.js +27 -0
- package/dist/browser/react-jsx-runtime.js.map +1 -0
- package/dist/components/AddressRiskBadge.d.ts +39 -0
- package/dist/components/AddressRiskBadge.d.ts.map +1 -0
- package/dist/components/AddressRiskBadge.js +26 -0
- package/dist/components/AddressRiskBadge.js.map +1 -0
- package/dist/components/ApprovalWarning.d.ts +29 -0
- package/dist/components/ApprovalWarning.d.ts.map +1 -0
- package/dist/components/ApprovalWarning.js +18 -0
- package/dist/components/ApprovalWarning.js.map +1 -0
- package/dist/components/ContractFacts.d.ts +27 -0
- package/dist/components/ContractFacts.d.ts.map +1 -0
- package/dist/components/ContractFacts.js +15 -0
- package/dist/components/ContractFacts.js.map +1 -0
- package/dist/components/RiskDetailsModal.d.ts +35 -0
- package/dist/components/RiskDetailsModal.d.ts.map +1 -0
- package/dist/components/RiskDetailsModal.js +74 -0
- package/dist/components/RiskDetailsModal.js.map +1 -0
- package/dist/components/ThreatSignalList.d.ts +28 -0
- package/dist/components/ThreatSignalList.d.ts.map +1 -0
- package/dist/components/ThreatSignalList.js +28 -0
- package/dist/components/ThreatSignalList.js.map +1 -0
- package/dist/components/TokenSecurityPanel.d.ts +28 -0
- package/dist/components/TokenSecurityPanel.d.ts.map +1 -0
- package/dist/components/TokenSecurityPanel.js +26 -0
- package/dist/components/TokenSecurityPanel.js.map +1 -0
- package/dist/components/TransactionRiskBanner.d.ts +36 -0
- package/dist/components/TransactionRiskBanner.d.ts.map +1 -0
- package/dist/components/TransactionRiskBanner.js +20 -0
- package/dist/components/TransactionRiskBanner.js.map +1 -0
- package/dist/context.d.ts +51 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +47 -0
- package/dist/context.js.map +1 -0
- package/dist/copy.d.ts +72 -0
- package/dist/copy.d.ts.map +1 -0
- package/dist/copy.js +77 -0
- package/dist/copy.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/presentation.d.ts +316 -0
- package/dist/presentation.d.ts.map +1 -0
- package/dist/presentation.js +533 -0
- package/dist/presentation.js.map +1 -0
- package/dist/primitives.d.ts +139 -0
- package/dist/primitives.d.ts.map +1 -0
- package/dist/primitives.js +150 -0
- package/dist/primitives.js.map +1 -0
- package/dist/styles.d.ts +15 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +285 -0
- package/dist/styles.js.map +1 -0
- package/dist/theme.d.ts +52 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +90 -0
- package/dist/theme.js.map +1 -0
- package/package.json +70 -0
- package/src/browser/react-dom-global.ts +20 -0
- package/src/browser/react-global.ts +42 -0
- package/src/browser/react-jsx-runtime.ts +23 -0
- package/src/components/AddressRiskBadge.tsx +94 -0
- package/src/components/ApprovalWarning.tsx +144 -0
- package/src/components/ContractFacts.tsx +119 -0
- package/src/components/RiskDetailsModal.tsx +229 -0
- package/src/components/ThreatSignalList.tsx +76 -0
- package/src/components/TokenSecurityPanel.tsx +168 -0
- package/src/components/TransactionRiskBanner.tsx +123 -0
- package/src/context.tsx +89 -0
- package/src/copy.test.ts +214 -0
- package/src/copy.ts +151 -0
- package/src/index.ts +84 -0
- package/src/presentation.test.ts +521 -0
- package/src/presentation.ts +846 -0
- package/src/primitives.tsx +384 -0
- package/src/styles.ts +281 -0
- package/src/theme.test.ts +105 -0
- package/src/theme.ts +117 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where the risk model becomes words a person reads.
|
|
3
|
+
*
|
|
4
|
+
* This file is pure. It takes an `Assessment` and returns descriptions —
|
|
5
|
+
* labels, tones, statements, aria strings — and renders nothing. That split is
|
|
6
|
+
* deliberate: the rule
|
|
7
|
+
*
|
|
8
|
+
* Unknown is neutral. Risk requires evidence. Malicious requires stronger
|
|
9
|
+
* evidence. Users should be shown why.
|
|
10
|
+
*
|
|
11
|
+
* is broken in *presentation*, not in markup. A component that paints
|
|
12
|
+
* "deployed 3 days ago" the same amber as "attributed to a drainer family" has
|
|
13
|
+
* defeated the entire model while passing every classifier test. So the
|
|
14
|
+
* decisions that could do that live here, in functions a test can call
|
|
15
|
+
* directly, rather than being spread across seven components where they can
|
|
16
|
+
* only be checked by eye.
|
|
17
|
+
*
|
|
18
|
+
* Four load-bearing choices:
|
|
19
|
+
*
|
|
20
|
+
* - **Kinds have their own tone families.** `fact`, `capability` and
|
|
21
|
+
* `unknown` are not points on the risk scale. They cannot be rendered in a
|
|
22
|
+
* severity colour because they are never handed one.
|
|
23
|
+
* - **`HistoryPresentation.tone` is the literal type `'neutral'` and
|
|
24
|
+
* `isWarning` is the literal type `false`.** Limited history being drawn as
|
|
25
|
+
* a warning is not a bug this codebase can have; it does not compile.
|
|
26
|
+
* - **A signal that did not raise the level is toned `inactive`.** A stale or
|
|
27
|
+
* low-confidence signal is still shown — hiding an observation is its own
|
|
28
|
+
* failure — but it is not shown in the colour of one that counted.
|
|
29
|
+
* - **Anything above zero hops says so in a sentence**, not just a badge,
|
|
30
|
+
* because a hop is an inference about a counterparty and a badge reading
|
|
31
|
+
* "2" does not tell anyone that.
|
|
32
|
+
*/
|
|
33
|
+
import { MIN_RAISING_CONFIDENCE, type Assessment, type CapabilitySeverity, type Evidence, type HistoryStatus, type ObservedFact, type PolicyAction, type RiskComponents, type RiskLevel, type SignalStatus, type TechnicalCapability, type ThreatSeverity, type ThreatSignal, type UnknownField } from '@decentrys/protect';
|
|
34
|
+
import type { Tone } from './theme';
|
|
35
|
+
import type { UiCopy } from './copy';
|
|
36
|
+
/**
|
|
37
|
+
* The labels already published to customers on the marketing site.
|
|
38
|
+
*
|
|
39
|
+
* They are copied rather than invented so that a user who read the pricing
|
|
40
|
+
* page and a user looking at a wallet see the same seven words. Overridable
|
|
41
|
+
* per component for translation; the meanings come from the model itself.
|
|
42
|
+
*/
|
|
43
|
+
export declare const RISK_LEVEL_LABEL: Record<RiskLevel, string>;
|
|
44
|
+
export declare function levelRank(level: RiskLevel): number;
|
|
45
|
+
export interface LevelPresentation {
|
|
46
|
+
level: RiskLevel;
|
|
47
|
+
label: string;
|
|
48
|
+
/** The model's own words for what this level is allowed to mean. */
|
|
49
|
+
meaning: string;
|
|
50
|
+
tone: Tone;
|
|
51
|
+
glyph: string;
|
|
52
|
+
/**
|
|
53
|
+
* True from ELEVATED_RISK upward — the levels the classifier can only reach
|
|
54
|
+
* with threat-signal evidence. Drives whether a banner interrupts a screen
|
|
55
|
+
* reader, which nothing below that threshold has earned.
|
|
56
|
+
*/
|
|
57
|
+
evidenceBacked: boolean;
|
|
58
|
+
/** Only KNOWN_MALICIOUS. The one output that accuses a third party. */
|
|
59
|
+
accusatory: boolean;
|
|
60
|
+
liveRegionRole: 'status' | 'alert';
|
|
61
|
+
ariaLabel: string;
|
|
62
|
+
}
|
|
63
|
+
export declare function levelPresentation(level: RiskLevel, options?: {
|
|
64
|
+
labels?: Partial<Record<RiskLevel, string>>;
|
|
65
|
+
}): LevelPresentation;
|
|
66
|
+
export type EvidenceKind = 'fact' | 'capability' | 'signal' | 'unknown';
|
|
67
|
+
export interface KindPresentation {
|
|
68
|
+
kind: EvidenceKind;
|
|
69
|
+
/** Rendered as text on every row. Meaning never rests on colour alone. */
|
|
70
|
+
label: string;
|
|
71
|
+
/** A distinct *shape* per kind, legible without colour vision. */
|
|
72
|
+
glyph: string;
|
|
73
|
+
tone: Tone;
|
|
74
|
+
/** A second non-colour carrier: each kind has its own left-rule style. */
|
|
75
|
+
rule: 'solid' | 'dashed' | 'dotted';
|
|
76
|
+
ruleWidth: string;
|
|
77
|
+
}
|
|
78
|
+
export declare function kindPresentation(kind: EvidenceKind, copy: UiCopy): KindPresentation;
|
|
79
|
+
export interface FactPresentation {
|
|
80
|
+
kind: 'fact';
|
|
81
|
+
statement: string;
|
|
82
|
+
source: string;
|
|
83
|
+
observedAt: string;
|
|
84
|
+
/** Always the fact tone. A fact has no severity to render. */
|
|
85
|
+
tone: 'fact';
|
|
86
|
+
}
|
|
87
|
+
export declare function factPresentation(fact: ObservedFact): FactPresentation;
|
|
88
|
+
export interface CapabilityPresentation {
|
|
89
|
+
kind: 'capability';
|
|
90
|
+
statement: string;
|
|
91
|
+
severity: CapabilitySeverity;
|
|
92
|
+
severityLabel: string;
|
|
93
|
+
grantedBy?: string;
|
|
94
|
+
/**
|
|
95
|
+
* Always the capability tone, at every severity.
|
|
96
|
+
*
|
|
97
|
+
* A significant capability is emphasised with weight, not recoloured into
|
|
98
|
+
* the threat palette. "The owner can mint additional supply" is a true
|
|
99
|
+
* statement about code; painting it the same red as an analyst-verified
|
|
100
|
+
* drainer match tells a user the two are the same kind of thing.
|
|
101
|
+
*/
|
|
102
|
+
tone: 'capability';
|
|
103
|
+
emphasis: 'normal' | 'strong';
|
|
104
|
+
}
|
|
105
|
+
export declare function capabilityPresentation(capability: TechnicalCapability): CapabilityPresentation;
|
|
106
|
+
/**
|
|
107
|
+
* Re-exported from the classifier rather than redeclared.
|
|
108
|
+
*
|
|
109
|
+
* This is the floor the model itself uses to decide whether a signal raised
|
|
110
|
+
* the level. A second copy here that drifted would show a signal as "did not
|
|
111
|
+
* count" while it was in fact counting.
|
|
112
|
+
*/
|
|
113
|
+
export { MIN_RAISING_CONFIDENCE };
|
|
114
|
+
export interface SignalPresentation {
|
|
115
|
+
kind: 'signal';
|
|
116
|
+
explanation: string;
|
|
117
|
+
severity: ThreatSeverity;
|
|
118
|
+
severityLabel: string;
|
|
119
|
+
/**
|
|
120
|
+
* The severity tone only while the signal is actually counting. A stale or
|
|
121
|
+
* low-confidence signal is toned `inactive`, because showing it in critical
|
|
122
|
+
* red would tell a user something contributed to the assessment when the
|
|
123
|
+
* classifier explicitly excluded it.
|
|
124
|
+
*/
|
|
125
|
+
tone: Tone;
|
|
126
|
+
status: SignalStatus;
|
|
127
|
+
statusLabel: string;
|
|
128
|
+
active: boolean;
|
|
129
|
+
raising: boolean;
|
|
130
|
+
/** Present whenever `raising` is false. Never left to inference. */
|
|
131
|
+
inertStatement?: string;
|
|
132
|
+
hops: number;
|
|
133
|
+
hopLabel: string;
|
|
134
|
+
hopStatement: string;
|
|
135
|
+
/** Any hop above zero is an inference about a counterparty. */
|
|
136
|
+
indirect: boolean;
|
|
137
|
+
confidence: number;
|
|
138
|
+
confidenceLabel: string;
|
|
139
|
+
analystConfirmed: boolean;
|
|
140
|
+
attribution: string;
|
|
141
|
+
evidenceCount: number;
|
|
142
|
+
ariaLabel: string;
|
|
143
|
+
}
|
|
144
|
+
export declare function signalPresentation(signal: ThreatSignal, copy: UiCopy, options?: {
|
|
145
|
+
subjectNoun?: string;
|
|
146
|
+
}): SignalPresentation;
|
|
147
|
+
export interface HopPresentation {
|
|
148
|
+
hops: number;
|
|
149
|
+
label: string;
|
|
150
|
+
statement: string;
|
|
151
|
+
indirect: boolean;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Hop distance, in a sentence.
|
|
155
|
+
*
|
|
156
|
+
* Zero hops is an observation about the subject. Everything else is an
|
|
157
|
+
* observation about somebody the subject transacted with, and the further out
|
|
158
|
+
* it goes the weaker the inference — a badge reading "3" communicates none of
|
|
159
|
+
* that, so the wording carries it instead.
|
|
160
|
+
*/
|
|
161
|
+
export declare function hopPresentation(hops: number, subjectNoun?: string): HopPresentation;
|
|
162
|
+
export interface EvidencePresentation {
|
|
163
|
+
id: string;
|
|
164
|
+
type: string;
|
|
165
|
+
source: string;
|
|
166
|
+
observedAt: string;
|
|
167
|
+
confidenceLabel: string;
|
|
168
|
+
analystConfirmed: boolean;
|
|
169
|
+
attribution: string;
|
|
170
|
+
reference?: string;
|
|
171
|
+
}
|
|
172
|
+
export declare function evidencePresentation(evidence: Evidence, copy: UiCopy): EvidencePresentation;
|
|
173
|
+
export interface UnknownPresentation {
|
|
174
|
+
kind: 'unknown';
|
|
175
|
+
field: string;
|
|
176
|
+
statement: string;
|
|
177
|
+
reasonLabel: string;
|
|
178
|
+
/** Always the unknown tone. Unknown is neutral; it is not a finding. */
|
|
179
|
+
tone: 'unknown';
|
|
180
|
+
}
|
|
181
|
+
export declare function unknownPresentation(unknown: UnknownField): UnknownPresentation;
|
|
182
|
+
/**
|
|
183
|
+
* Note the literal types on `tone` and `isWarning`.
|
|
184
|
+
*
|
|
185
|
+
* `historyStatus: 'LIMITED'` is the correct, expected state for anything
|
|
186
|
+
* recently deployed, and the single most likely place for this product to
|
|
187
|
+
* betray its own rule. Typing the fields as literals means a future component
|
|
188
|
+
* cannot render history as a warning by mistake — the attempt does not
|
|
189
|
+
* typecheck, which is a stronger guarantee than a comment asking nicely.
|
|
190
|
+
*/
|
|
191
|
+
export interface HistoryPresentation {
|
|
192
|
+
status: HistoryStatus;
|
|
193
|
+
label: string;
|
|
194
|
+
statement: string;
|
|
195
|
+
tone: 'neutral';
|
|
196
|
+
isWarning: false;
|
|
197
|
+
}
|
|
198
|
+
export declare function historyPresentation(status: HistoryStatus): HistoryPresentation;
|
|
199
|
+
export interface ComponentRow {
|
|
200
|
+
key: keyof RiskComponents;
|
|
201
|
+
label: string;
|
|
202
|
+
value: number;
|
|
203
|
+
/** True for `historyConfidence`, which is coverage rather than danger. */
|
|
204
|
+
isCoverage: boolean;
|
|
205
|
+
caveat?: string;
|
|
206
|
+
}
|
|
207
|
+
export declare function componentRows(components: RiskComponents, copy: UiCopy): ComponentRow[];
|
|
208
|
+
export interface AssessmentSections {
|
|
209
|
+
facts: ObservedFact[];
|
|
210
|
+
capabilities: TechnicalCapability[];
|
|
211
|
+
/** Signals the classifier counted. */
|
|
212
|
+
activeSignals: ThreatSignal[];
|
|
213
|
+
/** Stale, resolved, withdrawn or below the confidence floor. Still shown. */
|
|
214
|
+
inertSignals: ThreatSignal[];
|
|
215
|
+
unknowns: UnknownField[];
|
|
216
|
+
/** True when nothing at all came back — never rendered as a blank panel. */
|
|
217
|
+
isEmpty: boolean;
|
|
218
|
+
/** Present exactly when `isEmpty`. Says what the emptiness means. */
|
|
219
|
+
emptyStatement?: string;
|
|
220
|
+
summary: string;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Split an assessment into what gets rendered where.
|
|
224
|
+
*
|
|
225
|
+
* Facts and capabilities never enter the signal list and signals never enter
|
|
226
|
+
* the fact list; the separation is structural rather than a convention each
|
|
227
|
+
* component is trusted to follow. Coverage signals have already been demoted
|
|
228
|
+
* to facts by `normalizeEvidence` on the wire boundary, so anything arriving
|
|
229
|
+
* in `threatSignals` here genuinely claims to be one.
|
|
230
|
+
*/
|
|
231
|
+
export declare function assessmentSections(assessment: Assessment, copy: UiCopy): AssessmentSections;
|
|
232
|
+
export interface AvailabilityPresentation {
|
|
233
|
+
unavailable: boolean;
|
|
234
|
+
/** Present when unavailable. Says nothing was checked, and implies nothing. */
|
|
235
|
+
statement?: string;
|
|
236
|
+
/**
|
|
237
|
+
* Never a severity tone.
|
|
238
|
+
*
|
|
239
|
+
* Decentrys being unreachable is a fact about Decentrys, not a finding about
|
|
240
|
+
* the user's transaction. Rendering our own outage in red teaches people
|
|
241
|
+
* that red means nothing.
|
|
242
|
+
*/
|
|
243
|
+
tone: 'neutral';
|
|
244
|
+
}
|
|
245
|
+
export declare function availabilityPresentation(assessment: Assessment): AvailabilityPresentation;
|
|
246
|
+
export interface DecisionPresentation {
|
|
247
|
+
action: PolicyAction;
|
|
248
|
+
label: string;
|
|
249
|
+
statement: string;
|
|
250
|
+
reason: string;
|
|
251
|
+
/**
|
|
252
|
+
* These components never disable a host application's controls.
|
|
253
|
+
*
|
|
254
|
+
* Typed as the literal `false` so no component can be written that reads
|
|
255
|
+
* this field and switches a button off. Policy is the integrator's, and it
|
|
256
|
+
* is theirs to enforce in their own UI.
|
|
257
|
+
*/
|
|
258
|
+
blocksUi: false;
|
|
259
|
+
}
|
|
260
|
+
export declare function decisionPresentation(decision: {
|
|
261
|
+
action: PolicyAction;
|
|
262
|
+
reason: string;
|
|
263
|
+
}): DecisionPresentation;
|
|
264
|
+
export interface ApprovalDetails {
|
|
265
|
+
token: string;
|
|
266
|
+
symbol?: string;
|
|
267
|
+
decimals?: number;
|
|
268
|
+
spender: string;
|
|
269
|
+
/** A name the integrator already has for the spender, if any. */
|
|
270
|
+
spenderLabel?: string;
|
|
271
|
+
/** Base units, or the literal string `unlimited`. */
|
|
272
|
+
amount?: string;
|
|
273
|
+
}
|
|
274
|
+
export interface ApprovalPresentation {
|
|
275
|
+
unlimited: boolean;
|
|
276
|
+
amountKnown: boolean;
|
|
277
|
+
amountLabel: string;
|
|
278
|
+
scopeLabel: string;
|
|
279
|
+
statement: string;
|
|
280
|
+
spenderName: string;
|
|
281
|
+
assetName: string;
|
|
282
|
+
/**
|
|
283
|
+
* The capability tone, never a threat tone.
|
|
284
|
+
*
|
|
285
|
+
* An unlimited allowance is a *scope*, and describing it accurately is the
|
|
286
|
+
* whole job: "unlimited approval requested" is useful, "scam detected" is
|
|
287
|
+
* both unsupported and the thing that trains people to click through.
|
|
288
|
+
*/
|
|
289
|
+
tone: 'capability';
|
|
290
|
+
emphasis: 'normal' | 'strong';
|
|
291
|
+
}
|
|
292
|
+
export declare function approvalPresentation(details: ApprovalDetails): ApprovalPresentation;
|
|
293
|
+
/** ERC-20 approvals commonly use a sentinel near uint256 max to mean "no cap". */
|
|
294
|
+
export declare function isUnlimitedAllowance(amount: string): boolean;
|
|
295
|
+
/** `0.5` becomes `50%`. Never rounded away to "high" or "low". */
|
|
296
|
+
export declare function formatConfidence(confidence: number): string;
|
|
297
|
+
/**
|
|
298
|
+
* A fixed UTC rendering rather than a locale one.
|
|
299
|
+
*
|
|
300
|
+
* Locale formatting differs between a browser, an extension service worker and
|
|
301
|
+
* a React Native runtime, and an integrator wanting their own format has the
|
|
302
|
+
* raw ISO string on the model. Predictable beats pretty here.
|
|
303
|
+
*/
|
|
304
|
+
export declare function formatTimestamp(iso: string): string;
|
|
305
|
+
export declare function shortenAddress(address: string, lead?: number, tail?: number): string;
|
|
306
|
+
/**
|
|
307
|
+
* Base units to a human amount, in integer arithmetic.
|
|
308
|
+
*
|
|
309
|
+
* Token balances routinely exceed what a double can hold exactly, and a
|
|
310
|
+
* rounding artefact in an allowance figure is a number a user would act on.
|
|
311
|
+
* With no decimals supplied the raw base units are returned unscaled; the
|
|
312
|
+
* caller is responsible for saying so, and `approvalPresentation` does.
|
|
313
|
+
*/
|
|
314
|
+
export declare function formatTokenAmount(amount: string, decimals?: number): string;
|
|
315
|
+
export declare function plural(count: number, singular: string, pluralForm?: string): string;
|
|
316
|
+
//# sourceMappingURL=presentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../src/presentation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAEL,sBAAsB,EAEtB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,YAAY,EAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAMrC;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAQtD,CAAC;AA2CF,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAElD;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB,uEAAuE;IACvE,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,QAAQ,GAAG,OAAO,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;CAAO,GAC5D,iBAAiB,CAenB;AAMD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC;AAExE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,CAAC;IACnB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;IACX,0EAA0E;IAC1E,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAWnF;AAMD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,gBAAgB,CAQrE;AAYD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;OAOG;IACH,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC/B;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,mBAAmB,GAAG,sBAAsB,CAU9F;AAMD;;;;;;GAMG;AACH,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAyBlC,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,cAAc,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GACrC,kBAAkB,CA0CpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,SAAY,GAAG,eAAe,CA4BtF;AAMD,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAW3F;AAaD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,mBAAmB,CAQ9E;AAaD;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,KAAK,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,mBAAmB,CAQ9E;AAMD,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,cAAc,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAkBtF;AAMD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,sCAAsC;IACtC,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,6EAA6E;IAC7E,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;IACjB,qEAAqE;IACrE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAgC3F;AAMD,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,OAAO,CAAC;IACrB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,UAAU,GAAG,wBAAwB,CAQzF;AA0BD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,QAAQ,EAAE,KAAK,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjD,oBAAoB,CAQtB;AAMD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC/B;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,oBAAoB,CAuDnF;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAO5D;AAMD,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAInD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAI,EAAE,IAAI,SAAI,GAAG,MAAM,CAG1E;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAe3E;AAMD,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAGnF"}
|