office-open 0.13.0 → 0.13.2

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/ai/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { generate } from "../generate.mjs";
2
- import { a as sliceDocumentSchema, g as validateDocumentInput, n as getSkeletonSchema, r as UnknownDefinitionError, t as renderSliceTypeText } from "../schemas-LxuRToZl.mjs";
2
+ import { a as sliceDocumentSchema, g as validateDocumentInput, n as getSkeletonSchema, r as UnknownDefinitionError, t as renderSliceTypeText } from "../schemas-ChxBeDLa.mjs";
3
3
  import { lintWorkbookFormulas } from "@office-open/xlsx";
4
4
  import { PART_REGISTRIES, encodeBase64, unzipSync, validateOpcConsistency } from "@office-open/core";
5
5
  import { jsonSchema, tool } from "ai";
package/dist/cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { generateToFile, parseInput } from "./generate.mjs";
2
- import { a as sliceDocumentSchema, g as validateDocumentInput, p as SCHEMAS, r as UnknownDefinitionError, t as renderSliceTypeText, u as SCHEMA_ENTRIES } from "./schemas-LxuRToZl.mjs";
2
+ import { a as sliceDocumentSchema, g as validateDocumentInput, p as SCHEMAS, r as UnknownDefinitionError, t as renderSliceTypeText, u as SCHEMA_ENTRIES } from "./schemas-ChxBeDLa.mjs";
3
3
  import { defineCommand, runMain } from "citty";
4
4
  //#region src/cli.ts
5
5
  const FORMATS = [
@@ -1,2 +1,2 @@
1
- import { _ as xlsxSchema, a as sliceDocumentSchema, c as pointerHost, d as SCHEMA_ROOTS, f as entryNames, g as validateDocumentInput, h as pptxSchema, i as assertKnownDefinitions, l as resolvePointer, m as docxSchema, n as getSkeletonSchema, o as sliceSchema, p as SCHEMAS, r as UnknownDefinitionError, s as isPropertyPointer, t as renderSliceTypeText, u as SCHEMA_ENTRIES } from "../schemas-LxuRToZl.mjs";
1
+ import { _ as xlsxSchema, a as sliceDocumentSchema, c as pointerHost, d as SCHEMA_ROOTS, f as entryNames, g as validateDocumentInput, h as pptxSchema, i as assertKnownDefinitions, l as resolvePointer, m as docxSchema, n as getSkeletonSchema, o as sliceSchema, p as SCHEMAS, r as UnknownDefinitionError, s as isPropertyPointer, t as renderSliceTypeText, u as SCHEMA_ENTRIES } from "../schemas-ChxBeDLa.mjs";
2
2
  export { SCHEMAS, SCHEMA_ENTRIES, SCHEMA_ROOTS, UnknownDefinitionError, assertKnownDefinitions, docxSchema, entryNames, getSkeletonSchema, isPropertyPointer, pointerHost, pptxSchema, renderSliceTypeText, resolvePointer, sliceDocumentSchema, sliceSchema, validateDocumentInput, xlsxSchema };
@@ -26,7 +26,7 @@ var docx_schema_default = {
26
26
  "description": "w:abstractNum attributes + child elements + w15 restart.",
27
27
  "properties": {
28
28
  "multiLevelType": {
29
- "description": "w:multiLevelType value.",
29
+ "description": "w:multiLevelType value. Defaults to hybridMultilevel when omitted.",
30
30
  "enum": [
31
31
  "singleLevel",
32
32
  "multilevel",
@@ -50110,4 +50110,4 @@ function renderSliceTypeText(format, requested, slice) {
50110
50110
  //#endregion
50111
50111
  export { xlsxSchema as _, sliceDocumentSchema as a, pointerHost as c, SCHEMA_ROOTS as d, entryNames as f, validateDocumentInput as g, pptxSchema as h, assertKnownDefinitions as i, resolvePointer as l, docxSchema as m, getSkeletonSchema as n, sliceSchema as o, SCHEMAS as p, UnknownDefinitionError as r, isPropertyPointer as s, renderSliceTypeText as t, SCHEMA_ENTRIES as u };
50112
50112
 
50113
- //# sourceMappingURL=schemas-LxuRToZl.mjs.map
50113
+ //# sourceMappingURL=schemas-ChxBeDLa.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"schemas-LxuRToZl.mjs","names":["docxSchemaJson","pptxSchemaJson","xlsxSchemaJson","buildStub"],"sources":["../schemas/docx.schema.json","../schemas/pptx.schema.json","../schemas/xlsx.schema.json","../src/schemas/schemas.ts","../src/schemas/entries.ts","../src/schemas/pointer.ts","../src/schemas/slice.ts","../src/schemas/skeleton.ts","../src/schemas/type-text.ts"],"sourcesContent":["","","","/**\n * The committed draft-07 schemas and their ajv validators.\n *\n * @module\n */\nimport { Ajv, type ValidateFunction } from \"ajv\";\nimport addFormats from \"ajv-formats\";\n\nimport docxSchemaJson from \"../../schemas/docx.schema.json\";\nimport pptxSchemaJson from \"../../schemas/pptx.schema.json\";\nimport xlsxSchemaJson from \"../../schemas/xlsx.schema.json\";\n\n/** Draft-07 JSON Schema describing a format's root options object. */\nexport type JsonSchema = { readonly [key: string]: unknown };\n\nexport const docxSchema = docxSchemaJson as unknown as JsonSchema;\nexport const pptxSchema = pptxSchemaJson as unknown as JsonSchema;\nexport const xlsxSchema = xlsxSchemaJson as unknown as JsonSchema;\n\nexport const SCHEMAS = {\n docx: docxSchema,\n pptx: pptxSchema,\n xlsx: xlsxSchema,\n} as const;\n\nexport type DocumentType = \"docx\" | \"pptx\" | \"xlsx\";\n\nconst validators = new Map<DocumentType, ValidateFunction>();\n\nfunction getValidator(type: DocumentType): ValidateFunction {\n let validate = validators.get(type);\n if (!validate) {\n const ajv = new Ajv({ allErrors: true, allowUnionTypes: true });\n addFormats(ajv);\n validate = ajv.compile(SCHEMAS[type]);\n validators.set(type, validate);\n }\n return validate;\n}\n\n/** Max validation issues surfaced in one error message. */\nconst MAX_REPORTED_ERRORS = 5;\n\n/**\n * Validate document options against the full format schema.\n * Aggregates up to five `instancePath`-qualified issues so callers (and LLMs)\n * can fix several problems per iteration instead of one.\n */\nexport function validateDocumentInput(type: DocumentType, data: unknown): Record<string, unknown> {\n const validate = getValidator(type);\n if (!validate(data)) {\n const errors = validate.errors ?? [];\n const lines = errors.slice(0, MAX_REPORTED_ERRORS).map((error) => {\n const path = (error.instancePath ?? \"\").replaceAll(\"/\", \".\").replace(/^\\./, \"\");\n const message = error.message ?? \"invalid input\";\n return path ? `at \"${path}\": ${message}` : message;\n });\n const more =\n errors.length > MAX_REPORTED_ERRORS ? ` (+${errors.length - MAX_REPORTED_ERRORS} more)` : \"\";\n throw new Error(\n `Invalid ${type} options: ${lines.length > 0 ? lines.join(\"; \") : \"invalid input\"}${more}`,\n );\n }\n return data as Record<string, unknown>;\n}\n","/**\n * Entry catalog for schema slicing and lookup.\n *\n * The catalog is the single source of truth for two concerns:\n * 1. the recommended lookup index (`office-open schema index`)\n * 2. the stub boundary during closure traversal — any catalog member that\n * is NOT requested collapses to an expandable stub instead of being\n * walked, which keeps slices small (a full DocumentOptions closure\n * covers ~440 of 442 definitions).\n *\n * An entry is a domain root a user would construct independently: big enough\n * that stubbing it saves real tokens. Small helper types (BookmarkOptions,\n * SimpleFieldOptions, …) are deliberately NOT cataloged — they always expand\n * inside any slice, so they never need a second lookup.\n *\n * @module\n */\n\nimport type { DocumentType } from \"./schemas\";\n\n/** One cataloged lookup entry. */\nexport interface SchemaEntry {\n /** Definition name in the format's schema `definitions` (the TS type name). */\n name: string;\n /** Coarse domain grouping used by `office-open schema index` output. */\n domain: string;\n /** One-line summary (hand-written; schema descriptions may be missing). */\n summary: string;\n}\n\n/** Root definition of each format's options tree. */\nexport const SCHEMA_ROOTS: Record<DocumentType, string> = {\n docx: \"DocumentOptions\",\n pptx: \"PresentationOptions\",\n xlsx: \"WorkbookOptions\",\n};\n\nconst DOCX_ENTRIES: readonly SchemaEntry[] = [\n {\n name: \"DocumentOptions\",\n domain: \"document\",\n summary: \"Root document options (sections, styles, numbering, settings)\",\n },\n {\n name: \"AppPropertiesOptions\",\n domain: \"document\",\n summary: \"Core + app metadata (title, creator, dates)\",\n },\n { name: \"SettingsOptions\", domain: \"document\", summary: \"w:settings document behavior flags\" },\n {\n name: \"CompatibilityOptions\",\n domain: \"document\",\n summary: \"Legacy Word compatibility settings\",\n },\n {\n name: \"DocumentBackgroundOptions\",\n domain: \"document\",\n summary: \"Page background (color or image)\",\n },\n {\n name: \"MailMergeOptions\",\n domain: \"document\",\n summary: \"Mail merge envelope (dataSource, fields)\",\n },\n { name: \"BibliographyOptions\", domain: \"document\", summary: \"Bibliography + citation sources\" },\n {\n name: \"SectionOptions\",\n domain: \"structure\",\n summary: \"One section: properties, headers/footers, children\",\n },\n {\n name: \"SectionPropertiesOptions\",\n domain: \"structure\",\n summary: \"Page size, margins, columns, grid\",\n },\n {\n name: \"ParagraphOptions\",\n domain: \"text\",\n summary: \"Block paragraph (heading, alignment, spacing, runs)\",\n },\n { name: \"RunOptions\", domain: \"text\", summary: \"Text run (font, color, size, emphasis)\" },\n {\n name: \"ParagraphRunOptions\",\n domain: \"text\",\n summary: \"Run options including child-run wrappers (breaks, tabs, fields)\",\n },\n { name: \"HyperlinkOptions\", domain: \"text\", summary: \"Hyperlink with child runs\" },\n { name: \"MathInput\", domain: \"text\", summary: \"OMML math equation tree\" },\n { name: \"TableOptions\", domain: \"tables\", summary: \"Table (rows, width, borders, layout)\" },\n {\n name: \"TableRowOptions\",\n domain: \"tables\",\n summary: \"Table row (cells, height, header repeat)\",\n },\n {\n name: \"TableCellOptions\",\n domain: \"tables\",\n summary: \"Table cell (span, shading, vertical align)\",\n },\n {\n name: \"TableStyleOptions\",\n domain: \"tables\",\n summary: \"Table style banding + conditional formats\",\n },\n {\n name: \"PictureOptions\",\n domain: \"media\",\n summary: \"Inline/anchored image (data, size, altText)\",\n },\n { name: \"ChartOptions\", domain: \"media\", summary: \"Chart (type, series, axes, legend)\" },\n {\n name: \"ChartSpaceOptions\",\n domain: \"media\",\n summary: \"Full chartSpace envelope wrapping chart options\",\n },\n { name: \"AxisOptions\", domain: \"media\", summary: \"Chart axis (scaling, ticks, labels)\" },\n {\n name: \"ChartSeriesData\",\n domain: \"media\",\n summary: \"Category/value series data (numRef/strRef/lit)\",\n },\n {\n name: \"ScatterSeriesData\",\n domain: \"media\",\n summary: \"Scatter chart x/y series data\",\n },\n {\n name: \"BubbleSeriesData\",\n domain: \"media\",\n summary: \"Bubble chart x/y/size series data\",\n },\n {\n name: \"ColorTransformOptions\",\n domain: \"media\",\n summary: \"Color transforms on a scheme color (lumMod, alpha, …)\",\n },\n {\n name: \"EffectDagOptions\",\n domain: \"media\",\n summary: \"Effect DAG node (one effect in a chain)\",\n },\n {\n name: \"SmartArtOptions\",\n domain: \"media\",\n summary: \"Diagram nodes + layout/style/color references\",\n },\n {\n name: \"VmlShapeOptions\",\n domain: \"vml\",\n summary: \"Generic v:shape (pict/object legacy drawing)\",\n },\n {\n name: \"VmlShapetypeOptions\",\n domain: \"vml\",\n summary: \"Reusable v:shapetype geometry definition\",\n },\n { name: \"VmlGroupOptions\", domain: \"vml\", summary: \"VML shape group (v:group)\" },\n { name: \"VmlImageOptions\", domain: \"vml\", summary: \"VML image (v:imagedata host)\" },\n { name: \"VmlArcOptions\", domain: \"vml\", summary: \"VML arc primitive\" },\n { name: \"VmlCurveOptions\", domain: \"vml\", summary: \"VML curve primitive\" },\n { name: \"VmlLineOptions\", domain: \"vml\", summary: \"VML line primitive\" },\n { name: \"VmlOvalOptions\", domain: \"vml\", summary: \"VML oval primitive\" },\n { name: \"VmlPolylineOptions\", domain: \"vml\", summary: \"VML polyline primitive\" },\n { name: \"VmlRectOptions\", domain: \"vml\", summary: \"VML rectangle primitive\" },\n { name: \"VmlRoundRectOptions\", domain: \"vml\", summary: \"VML rounded rectangle primitive\" },\n {\n name: \"VmlShapeDefaultsOptions\",\n domain: \"vml\",\n summary: \"o:shapedefaults defaults (settings)\",\n },\n {\n name: \"VmlShapeLayoutOptions\",\n domain: \"vml\",\n summary: \"o:shapelayout idmap/regroup tables (settings)\",\n },\n {\n name: \"GroupOptions\",\n domain: \"media\",\n summary: \"Drawing group container (children, transforms)\",\n },\n {\n name: \"ShapeOptions\",\n domain: \"media\",\n summary: \"Floating text box / shape with drawing anchor\",\n },\n {\n name: \"SdtRunOptions\",\n domain: \"media\",\n summary: \"Structured document tag wrapping run content\",\n },\n {\n name: \"SymbolRunOptions\",\n domain: \"text\",\n summary: \"Symbol-font character run (Wingdings etc.)\",\n },\n {\n name: \"ParagraphPropertiesChangeOptions\",\n domain: \"revisions\",\n summary: \"Tracked change to paragraph properties (w:pPrChange)\",\n },\n {\n name: \"RunPropertiesChangeOptions\",\n domain: \"revisions\",\n summary: \"Tracked change to run properties (w:rPrChange)\",\n },\n {\n name: \"TrackChangeChild\",\n domain: \"revisions\",\n summary: \"Inserted/deleted content under a revision marker\",\n },\n { name: \"StylesOptions\", domain: \"styles\", summary: \"Default + paragraph/character/link styles\" },\n {\n name: \"StyleDefinitionOptions\",\n domain: \"styles\",\n summary: \"Base style fields shared by style kinds\",\n },\n { name: \"ParagraphStyleOptions\", domain: \"styles\", summary: \"Paragraph style definition\" },\n { name: \"CharacterStyleOptions\", domain: \"styles\", summary: \"Character (run) style definition\" },\n {\n name: \"NumberingOptions\",\n domain: \"styles\",\n summary: \"Bullet/numbering definitions and references\",\n },\n {\n name: \"CommentOptions\",\n domain: \"annotations\",\n summary: \"One comment (author, children, date)\",\n },\n {\n name: \"FootnotePropertiesOptions\",\n domain: \"annotations\",\n summary: \"Footnotes section options\",\n },\n { name: \"EndnotePropertiesOptions\", domain: \"annotations\", summary: \"Endnotes section options\" },\n { name: \"FootnoteOptions\", domain: \"annotations\", summary: \"Footnote with explicit id\" },\n { name: \"EndnoteOptions\", domain: \"annotations\", summary: \"Endnote with explicit id\" },\n];\n\nconst PPTX_ENTRIES: readonly SchemaEntry[] = [\n {\n name: \"PresentationOptions\",\n domain: \"presentation\",\n summary: \"Root presentation options (slides, size, masters)\",\n },\n { name: \"AppPropertiesOptions\", domain: \"presentation\", summary: \"Core + app metadata\" },\n { name: \"ShowOptions\", domain: \"presentation\", summary: \"Slide show settings\" },\n {\n name: \"CustomShowOptions\",\n domain: \"presentation\",\n summary: \"Custom slide show (name, slide list)\",\n },\n {\n name: \"PrintPropertiesOptions\",\n domain: \"presentation\",\n summary: \"Handouts/notes printing settings\",\n },\n { name: \"SlideOptions\", domain: \"slides\", summary: \"One slide (children, background, notes)\" },\n { name: \"BackgroundOptions\", domain: \"slides\", summary: \"Slide background fill\" },\n {\n name: \"SlideHeaderFooterOptions\",\n domain: \"slides\",\n summary: \"Slide header/footer/slide-number placeholders\",\n },\n {\n name: \"TransitionOptions\",\n domain: \"slides\",\n summary: \"Slide transition (type, duration, triggers)\",\n },\n { name: \"SlideAnimation\", domain: \"slides\", summary: \"Slide animation timeline root\" },\n {\n name: \"AnimationOptions\",\n domain: \"slides\",\n summary: \"Animation effect (target, effect, timing)\",\n },\n {\n name: \"MasterDefinition\",\n domain: \"masters\",\n summary: \"Slide master definition (placeholders, styles)\",\n },\n {\n name: \"ThemeOptions\",\n domain: \"masters\",\n summary: \"Theme (color scheme, fonts, format scheme)\",\n },\n { name: \"NotesMasterOptions\", domain: \"masters\", summary: \"Notes master options\" },\n { name: \"NotesSlideOptions\", domain: \"masters\", summary: \"Notes slide content\" },\n { name: \"HandoutMasterOptions\", domain: \"masters\", summary: \"Handout master options\" },\n {\n name: \"ShapeOptions\",\n domain: \"shapes\",\n summary: \"Auto shape (geometry, fill, outline, textBody)\",\n },\n { name: \"LineShapeOptions\", domain: \"shapes\", summary: \"Straight line shape\" },\n { name: \"ConnectorOptions\", domain: \"shapes\", summary: \"Connector with optional endpoints\" },\n { name: \"GroupOptions\", domain: \"shapes\", summary: \"Group container (children, transforms)\" },\n {\n name: \"TextBodyOptions\",\n domain: \"shapes\",\n summary: \"Shape text body (paragraphs, list styles)\",\n },\n { name: \"BulletOptions\", domain: \"shapes\", summary: \"Paragraph bullet character/numbering\" },\n { name: \"TextListStyleOptions\", domain: \"shapes\", summary: \"List style per outline level\" },\n { name: \"PictureOptions\", domain: \"media\", summary: \"Image (data, size, style, crop)\" },\n { name: \"TableOptions\", domain: \"media\", summary: \"Table (rows, first-row/banding flags)\" },\n { name: \"ChartOptions\", domain: \"media\", summary: \"Chart (type, series, axes, legend)\" },\n { name: \"AxisOptions\", domain: \"media\", summary: \"Chart axis (scaling, ticks, labels)\" },\n {\n name: \"ChartSeriesData\",\n domain: \"media\",\n summary: \"Category/value series data (numRef/strRef/lit)\",\n },\n {\n name: \"ScatterSeriesData\",\n domain: \"media\",\n summary: \"Scatter chart x/y series data\",\n },\n {\n name: \"BubbleSeriesData\",\n domain: \"media\",\n summary: \"Bubble chart x/y/size series data\",\n },\n {\n name: \"ColorTransformOptions\",\n domain: \"media\",\n summary: \"Color transforms on a scheme color (lumMod, alpha, …)\",\n },\n {\n name: \"EffectDagOptions\",\n domain: \"media\",\n summary: \"Effect DAG node (one effect in a chain)\",\n },\n {\n name: \"SmartArtOptions\",\n domain: \"media\",\n summary: \"Diagram nodes + layout/style/color references\",\n },\n { name: \"VideoFrameOptions\", domain: \"media\", summary: \"Video frame (data, poster, trim)\" },\n { name: \"AudioFrameOptions\", domain: \"media\", summary: \"Audio frame (data, icon, playback)\" },\n { name: \"OleOptions\", domain: \"media\", summary: \"OLE object embedding\" },\n];\n\nconst XLSX_ENTRIES: readonly SchemaEntry[] = [\n {\n name: \"WorkbookOptions\",\n domain: \"workbook\",\n summary: \"Root workbook options (worksheets, properties)\",\n },\n { name: \"AppPropertiesOptions\", domain: \"workbook\", summary: \"Core + app metadata\" },\n {\n name: \"WorkbookPropertiesOptions\",\n domain: \"workbook\",\n summary: \"Workbook flags (date1904, iterateCalc)\",\n },\n {\n name: \"WorkbookProtectionOptions\",\n domain: \"workbook\",\n summary: \"Workbook structure/window protection\",\n },\n {\n name: \"CalculationPropertiesOptions\",\n domain: \"workbook\",\n summary: \"Calculation mode and iteration\",\n },\n { name: \"DefinedNameOptions\", domain: \"workbook\", summary: \"Named range/formula\" },\n {\n name: \"WorksheetOptions\",\n domain: \"sheets\",\n summary: \"One worksheet (rows, columns, merges, views)\",\n },\n { name: \"ChartsheetOptions\", domain: \"sheets\", summary: \"Chart sheet hosting one chart\" },\n { name: \"SheetProtectionOptions\", domain: \"sheets\", summary: \"Sheet protection flags\" },\n { name: \"SheetViewOptions\", domain: \"sheets\", summary: \"Sheet view (zoom, selection, pane)\" },\n {\n name: \"HeaderFooterOptions\",\n domain: \"sheets\",\n summary: \"Print header/footer (odd/even/first)\",\n },\n {\n name: \"PageSetupOptions\",\n domain: \"sheets\",\n summary: \"Print page setup (orientation, scale, paper)\",\n },\n { name: \"PageMarginsOptions\", domain: \"sheets\", summary: \"Print page margins\" },\n { name: \"PrintOptions\", domain: \"sheets\", summary: \"Print gridlines/headings/order\" },\n { name: \"RowOptions\", domain: \"data\", summary: \"Row (cells, height, style)\" },\n { name: \"CellOptions\", domain: \"data\", summary: \"Cell (value, style, formula)\" },\n { name: \"RichTextOptions\", domain: \"data\", summary: \"Cell rich text runs\" },\n { name: \"CommentOptions\", domain: \"data\", summary: \"Cell comment\" },\n { name: \"HyperlinkOptions\", domain: \"data\", summary: \"Cell hyperlink\" },\n { name: \"ColumnOptions\", domain: \"data\", summary: \"Column (width, style, custom)\" },\n {\n name: \"StyleOptions\",\n domain: \"style\",\n summary: \"Cell style (font, fill, border, alignment, numFmt)\",\n },\n { name: \"FontOptions\", domain: \"style\", summary: \"Font (name, size, color, emphasis)\" },\n { name: \"FillOptions\", domain: \"style\", summary: \"Pattern or gradient fill\" },\n { name: \"BorderOptions\", domain: \"style\", summary: \"Border sides and diagonals\" },\n { name: \"AlignmentOptions\", domain: \"style\", summary: \"Text alignment and wrap\" },\n { name: \"AutoFilterOptions\", domain: \"features\", summary: \"Auto filter range and columns\" },\n { name: \"DataValidationOptions\", domain: \"features\", summary: \"Cell input validation rules\" },\n { name: \"ConditionalFormatOptions\", domain: \"features\", summary: \"Conditional formatting rules\" },\n { name: \"TableOptions\", domain: \"features\", summary: \"Worksheet table (range, columns, style)\" },\n { name: \"PivotTableOptions\", domain: \"features\", summary: \"Pivot table definition\" },\n { name: \"WorksheetChartOptions\", domain: \"features\", summary: \"Anchored chart on a worksheet\" },\n {\n name: \"ChartSpaceOptions\",\n domain: \"features\",\n summary: \"Full chartSpace envelope wrapping chart options\",\n },\n { name: \"AxisOptions\", domain: \"features\", summary: \"Chart axis (scaling, ticks, labels)\" },\n {\n name: \"ChartSeriesData\",\n domain: \"features\",\n summary: \"Category/value series data (numRef/strRef/lit)\",\n },\n {\n name: \"ScatterSeriesData\",\n domain: \"features\",\n summary: \"Scatter chart x/y series data\",\n },\n {\n name: \"BubbleSeriesData\",\n domain: \"features\",\n summary: \"Bubble chart x/y/size series data\",\n },\n {\n name: \"ColorTransformOptions\",\n domain: \"features\",\n summary: \"Color transforms on a scheme color (lumMod, alpha, …)\",\n },\n {\n name: \"EffectDagOptions\",\n domain: \"features\",\n summary: \"Effect DAG node (one effect in a chain)\",\n },\n { name: \"PictureOptions\", domain: \"media\", summary: \"Anchored image\" },\n { name: \"ShapeOptions\", domain: \"media\", summary: \"Anchored shape\" },\n { name: \"ConnectorOptions\", domain: \"media\", summary: \"Anchored connector\" },\n { name: \"GroupOptions\", domain: \"media\", summary: \"Anchored group container\" },\n { name: \"ThemeOptions\", domain: \"media\", summary: \"Workbook theme\" },\n];\n\n/** Cataloged lookup entries per format. */\nexport const SCHEMA_ENTRIES: Readonly<Record<DocumentType, readonly SchemaEntry[]>> = {\n docx: DOCX_ENTRIES,\n pptx: PPTX_ENTRIES,\n xlsx: XLSX_ENTRIES,\n};\n\n/** Definition names that act as stub boundaries when not requested. */\nexport function entryNames(type: DocumentType): ReadonlySet<string> {\n return new Set(SCHEMA_ENTRIES[type].map((entry) => entry.name));\n}\n","/**\n * Internal `#/definitions/…` pointer resolution.\n *\n * Definition-name refs (`#/definitions/Foo`) and the property-sharing pointers\n * the schema generator emits (`#/definitions/Foo/properties/bar`, replacing\n * schema-identical properties duplicated by extends deep-merge) both resolve\n * here so every consumer — slice extraction, skeleton derivation, type-text\n * rendering — walks them the same way.\n *\n * @module\n */\n\ntype Node = Record<string, unknown>;\n\n/** Resolve one pointer segment: raw key first, then URI-decoded (~0/~1 last). */\nfunction child(container: Node, segment: string): unknown {\n if (segment in container) return container[segment];\n try {\n return container[decodeURIComponent(segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))];\n } catch {\n return undefined;\n }\n}\n\n/** A ref that reaches into a definition instead of naming one. */\nexport function isPropertyPointer(ref: string): boolean {\n return ref.startsWith(\"#/definitions/\") && ref.slice(\"#/definitions/\".length).includes(\"/\");\n}\n\n/** Host definition name of a property pointer (`Foo` for `…/Foo/properties/bar`). */\nexport function pointerHost(ref: string): string {\n const [host] = ref.slice(\"#/definitions/\".length).split(\"/\");\n return decodeURIComponent(host!);\n}\n\n/** Resolve any `#/…` pointer against `root`; undefined when a segment is missing. */\nexport function resolvePointer(root: Node, ref: string): Node | undefined {\n if (!ref.startsWith(\"#/\")) return undefined;\n let node: unknown = root;\n for (const segment of ref.slice(2).split(\"/\")) {\n if (!node || typeof node !== \"object\") return undefined;\n const next = child(node as Node, segment);\n if (next === undefined) return undefined;\n node = next;\n }\n return node && typeof node === \"object\" ? (node as Node) : undefined;\n}\n","/**\n * Schema slicing — extract an on-demand sub-schema by definition name.\n *\n * A full format schema (docx: 442 definitions, ~675 KB) is far too large to\n * hand to an LLM in one piece. `sliceSchema` walks the `$ref` dependency\n * closure of the requested definitions and returns only that subgraph.\n * Cataloged entry names (see entries.ts) act as stub boundaries: any entry\n * that is requested expands fully; any entry merely encountered collapses to\n * an empty-schema stub that names the follow-up lookup — recursive\n * disclosure, the same pattern Agent Skills use for reference files.\n *\n * The slice is a pure subgraph extraction: field names, descriptions, and\n * enums are kept verbatim; the source schema is never mutated. Property-\n * sharing pointers from the generator are resolved against the source and\n * inlined, so a slice never depends on a definition outside its closure.\n *\n * @module\n */\n\nimport { entryNames } from \"./entries\";\nimport { isPropertyPointer, resolvePointer } from \"./pointer\";\nimport { SCHEMAS, type DocumentType, type JsonSchema } from \"./schemas\";\n\n/** Error thrown for unknown definition names; carries did-you-mean suggestions. */\nexport class UnknownDefinitionError extends Error {\n readonly suggestions: readonly string[];\n constructor(names: readonly string[], suggestions: readonly string[]) {\n super(`Unknown definition(s): ${names.join(\", \")}`);\n this.name = \"UnknownDefinitionError\";\n this.suggestions = suggestions;\n }\n}\n\n/**\n * Definition names referenced (directly or transitively) by one definition.\n * Property-sharing pointers do not enqueue their host definition — the host\n * is not needed in the slice; `inlineDanglingPointers` copies the pointed-at\n * schema in, so a shared property never drags a whole definition along.\n */\nfunction refsOf(def: unknown): string[] {\n const text = JSON.stringify(def) ?? \"\";\n const refs = text.match(/#\\/definitions\\/[A-Za-z0-9_%.$-]+(?:\\/[A-Za-z0-9_%.$-]+)*/g) ?? [];\n return [\n ...new Set(\n refs.filter((r) => !isPropertyPointer(r)).map((r) => decodeURIComponent(r.slice(14))),\n ),\n ];\n}\n\n/**\n * Build the empty-schema stub that replaces a non-requested entry.\n * No `type` keyword: boundary definitions may legitimately be scalars\n * (UniversalMeasure strings, enums), and `type: \"object\"` would wrongly\n * reject those values. Kept minimal — a slice can carry hundreds of stubs,\n * so every byte here is multiplied.\n */\nfunction buildStub(\n name: string,\n original: Record<string, unknown>,\n format: DocumentType | undefined,\n): Record<string, unknown> {\n const description = typeof original.description === \"string\" ? `${original.description}\\n` : \"\";\n return {\n title: `${name} (stub)`,\n description:\n `${description}` +\n `Accepts any value. Expand: office-open-schema-lookup ` +\n (format\n ? `{ type: \"${format}\", definitions: [\"${name}\"] }`\n : `with definitions: [\"${name}\"]`),\n };\n}\n\n/**\n * Hard cap on the serialized slice handed back to the model. Tool responses\n * must stay well inside a model's comfortable context budget (Anthropic's\n * tool guidance caps responses at 25k tokens); the entry catalog is the\n * primary size control and this cap is the backstop — a slice that still\n * exceeds it demotes its largest non-requested definitions to stubs until\n * it fits.\n */\nconst MAX_SLICE_BYTES = 64 * 1024;\n\n/**\n * Extract the `$ref` closure of `definitions` from `schema`.\n *\n * Cataloged entries that were not requested become stubs, which keeps the\n * slice proportional to the request instead of the whole schema. The result\n * is a standalone draft-07 schema: when a single definition is requested it\n * is also wired as the root `$ref` so `ajv.compile(slice)` validates that\n * fragment directly.\n */\nexport function sliceSchema(\n schema: JsonSchema,\n definitions: readonly string[],\n format?: DocumentType,\n): JsonSchema {\n const all = schema.definitions as Record<string, Record<string, unknown>> | undefined;\n if (!all) throw new Error(\"schema has no definitions\");\n\n const unknown = definitions.filter((name) => !(name in all));\n if (unknown.length > 0)\n throw new UnknownDefinitionError(unknown, suggestNames(Object.keys(all), unknown[0]));\n\n const stubs = format ? entryNames(format) : new Set<string>();\n const requested = new Set(definitions);\n\n const expanded = new Set<string>();\n const stubbed = new Set<string>();\n const out: Record<string, unknown> = {};\n const queue = [...definitions];\n while (queue.length > 0) {\n const name = queue.pop()!;\n if (expanded.has(name) || stubbed.has(name)) continue;\n if (stubs.has(name) && !requested.has(name)) {\n stubbed.add(name);\n continue;\n }\n expanded.add(name);\n const clone: Record<string, unknown> = structuredClone(all[name]);\n // Pointers are resolved against the source and inlined before refs are\n // collected, so name refs introduced by an inlined property (its host\n // definition is not part of the closure) still enter the walk.\n inlinePropertyPointers(clone, all);\n out[name] = clone;\n for (const ref of refsOf(clone)) {\n if (ref in all) queue.push(ref);\n }\n }\n\n for (const name of stubbed) out[name] = buildStub(name, all[name], format);\n\n // Size backstop: demote the largest non-requested definitions to stubs\n // until the slice fits. Requested definitions are never demoted.\n while (JSON.stringify(out).length > MAX_SLICE_BYTES) {\n const candidates = [...expanded]\n .filter((name) => !requested.has(name))\n .map((name) => [name, JSON.stringify(out[name]).length] as const)\n .sort((a, b) => b[1] - a[1]);\n if (candidates.length === 0) break;\n const [name] = candidates[0]!;\n expanded.delete(name);\n stubbed.add(name);\n out[name] = buildStub(name, all[name], format);\n }\n\n const result: Record<string, unknown> = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n title: `office-open ${format ?? \"\"} schema slice: ${definitions.join(\", \")}`.trim(),\n description:\n \"Sub-schema extracted on demand. Definitions marked as stubs accept any value — \" +\n \"look one up by name to expand it. The full schema ships with the package.\",\n definitions: out,\n };\n if (definitions.length === 1) result.$ref = `#/definitions/${definitions[0]}`;\n return result;\n}\n\n/** Slice a format's schema by definition name (stub guidance names the format). */\nexport function sliceDocumentSchema(\n type: DocumentType,\n definitions: readonly string[],\n): JsonSchema {\n return sliceSchema(SCHEMAS[type], definitions, type);\n}\n\n/**\n * Replace every `#/definitions/<Def>/properties/<name>` pointer in `node`\n * with a clone of the pointed-at schema, resolved against the source schema.\n * A slice is a self-contained subgraph and the pointer's host definition is\n * deliberately not part of it (a shared property never drags its host along),\n * so pointers are inlined before refs are collected. Nested pointers inside\n * an inlined clone are picked up by the same walk.\n */\nfunction inlinePropertyPointers(\n node: unknown,\n source: Record<string, Record<string, unknown>>,\n): void {\n if (Array.isArray(node)) {\n for (const item of node) inlinePropertyPointers(item, source);\n return;\n }\n if (!node || typeof node !== \"object\") return;\n const obj = node as Record<string, unknown>;\n const ref = typeof obj.$ref === \"string\" ? obj.$ref : \"\";\n if (isPropertyPointer(ref)) {\n const target = resolvePointer({ definitions: source }, ref);\n if (target) {\n const clone = structuredClone(target);\n for (const key of Object.keys(obj)) delete obj[key];\n Object.assign(obj, clone);\n }\n }\n for (const value of Object.values(obj)) inlinePropertyPointers(value, source);\n}\n\n/** Throw {@link UnknownDefinitionError} for names missing from the format's schema. */\nexport function assertKnownDefinitions(type: DocumentType, definitions: readonly string[]): void {\n const all = SCHEMAS[type].definitions as Record<string, unknown>;\n const unknown = definitions.filter((name) => !(name in all));\n if (unknown.length > 0) {\n throw new UnknownDefinitionError(unknown, suggestNames(Object.keys(all), unknown[0]));\n }\n}\n\n/** Up to three close candidates for an unknown name (substring match, then edit distance). */\nfunction suggestNames(candidates: readonly string[], query: string): string[] {\n const lower = query.toLowerCase();\n const contains = candidates.filter(\n (c) => c.toLowerCase().includes(lower) || lower.includes(c.toLowerCase()),\n );\n if (contains.length > 0) return contains.slice(0, 3);\n return candidates.filter((c) => levenshtein(c.toLowerCase(), lower) <= 3).slice(0, 3);\n}\n\n/** Classic Levenshtein distance, bounded to short strings. */\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n if (Math.abs(m - n) > 3) return 4;\n let prev = Array.from({ length: n + 1 }, (_, i) => i);\n for (let i = 1; i <= m; i++) {\n const curr = [i];\n for (let j = 1; j <= n; j++) {\n curr[j] = Math.min(\n prev[j]! + 1,\n curr[j - 1]! + 1,\n prev[j - 1]! + (a[i - 1] === b[j - 1] ? 0 : 1),\n );\n }\n prev = curr;\n }\n return prev[n]!;\n}\n","/**\n * Skeleton schemas for the generate tools' `inputSchema`.\n *\n * The full format schema (docx: ~675 KB) is far beyond what any provider\n * accepts in a tool definition. The skeleton is derived at runtime from the\n * real schema so it can never drift from it: top-level fields stay verbatim,\n * the section/slide/worksheet chain expands one level, tagged-union wrapper\n * keys (the `{ paragraph: {...} }` / `{ shape: {...} }` convention) expand\n * into a scannable key list, and everything deeper becomes a stub that names\n * the definition to look up via the schema-lookup tool. The output is fully\n * inlined — no `$ref`/`definitions` — for maximum provider compatibility.\n *\n * A skeleton deliberately accepts more than the full schema (stubs allow any\n * value); the authoritative ajv validation runs inside the tool's `execute`.\n *\n * @module\n */\n\nimport { isPropertyPointer, resolvePointer } from \"./pointer\";\nimport { SCHEMAS, type DocumentType, type JsonSchema } from \"./schemas\";\n\n/** Definitions expanded in the skeleton, outermost first. */\nconst SKELETON_SPINE: Record<DocumentType, readonly string[]> = {\n docx: [\"DocumentOptions\", \"SectionOptions\"],\n pptx: [\"PresentationOptions\", \"SlideOptions\"],\n xlsx: [\"WorkbookOptions\", \"WorksheetOptions\", \"RowOptions\", \"CellOptions\"],\n};\n\ntype Node = Record<string, unknown>;\n\nfunction definitionsOf(type: DocumentType): Record<string, Node> {\n return SCHEMAS[type].definitions as Record<string, Node>;\n}\n\n/** A tagged-union wrapper: every branch is `{ title, properties: {<key>: …}, required: [<key>] }`. */\nfunction isWrapperUnion(def: Node | undefined): boolean {\n const branches = def?.anyOf;\n if (!Array.isArray(branches) || branches.length === 0) return false;\n return branches.every((branch) => {\n const b = branch as Node;\n const required = b.required as string[] | undefined;\n const properties = b.properties as Record<string, unknown> | undefined;\n return (\n typeof b.title === \"string\" &&\n Array.isArray(required) &&\n required.length === 1 &&\n properties !== undefined &&\n Object.keys(properties).length === 1\n );\n });\n}\n\nfunction buildStub(name: string): Node {\n return {\n description: `\"${name}\" stub — fetch its fields with the office-open-schema-lookup tool.`,\n $comment: `office-open-stub:${name}`,\n };\n}\n\n/** Collapse an inline (non-$ref) object schema that is too large to be self-explanatory. */\nfunction collapseInline(node: Node, format: DocumentType, context: string): Node {\n const description = typeof node.description === \"string\" ? `${node.description}\\n\\n` : \"\";\n return {\n type: \"object\",\n description:\n `${description}Collapsed inline object (${context}) — call the office-open-schema-lookup tool ` +\n `with { type: \"${format}\" } for details.`,\n };\n}\n\nfunction convertProperty(\n prop: Node,\n format: DocumentType,\n spine: readonly string[],\n visited: ReadonlySet<string>,\n): Node {\n const ref = typeof prop.$ref === \"string\" ? prop.$ref : undefined;\n if (ref) {\n if (isPropertyPointer(ref)) {\n // property-sharing pointer: resolve to the target property schema and\n // keep converting — the skeleton must stay $ref-free\n if (visited.has(ref)) return buildStub(ref);\n const target = resolvePointer({ definitions: definitionsOf(format) }, ref);\n if (target) {\n return convertProperty(structuredClone(target), format, spine, new Set([...visited, ref]));\n }\n return buildStub(ref);\n }\n const name = decodeURIComponent(ref.slice(\"#/definitions/\".length));\n const target = definitionsOf(format)[name];\n if (visited.has(name)) return buildStub(name);\n if (spine.includes(name)) {\n return convertDefinition(name, target, format, new Set([...visited, name]));\n }\n if (isWrapperUnion(target)) {\n // visited must thread through wrapper expansion: unions can reference\n // themselves (SectionChild.sdt.children → SectionChild).\n return convertWrapperUnion(target, format, new Set([...visited, name]));\n }\n return buildStub(name);\n }\n\n if (Array.isArray(prop.anyOf) || Array.isArray(prop.oneOf)) {\n const key = Array.isArray(prop.anyOf) ? \"anyOf\" : \"oneOf\";\n const branches = (prop[key] as Node[]).map((branch) =>\n convertProperty(branch, format, spine, visited),\n );\n const out: Node = { [key]: branches };\n if (typeof prop.description === \"string\") out.description = prop.description;\n // A wrapper key list (titled branches) is core skeleton information;\n // any other oversized union collapses to a lookup pointer.\n const isWrapperList = branches.some((branch) => branch.title !== undefined);\n if (!isWrapperList && JSON.stringify(out).length >= 400) {\n return collapseInline(prop, format, \"inline union\");\n }\n return out;\n }\n\n if (prop.type === \"array\" && prop.items && typeof prop.items === \"object\") {\n return {\n type: \"array\",\n ...(typeof prop.description === \"string\" ? { description: prop.description } : {}),\n items: convertProperty(prop.items as Node, format, spine, visited),\n };\n }\n\n // Scalars, enums, and small inline objects pass through untouched — but a\n // $ref must never escape into this $ref-less skeleton, so inline schemas\n // that reference other definitions are recursed through their containers\n // first and then run through the same size gate.\n const clone = structuredClone(prop) as Node;\n const text = JSON.stringify(clone);\n if (text.includes(\"#/definitions/\")) {\n if (clone.properties && typeof clone.properties === \"object\") {\n clone.properties = Object.fromEntries(\n Object.entries(clone.properties as Record<string, Node>).map(([key, value]) => [\n key,\n convertProperty(value, format, spine, visited),\n ]),\n );\n }\n if (clone.items && typeof clone.items === \"object\") {\n clone.items = convertProperty(clone.items as Node, format, spine, visited);\n }\n }\n return JSON.stringify(clone).length < 400\n ? clone\n : collapseInline(prop, format, \"large inline object\");\n}\n\nfunction convertWrapperUnion(def: Node, format: DocumentType, visited: ReadonlySet<string>): Node {\n const out: Node = {};\n if (typeof def.description === \"string\") out.description = def.description;\n out.anyOf = (def.anyOf as Node[]).map((branch) => {\n const b = branch as Node;\n const properties = b.properties as Record<string, Node>;\n const key = Object.keys(properties)[0]!;\n const skeletonBranch: Node = {\n title: b.title,\n type: \"object\",\n properties: { [key]: convertProperty(properties[key]!, format, [], visited) },\n required: b.required,\n };\n if (typeof b.description === \"string\") skeletonBranch.description = b.description;\n return skeletonBranch;\n });\n return out;\n}\n\nfunction convertDefinition(\n name: string,\n def: Node,\n format: DocumentType,\n visited: ReadonlySet<string>,\n): Node {\n const spine = SKELETON_SPINE[format].slice(SKELETON_SPINE[format].indexOf(name) + 1);\n const out: Node = {};\n if (typeof def.description === \"string\") out.description = def.description;\n if (typeof def.type === \"string\") out.type = def.type;\n const properties = def.properties as Record<string, Node> | undefined;\n if (properties) {\n const converted: Record<string, Node> = {};\n for (const [key, value] of Object.entries(properties)) {\n converted[key] = convertProperty(value, format, spine, visited);\n }\n out.properties = converted;\n }\n if (Array.isArray(def.required)) out.required = structuredClone(def.required);\n return out;\n}\n\nconst skeletonCache = new Map<DocumentType, JsonSchema>();\n\n/** Derive (and memoize) the skeleton input schema for a format. */\nexport function getSkeletonSchema(type: DocumentType): JsonSchema {\n let skeleton = skeletonCache.get(type);\n if (!skeleton) {\n const [root] = SKELETON_SPINE[type];\n if (!root) throw new Error(`no skeleton spine for ${type}`);\n const visited = new Set<string>([root]);\n skeleton = convertDefinition(root, definitionsOf(type)[root]!, type, visited) as JsonSchema;\n skeletonCache.set(type, skeleton);\n }\n return skeleton;\n}\n","/**\n * Type-definition rendering for schema slices.\n *\n * The AI-facing layer renders slices as type definitions instead of JSON\n * Schema: type definitions are a lossless compression of the same information\n * (BoundaryML's \"type-definition prompting\"), the tokenizers of current\n * models are already tuned to type syntax, and `?`-suffix optionality keeps\n * each field next to its constraint instead of a `required` list many tokens\n * away. Measured on real slices: 38-44% fewer tokens than the JSON form.\n *\n * Validation never goes through this format — the authoritative ajv gate\n * compiles the full draft-07 schemas.\n *\n * @module\n */\n\nimport type { DocumentType, JsonSchema } from \"./schemas\";\n\ntype Node = Record<string, unknown>;\n\n/** Scalar-shorthand names for JSON Schema type keywords. */\nconst SCALAR_NAMES: Record<string, string> = {\n string: \"string\",\n number: \"number\",\n integer: \"number\",\n boolean: \"boolean\",\n null: \"null\",\n};\n\nfunction firstLine(text: string): string {\n return text.split(\"\\n\")[0]!.trim();\n}\n\n/** Compact a description to its first line for trailing comments. */\nfunction trailingComment(node: Node): string {\n return typeof node.description === \"string\" && node.description.length > 0\n ? ` // ${firstLine(node.description)}`\n : \"\";\n}\n\n/**\n * Comment block for a definition header: the full multi-line description —\n * later lines often carry unit and encoding contracts that must survive.\n */\nfunction headerComment(def: Node): string {\n if (typeof def.description !== \"string\" || def.description.length === 0) return \"\";\n const lines = def.description.split(\"\\n\").filter((l) => l.trim().length > 0);\n return ` // ${lines.join(\" · \")}`;\n}\n\n/** Render a property/branch schema node as a compact type expression. */\nfunction renderType(node: Node | undefined): string {\n if (!node || typeof node !== \"object\") return \"unknown\";\n if (typeof node.$ref === \"string\") {\n return decodeURIComponent(node.$ref.slice(\"#/definitions/\".length));\n }\n const branches = (node.anyOf ?? node.oneOf) as Node[] | undefined;\n if (Array.isArray(branches)) return branches.map((b) => renderType(b)).join(\" | \");\n if (Array.isArray(node.enum)) {\n return node.enum.map((v) => JSON.stringify(v)).join(\" | \");\n }\n if (node.type === \"array\") {\n const inner = renderType(node.items as Node | undefined);\n return /^\"[^\"]*\"|[A-Za-z0-9_.]+(\\[\\])?$/.test(inner) ? `${inner}[]` : `(${inner})[]`;\n }\n if (typeof node.type === \"string\" && node.type in SCALAR_NAMES) {\n return SCALAR_NAMES[node.type]!;\n }\n if (node.type === \"object\") {\n // inline object: single line, sub-descriptions dropped (the def they\n // usually point at carries them; keeping every line short is the point)\n const required = new Set(Array.isArray(node.required) ? (node.required as string[]) : []);\n const props = Object.entries((node.properties ?? {}) as Record<string, Node>).map(\n ([key, value]) => `${key}${required.has(key) ? \"\" : \"?\"}: ${renderType(value)}`,\n );\n return props.length > 0 ? `{ ${props.join(\", \")} }` : \"object\";\n }\n // no type keyword (slice stubs): any value\n return \"any\";\n}\n\n/** Render a wrapper-union definition (each branch a single-key object). */\nfunction renderWrapperUnion(name: string, def: Node, description: string): string[] {\n const lines = [`${name} =${description}`];\n for (const branch of def.anyOf as Node[]) {\n const properties = (branch.properties ?? {}) as Record<string, Node>;\n const entries = Object.entries(properties);\n if (entries.length === 1) {\n const [key, value] = entries[0]!;\n lines.push(` | { ${key}: ${renderType(value)} }${trailingComment(branch)}`);\n } else {\n lines.push(` | ${renderType(branch)}`);\n }\n }\n return lines;\n}\n\n/** Render one definition as type-definition lines. */\nfunction renderDefinition(name: string, def: Node): string[] {\n const stubbed = typeof def.title === \"string\" && def.title.endsWith(\" (stub)\");\n if (stubbed)\n return [`${name} // stub — office-open-schema-lookup { definitions: [\"${name}\"] } expands it`];\n\n const description = headerComment(def);\n if (Array.isArray(def.enum)) {\n return [`${name} = ${def.enum.map((v) => JSON.stringify(v)).join(\" | \")}${description}`];\n }\n if (Array.isArray(def.anyOf ?? def.oneOf)) {\n return renderWrapperUnion(name, def, description);\n }\n if (def.type === \"object\" && def.properties) {\n const required = new Set(Array.isArray(def.required) ? (def.required as string[]) : []);\n const lines = [`${name} {${description}`];\n for (const [key, value] of Object.entries(def.properties as Record<string, Node>)) {\n lines.push(\n ` ${key}${required.has(key) ? \"\" : \"?\"}: ${renderType(value)},${trailingComment(value)}`,\n );\n }\n lines.push(\"}\");\n return lines;\n }\n return [`${name}: ${renderType(def)}${description}`];\n}\n\n/**\n * Render a slice's definitions as a type-definition document for the model.\n * Field order follows the source schema (declaration order), definitions\n * follow the slice's insertion order (requested definitions first).\n */\nexport function renderSliceTypeText(\n format: DocumentType,\n requested: readonly string[],\n slice: JsonSchema,\n): string {\n const header =\n `office-open ${format} type definitions for: ${requested.join(\", \")}. ` +\n `Lines marked \"// stub\" accept any value — expand them with the ` +\n `office-open-schema-lookup tool, e.g. { type: \"${format}\", definitions: [\"StubName\"] }. ` +\n '`?` marks optional fields; `\"a\" | \"b\"` enumerates allowed values.';\n const blocks: string[] = [];\n for (const [name, def] of Object.entries(slice.definitions as Record<string, Node>)) {\n blocks.push(renderDefinition(name, def).join(\"\\n\"));\n }\n return `${header}\\n\\n${blocks.join(\"\\n\\n\")}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"schemas-ChxBeDLa.mjs","names":["docxSchemaJson","pptxSchemaJson","xlsxSchemaJson","buildStub"],"sources":["../schemas/docx.schema.json","../schemas/pptx.schema.json","../schemas/xlsx.schema.json","../src/schemas/schemas.ts","../src/schemas/entries.ts","../src/schemas/pointer.ts","../src/schemas/slice.ts","../src/schemas/skeleton.ts","../src/schemas/type-text.ts"],"sourcesContent":["","","","/**\n * The committed draft-07 schemas and their ajv validators.\n *\n * @module\n */\nimport { Ajv, type ValidateFunction } from \"ajv\";\nimport addFormats from \"ajv-formats\";\n\nimport docxSchemaJson from \"../../schemas/docx.schema.json\";\nimport pptxSchemaJson from \"../../schemas/pptx.schema.json\";\nimport xlsxSchemaJson from \"../../schemas/xlsx.schema.json\";\n\n/** Draft-07 JSON Schema describing a format's root options object. */\nexport type JsonSchema = { readonly [key: string]: unknown };\n\nexport const docxSchema = docxSchemaJson as unknown as JsonSchema;\nexport const pptxSchema = pptxSchemaJson as unknown as JsonSchema;\nexport const xlsxSchema = xlsxSchemaJson as unknown as JsonSchema;\n\nexport const SCHEMAS = {\n docx: docxSchema,\n pptx: pptxSchema,\n xlsx: xlsxSchema,\n} as const;\n\nexport type DocumentType = \"docx\" | \"pptx\" | \"xlsx\";\n\nconst validators = new Map<DocumentType, ValidateFunction>();\n\nfunction getValidator(type: DocumentType): ValidateFunction {\n let validate = validators.get(type);\n if (!validate) {\n const ajv = new Ajv({ allErrors: true, allowUnionTypes: true });\n addFormats(ajv);\n validate = ajv.compile(SCHEMAS[type]);\n validators.set(type, validate);\n }\n return validate;\n}\n\n/** Max validation issues surfaced in one error message. */\nconst MAX_REPORTED_ERRORS = 5;\n\n/**\n * Validate document options against the full format schema.\n * Aggregates up to five `instancePath`-qualified issues so callers (and LLMs)\n * can fix several problems per iteration instead of one.\n */\nexport function validateDocumentInput(type: DocumentType, data: unknown): Record<string, unknown> {\n const validate = getValidator(type);\n if (!validate(data)) {\n const errors = validate.errors ?? [];\n const lines = errors.slice(0, MAX_REPORTED_ERRORS).map((error) => {\n const path = (error.instancePath ?? \"\").replaceAll(\"/\", \".\").replace(/^\\./, \"\");\n const message = error.message ?? \"invalid input\";\n return path ? `at \"${path}\": ${message}` : message;\n });\n const more =\n errors.length > MAX_REPORTED_ERRORS ? ` (+${errors.length - MAX_REPORTED_ERRORS} more)` : \"\";\n throw new Error(\n `Invalid ${type} options: ${lines.length > 0 ? lines.join(\"; \") : \"invalid input\"}${more}`,\n );\n }\n return data as Record<string, unknown>;\n}\n","/**\n * Entry catalog for schema slicing and lookup.\n *\n * The catalog is the single source of truth for two concerns:\n * 1. the recommended lookup index (`office-open schema index`)\n * 2. the stub boundary during closure traversal — any catalog member that\n * is NOT requested collapses to an expandable stub instead of being\n * walked, which keeps slices small (a full DocumentOptions closure\n * covers ~440 of 442 definitions).\n *\n * An entry is a domain root a user would construct independently: big enough\n * that stubbing it saves real tokens. Small helper types (BookmarkOptions,\n * SimpleFieldOptions, …) are deliberately NOT cataloged — they always expand\n * inside any slice, so they never need a second lookup.\n *\n * @module\n */\n\nimport type { DocumentType } from \"./schemas\";\n\n/** One cataloged lookup entry. */\nexport interface SchemaEntry {\n /** Definition name in the format's schema `definitions` (the TS type name). */\n name: string;\n /** Coarse domain grouping used by `office-open schema index` output. */\n domain: string;\n /** One-line summary (hand-written; schema descriptions may be missing). */\n summary: string;\n}\n\n/** Root definition of each format's options tree. */\nexport const SCHEMA_ROOTS: Record<DocumentType, string> = {\n docx: \"DocumentOptions\",\n pptx: \"PresentationOptions\",\n xlsx: \"WorkbookOptions\",\n};\n\nconst DOCX_ENTRIES: readonly SchemaEntry[] = [\n {\n name: \"DocumentOptions\",\n domain: \"document\",\n summary: \"Root document options (sections, styles, numbering, settings)\",\n },\n {\n name: \"AppPropertiesOptions\",\n domain: \"document\",\n summary: \"Core + app metadata (title, creator, dates)\",\n },\n { name: \"SettingsOptions\", domain: \"document\", summary: \"w:settings document behavior flags\" },\n {\n name: \"CompatibilityOptions\",\n domain: \"document\",\n summary: \"Legacy Word compatibility settings\",\n },\n {\n name: \"DocumentBackgroundOptions\",\n domain: \"document\",\n summary: \"Page background (color or image)\",\n },\n {\n name: \"MailMergeOptions\",\n domain: \"document\",\n summary: \"Mail merge envelope (dataSource, fields)\",\n },\n { name: \"BibliographyOptions\", domain: \"document\", summary: \"Bibliography + citation sources\" },\n {\n name: \"SectionOptions\",\n domain: \"structure\",\n summary: \"One section: properties, headers/footers, children\",\n },\n {\n name: \"SectionPropertiesOptions\",\n domain: \"structure\",\n summary: \"Page size, margins, columns, grid\",\n },\n {\n name: \"ParagraphOptions\",\n domain: \"text\",\n summary: \"Block paragraph (heading, alignment, spacing, runs)\",\n },\n { name: \"RunOptions\", domain: \"text\", summary: \"Text run (font, color, size, emphasis)\" },\n {\n name: \"ParagraphRunOptions\",\n domain: \"text\",\n summary: \"Run options including child-run wrappers (breaks, tabs, fields)\",\n },\n { name: \"HyperlinkOptions\", domain: \"text\", summary: \"Hyperlink with child runs\" },\n { name: \"MathInput\", domain: \"text\", summary: \"OMML math equation tree\" },\n { name: \"TableOptions\", domain: \"tables\", summary: \"Table (rows, width, borders, layout)\" },\n {\n name: \"TableRowOptions\",\n domain: \"tables\",\n summary: \"Table row (cells, height, header repeat)\",\n },\n {\n name: \"TableCellOptions\",\n domain: \"tables\",\n summary: \"Table cell (span, shading, vertical align)\",\n },\n {\n name: \"TableStyleOptions\",\n domain: \"tables\",\n summary: \"Table style banding + conditional formats\",\n },\n {\n name: \"PictureOptions\",\n domain: \"media\",\n summary: \"Inline/anchored image (data, size, altText)\",\n },\n { name: \"ChartOptions\", domain: \"media\", summary: \"Chart (type, series, axes, legend)\" },\n {\n name: \"ChartSpaceOptions\",\n domain: \"media\",\n summary: \"Full chartSpace envelope wrapping chart options\",\n },\n { name: \"AxisOptions\", domain: \"media\", summary: \"Chart axis (scaling, ticks, labels)\" },\n {\n name: \"ChartSeriesData\",\n domain: \"media\",\n summary: \"Category/value series data (numRef/strRef/lit)\",\n },\n {\n name: \"ScatterSeriesData\",\n domain: \"media\",\n summary: \"Scatter chart x/y series data\",\n },\n {\n name: \"BubbleSeriesData\",\n domain: \"media\",\n summary: \"Bubble chart x/y/size series data\",\n },\n {\n name: \"ColorTransformOptions\",\n domain: \"media\",\n summary: \"Color transforms on a scheme color (lumMod, alpha, …)\",\n },\n {\n name: \"EffectDagOptions\",\n domain: \"media\",\n summary: \"Effect DAG node (one effect in a chain)\",\n },\n {\n name: \"SmartArtOptions\",\n domain: \"media\",\n summary: \"Diagram nodes + layout/style/color references\",\n },\n {\n name: \"VmlShapeOptions\",\n domain: \"vml\",\n summary: \"Generic v:shape (pict/object legacy drawing)\",\n },\n {\n name: \"VmlShapetypeOptions\",\n domain: \"vml\",\n summary: \"Reusable v:shapetype geometry definition\",\n },\n { name: \"VmlGroupOptions\", domain: \"vml\", summary: \"VML shape group (v:group)\" },\n { name: \"VmlImageOptions\", domain: \"vml\", summary: \"VML image (v:imagedata host)\" },\n { name: \"VmlArcOptions\", domain: \"vml\", summary: \"VML arc primitive\" },\n { name: \"VmlCurveOptions\", domain: \"vml\", summary: \"VML curve primitive\" },\n { name: \"VmlLineOptions\", domain: \"vml\", summary: \"VML line primitive\" },\n { name: \"VmlOvalOptions\", domain: \"vml\", summary: \"VML oval primitive\" },\n { name: \"VmlPolylineOptions\", domain: \"vml\", summary: \"VML polyline primitive\" },\n { name: \"VmlRectOptions\", domain: \"vml\", summary: \"VML rectangle primitive\" },\n { name: \"VmlRoundRectOptions\", domain: \"vml\", summary: \"VML rounded rectangle primitive\" },\n {\n name: \"VmlShapeDefaultsOptions\",\n domain: \"vml\",\n summary: \"o:shapedefaults defaults (settings)\",\n },\n {\n name: \"VmlShapeLayoutOptions\",\n domain: \"vml\",\n summary: \"o:shapelayout idmap/regroup tables (settings)\",\n },\n {\n name: \"GroupOptions\",\n domain: \"media\",\n summary: \"Drawing group container (children, transforms)\",\n },\n {\n name: \"ShapeOptions\",\n domain: \"media\",\n summary: \"Floating text box / shape with drawing anchor\",\n },\n {\n name: \"SdtRunOptions\",\n domain: \"media\",\n summary: \"Structured document tag wrapping run content\",\n },\n {\n name: \"SymbolRunOptions\",\n domain: \"text\",\n summary: \"Symbol-font character run (Wingdings etc.)\",\n },\n {\n name: \"ParagraphPropertiesChangeOptions\",\n domain: \"revisions\",\n summary: \"Tracked change to paragraph properties (w:pPrChange)\",\n },\n {\n name: \"RunPropertiesChangeOptions\",\n domain: \"revisions\",\n summary: \"Tracked change to run properties (w:rPrChange)\",\n },\n {\n name: \"TrackChangeChild\",\n domain: \"revisions\",\n summary: \"Inserted/deleted content under a revision marker\",\n },\n { name: \"StylesOptions\", domain: \"styles\", summary: \"Default + paragraph/character/link styles\" },\n {\n name: \"StyleDefinitionOptions\",\n domain: \"styles\",\n summary: \"Base style fields shared by style kinds\",\n },\n { name: \"ParagraphStyleOptions\", domain: \"styles\", summary: \"Paragraph style definition\" },\n { name: \"CharacterStyleOptions\", domain: \"styles\", summary: \"Character (run) style definition\" },\n {\n name: \"NumberingOptions\",\n domain: \"styles\",\n summary: \"Bullet/numbering definitions and references\",\n },\n {\n name: \"CommentOptions\",\n domain: \"annotations\",\n summary: \"One comment (author, children, date)\",\n },\n {\n name: \"FootnotePropertiesOptions\",\n domain: \"annotations\",\n summary: \"Footnotes section options\",\n },\n { name: \"EndnotePropertiesOptions\", domain: \"annotations\", summary: \"Endnotes section options\" },\n { name: \"FootnoteOptions\", domain: \"annotations\", summary: \"Footnote with explicit id\" },\n { name: \"EndnoteOptions\", domain: \"annotations\", summary: \"Endnote with explicit id\" },\n];\n\nconst PPTX_ENTRIES: readonly SchemaEntry[] = [\n {\n name: \"PresentationOptions\",\n domain: \"presentation\",\n summary: \"Root presentation options (slides, size, masters)\",\n },\n { name: \"AppPropertiesOptions\", domain: \"presentation\", summary: \"Core + app metadata\" },\n { name: \"ShowOptions\", domain: \"presentation\", summary: \"Slide show settings\" },\n {\n name: \"CustomShowOptions\",\n domain: \"presentation\",\n summary: \"Custom slide show (name, slide list)\",\n },\n {\n name: \"PrintPropertiesOptions\",\n domain: \"presentation\",\n summary: \"Handouts/notes printing settings\",\n },\n { name: \"SlideOptions\", domain: \"slides\", summary: \"One slide (children, background, notes)\" },\n { name: \"BackgroundOptions\", domain: \"slides\", summary: \"Slide background fill\" },\n {\n name: \"SlideHeaderFooterOptions\",\n domain: \"slides\",\n summary: \"Slide header/footer/slide-number placeholders\",\n },\n {\n name: \"TransitionOptions\",\n domain: \"slides\",\n summary: \"Slide transition (type, duration, triggers)\",\n },\n { name: \"SlideAnimation\", domain: \"slides\", summary: \"Slide animation timeline root\" },\n {\n name: \"AnimationOptions\",\n domain: \"slides\",\n summary: \"Animation effect (target, effect, timing)\",\n },\n {\n name: \"MasterDefinition\",\n domain: \"masters\",\n summary: \"Slide master definition (placeholders, styles)\",\n },\n {\n name: \"ThemeOptions\",\n domain: \"masters\",\n summary: \"Theme (color scheme, fonts, format scheme)\",\n },\n { name: \"NotesMasterOptions\", domain: \"masters\", summary: \"Notes master options\" },\n { name: \"NotesSlideOptions\", domain: \"masters\", summary: \"Notes slide content\" },\n { name: \"HandoutMasterOptions\", domain: \"masters\", summary: \"Handout master options\" },\n {\n name: \"ShapeOptions\",\n domain: \"shapes\",\n summary: \"Auto shape (geometry, fill, outline, textBody)\",\n },\n { name: \"LineShapeOptions\", domain: \"shapes\", summary: \"Straight line shape\" },\n { name: \"ConnectorOptions\", domain: \"shapes\", summary: \"Connector with optional endpoints\" },\n { name: \"GroupOptions\", domain: \"shapes\", summary: \"Group container (children, transforms)\" },\n {\n name: \"TextBodyOptions\",\n domain: \"shapes\",\n summary: \"Shape text body (paragraphs, list styles)\",\n },\n { name: \"BulletOptions\", domain: \"shapes\", summary: \"Paragraph bullet character/numbering\" },\n { name: \"TextListStyleOptions\", domain: \"shapes\", summary: \"List style per outline level\" },\n { name: \"PictureOptions\", domain: \"media\", summary: \"Image (data, size, style, crop)\" },\n { name: \"TableOptions\", domain: \"media\", summary: \"Table (rows, first-row/banding flags)\" },\n { name: \"ChartOptions\", domain: \"media\", summary: \"Chart (type, series, axes, legend)\" },\n { name: \"AxisOptions\", domain: \"media\", summary: \"Chart axis (scaling, ticks, labels)\" },\n {\n name: \"ChartSeriesData\",\n domain: \"media\",\n summary: \"Category/value series data (numRef/strRef/lit)\",\n },\n {\n name: \"ScatterSeriesData\",\n domain: \"media\",\n summary: \"Scatter chart x/y series data\",\n },\n {\n name: \"BubbleSeriesData\",\n domain: \"media\",\n summary: \"Bubble chart x/y/size series data\",\n },\n {\n name: \"ColorTransformOptions\",\n domain: \"media\",\n summary: \"Color transforms on a scheme color (lumMod, alpha, …)\",\n },\n {\n name: \"EffectDagOptions\",\n domain: \"media\",\n summary: \"Effect DAG node (one effect in a chain)\",\n },\n {\n name: \"SmartArtOptions\",\n domain: \"media\",\n summary: \"Diagram nodes + layout/style/color references\",\n },\n { name: \"VideoFrameOptions\", domain: \"media\", summary: \"Video frame (data, poster, trim)\" },\n { name: \"AudioFrameOptions\", domain: \"media\", summary: \"Audio frame (data, icon, playback)\" },\n { name: \"OleOptions\", domain: \"media\", summary: \"OLE object embedding\" },\n];\n\nconst XLSX_ENTRIES: readonly SchemaEntry[] = [\n {\n name: \"WorkbookOptions\",\n domain: \"workbook\",\n summary: \"Root workbook options (worksheets, properties)\",\n },\n { name: \"AppPropertiesOptions\", domain: \"workbook\", summary: \"Core + app metadata\" },\n {\n name: \"WorkbookPropertiesOptions\",\n domain: \"workbook\",\n summary: \"Workbook flags (date1904, iterateCalc)\",\n },\n {\n name: \"WorkbookProtectionOptions\",\n domain: \"workbook\",\n summary: \"Workbook structure/window protection\",\n },\n {\n name: \"CalculationPropertiesOptions\",\n domain: \"workbook\",\n summary: \"Calculation mode and iteration\",\n },\n { name: \"DefinedNameOptions\", domain: \"workbook\", summary: \"Named range/formula\" },\n {\n name: \"WorksheetOptions\",\n domain: \"sheets\",\n summary: \"One worksheet (rows, columns, merges, views)\",\n },\n { name: \"ChartsheetOptions\", domain: \"sheets\", summary: \"Chart sheet hosting one chart\" },\n { name: \"SheetProtectionOptions\", domain: \"sheets\", summary: \"Sheet protection flags\" },\n { name: \"SheetViewOptions\", domain: \"sheets\", summary: \"Sheet view (zoom, selection, pane)\" },\n {\n name: \"HeaderFooterOptions\",\n domain: \"sheets\",\n summary: \"Print header/footer (odd/even/first)\",\n },\n {\n name: \"PageSetupOptions\",\n domain: \"sheets\",\n summary: \"Print page setup (orientation, scale, paper)\",\n },\n { name: \"PageMarginsOptions\", domain: \"sheets\", summary: \"Print page margins\" },\n { name: \"PrintOptions\", domain: \"sheets\", summary: \"Print gridlines/headings/order\" },\n { name: \"RowOptions\", domain: \"data\", summary: \"Row (cells, height, style)\" },\n { name: \"CellOptions\", domain: \"data\", summary: \"Cell (value, style, formula)\" },\n { name: \"RichTextOptions\", domain: \"data\", summary: \"Cell rich text runs\" },\n { name: \"CommentOptions\", domain: \"data\", summary: \"Cell comment\" },\n { name: \"HyperlinkOptions\", domain: \"data\", summary: \"Cell hyperlink\" },\n { name: \"ColumnOptions\", domain: \"data\", summary: \"Column (width, style, custom)\" },\n {\n name: \"StyleOptions\",\n domain: \"style\",\n summary: \"Cell style (font, fill, border, alignment, numFmt)\",\n },\n { name: \"FontOptions\", domain: \"style\", summary: \"Font (name, size, color, emphasis)\" },\n { name: \"FillOptions\", domain: \"style\", summary: \"Pattern or gradient fill\" },\n { name: \"BorderOptions\", domain: \"style\", summary: \"Border sides and diagonals\" },\n { name: \"AlignmentOptions\", domain: \"style\", summary: \"Text alignment and wrap\" },\n { name: \"AutoFilterOptions\", domain: \"features\", summary: \"Auto filter range and columns\" },\n { name: \"DataValidationOptions\", domain: \"features\", summary: \"Cell input validation rules\" },\n { name: \"ConditionalFormatOptions\", domain: \"features\", summary: \"Conditional formatting rules\" },\n { name: \"TableOptions\", domain: \"features\", summary: \"Worksheet table (range, columns, style)\" },\n { name: \"PivotTableOptions\", domain: \"features\", summary: \"Pivot table definition\" },\n { name: \"WorksheetChartOptions\", domain: \"features\", summary: \"Anchored chart on a worksheet\" },\n {\n name: \"ChartSpaceOptions\",\n domain: \"features\",\n summary: \"Full chartSpace envelope wrapping chart options\",\n },\n { name: \"AxisOptions\", domain: \"features\", summary: \"Chart axis (scaling, ticks, labels)\" },\n {\n name: \"ChartSeriesData\",\n domain: \"features\",\n summary: \"Category/value series data (numRef/strRef/lit)\",\n },\n {\n name: \"ScatterSeriesData\",\n domain: \"features\",\n summary: \"Scatter chart x/y series data\",\n },\n {\n name: \"BubbleSeriesData\",\n domain: \"features\",\n summary: \"Bubble chart x/y/size series data\",\n },\n {\n name: \"ColorTransformOptions\",\n domain: \"features\",\n summary: \"Color transforms on a scheme color (lumMod, alpha, …)\",\n },\n {\n name: \"EffectDagOptions\",\n domain: \"features\",\n summary: \"Effect DAG node (one effect in a chain)\",\n },\n { name: \"PictureOptions\", domain: \"media\", summary: \"Anchored image\" },\n { name: \"ShapeOptions\", domain: \"media\", summary: \"Anchored shape\" },\n { name: \"ConnectorOptions\", domain: \"media\", summary: \"Anchored connector\" },\n { name: \"GroupOptions\", domain: \"media\", summary: \"Anchored group container\" },\n { name: \"ThemeOptions\", domain: \"media\", summary: \"Workbook theme\" },\n];\n\n/** Cataloged lookup entries per format. */\nexport const SCHEMA_ENTRIES: Readonly<Record<DocumentType, readonly SchemaEntry[]>> = {\n docx: DOCX_ENTRIES,\n pptx: PPTX_ENTRIES,\n xlsx: XLSX_ENTRIES,\n};\n\n/** Definition names that act as stub boundaries when not requested. */\nexport function entryNames(type: DocumentType): ReadonlySet<string> {\n return new Set(SCHEMA_ENTRIES[type].map((entry) => entry.name));\n}\n","/**\n * Internal `#/definitions/…` pointer resolution.\n *\n * Definition-name refs (`#/definitions/Foo`) and the property-sharing pointers\n * the schema generator emits (`#/definitions/Foo/properties/bar`, replacing\n * schema-identical properties duplicated by extends deep-merge) both resolve\n * here so every consumer — slice extraction, skeleton derivation, type-text\n * rendering — walks them the same way.\n *\n * @module\n */\n\ntype Node = Record<string, unknown>;\n\n/** Resolve one pointer segment: raw key first, then URI-decoded (~0/~1 last). */\nfunction child(container: Node, segment: string): unknown {\n if (segment in container) return container[segment];\n try {\n return container[decodeURIComponent(segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))];\n } catch {\n return undefined;\n }\n}\n\n/** A ref that reaches into a definition instead of naming one. */\nexport function isPropertyPointer(ref: string): boolean {\n return ref.startsWith(\"#/definitions/\") && ref.slice(\"#/definitions/\".length).includes(\"/\");\n}\n\n/** Host definition name of a property pointer (`Foo` for `…/Foo/properties/bar`). */\nexport function pointerHost(ref: string): string {\n const [host] = ref.slice(\"#/definitions/\".length).split(\"/\");\n return decodeURIComponent(host!);\n}\n\n/** Resolve any `#/…` pointer against `root`; undefined when a segment is missing. */\nexport function resolvePointer(root: Node, ref: string): Node | undefined {\n if (!ref.startsWith(\"#/\")) return undefined;\n let node: unknown = root;\n for (const segment of ref.slice(2).split(\"/\")) {\n if (!node || typeof node !== \"object\") return undefined;\n const next = child(node as Node, segment);\n if (next === undefined) return undefined;\n node = next;\n }\n return node && typeof node === \"object\" ? (node as Node) : undefined;\n}\n","/**\n * Schema slicing — extract an on-demand sub-schema by definition name.\n *\n * A full format schema (docx: 442 definitions, ~675 KB) is far too large to\n * hand to an LLM in one piece. `sliceSchema` walks the `$ref` dependency\n * closure of the requested definitions and returns only that subgraph.\n * Cataloged entry names (see entries.ts) act as stub boundaries: any entry\n * that is requested expands fully; any entry merely encountered collapses to\n * an empty-schema stub that names the follow-up lookup — recursive\n * disclosure, the same pattern Agent Skills use for reference files.\n *\n * The slice is a pure subgraph extraction: field names, descriptions, and\n * enums are kept verbatim; the source schema is never mutated. Property-\n * sharing pointers from the generator are resolved against the source and\n * inlined, so a slice never depends on a definition outside its closure.\n *\n * @module\n */\n\nimport { entryNames } from \"./entries\";\nimport { isPropertyPointer, resolvePointer } from \"./pointer\";\nimport { SCHEMAS, type DocumentType, type JsonSchema } from \"./schemas\";\n\n/** Error thrown for unknown definition names; carries did-you-mean suggestions. */\nexport class UnknownDefinitionError extends Error {\n readonly suggestions: readonly string[];\n constructor(names: readonly string[], suggestions: readonly string[]) {\n super(`Unknown definition(s): ${names.join(\", \")}`);\n this.name = \"UnknownDefinitionError\";\n this.suggestions = suggestions;\n }\n}\n\n/**\n * Definition names referenced (directly or transitively) by one definition.\n * Property-sharing pointers do not enqueue their host definition — the host\n * is not needed in the slice; `inlineDanglingPointers` copies the pointed-at\n * schema in, so a shared property never drags a whole definition along.\n */\nfunction refsOf(def: unknown): string[] {\n const text = JSON.stringify(def) ?? \"\";\n const refs = text.match(/#\\/definitions\\/[A-Za-z0-9_%.$-]+(?:\\/[A-Za-z0-9_%.$-]+)*/g) ?? [];\n return [\n ...new Set(\n refs.filter((r) => !isPropertyPointer(r)).map((r) => decodeURIComponent(r.slice(14))),\n ),\n ];\n}\n\n/**\n * Build the empty-schema stub that replaces a non-requested entry.\n * No `type` keyword: boundary definitions may legitimately be scalars\n * (UniversalMeasure strings, enums), and `type: \"object\"` would wrongly\n * reject those values. Kept minimal — a slice can carry hundreds of stubs,\n * so every byte here is multiplied.\n */\nfunction buildStub(\n name: string,\n original: Record<string, unknown>,\n format: DocumentType | undefined,\n): Record<string, unknown> {\n const description = typeof original.description === \"string\" ? `${original.description}\\n` : \"\";\n return {\n title: `${name} (stub)`,\n description:\n `${description}` +\n `Accepts any value. Expand: office-open-schema-lookup ` +\n (format\n ? `{ type: \"${format}\", definitions: [\"${name}\"] }`\n : `with definitions: [\"${name}\"]`),\n };\n}\n\n/**\n * Hard cap on the serialized slice handed back to the model. Tool responses\n * must stay well inside a model's comfortable context budget (Anthropic's\n * tool guidance caps responses at 25k tokens); the entry catalog is the\n * primary size control and this cap is the backstop — a slice that still\n * exceeds it demotes its largest non-requested definitions to stubs until\n * it fits.\n */\nconst MAX_SLICE_BYTES = 64 * 1024;\n\n/**\n * Extract the `$ref` closure of `definitions` from `schema`.\n *\n * Cataloged entries that were not requested become stubs, which keeps the\n * slice proportional to the request instead of the whole schema. The result\n * is a standalone draft-07 schema: when a single definition is requested it\n * is also wired as the root `$ref` so `ajv.compile(slice)` validates that\n * fragment directly.\n */\nexport function sliceSchema(\n schema: JsonSchema,\n definitions: readonly string[],\n format?: DocumentType,\n): JsonSchema {\n const all = schema.definitions as Record<string, Record<string, unknown>> | undefined;\n if (!all) throw new Error(\"schema has no definitions\");\n\n const unknown = definitions.filter((name) => !(name in all));\n if (unknown.length > 0)\n throw new UnknownDefinitionError(unknown, suggestNames(Object.keys(all), unknown[0]));\n\n const stubs = format ? entryNames(format) : new Set<string>();\n const requested = new Set(definitions);\n\n const expanded = new Set<string>();\n const stubbed = new Set<string>();\n const out: Record<string, unknown> = {};\n const queue = [...definitions];\n while (queue.length > 0) {\n const name = queue.pop()!;\n if (expanded.has(name) || stubbed.has(name)) continue;\n if (stubs.has(name) && !requested.has(name)) {\n stubbed.add(name);\n continue;\n }\n expanded.add(name);\n const clone: Record<string, unknown> = structuredClone(all[name]);\n // Pointers are resolved against the source and inlined before refs are\n // collected, so name refs introduced by an inlined property (its host\n // definition is not part of the closure) still enter the walk.\n inlinePropertyPointers(clone, all);\n out[name] = clone;\n for (const ref of refsOf(clone)) {\n if (ref in all) queue.push(ref);\n }\n }\n\n for (const name of stubbed) out[name] = buildStub(name, all[name], format);\n\n // Size backstop: demote the largest non-requested definitions to stubs\n // until the slice fits. Requested definitions are never demoted.\n while (JSON.stringify(out).length > MAX_SLICE_BYTES) {\n const candidates = [...expanded]\n .filter((name) => !requested.has(name))\n .map((name) => [name, JSON.stringify(out[name]).length] as const)\n .sort((a, b) => b[1] - a[1]);\n if (candidates.length === 0) break;\n const [name] = candidates[0]!;\n expanded.delete(name);\n stubbed.add(name);\n out[name] = buildStub(name, all[name], format);\n }\n\n const result: Record<string, unknown> = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n title: `office-open ${format ?? \"\"} schema slice: ${definitions.join(\", \")}`.trim(),\n description:\n \"Sub-schema extracted on demand. Definitions marked as stubs accept any value — \" +\n \"look one up by name to expand it. The full schema ships with the package.\",\n definitions: out,\n };\n if (definitions.length === 1) result.$ref = `#/definitions/${definitions[0]}`;\n return result;\n}\n\n/** Slice a format's schema by definition name (stub guidance names the format). */\nexport function sliceDocumentSchema(\n type: DocumentType,\n definitions: readonly string[],\n): JsonSchema {\n return sliceSchema(SCHEMAS[type], definitions, type);\n}\n\n/**\n * Replace every `#/definitions/<Def>/properties/<name>` pointer in `node`\n * with a clone of the pointed-at schema, resolved against the source schema.\n * A slice is a self-contained subgraph and the pointer's host definition is\n * deliberately not part of it (a shared property never drags its host along),\n * so pointers are inlined before refs are collected. Nested pointers inside\n * an inlined clone are picked up by the same walk.\n */\nfunction inlinePropertyPointers(\n node: unknown,\n source: Record<string, Record<string, unknown>>,\n): void {\n if (Array.isArray(node)) {\n for (const item of node) inlinePropertyPointers(item, source);\n return;\n }\n if (!node || typeof node !== \"object\") return;\n const obj = node as Record<string, unknown>;\n const ref = typeof obj.$ref === \"string\" ? obj.$ref : \"\";\n if (isPropertyPointer(ref)) {\n const target = resolvePointer({ definitions: source }, ref);\n if (target) {\n const clone = structuredClone(target);\n for (const key of Object.keys(obj)) delete obj[key];\n Object.assign(obj, clone);\n }\n }\n for (const value of Object.values(obj)) inlinePropertyPointers(value, source);\n}\n\n/** Throw {@link UnknownDefinitionError} for names missing from the format's schema. */\nexport function assertKnownDefinitions(type: DocumentType, definitions: readonly string[]): void {\n const all = SCHEMAS[type].definitions as Record<string, unknown>;\n const unknown = definitions.filter((name) => !(name in all));\n if (unknown.length > 0) {\n throw new UnknownDefinitionError(unknown, suggestNames(Object.keys(all), unknown[0]));\n }\n}\n\n/** Up to three close candidates for an unknown name (substring match, then edit distance). */\nfunction suggestNames(candidates: readonly string[], query: string): string[] {\n const lower = query.toLowerCase();\n const contains = candidates.filter(\n (c) => c.toLowerCase().includes(lower) || lower.includes(c.toLowerCase()),\n );\n if (contains.length > 0) return contains.slice(0, 3);\n return candidates.filter((c) => levenshtein(c.toLowerCase(), lower) <= 3).slice(0, 3);\n}\n\n/** Classic Levenshtein distance, bounded to short strings. */\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n if (Math.abs(m - n) > 3) return 4;\n let prev = Array.from({ length: n + 1 }, (_, i) => i);\n for (let i = 1; i <= m; i++) {\n const curr = [i];\n for (let j = 1; j <= n; j++) {\n curr[j] = Math.min(\n prev[j]! + 1,\n curr[j - 1]! + 1,\n prev[j - 1]! + (a[i - 1] === b[j - 1] ? 0 : 1),\n );\n }\n prev = curr;\n }\n return prev[n]!;\n}\n","/**\n * Skeleton schemas for the generate tools' `inputSchema`.\n *\n * The full format schema (docx: ~675 KB) is far beyond what any provider\n * accepts in a tool definition. The skeleton is derived at runtime from the\n * real schema so it can never drift from it: top-level fields stay verbatim,\n * the section/slide/worksheet chain expands one level, tagged-union wrapper\n * keys (the `{ paragraph: {...} }` / `{ shape: {...} }` convention) expand\n * into a scannable key list, and everything deeper becomes a stub that names\n * the definition to look up via the schema-lookup tool. The output is fully\n * inlined — no `$ref`/`definitions` — for maximum provider compatibility.\n *\n * A skeleton deliberately accepts more than the full schema (stubs allow any\n * value); the authoritative ajv validation runs inside the tool's `execute`.\n *\n * @module\n */\n\nimport { isPropertyPointer, resolvePointer } from \"./pointer\";\nimport { SCHEMAS, type DocumentType, type JsonSchema } from \"./schemas\";\n\n/** Definitions expanded in the skeleton, outermost first. */\nconst SKELETON_SPINE: Record<DocumentType, readonly string[]> = {\n docx: [\"DocumentOptions\", \"SectionOptions\"],\n pptx: [\"PresentationOptions\", \"SlideOptions\"],\n xlsx: [\"WorkbookOptions\", \"WorksheetOptions\", \"RowOptions\", \"CellOptions\"],\n};\n\ntype Node = Record<string, unknown>;\n\nfunction definitionsOf(type: DocumentType): Record<string, Node> {\n return SCHEMAS[type].definitions as Record<string, Node>;\n}\n\n/** A tagged-union wrapper: every branch is `{ title, properties: {<key>: …}, required: [<key>] }`. */\nfunction isWrapperUnion(def: Node | undefined): boolean {\n const branches = def?.anyOf;\n if (!Array.isArray(branches) || branches.length === 0) return false;\n return branches.every((branch) => {\n const b = branch as Node;\n const required = b.required as string[] | undefined;\n const properties = b.properties as Record<string, unknown> | undefined;\n return (\n typeof b.title === \"string\" &&\n Array.isArray(required) &&\n required.length === 1 &&\n properties !== undefined &&\n Object.keys(properties).length === 1\n );\n });\n}\n\nfunction buildStub(name: string): Node {\n return {\n description: `\"${name}\" stub — fetch its fields with the office-open-schema-lookup tool.`,\n $comment: `office-open-stub:${name}`,\n };\n}\n\n/** Collapse an inline (non-$ref) object schema that is too large to be self-explanatory. */\nfunction collapseInline(node: Node, format: DocumentType, context: string): Node {\n const description = typeof node.description === \"string\" ? `${node.description}\\n\\n` : \"\";\n return {\n type: \"object\",\n description:\n `${description}Collapsed inline object (${context}) — call the office-open-schema-lookup tool ` +\n `with { type: \"${format}\" } for details.`,\n };\n}\n\nfunction convertProperty(\n prop: Node,\n format: DocumentType,\n spine: readonly string[],\n visited: ReadonlySet<string>,\n): Node {\n const ref = typeof prop.$ref === \"string\" ? prop.$ref : undefined;\n if (ref) {\n if (isPropertyPointer(ref)) {\n // property-sharing pointer: resolve to the target property schema and\n // keep converting — the skeleton must stay $ref-free\n if (visited.has(ref)) return buildStub(ref);\n const target = resolvePointer({ definitions: definitionsOf(format) }, ref);\n if (target) {\n return convertProperty(structuredClone(target), format, spine, new Set([...visited, ref]));\n }\n return buildStub(ref);\n }\n const name = decodeURIComponent(ref.slice(\"#/definitions/\".length));\n const target = definitionsOf(format)[name];\n if (visited.has(name)) return buildStub(name);\n if (spine.includes(name)) {\n return convertDefinition(name, target, format, new Set([...visited, name]));\n }\n if (isWrapperUnion(target)) {\n // visited must thread through wrapper expansion: unions can reference\n // themselves (SectionChild.sdt.children → SectionChild).\n return convertWrapperUnion(target, format, new Set([...visited, name]));\n }\n return buildStub(name);\n }\n\n if (Array.isArray(prop.anyOf) || Array.isArray(prop.oneOf)) {\n const key = Array.isArray(prop.anyOf) ? \"anyOf\" : \"oneOf\";\n const branches = (prop[key] as Node[]).map((branch) =>\n convertProperty(branch, format, spine, visited),\n );\n const out: Node = { [key]: branches };\n if (typeof prop.description === \"string\") out.description = prop.description;\n // A wrapper key list (titled branches) is core skeleton information;\n // any other oversized union collapses to a lookup pointer.\n const isWrapperList = branches.some((branch) => branch.title !== undefined);\n if (!isWrapperList && JSON.stringify(out).length >= 400) {\n return collapseInline(prop, format, \"inline union\");\n }\n return out;\n }\n\n if (prop.type === \"array\" && prop.items && typeof prop.items === \"object\") {\n return {\n type: \"array\",\n ...(typeof prop.description === \"string\" ? { description: prop.description } : {}),\n items: convertProperty(prop.items as Node, format, spine, visited),\n };\n }\n\n // Scalars, enums, and small inline objects pass through untouched — but a\n // $ref must never escape into this $ref-less skeleton, so inline schemas\n // that reference other definitions are recursed through their containers\n // first and then run through the same size gate.\n const clone = structuredClone(prop) as Node;\n const text = JSON.stringify(clone);\n if (text.includes(\"#/definitions/\")) {\n if (clone.properties && typeof clone.properties === \"object\") {\n clone.properties = Object.fromEntries(\n Object.entries(clone.properties as Record<string, Node>).map(([key, value]) => [\n key,\n convertProperty(value, format, spine, visited),\n ]),\n );\n }\n if (clone.items && typeof clone.items === \"object\") {\n clone.items = convertProperty(clone.items as Node, format, spine, visited);\n }\n }\n return JSON.stringify(clone).length < 400\n ? clone\n : collapseInline(prop, format, \"large inline object\");\n}\n\nfunction convertWrapperUnion(def: Node, format: DocumentType, visited: ReadonlySet<string>): Node {\n const out: Node = {};\n if (typeof def.description === \"string\") out.description = def.description;\n out.anyOf = (def.anyOf as Node[]).map((branch) => {\n const b = branch as Node;\n const properties = b.properties as Record<string, Node>;\n const key = Object.keys(properties)[0]!;\n const skeletonBranch: Node = {\n title: b.title,\n type: \"object\",\n properties: { [key]: convertProperty(properties[key]!, format, [], visited) },\n required: b.required,\n };\n if (typeof b.description === \"string\") skeletonBranch.description = b.description;\n return skeletonBranch;\n });\n return out;\n}\n\nfunction convertDefinition(\n name: string,\n def: Node,\n format: DocumentType,\n visited: ReadonlySet<string>,\n): Node {\n const spine = SKELETON_SPINE[format].slice(SKELETON_SPINE[format].indexOf(name) + 1);\n const out: Node = {};\n if (typeof def.description === \"string\") out.description = def.description;\n if (typeof def.type === \"string\") out.type = def.type;\n const properties = def.properties as Record<string, Node> | undefined;\n if (properties) {\n const converted: Record<string, Node> = {};\n for (const [key, value] of Object.entries(properties)) {\n converted[key] = convertProperty(value, format, spine, visited);\n }\n out.properties = converted;\n }\n if (Array.isArray(def.required)) out.required = structuredClone(def.required);\n return out;\n}\n\nconst skeletonCache = new Map<DocumentType, JsonSchema>();\n\n/** Derive (and memoize) the skeleton input schema for a format. */\nexport function getSkeletonSchema(type: DocumentType): JsonSchema {\n let skeleton = skeletonCache.get(type);\n if (!skeleton) {\n const [root] = SKELETON_SPINE[type];\n if (!root) throw new Error(`no skeleton spine for ${type}`);\n const visited = new Set<string>([root]);\n skeleton = convertDefinition(root, definitionsOf(type)[root]!, type, visited) as JsonSchema;\n skeletonCache.set(type, skeleton);\n }\n return skeleton;\n}\n","/**\n * Type-definition rendering for schema slices.\n *\n * The AI-facing layer renders slices as type definitions instead of JSON\n * Schema: type definitions are a lossless compression of the same information\n * (BoundaryML's \"type-definition prompting\"), the tokenizers of current\n * models are already tuned to type syntax, and `?`-suffix optionality keeps\n * each field next to its constraint instead of a `required` list many tokens\n * away. Measured on real slices: 38-44% fewer tokens than the JSON form.\n *\n * Validation never goes through this format — the authoritative ajv gate\n * compiles the full draft-07 schemas.\n *\n * @module\n */\n\nimport type { DocumentType, JsonSchema } from \"./schemas\";\n\ntype Node = Record<string, unknown>;\n\n/** Scalar-shorthand names for JSON Schema type keywords. */\nconst SCALAR_NAMES: Record<string, string> = {\n string: \"string\",\n number: \"number\",\n integer: \"number\",\n boolean: \"boolean\",\n null: \"null\",\n};\n\nfunction firstLine(text: string): string {\n return text.split(\"\\n\")[0]!.trim();\n}\n\n/** Compact a description to its first line for trailing comments. */\nfunction trailingComment(node: Node): string {\n return typeof node.description === \"string\" && node.description.length > 0\n ? ` // ${firstLine(node.description)}`\n : \"\";\n}\n\n/**\n * Comment block for a definition header: the full multi-line description —\n * later lines often carry unit and encoding contracts that must survive.\n */\nfunction headerComment(def: Node): string {\n if (typeof def.description !== \"string\" || def.description.length === 0) return \"\";\n const lines = def.description.split(\"\\n\").filter((l) => l.trim().length > 0);\n return ` // ${lines.join(\" · \")}`;\n}\n\n/** Render a property/branch schema node as a compact type expression. */\nfunction renderType(node: Node | undefined): string {\n if (!node || typeof node !== \"object\") return \"unknown\";\n if (typeof node.$ref === \"string\") {\n return decodeURIComponent(node.$ref.slice(\"#/definitions/\".length));\n }\n const branches = (node.anyOf ?? node.oneOf) as Node[] | undefined;\n if (Array.isArray(branches)) return branches.map((b) => renderType(b)).join(\" | \");\n if (Array.isArray(node.enum)) {\n return node.enum.map((v) => JSON.stringify(v)).join(\" | \");\n }\n if (node.type === \"array\") {\n const inner = renderType(node.items as Node | undefined);\n return /^\"[^\"]*\"|[A-Za-z0-9_.]+(\\[\\])?$/.test(inner) ? `${inner}[]` : `(${inner})[]`;\n }\n if (typeof node.type === \"string\" && node.type in SCALAR_NAMES) {\n return SCALAR_NAMES[node.type]!;\n }\n if (node.type === \"object\") {\n // inline object: single line, sub-descriptions dropped (the def they\n // usually point at carries them; keeping every line short is the point)\n const required = new Set(Array.isArray(node.required) ? (node.required as string[]) : []);\n const props = Object.entries((node.properties ?? {}) as Record<string, Node>).map(\n ([key, value]) => `${key}${required.has(key) ? \"\" : \"?\"}: ${renderType(value)}`,\n );\n return props.length > 0 ? `{ ${props.join(\", \")} }` : \"object\";\n }\n // no type keyword (slice stubs): any value\n return \"any\";\n}\n\n/** Render a wrapper-union definition (each branch a single-key object). */\nfunction renderWrapperUnion(name: string, def: Node, description: string): string[] {\n const lines = [`${name} =${description}`];\n for (const branch of def.anyOf as Node[]) {\n const properties = (branch.properties ?? {}) as Record<string, Node>;\n const entries = Object.entries(properties);\n if (entries.length === 1) {\n const [key, value] = entries[0]!;\n lines.push(` | { ${key}: ${renderType(value)} }${trailingComment(branch)}`);\n } else {\n lines.push(` | ${renderType(branch)}`);\n }\n }\n return lines;\n}\n\n/** Render one definition as type-definition lines. */\nfunction renderDefinition(name: string, def: Node): string[] {\n const stubbed = typeof def.title === \"string\" && def.title.endsWith(\" (stub)\");\n if (stubbed)\n return [`${name} // stub — office-open-schema-lookup { definitions: [\"${name}\"] } expands it`];\n\n const description = headerComment(def);\n if (Array.isArray(def.enum)) {\n return [`${name} = ${def.enum.map((v) => JSON.stringify(v)).join(\" | \")}${description}`];\n }\n if (Array.isArray(def.anyOf ?? def.oneOf)) {\n return renderWrapperUnion(name, def, description);\n }\n if (def.type === \"object\" && def.properties) {\n const required = new Set(Array.isArray(def.required) ? (def.required as string[]) : []);\n const lines = [`${name} {${description}`];\n for (const [key, value] of Object.entries(def.properties as Record<string, Node>)) {\n lines.push(\n ` ${key}${required.has(key) ? \"\" : \"?\"}: ${renderType(value)},${trailingComment(value)}`,\n );\n }\n lines.push(\"}\");\n return lines;\n }\n return [`${name}: ${renderType(def)}${description}`];\n}\n\n/**\n * Render a slice's definitions as a type-definition document for the model.\n * Field order follows the source schema (declaration order), definitions\n * follow the slice's insertion order (requested definitions first).\n */\nexport function renderSliceTypeText(\n format: DocumentType,\n requested: readonly string[],\n slice: JsonSchema,\n): string {\n const header =\n `office-open ${format} type definitions for: ${requested.join(\", \")}. ` +\n `Lines marked \"// stub\" accept any value — expand them with the ` +\n `office-open-schema-lookup tool, e.g. { type: \"${format}\", definitions: [\"StubName\"] }. ` +\n '`?` marks optional fields; `\"a\" | \"b\"` enumerates allowed values.';\n const blocks: string[] = [];\n for (const [name, def] of Object.entries(slice.definitions as Record<string, Node>)) {\n blocks.push(renderDefinition(name, def).join(\"\\n\"));\n }\n return `${header}\\n\\n${blocks.join(\"\\n\\n\")}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "office-open",
3
- "version": "0.13.0",
3
+ "version": "0.13.2",
4
4
  "description": "AI-native Office documents in one install — generate, parse, and patch Word, Excel, and PowerPoint from plain JSON, with a CLI, AI SDK tools, and JSON schemas for LLM tool-calling",
5
5
  "keywords": [
6
6
  "ai",
@@ -94,11 +94,11 @@
94
94
  "ajv": "8.20.0",
95
95
  "ajv-formats": "3.0.1",
96
96
  "citty": "0.2.2",
97
- "@office-open/core": "0.13.0",
98
- "@office-open/xlsx": "0.13.0",
99
- "@office-open/docx": "0.13.0",
100
- "@office-open/xml": "0.13.0",
101
- "@office-open/pptx": "0.13.0"
97
+ "@office-open/pptx": "0.13.2",
98
+ "@office-open/docx": "0.13.2",
99
+ "@office-open/xml": "0.13.2",
100
+ "@office-open/core": "0.13.2",
101
+ "@office-open/xlsx": "0.13.2"
102
102
  },
103
103
  "peerDependencies": {
104
104
  "ai": "^6.0.0"
@@ -25,7 +25,7 @@
25
25
  "description": "w:abstractNum attributes + child elements + w15 restart.",
26
26
  "properties": {
27
27
  "multiLevelType": {
28
- "description": "w:multiLevelType value.",
28
+ "description": "w:multiLevelType value. Defaults to hybridMultilevel when omitted.",
29
29
  "enum": ["singleLevel", "multilevel", "hybridMultilevel"],
30
30
  "type": "string"
31
31
  },