@elizaos/plugin-form 2.0.0-alpha.9 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/auto-enable.ts +24 -0
- package/dist/actions/restore.d.ts +25 -0
- package/dist/actions/restore.d.ts.map +1 -0
- package/dist/actions/restore.js +176 -0
- package/dist/actions/restore.js.map +1 -0
- package/dist/builder.d.ts +320 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +458 -0
- package/dist/builder.js.map +1 -0
- package/dist/builtins.d.ts +128 -0
- package/dist/builtins.d.ts.map +1 -0
- package/dist/builtins.js +233 -0
- package/dist/builtins.js.map +1 -0
- package/dist/defaults.d.ts +95 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +79 -0
- package/dist/defaults.js.map +1 -0
- package/dist/evaluators/extractor.d.ts +28 -0
- package/dist/evaluators/extractor.d.ts.map +1 -0
- package/dist/evaluators/extractor.js +247 -0
- package/dist/evaluators/extractor.js.map +1 -0
- package/dist/extraction.d.ts +55 -0
- package/dist/extraction.d.ts.map +1 -0
- package/dist/extraction.js +331 -0
- package/dist/extraction.js.map +1 -0
- package/dist/index.d.ts +31 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +119 -3284
- package/dist/index.js.map +1 -30
- package/dist/providers/context.d.ts +56 -0
- package/dist/providers/context.d.ts.map +1 -0
- package/dist/providers/context.js +206 -0
- package/dist/providers/context.js.map +1 -0
- package/dist/service.d.ts +402 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +1158 -0
- package/dist/service.js.map +1 -0
- package/dist/storage.d.ts +228 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +218 -0
- package/dist/storage.js.map +1 -0
- package/dist/template.d.ts +10 -0
- package/dist/template.d.ts.map +1 -0
- package/dist/template.js +60 -0
- package/dist/template.js.map +1 -0
- package/dist/ttl.d.ts +144 -0
- package/dist/ttl.d.ts.map +1 -0
- package/dist/ttl.js +85 -0
- package/dist/ttl.js.map +1 -0
- package/dist/types.d.ts +1213 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +39 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +156 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +289 -0
- package/dist/validation.js.map +1 -0
- package/package.json +39 -42
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/validation.ts"],"sourcesContent":["/**\n * @module validation\n * @description Field validation utilities for the Form Plugin\n *\n * ## Design Rationale\n *\n * Validation happens at two points in the form lifecycle:\n *\n * 1. **At Extraction**: When the LLM extracts a value from user message,\n * we immediately validate it. Invalid values get status 'invalid' and\n * the agent asks again. This provides instant feedback.\n *\n * 2. **At Submission**: Final validation before submission ensures no\n * invalid values slipped through. This is the safety net.\n *\n * ## Type Handler Registry (Legacy) vs ControlType\n *\n * There are two ways to register custom types:\n *\n * 1. **TypeHandler (Legacy)**: Simple validate/parse/format functions.\n * Registered via registerTypeHandler(). Still supported for backwards\n * compatibility.\n *\n * 2. **ControlType (New)**: Full widget system with subcontrols and\n * external activation. Registered via FormService.registerControlType().\n * Use this for new code.\n *\n * This validation module still uses TypeHandler for backwards compatibility.\n * The FormService.getControlType() method should be preferred for new code.\n *\n * ## Custom Type Examples\n *\n * - Blockchain addresses (Solana, EVM)\n * - Phone numbers (with country-specific rules)\n * - Custom business identifiers (order numbers, employee IDs)\n *\n * Custom handlers are checked FIRST, before built-in type validation.\n * This allows overriding built-in types if needed.\n *\n * ## Why String-Based Types\n *\n * Form control types are strings, not enums, because:\n * - Plugins can add new types without modifying core\n * - Type handlers provide runtime extensibility\n * - No need to maintain exhaustive type lists\n */\n\nimport type { JsonValue } from \"@elizaos/core\";\nimport type { FormControl, TypeHandler } from \"./types\";\n\n/**\n * Validation result.\n *\n * WHY simple structure:\n * - Just need to know valid/invalid\n * - Error message for user feedback\n * - Easy to compose multiple validations\n */\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n}\n\n// ============================================================================\n// TYPE HANDLER REGISTRY\n// ============================================================================\n\n/**\n * Global registry for custom type handlers.\n *\n * WHY global Map:\n * - Type handlers are stateless\n * - One handler per type is sufficient\n * - Easy to mock in tests (clearTypeHandlers)\n */\nconst typeHandlers: Map<string, TypeHandler> = new Map();\n\n/**\n * Register a custom type handler.\n *\n * WHY this API:\n * - Simple key-value registration\n * - Called at plugin initialization\n * - Overwrites existing handlers (allows hot-reload)\n *\n * @example\n * ```typescript\n * registerTypeHandler('solana_address', {\n * validate: (value) => {\n * const valid = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(String(value));\n * return { valid, error: valid ? undefined : 'Invalid Solana address' };\n * },\n * extractionPrompt: 'a Solana wallet address (Base58 encoded)',\n * });\n * ```\n */\nexport function registerTypeHandler(type: string, handler: TypeHandler): void {\n typeHandlers.set(type, handler);\n}\n\n/**\n * Get a type handler.\n *\n * @returns The handler or undefined if not registered\n */\nexport function getTypeHandler(type: string): TypeHandler | undefined {\n return typeHandlers.get(type);\n}\n\n/**\n * Clear all type handlers.\n *\n * WHY this exists:\n * - Test isolation\n * - Hot-reload scenarios\n * - Should not be called in production\n */\nexport function clearTypeHandlers(): void {\n typeHandlers.clear();\n}\n\n// ============================================================================\n// FIELD VALIDATION\n// ============================================================================\n\n/**\n * Validate a value against a control's validation rules.\n *\n * Validation order (first failure returns):\n * 1. Required check\n * 2. Custom type handler (if registered)\n * 3. Built-in type validation\n * 4. Pattern, min/max, etc.\n *\n * WHY this order:\n * - Required is fastest check\n * - Custom handlers may have special logic\n * - Built-in types provide fallback\n * - Pattern/limits are additional constraints\n *\n * @param value - The value to validate\n * @param control - The field definition with validation rules\n * @returns Validation result with error message if invalid\n */\nexport function validateField(\n value: JsonValue,\n control: FormControl,\n): ValidationResult {\n // Check required first - fastest check\n if (control.required) {\n if (value === undefined || value === null || value === \"\") {\n return {\n valid: false,\n error: `${control.label || control.key} is required`,\n };\n }\n }\n\n // Empty optional fields are valid\n // WHY: No need to validate undefined/null/empty for optional fields\n if (value === undefined || value === null || value === \"\") {\n return { valid: true };\n }\n\n // Check custom type handler first\n // WHY: Allows overriding built-in types or adding new ones\n const handler = typeHandlers.get(control.type);\n if (handler?.validate) {\n const result = handler.validate(value, control);\n if (!result.valid) {\n return result;\n }\n }\n\n // Type-specific validation\n // WHY switch: Clear separation of validation logic per type\n switch (control.type) {\n case \"email\":\n return validateEmail(value, control);\n case \"number\":\n return validateNumber(value, control);\n case \"boolean\":\n return validateBoolean(value, control);\n case \"date\":\n return validateDate(value, control);\n case \"select\":\n return validateSelect(value, control);\n case \"file\":\n return validateFile(value, control);\n default:\n // Default to text validation for unknown types\n // WHY: Text validation handles pattern, length - applicable to most types\n return validateText(value, control);\n }\n}\n\n/**\n * Validate text field.\n *\n * Applies: pattern, minLength, maxLength, enum\n */\nfunction validateText(\n value: JsonValue,\n control: FormControl,\n): ValidationResult {\n const strValue = String(value);\n\n // Pattern validation\n // WHY regex: Flexible, powerful, user-defined patterns\n if (control.pattern) {\n const regex = new RegExp(control.pattern);\n if (!regex.test(strValue)) {\n return {\n valid: false,\n error: `${control.label || control.key} has invalid format`,\n };\n }\n }\n\n // Length validation\n // WHY separate minLength/maxLength: min/max used for numeric values too\n if (control.minLength !== undefined && strValue.length < control.minLength) {\n return {\n valid: false,\n error: `${control.label || control.key} must be at least ${control.minLength} characters`,\n };\n }\n\n if (control.maxLength !== undefined && strValue.length > control.maxLength) {\n return {\n valid: false,\n error: `${control.label || control.key} must be at most ${control.maxLength} characters`,\n };\n }\n\n // Enum validation\n // WHY enum: Simple allowed-values without full select options\n if (control.enum && control.enum.length > 0) {\n if (!control.enum.includes(strValue)) {\n return {\n valid: false,\n error: `${control.label || control.key} must be one of: ${control.enum.join(\", \")}`,\n };\n }\n }\n\n return { valid: true };\n}\n\n/**\n * Validate email field.\n *\n * WHY simple regex:\n * - Complex RFC 5322 regex is overkill and often wrong\n * - This catches most typos (missing @, missing domain)\n * - Further validation via confirmation email\n */\nfunction validateEmail(\n value: JsonValue,\n control: FormControl,\n): ValidationResult {\n const rawValue = String(value);\n const strValue = rawValue.length > 320 ? rawValue.slice(0, 320) : rawValue;\n\n // Basic email regex - intentionally simple\n // WHY: More complex patterns have edge cases; simple pattern catches most errors\n // Use [^\\s@.] in the domain parts to keep matching linear (no ReDoS).\n const emailRegex = /^[^\\s@]+@[^\\s@.]+(?:\\.[^\\s@.]+)+$/;\n if (!emailRegex.test(strValue)) {\n return {\n valid: false,\n error: `${control.label || control.key} must be a valid email address`,\n };\n }\n\n // Also apply text validation (pattern, length)\n return validateText(value, control);\n}\n\n/**\n * Validate number field.\n *\n * Applies: min, max (as numeric values, not length)\n */\nfunction validateNumber(\n value: JsonValue,\n control: FormControl,\n): ValidationResult {\n // Parse number, handling commas and currency symbols\n // WHY: Users type \"1,234\" or \"$50\" and expect it to work\n const numValue =\n typeof value === \"number\"\n ? value\n : parseFloat(String(value).replace(/[,$]/g, \"\"));\n\n if (Number.isNaN(numValue)) {\n return {\n valid: false,\n error: `${control.label || control.key} must be a number`,\n };\n }\n\n // Min/max validation\n if (control.min !== undefined && numValue < control.min) {\n return {\n valid: false,\n error: `${control.label || control.key} must be at least ${control.min}`,\n };\n }\n\n if (control.max !== undefined && numValue > control.max) {\n return {\n valid: false,\n error: `${control.label || control.key} must be at most ${control.max}`,\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate boolean field.\n *\n * WHY accept many formats:\n * - Users say \"yes\", \"no\", \"true\", \"false\", \"1\", \"0\"\n * - Agent might extract any of these\n * - All should be valid booleans\n */\nfunction validateBoolean(\n value: JsonValue,\n _control: FormControl,\n): ValidationResult {\n if (typeof value === \"boolean\") {\n return { valid: true };\n }\n\n // Accept common boolean-like strings\n const strValue = String(value).toLowerCase();\n const truthy = [\"true\", \"yes\", \"1\", \"on\"];\n const falsy = [\"false\", \"no\", \"0\", \"off\"];\n\n if (truthy.includes(strValue) || falsy.includes(strValue)) {\n return { valid: true };\n }\n\n return { valid: false, error: \"Must be true or false\" };\n}\n\n/**\n * Validate date field.\n *\n * WHY flexible parsing:\n * - Users say \"tomorrow\", \"next Monday\", \"12/25/2024\"\n * - LLM should normalize to parseable format\n * - We accept anything Date() can parse\n */\nfunction validateDate(\n value: JsonValue,\n control: FormControl,\n): ValidationResult {\n let dateValue: Date;\n\n if (value instanceof Date) {\n dateValue = value;\n } else if (typeof value === \"string\" || typeof value === \"number\") {\n dateValue = new Date(value);\n } else {\n return {\n valid: false,\n error: `${control.label || control.key} must be a valid date`,\n };\n }\n\n // Invalid Date check\n if (Number.isNaN(dateValue.getTime())) {\n return {\n valid: false,\n error: `${control.label || control.key} must be a valid date`,\n };\n }\n\n // Min/max as timestamps\n // WHY: Form definition can set date ranges (e.g., future dates only)\n if (control.min !== undefined && dateValue.getTime() < control.min) {\n return {\n valid: false,\n error: `${control.label || control.key} is too early`,\n };\n }\n\n if (control.max !== undefined && dateValue.getTime() > control.max) {\n return {\n valid: false,\n error: `${control.label || control.key} is too late`,\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate select field.\n *\n * WHY strict validation:\n * - Select has defined options\n * - Invalid selections are likely extraction errors\n * - Should reject and re-ask rather than accept garbage\n */\nfunction validateSelect(\n value: JsonValue,\n control: FormControl,\n): ValidationResult {\n const options = control.options ?? [];\n if (options.length === 0) {\n // No options defined - treat as text\n return { valid: true };\n }\n\n const strValue = String(value);\n const validValues = options.map((opt) => opt.value);\n\n if (!validValues.includes(strValue)) {\n return {\n valid: false,\n error: `${control.label || control.key} must be one of the available options`,\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate file field (validates metadata, not content).\n *\n * WHY metadata-only:\n * - Actual file content is handled elsewhere\n * - This validates the metadata (size, type)\n * - Runs during session, not file upload\n */\nfunction validateFile(\n value: JsonValue,\n control: FormControl,\n): ValidationResult {\n if (!control.file) {\n return { valid: true };\n }\n\n // Value should be an array of file metadata\n const files = Array.isArray(value) ? value : [value];\n\n // Check max files\n if (control.file.maxFiles && files.length > control.file.maxFiles) {\n return {\n valid: false,\n error: `Maximum ${control.file.maxFiles} files allowed`,\n };\n }\n\n for (const file of files) {\n if (!file || typeof file !== \"object\") continue;\n\n const fileObj = file as { size?: number; mimeType?: string };\n\n // Check file size\n if (\n control.file.maxSize &&\n fileObj.size &&\n fileObj.size > control.file.maxSize\n ) {\n return {\n valid: false,\n error: `File size exceeds maximum of ${formatBytes(control.file.maxSize)}`,\n };\n }\n\n // Check accepted MIME types\n if (control.file.accept && fileObj.mimeType) {\n const { mimeType } = fileObj;\n const accepted = control.file.accept.some((pattern) =>\n matchesMimeType(mimeType, pattern),\n );\n if (!accepted) {\n return {\n valid: false,\n error: `File type ${mimeType} is not accepted`,\n };\n }\n }\n }\n\n return { valid: true };\n}\n\n/**\n * Check if a MIME type matches a pattern.\n *\n * Supports:\n * - Exact match: \"image/png\"\n * - Wildcard: \"image/*\"\n * - Universal: \"*\\/*\"\n *\n * @example\n * matchesMimeType('image/png', 'image/*') // true\n * matchesMimeType('application/pdf', 'image/*') // false\n */\nexport function matchesMimeType(mimeType: string, pattern: string): boolean {\n if (pattern === \"*/*\") return true;\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -1); // \"image/\" from \"image/*\"\n return mimeType.startsWith(prefix);\n }\n return mimeType === pattern;\n}\n\n/**\n * Format bytes to human-readable string.\n *\n * @example formatBytes(1024) // \"1.0 KB\"\n */\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024)\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\n// ============================================================================\n// VALUE PARSING\n// ============================================================================\n\n/**\n * Parse a string value to the appropriate type based on control type.\n *\n * WHY parsing:\n * - LLM extraction returns strings\n * - We need proper types for validation and storage\n * - Custom handlers can define custom parsing\n *\n * @param value - String value from extraction\n * @param control - Field definition to determine type\n * @returns Parsed value of appropriate type\n */\nexport function parseValue(value: string, control: FormControl): JsonValue {\n // Check for custom type handler\n const handler = typeHandlers.get(control.type);\n if (handler?.parse) {\n return handler.parse(value);\n }\n\n switch (control.type) {\n case \"number\":\n // Remove formatting characters\n // WHY: Users type \"1,234.56\" or \"$50.00\"\n return parseFloat(value.replace(/[,$]/g, \"\"));\n\n case \"boolean\": {\n const lower = value.toLowerCase();\n return [\"true\", \"yes\", \"1\", \"on\"].includes(lower);\n }\n\n case \"date\": {\n const timestamp = Date.parse(value);\n return Number.isFinite(timestamp)\n ? new Date(timestamp).toISOString()\n : value;\n }\n default:\n // Keep as string for text-like types\n return value;\n }\n}\n\n// ============================================================================\n// VALUE FORMATTING\n// ============================================================================\n\n/**\n * Format a value for display.\n *\n * WHY formatting:\n * - Numbers should have locale formatting\n * - Booleans should be \"Yes\"/\"No\" not \"true\"/\"false\"\n * - Sensitive values should be masked\n * - Select values should show label not value\n *\n * @param value - The value to format\n * @param control - Field definition with display hints\n * @returns Human-readable string representation\n */\nexport function formatValue(value: JsonValue, control: FormControl): string {\n if (value === undefined || value === null) return \"\";\n\n // Check for custom type handler\n const handler = typeHandlers.get(control.type);\n if (handler?.format) {\n return handler.format(value);\n }\n\n // Sensitive fields should be masked\n // WHY: Passwords, tokens shouldn't be echoed back to user\n if (control.sensitive) {\n const strVal = String(value);\n if (strVal.length > 8) {\n return `${strVal.slice(0, 4)}...${strVal.slice(-4)}`;\n }\n return \"****\";\n }\n\n switch (control.type) {\n case \"number\":\n // Use locale formatting for numbers\n return typeof value === \"number\" ? value.toLocaleString() : String(value);\n\n case \"boolean\":\n // Human-friendly boolean display\n return value ? \"Yes\" : \"No\";\n\n case \"date\":\n // Locale-appropriate date format\n return value instanceof Date ? value.toLocaleDateString() : String(value);\n\n case \"select\":\n // Show option label instead of value\n // WHY: User sees \"United States\" not \"US\"\n if (control.options) {\n const option = control.options.find(\n (opt) => opt.value === String(value),\n );\n if (option) return option.label;\n }\n return String(value);\n\n case \"file\":\n // Show file names\n if (Array.isArray(value)) {\n return value\n .map((f) => (f as { name?: string }).name || \"file\")\n .join(\", \");\n }\n return (value as { name?: string }).name || \"file\";\n\n default:\n return String(value);\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,26 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elizaos/plugin-form",
|
|
3
|
-
"
|
|
4
|
-
"version": "2.0.0-alpha.9",
|
|
3
|
+
"version": "2.0.0-beta.1",
|
|
5
4
|
"type": "module",
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"types": "dist/index.d.ts",
|
|
9
|
-
"packageType": "plugin",
|
|
10
|
-
"platform": "node",
|
|
11
|
-
"license": "MIT",
|
|
12
|
-
"author": "Odilitime",
|
|
13
|
-
"keywords": [
|
|
14
|
-
"plugin",
|
|
15
|
-
"elizaos",
|
|
16
|
-
"form",
|
|
17
|
-
"conversational",
|
|
18
|
-
"data-collection"
|
|
19
|
-
],
|
|
20
|
-
"repository": {
|
|
21
|
-
"type": "git",
|
|
22
|
-
"url": "https://github.com/elizaos/elizaos"
|
|
23
|
-
},
|
|
5
|
+
"description": "Eliza plugin-form: conversational forms as guardrails for guided user journeys.",
|
|
6
|
+
"main": "./dist/index.js",
|
|
24
7
|
"exports": {
|
|
25
8
|
"./package.json": "./package.json",
|
|
26
9
|
".": {
|
|
@@ -29,32 +12,46 @@
|
|
|
29
12
|
"default": "./dist/index.js"
|
|
30
13
|
}
|
|
31
14
|
},
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"package.json"
|
|
36
|
-
],
|
|
37
|
-
"peerDependencies": {
|
|
38
|
-
"@elizaos/core": "2.0.0-alpha.3"
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@elizaos/core": "2.0.0-beta.1",
|
|
17
|
+
"uuid": "^14.0.0"
|
|
39
18
|
},
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
19
|
+
"agentConfig": {
|
|
20
|
+
"pluginType": "elizaos:plugin:1.0.0",
|
|
21
|
+
"pluginParameters": {},
|
|
22
|
+
"description": "Conversational forms for structured data collection."
|
|
44
23
|
},
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
"
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
"format:check": "bunx @biomejs/biome format ."
|
|
24
|
+
"elizaos": {
|
|
25
|
+
"app": {
|
|
26
|
+
"heroImage": "assets/hero.png"
|
|
27
|
+
},
|
|
28
|
+
"plugin": {
|
|
29
|
+
"autoEnableModule": "./auto-enable.ts",
|
|
30
|
+
"capabilities": [
|
|
31
|
+
"forms"
|
|
32
|
+
]
|
|
33
|
+
}
|
|
56
34
|
},
|
|
57
35
|
"publishConfig": {
|
|
58
36
|
"access": "public"
|
|
37
|
+
},
|
|
38
|
+
"types": "./dist/index.d.ts",
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "bun run build:js && bun run build:types",
|
|
41
|
+
"clean": "rm -rf dist",
|
|
42
|
+
"test": "vitest run --config vitest.config.ts",
|
|
43
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
44
|
+
"build:js": "tsup --config ../tsup.plugin-packages.shared.ts",
|
|
45
|
+
"build:types": "tsc --noCheck -p tsconfig.build.json"
|
|
46
|
+
},
|
|
47
|
+
"files": [
|
|
48
|
+
"dist",
|
|
49
|
+
"auto-enable.ts"
|
|
50
|
+
],
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@types/node": "^25.0.3",
|
|
53
|
+
"tsup": "^8.5.1",
|
|
54
|
+
"typescript": "^6.0.3",
|
|
55
|
+
"vitest": "^4.0.18"
|
|
59
56
|
}
|
|
60
57
|
}
|