myio-js-library 0.1.165 → 0.1.166
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/dist/index.cjs +695 -50
- package/dist/index.d.cts +229 -9
- package/dist/index.js +684 -50
- package/dist/myio-js-library.umd.js +682 -50
- package/dist/myio-js-library.umd.min.js +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -2434,7 +2434,7 @@ type ChartDomain = 'energy' | 'water' | 'gas' | 'temperature' | string;
|
|
|
2434
2434
|
/**
|
|
2435
2435
|
* Theme modes
|
|
2436
2436
|
*/
|
|
2437
|
-
type ThemeMode = 'light' | 'dark';
|
|
2437
|
+
type ThemeMode$1 = 'light' | 'dark';
|
|
2438
2438
|
/**
|
|
2439
2439
|
* Chart visualization types
|
|
2440
2440
|
*/
|
|
@@ -2595,7 +2595,7 @@ interface Consumption7DaysConfig {
|
|
|
2595
2595
|
/** Fill area under line chart (default: true) */
|
|
2596
2596
|
fill?: boolean;
|
|
2597
2597
|
/** Theme mode: 'light' or 'dark' (default: 'light') */
|
|
2598
|
-
theme?: ThemeMode;
|
|
2598
|
+
theme?: ThemeMode$1;
|
|
2599
2599
|
/** Default period in days (default: 7) */
|
|
2600
2600
|
defaultPeriod?: number;
|
|
2601
2601
|
/** Default chart type (default: 'line') */
|
|
@@ -2750,7 +2750,7 @@ interface Consumption7DaysInstance {
|
|
|
2750
2750
|
period: number;
|
|
2751
2751
|
chartType: ChartType;
|
|
2752
2752
|
vizMode: VizMode;
|
|
2753
|
-
theme: ThemeMode;
|
|
2753
|
+
theme: ThemeMode$1;
|
|
2754
2754
|
isRendered: boolean;
|
|
2755
2755
|
};
|
|
2756
2756
|
/**
|
|
@@ -2762,7 +2762,7 @@ interface Consumption7DaysInstance {
|
|
|
2762
2762
|
* Set theme mode
|
|
2763
2763
|
* @param theme - 'light' or 'dark'
|
|
2764
2764
|
*/
|
|
2765
|
-
setTheme: (theme: ThemeMode) => void;
|
|
2765
|
+
setTheme: (theme: ThemeMode$1) => void;
|
|
2766
2766
|
/**
|
|
2767
2767
|
* Set or update the ideal range
|
|
2768
2768
|
* Pass null to remove the ideal range
|
|
@@ -2800,7 +2800,7 @@ interface ThemeColors {
|
|
|
2800
2800
|
/**
|
|
2801
2801
|
* Default theme colors for light and dark modes
|
|
2802
2802
|
*/
|
|
2803
|
-
declare const THEME_COLORS: Record<ThemeMode, ThemeColors>;
|
|
2803
|
+
declare const THEME_COLORS: Record<ThemeMode$1, ThemeColors>;
|
|
2804
2804
|
/**
|
|
2805
2805
|
* Default configuration values
|
|
2806
2806
|
*/
|
|
@@ -2808,7 +2808,7 @@ declare const DEFAULT_CONFIG: {
|
|
|
2808
2808
|
defaultPeriod: number;
|
|
2809
2809
|
defaultChartType: ChartType;
|
|
2810
2810
|
defaultVizMode: VizMode;
|
|
2811
|
-
defaultTheme: ThemeMode;
|
|
2811
|
+
defaultTheme: ThemeMode$1;
|
|
2812
2812
|
cacheTTL: number;
|
|
2813
2813
|
decimalPlaces: number;
|
|
2814
2814
|
lineTension: number;
|
|
@@ -2874,7 +2874,7 @@ interface ConsumptionModalConfig extends Omit<Consumption7DaysConfig, 'container
|
|
|
2874
2874
|
/** Modal title */
|
|
2875
2875
|
title?: string;
|
|
2876
2876
|
/** Initial theme */
|
|
2877
|
-
theme?: ThemeMode;
|
|
2877
|
+
theme?: ThemeMode$1;
|
|
2878
2878
|
/** Callback when modal closes */
|
|
2879
2879
|
onClose?: () => void;
|
|
2880
2880
|
/** Container to append modal (default: document.body) */
|
|
@@ -2883,6 +2883,10 @@ interface ConsumptionModalConfig extends Omit<Consumption7DaysConfig, 'container
|
|
|
2883
2883
|
exportFormats?: ExportFormat$1[];
|
|
2884
2884
|
/** Custom export handler (receives format, default uses built-in CSV export) */
|
|
2885
2885
|
onExport?: (format: ExportFormat$1) => void;
|
|
2886
|
+
/** Show settings button (default: true) */
|
|
2887
|
+
showSettingsButton?: boolean;
|
|
2888
|
+
/** Callback when settings button is clicked */
|
|
2889
|
+
onSettingsClick?: () => void;
|
|
2886
2890
|
}
|
|
2887
2891
|
interface ConsumptionModalInstance {
|
|
2888
2892
|
/** Opens the modal */
|
|
@@ -2954,7 +2958,7 @@ interface ConsumptionWidgetInstance {
|
|
|
2954
2958
|
/** Sets the visualization mode */
|
|
2955
2959
|
setVizMode: (mode: VizMode) => void;
|
|
2956
2960
|
/** Sets the theme */
|
|
2957
|
-
setTheme: (theme: ThemeMode) => void;
|
|
2961
|
+
setTheme: (theme: ThemeMode$1) => void;
|
|
2958
2962
|
/** Sets the period in days */
|
|
2959
2963
|
setPeriod: (days: number) => Promise<void>;
|
|
2960
2964
|
/** Sets the ideal range */
|
|
@@ -3245,4 +3249,220 @@ declare const EXPORT_DOMAIN_LABELS: Record<ExportDomain, string>;
|
|
|
3245
3249
|
/** Domain units */
|
|
3246
3250
|
declare const EXPORT_DOMAIN_UNITS: Record<ExportDomain, string>;
|
|
3247
3251
|
|
|
3248
|
-
|
|
3252
|
+
/**
|
|
3253
|
+
* RFC-0102: Distribution Chart Widget Types
|
|
3254
|
+
* TypeScript interfaces for the distribution chart component
|
|
3255
|
+
*/
|
|
3256
|
+
type DistributionDomain = 'energy' | 'water' | 'gas' | string;
|
|
3257
|
+
type ThemeMode = 'light' | 'dark';
|
|
3258
|
+
/**
|
|
3259
|
+
* Visualization mode configuration
|
|
3260
|
+
*/
|
|
3261
|
+
interface DistributionMode {
|
|
3262
|
+
value: string;
|
|
3263
|
+
label: string;
|
|
3264
|
+
}
|
|
3265
|
+
/**
|
|
3266
|
+
* Distribution data - key-value pairs of category/shopping to consumption value
|
|
3267
|
+
*/
|
|
3268
|
+
interface DistributionData {
|
|
3269
|
+
[key: string]: number;
|
|
3270
|
+
}
|
|
3271
|
+
/**
|
|
3272
|
+
* Color mapping for equipment groups
|
|
3273
|
+
*/
|
|
3274
|
+
interface GroupColors {
|
|
3275
|
+
[groupName: string]: string;
|
|
3276
|
+
}
|
|
3277
|
+
/**
|
|
3278
|
+
* Color mapping for shoppings (from orchestrator)
|
|
3279
|
+
*/
|
|
3280
|
+
interface ShoppingColors {
|
|
3281
|
+
[shoppingId: string]: string;
|
|
3282
|
+
}
|
|
3283
|
+
/**
|
|
3284
|
+
* Theme colors for chart rendering
|
|
3285
|
+
*/
|
|
3286
|
+
interface DistributionThemeColors {
|
|
3287
|
+
text: string;
|
|
3288
|
+
secondaryText: string;
|
|
3289
|
+
background: string;
|
|
3290
|
+
cardBackground: string;
|
|
3291
|
+
border: string;
|
|
3292
|
+
grid: string;
|
|
3293
|
+
}
|
|
3294
|
+
/**
|
|
3295
|
+
* Main configuration for createDistributionChartWidget
|
|
3296
|
+
*/
|
|
3297
|
+
interface DistributionChartConfig {
|
|
3298
|
+
/** Domain identifier (energy, water, etc.) */
|
|
3299
|
+
domain: DistributionDomain;
|
|
3300
|
+
/** Container element ID where widget will be injected */
|
|
3301
|
+
containerId: string;
|
|
3302
|
+
/** Unit of measurement (kWh, m³, etc.) */
|
|
3303
|
+
unit: string;
|
|
3304
|
+
/** Function to fetch distribution data for a given mode */
|
|
3305
|
+
fetchDistribution: (mode: string) => Promise<DistributionData | null>;
|
|
3306
|
+
/** Large unit for values above threshold (MWh, etc.) */
|
|
3307
|
+
unitLarge?: string | null;
|
|
3308
|
+
/** Threshold to switch to large unit */
|
|
3309
|
+
thresholdForLargeUnit?: number | null;
|
|
3310
|
+
/** Decimal places for formatting (default: 2) */
|
|
3311
|
+
decimalPlaces?: number;
|
|
3312
|
+
/** Available visualization modes */
|
|
3313
|
+
modes?: DistributionMode[];
|
|
3314
|
+
/** Default mode to display (default: 'groups') */
|
|
3315
|
+
defaultMode?: string;
|
|
3316
|
+
/** Widget title */
|
|
3317
|
+
title?: string;
|
|
3318
|
+
/** Theme mode (default: 'light') */
|
|
3319
|
+
theme?: ThemeMode;
|
|
3320
|
+
/** Chart height in pixels (default: 300) */
|
|
3321
|
+
chartHeight?: number;
|
|
3322
|
+
/** Show header with title (default: true) */
|
|
3323
|
+
showHeader?: boolean;
|
|
3324
|
+
/** Show mode selector dropdown (default: true) */
|
|
3325
|
+
showModeSelector?: boolean;
|
|
3326
|
+
/** Show settings button (default: false) */
|
|
3327
|
+
showSettingsButton?: boolean;
|
|
3328
|
+
/** Show maximize button (default: false) */
|
|
3329
|
+
showMaximizeButton?: boolean;
|
|
3330
|
+
/** Custom colors for equipment groups */
|
|
3331
|
+
groupColors?: GroupColors;
|
|
3332
|
+
/** Function to get shopping colors from orchestrator */
|
|
3333
|
+
getShoppingColors?: () => ShoppingColors | null;
|
|
3334
|
+
/** Function to get shopping names from orchestrator */
|
|
3335
|
+
getShoppingNames?: () => Record<string, string> | null;
|
|
3336
|
+
/** Called when mode changes */
|
|
3337
|
+
onModeChange?: (mode: string) => void;
|
|
3338
|
+
/** Called when data is loaded */
|
|
3339
|
+
onDataLoaded?: (data: DistributionData) => void;
|
|
3340
|
+
/** Called on error */
|
|
3341
|
+
onError?: (error: Error) => void;
|
|
3342
|
+
/** Called when settings button is clicked */
|
|
3343
|
+
onSettingsClick?: () => void;
|
|
3344
|
+
/** Called when maximize button is clicked */
|
|
3345
|
+
onMaximizeClick?: () => void;
|
|
3346
|
+
/** jQuery container for ThingsBoard widget context */
|
|
3347
|
+
$container?: {
|
|
3348
|
+
[0]: HTMLElement;
|
|
3349
|
+
} | HTMLElement[];
|
|
3350
|
+
}
|
|
3351
|
+
/**
|
|
3352
|
+
* Instance returned by createDistributionChartWidget
|
|
3353
|
+
*/
|
|
3354
|
+
interface DistributionChartInstance {
|
|
3355
|
+
/** Render the widget into the container */
|
|
3356
|
+
render: () => Promise<void>;
|
|
3357
|
+
/** Change visualization mode */
|
|
3358
|
+
setMode: (mode: string) => Promise<void>;
|
|
3359
|
+
/** Refresh data from source */
|
|
3360
|
+
refresh: () => Promise<void>;
|
|
3361
|
+
/** Change theme */
|
|
3362
|
+
setTheme: (theme: ThemeMode) => void;
|
|
3363
|
+
/** Destroy the widget and clean up */
|
|
3364
|
+
destroy: () => void;
|
|
3365
|
+
/** Get the Chart.js instance */
|
|
3366
|
+
getChartInstance: () => Chart | null;
|
|
3367
|
+
/** Get current mode */
|
|
3368
|
+
getCurrentMode: () => string;
|
|
3369
|
+
/** Get current data */
|
|
3370
|
+
getCurrentData: () => DistributionData | null;
|
|
3371
|
+
}
|
|
3372
|
+
declare global {
|
|
3373
|
+
interface Window {
|
|
3374
|
+
Chart: typeof Chart;
|
|
3375
|
+
}
|
|
3376
|
+
}
|
|
3377
|
+
declare class Chart {
|
|
3378
|
+
constructor(ctx: CanvasRenderingContext2D, config: any);
|
|
3379
|
+
data: any;
|
|
3380
|
+
options: any;
|
|
3381
|
+
update(mode?: string): void;
|
|
3382
|
+
destroy(): void;
|
|
3383
|
+
}
|
|
3384
|
+
|
|
3385
|
+
/**
|
|
3386
|
+
* RFC-0102: Distribution Chart Widget
|
|
3387
|
+
* Self-contained horizontal bar chart for consumption distribution
|
|
3388
|
+
* Supports ENERGY, WATER, and other domains with consistent shopping colors
|
|
3389
|
+
*/
|
|
3390
|
+
|
|
3391
|
+
/**
|
|
3392
|
+
* Create a distribution chart widget
|
|
3393
|
+
* Injects all HTML into the container element
|
|
3394
|
+
*/
|
|
3395
|
+
declare function createDistributionChartWidget(config: DistributionChartConfig): DistributionChartInstance;
|
|
3396
|
+
|
|
3397
|
+
/**
|
|
3398
|
+
* RFC-0102: Centralized Color Management
|
|
3399
|
+
* Ensures consistent shopping colors across all widgets and domains
|
|
3400
|
+
*/
|
|
3401
|
+
|
|
3402
|
+
/**
|
|
3403
|
+
* Default color palette for shoppings
|
|
3404
|
+
* Used when orchestrator colors are not available
|
|
3405
|
+
* These colors cycle for more than 10 shoppings
|
|
3406
|
+
*/
|
|
3407
|
+
declare const DEFAULT_SHOPPING_COLORS: string[];
|
|
3408
|
+
/**
|
|
3409
|
+
* Default colors for ENERGY equipment groups
|
|
3410
|
+
*/
|
|
3411
|
+
declare const DEFAULT_ENERGY_GROUP_COLORS: GroupColors;
|
|
3412
|
+
/**
|
|
3413
|
+
* Default colors for WATER groups
|
|
3414
|
+
*/
|
|
3415
|
+
declare const DEFAULT_WATER_GROUP_COLORS: GroupColors;
|
|
3416
|
+
/**
|
|
3417
|
+
* Default colors for GAS groups
|
|
3418
|
+
*/
|
|
3419
|
+
declare const DEFAULT_GAS_GROUP_COLORS: GroupColors;
|
|
3420
|
+
/**
|
|
3421
|
+
* Get default group colors based on domain
|
|
3422
|
+
*/
|
|
3423
|
+
declare function getDefaultGroupColors(domain: string): GroupColors;
|
|
3424
|
+
/**
|
|
3425
|
+
* Creates a color assignment map for shoppings
|
|
3426
|
+
* Should be called once by the orchestrator during initialization
|
|
3427
|
+
*
|
|
3428
|
+
* @param shoppingIds - Array of shopping IDs
|
|
3429
|
+
* @returns Map of shopping ID to color
|
|
3430
|
+
*/
|
|
3431
|
+
declare function assignShoppingColors(shoppingIds: string[]): ShoppingColors;
|
|
3432
|
+
/**
|
|
3433
|
+
* Gets the color for a specific shopping
|
|
3434
|
+
* Falls back to cycling through default colors if not found
|
|
3435
|
+
*
|
|
3436
|
+
* @param shoppingId - The shopping ID or name
|
|
3437
|
+
* @param shoppingColors - Color map from orchestrator (optional)
|
|
3438
|
+
* @param fallbackIndex - Index to use for fallback color cycling
|
|
3439
|
+
* @returns Color hex string
|
|
3440
|
+
*/
|
|
3441
|
+
declare function getShoppingColor(shoppingId: string, shoppingColors: ShoppingColors | null, fallbackIndex?: number): string;
|
|
3442
|
+
/**
|
|
3443
|
+
* Gets the color for a group (equipment type, area type, etc.)
|
|
3444
|
+
*
|
|
3445
|
+
* @param groupName - The group name
|
|
3446
|
+
* @param groupColors - Custom group colors (optional)
|
|
3447
|
+
* @param domain - Domain for default colors
|
|
3448
|
+
* @param fallbackIndex - Index for fallback color
|
|
3449
|
+
* @returns Color hex string
|
|
3450
|
+
*/
|
|
3451
|
+
declare function getGroupColor(groupName: string, groupColors: GroupColors | null, domain?: string, fallbackIndex?: number): string;
|
|
3452
|
+
/**
|
|
3453
|
+
* Get theme colors for chart rendering
|
|
3454
|
+
*
|
|
3455
|
+
* @param theme - Light or dark theme
|
|
3456
|
+
* @returns Theme color configuration
|
|
3457
|
+
*/
|
|
3458
|
+
declare function getThemeColors(theme: ThemeMode): DistributionThemeColors;
|
|
3459
|
+
/**
|
|
3460
|
+
* Generate a deterministic color for a string (useful for unknown categories)
|
|
3461
|
+
* Uses a simple hash to ensure same string always gets same color
|
|
3462
|
+
*
|
|
3463
|
+
* @param str - String to hash
|
|
3464
|
+
* @returns Color hex string
|
|
3465
|
+
*/
|
|
3466
|
+
declare function getHashColor(str: string): string;
|
|
3467
|
+
|
|
3468
|
+
export { type BuildTemplateExportParams, CHART_COLORS, DEFAULT_COLORS as CONSUMPTION_CHART_COLORS, DEFAULT_CONFIG as CONSUMPTION_CHART_DEFAULTS, THEME_COLORS as CONSUMPTION_THEME_COLORS, type ChartDomain, type ClampRange, ConnectionStatusType, type Consumption7DaysColors, type Consumption7DaysConfig, type Consumption7DaysData, type Consumption7DaysInstance, type ChartType as ConsumptionChartType, type ConsumptionDataPoint, type IdealRangeConfig as ConsumptionIdealRangeConfig, type ConsumptionModalConfig, type ConsumptionModalInstance, type TemperatureConfig as ConsumptionTemperatureConfig, type TemperatureReferenceLine as ConsumptionTemperatureReferenceLine, type ThemeColors as ConsumptionThemeColors, type ThemeMode$1 as ConsumptionThemeMode, type VizMode as ConsumptionVizMode, type ConsumptionWidgetConfig, type ConsumptionWidgetInstance, type CreateDateRangePickerOptions, type CreateInputDateRangePickerInsideDIVParams, DEFAULT_CLAMP_RANGE, DEFAULT_ENERGY_GROUP_COLORS, DEFAULT_GAS_GROUP_COLORS, DEFAULT_SHOPPING_COLORS, DEFAULT_WATER_GROUP_COLORS, type DateRangeControl, type DateRangeInputController, type DateRangeResult, type DemandModalInstance, type DemandModalParams, type DemandModalPdfConfig, type DemandModalStyles, DeviceStatusType, type DistributionChartConfig, type DistributionChartInstance, type DistributionData, type DistributionDomain, type DistributionMode, type DistributionThemeColors, EXPORT_DEFAULT_COLORS, EXPORT_DOMAIN_ICONS, EXPORT_DOMAIN_LABELS, EXPORT_DOMAIN_UNITS, type EnergyModalContext, type EnergyModalError, type EnergyModalI18n, type EnergyModalStyleOverrides, type ExportColorsPallet, type ExportComparisonData, type ExportConfigTemplate, type ExportCustomerData, type ExportCustomerInfo, type ExportData, type ExportDataInput, type ExportDataInstance, type ExportDataPoint, type ExportDeviceInfo, type ExportDomain, type ExportFormat, type ExportGroupData, type ExportOptions, type ExportProgressCallback, type ExportResult, type ExportStats, type ExportType, type GroupColors, type ExportFormat$1 as ModalExportFormat, type ModalHeaderConfig, type ModalHeaderInstance, type ModalTheme, type MyIOAuthConfig, type MyIOAuthInstance, MyIOChartModal, MyIODraggableCard, MyIOSelectionStore, MyIOSelectionStoreClass, MyIOToast, type OpenDashboardPopupEnergyOptions, type OpenDashboardPopupSettingsParams, type OpenDashboardPopupWaterTankOptions, type PersistResult, type RealTimeTelemetryInstance, type RealTimeTelemetryParams, type SettingsError, type SettingsEvent, type ShoppingColors, type ShoppingDataPoint, type StoreRow, type TbScope, type TelemetryFetcher, type TemperatureComparisonModalInstance, type TemperatureComparisonModalParams, type TemperatureDevice, type TemperatureGranularity, type TemperatureModalInstance, type TemperatureModalParams, type TemperatureSettingsInstance, type TemperatureSettingsParams, type TemperatureStats, type TemperatureTelemetry, type ThingsboardCustomerAttrsConfig, type TimedValue, type WaterRow, type WaterTankDataPoint, type WaterTankModalContext, type WaterTankModalError, type WaterTankModalI18n, type WaterTankModalStyleOverrides, type WaterTankTelemetryData, addDetectionContext, addNamespace, aggregateByDay, assignShoppingColors, averageByDay, buildListItemsThingsboardByUniqueDatasource, buildMyioIngestionAuth, buildTemplateExport, buildWaterReportCSV, buildWaterStoresCSV, calcDeltaPercent, calculateDeviceStatus, calculateDeviceStatusWithRanges, calculateStats as calculateExportStats, calculateStats$1 as calculateStats, clampTemperature, classify, classifyWaterLabel, classifyWaterLabels, clearAllAuthCaches, connectionStatusIcons, createConsumption7DaysChart, createConsumptionChartWidget, createConsumptionModal, createDateRangePicker, createDistributionChartWidget, createInputDateRangePickerInsideDIV, createModalHeader, decodePayload, decodePayloadBase64Xor, detectDeviceType, determineInterval, deviceStatusIcons, exportTemperatureCSV, exportToCSV, exportToCSVAll, extractMyIOCredentials, fetchTemperatureData, fetchThingsboardCustomerAttrsFromStorage, fetchThingsboardCustomerServerScopeAttrs, findValue, findValueWithDefault, fmtPerc$1 as fmtPerc, fmtPerc as fmtPercLegacy, formatAllInSameUnit, formatAllInSameWaterUnit, formatDateForInput, formatDateToYMD, formatDateWithTimezoneOffset, formatDuration, formatEnergy, formatNumberReadable, formatRelativeTime, formatTankHeadFromCm, formatTemperature, formatWater, formatWaterByGroup, formatWaterVolumeM3, formatarDuracao, generateFilename as generateExportFilename, getAuthCacheStats, getAvailableContexts, getConnectionStatusIcon, getDateRangeArray, getDefaultGroupColors, getDeviceStatusIcon, getDeviceStatusInfo, getThemeColors as getDistributionThemeColors, getGroupColor, getHashColor, getModalHeaderStyles, getSaoPauloISOString, getSaoPauloISOStringFixed, getShoppingColor, getValueByDatakey, getValueByDatakeyLegacy, getWaterCategories, groupByDay, interpolateTemperature, isDeviceOffline, isValidConnectionStatus, isValidDeviceStatus, isWaterCategory, mapConnectionStatus, mapDeviceStatusToCardStatus, mapDeviceToConnectionStatus, myioExportData, normalizeRecipients, numbers, openDashboardPopup, openDashboardPopupAllReport, openDashboardPopupEnergy, openDashboardPopupReport, openDashboardPopupSettings, openDashboardPopupWaterTank, openDemandModal, openGoalsPanel, openRealTimeTelemetryModal, openTemperatureComparisonModal, openTemperatureModal, openTemperatureSettingsModal, parseInputDateToDate, renderCardComponent$2 as renderCardComponent, renderCardComponent$1 as renderCardComponentEnhanced, renderCardComponentHeadOffice, renderCardComponentLegacy, renderCardComponentV2, renderCardComponent as renderCardComponentV5, renderCardComponentV5 as renderCardV5, shouldFlashIcon, strings, timeWindowFromInputYMD, toCSV, toFixedSafe, waterDeviceStatusIcons };
|