From ae208af6a97839a879bc7e5530e6244c56f95560 Mon Sep 17 00:00:00 2001 From: Mimikko-zeus Date: Tue, 3 Mar 2026 01:23:23 +0800 Subject: [PATCH] Please enter the commit message for your changes. Lines starting with '#' will be ignored, and an empty message aborts the commit. On branch main Your branch is up to date with 'origin/main'. Changes to be committed: new file: .claude/skills/algorithmic-art/.openskills.json new file: .claude/skills/algorithmic-art/LICENSE.txt new file: .claude/skills/algorithmic-art/SKILL.md new file: .claude/skills/algorithmic-art/templates/generator_template.js new file: .claude/skills/algorithmic-art/templates/viewer.html new file: .claude/skills/brand-guidelines/.openskills.json new file: .claude/skills/brand-guidelines/LICENSE.txt new file: .claude/skills/brand-guidelines/SKILL.md new file: .claude/skills/canvas-design/.openskills.json new file: .claude/skills/canvas-design/LICENSE.txt new file: .claude/skills/canvas-design/SKILL.md new file: .claude/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf new file: .claude/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/DMMono-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/Gloock-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf new file: .claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf new file: .claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf new file: .claude/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf new file: .claude/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf new file: .claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/Italiana-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/Jura-Light.ttf new file: .claude/skills/canvas-design/canvas-fonts/Jura-Medium.ttf new file: .claude/skills/canvas-design/canvas-fonts/Jura-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/Lora-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf new file: .claude/skills/canvas-design/canvas-fonts/Lora-Italic.ttf new file: .claude/skills/canvas-design/canvas-fonts/Lora-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/Lora-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/Outfit-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf new file: .claude/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf new file: .claude/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf new file: .claude/skills/canvas-design/canvas-fonts/Tektur-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf new file: .claude/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf new file: .claude/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf new file: .claude/skills/doc-coauthoring/.openskills.json new file: .claude/skills/doc-coauthoring/SKILL.md new file: .claude/skills/docx/.openskills.json new file: .claude/skills/docx/LICENSE.txt new file: .claude/skills/docx/SKILL.md new file: .claude/skills/docx/scripts/__init__.py new file: .claude/skills/docx/scripts/accept_changes.py new file: .claude/skills/docx/scripts/comment.py new file: .claude/skills/docx/scripts/office/helpers/__init__.py new file: .claude/skills/docx/scripts/office/helpers/merge_runs.py new file: .claude/skills/docx/scripts/office/helpers/simplify_redlines.py new file: .claude/skills/docx/scripts/office/pack.py new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd new file: .claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd new file: .claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd new file: .claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd new file: .claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd new file: .claude/skills/docx/scripts/office/schemas/mce/mc.xsd new file: .claude/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd new file: .claude/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd new file: .claude/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd new file: .claude/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd new file: .claude/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd new file: .claude/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd new file: .claude/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd new file: .claude/skills/docx/scripts/office/soffice.py new file: .claude/skills/docx/scripts/office/unpack.py new file: .claude/skills/docx/scripts/office/validate.py new file: .claude/skills/docx/scripts/office/validators/__init__.py new file: .claude/skills/docx/scripts/office/validators/base.py new file: .claude/skills/docx/scripts/office/validators/docx.py new file: .claude/skills/docx/scripts/office/validators/pptx.py new file: .claude/skills/docx/scripts/office/validators/redlining.py new file: .claude/skills/docx/scripts/templates/comments.xml new file: .claude/skills/docx/scripts/templates/commentsExtended.xml new file: .claude/skills/docx/scripts/templates/commentsExtensible.xml new file: .claude/skills/docx/scripts/templates/commentsIds.xml new file: .claude/skills/docx/scripts/templates/people.xml new file: .claude/skills/frontend-design/.openskills.json new file: .claude/skills/frontend-design/LICENSE.txt new file: .claude/skills/frontend-design/SKILL.md new file: .claude/skills/internal-comms/.openskills.json new file: .claude/skills/internal-comms/LICENSE.txt new file: .claude/skills/internal-comms/SKILL.md new file: .claude/skills/internal-comms/examples/3p-updates.md new file: .claude/skills/internal-comms/examples/company-newsletter.md new file: .claude/skills/internal-comms/examples/faq-answers.md new file: .claude/skills/internal-comms/examples/general-comms.md new file: .claude/skills/mcp-builder/.openskills.json new file: .claude/skills/mcp-builder/LICENSE.txt new file: .claude/skills/mcp-builder/SKILL.md new file: .claude/skills/mcp-builder/reference/evaluation.md new file: .claude/skills/mcp-builder/reference/mcp_best_practices.md new file: .claude/skills/mcp-builder/reference/node_mcp_server.md new file: .claude/skills/mcp-builder/reference/python_mcp_server.md new file: .claude/skills/mcp-builder/scripts/connections.py new file: .claude/skills/mcp-builder/scripts/evaluation.py new file: .claude/skills/mcp-builder/scripts/example_evaluation.xml new file: .claude/skills/mcp-builder/scripts/requirements.txt new file: .claude/skills/pdf/.openskills.json new file: .claude/skills/pdf/LICENSE.txt new file: .claude/skills/pdf/SKILL.md new file: .claude/skills/pdf/forms.md new file: .claude/skills/pdf/reference.md new file: .claude/skills/pdf/scripts/check_bounding_boxes.py new file: .claude/skills/pdf/scripts/check_fillable_fields.py new file: .claude/skills/pdf/scripts/convert_pdf_to_images.py new file: .claude/skills/pdf/scripts/create_validation_image.py new file: .claude/skills/pdf/scripts/extract_form_field_info.py new file: .claude/skills/pdf/scripts/extract_form_structure.py new file: .claude/skills/pdf/scripts/fill_fillable_fields.py new file: .claude/skills/pdf/scripts/fill_pdf_form_with_annotations.py new file: .claude/skills/pptx/.openskills.json new file: .claude/skills/pptx/LICENSE.txt new file: .claude/skills/pptx/SKILL.md new file: .claude/skills/pptx/editing.md new file: .claude/skills/pptx/pptxgenjs.md new file: .claude/skills/pptx/scripts/__init__.py new file: .claude/skills/pptx/scripts/add_slide.py new file: .claude/skills/pptx/scripts/clean.py new file: .claude/skills/pptx/scripts/office/helpers/__init__.py new file: .claude/skills/pptx/scripts/office/helpers/merge_runs.py new file: .claude/skills/pptx/scripts/office/helpers/simplify_redlines.py new file: .claude/skills/pptx/scripts/office/pack.py new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd new file: .claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd new file: .claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd new file: .claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd new file: .claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd new file: .claude/skills/pptx/scripts/office/schemas/mce/mc.xsd new file: .claude/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd new file: .claude/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd new file: .claude/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd new file: .claude/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd new file: .claude/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd new file: .claude/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd new file: .claude/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd new file: .claude/skills/pptx/scripts/office/soffice.py new file: .claude/skills/pptx/scripts/office/unpack.py new file: .claude/skills/pptx/scripts/office/validate.py new file: .claude/skills/pptx/scripts/office/validators/__init__.py new file: .claude/skills/pptx/scripts/office/validators/base.py new file: .claude/skills/pptx/scripts/office/validators/docx.py new file: .claude/skills/pptx/scripts/office/validators/pptx.py new file: .claude/skills/pptx/scripts/office/validators/redlining.py new file: .claude/skills/pptx/scripts/thumbnail.py new file: .claude/skills/skill-creator/.openskills.json new file: .claude/skills/skill-creator/LICENSE.txt new file: .claude/skills/skill-creator/SKILL.md new file: .claude/skills/skill-creator/agents/analyzer.md new file: .claude/skills/skill-creator/agents/comparator.md new file: .claude/skills/skill-creator/agents/grader.md new file: .claude/skills/skill-creator/assets/eval_review.html new file: .claude/skills/skill-creator/eval-viewer/generate_review.py new file: .claude/skills/skill-creator/eval-viewer/viewer.html new file: .claude/skills/skill-creator/references/schemas.md new file: .claude/skills/skill-creator/scripts/__init__.py new file: .claude/skills/skill-creator/scripts/aggregate_benchmark.py new file: .claude/skills/skill-creator/scripts/generate_report.py new file: .claude/skills/skill-creator/scripts/improve_description.py new file: .claude/skills/skill-creator/scripts/package_skill.py new file: .claude/skills/skill-creator/scripts/quick_validate.py new file: .claude/skills/skill-creator/scripts/run_eval.py new file: .claude/skills/skill-creator/scripts/run_loop.py new file: .claude/skills/skill-creator/scripts/utils.py new file: .claude/skills/slack-gif-creator/.openskills.json new file: .claude/skills/slack-gif-creator/LICENSE.txt new file: .claude/skills/slack-gif-creator/SKILL.md new file: .claude/skills/slack-gif-creator/core/easing.py new file: .claude/skills/slack-gif-creator/core/frame_composer.py new file: .claude/skills/slack-gif-creator/core/gif_builder.py new file: .claude/skills/slack-gif-creator/core/validators.py new file: .claude/skills/slack-gif-creator/requirements.txt new file: .claude/skills/template/.openskills.json new file: .claude/skills/template/SKILL.md new file: .claude/skills/theme-factory/.openskills.json new file: .claude/skills/theme-factory/LICENSE.txt new file: .claude/skills/theme-factory/SKILL.md new file: .claude/skills/theme-factory/theme-showcase.pdf new file: .claude/skills/theme-factory/themes/arctic-frost.md new file: .claude/skills/theme-factory/themes/botanical-garden.md new file: .claude/skills/theme-factory/themes/desert-rose.md new file: .claude/skills/theme-factory/themes/forest-canopy.md new file: .claude/skills/theme-factory/themes/golden-hour.md new file: .claude/skills/theme-factory/themes/midnight-galaxy.md new file: .claude/skills/theme-factory/themes/modern-minimalist.md new file: .claude/skills/theme-factory/themes/ocean-depths.md new file: .claude/skills/theme-factory/themes/sunset-boulevard.md new file: .claude/skills/theme-factory/themes/tech-innovation.md new file: .claude/skills/web-artifacts-builder/.openskills.json new file: .claude/skills/web-artifacts-builder/LICENSE.txt new file: .claude/skills/web-artifacts-builder/SKILL.md new file: .claude/skills/web-artifacts-builder/scripts/bundle-artifact.sh new file: .claude/skills/web-artifacts-builder/scripts/init-artifact.sh new file: .claude/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz new file: .claude/skills/webapp-testing/.openskills.json new file: .claude/skills/webapp-testing/LICENSE.txt new file: .claude/skills/webapp-testing/SKILL.md new file: .claude/skills/webapp-testing/examples/console_logging.py new file: .claude/skills/webapp-testing/examples/element_discovery.py new file: .claude/skills/webapp-testing/examples/static_html_automation.py new file: .claude/skills/webapp-testing/scripts/with_server.py new file: .claude/skills/xlsx/.openskills.json new file: .claude/skills/xlsx/LICENSE.txt new file: .claude/skills/xlsx/SKILL.md new file: .claude/skills/xlsx/scripts/office/helpers/__init__.py new file: .claude/skills/xlsx/scripts/office/helpers/merge_runs.py new file: .claude/skills/xlsx/scripts/office/helpers/simplify_redlines.py new file: .claude/skills/xlsx/scripts/office/pack.py new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd new file: .claude/skills/xlsx/scripts/office/schemas/mce/mc.xsd new file: .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd new file: .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd new file: .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd new file: .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd new file: .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd new file: .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd new file: .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd new file: .claude/skills/xlsx/scripts/office/soffice.py new file: .claude/skills/xlsx/scripts/office/unpack.py new file: .claude/skills/xlsx/scripts/office/validate.py new file: .claude/skills/xlsx/scripts/office/validators/__init__.py new file: .claude/skills/xlsx/scripts/office/validators/base.py new file: .claude/skills/xlsx/scripts/office/validators/docx.py new file: .claude/skills/xlsx/scripts/office/validators/pptx.py new file: .claude/skills/xlsx/scripts/office/validators/redlining.py new file: .claude/skills/xlsx/scripts/recalc.py new file: .env.example new file: .gitignore new file: config/mcp.json new file: config/models.json new file: config/personalities.json new file: docs/AGENTS.md new file: docs/AI_IMPLEMENTATION.md new file: docs/AI_INTEGRATION_COMPLETE.md new file: docs/AI_QUICKSTART.md new file: docs/AI_SUMMARY.md new file: docs/CHANGELOG.md new file: docs/CONFIG_GUIDE.md new file: docs/FIXES.md new file: docs/PROJECT_REFACTOR.md new file: docs/README.md new file: docs/README_INDEX.md new file: examples/ai_example.py new file: main.py new file: pytest.ini new file: requirements.txt new file: scripts/migrate_to_vector_db.py new file: skills/cmd_zip_skill/README.md new file: skills/cmd_zip_skill/__init__.py new file: skills/cmd_zip_skill/main.py new file: skills/cmd_zip_skill/skill.json new file: skills/cmd_zip_skill_1772465404375/README.md new file: skills/cmd_zip_skill_1772465404375/__init__.py new file: skills/cmd_zip_skill_1772465404375/main.py new file: skills/cmd_zip_skill_1772465404375/skill.json new file: skills/cmd_zip_skill_1772465434774/README.md new file: skills/cmd_zip_skill_1772465434774/__init__.py new file: skills/cmd_zip_skill_1772465434774/main.py new file: skills/cmd_zip_skill_1772465434774/skill.json new file: skills/cmd_zip_skill_1772465467809/README.md new file: skills/cmd_zip_skill_1772465467809/__init__.py new file: skills/cmd_zip_skill_1772465467809/main.py new file: skills/cmd_zip_skill_1772465467809/skill.json new file: skills/cmd_zip_skill_1772465652075/README.md new file: skills/cmd_zip_skill_1772465652075/__init__.py new file: skills/cmd_zip_skill_1772465652075/main.py new file: skills/cmd_zip_skill_1772465652075/skill.json new file: skills/cmd_zip_skill_1772465685352/README.md new file: skills/cmd_zip_skill_1772465685352/__init__.py new file: skills/cmd_zip_skill_1772465685352/main.py new file: skills/cmd_zip_skill_1772465685352/skill.json new file: skills/cmd_zip_skill_1772465936294/README.md new file: skills/cmd_zip_skill_1772465936294/__init__.py new file: skills/cmd_zip_skill_1772465936294/main.py new file: skills/cmd_zip_skill_1772465936294/skill.json new file: skills/cmd_zip_skill_1772465966322/README.md new file: skills/cmd_zip_skill_1772465966322/__init__.py new file: skills/cmd_zip_skill_1772465966322/main.py new file: skills/cmd_zip_skill_1772465966322/skill.json new file: skills/cmd_zip_skill_1772466071278/README.md new file: skills/cmd_zip_skill_1772466071278/__init__.py new file: skills/cmd_zip_skill_1772466071278/main.py new file: skills/cmd_zip_skill_1772466071278/skill.json new file: skills/skills_creator/README.md new file: skills/skills_creator/__init__.py new file: skills/skills_creator/main.py new file: skills/skills_creator/skill.json new file: src/__init__.py new file: src/ai/__init__.py new file: src/ai/base.py new file: src/ai/client.py new file: src/ai/docs/README.md new file: src/ai/mcp/__init__.py new file: src/ai/mcp/base.py new file: src/ai/mcp/servers/__init__.py new file: src/ai/mcp/servers/filesystem.py new file: src/ai/memory.py new file: src/ai/models/__init__.py new file: src/ai/models/anthropic_model.py new file: src/ai/models/openai_model.py new file: src/ai/personality.py new file: src/ai/skills/__init__.py new file: src/ai/skills/base.py new file: src/ai/task_manager.py new file: src/ai/vector_store/__init__.py new file: src/ai/vector_store/base.py new file: src/ai/vector_store/chroma_store.py new file: src/ai/vector_store/json_store.py new file: src/core/__init__.py new file: src/core/bot.py new file: src/core/config.py new file: src/handlers/__init__.py new file: src/handlers/message_handler.py new file: src/handlers/message_handler_ai.py new file: src/utils/__init__.py new file: src/utils/logger.py new file: start.bat new file: tests/test_ai.py --- .../skills/algorithmic-art/.openskills.json | 7 + .claude/skills/algorithmic-art/LICENSE.txt | 202 + .claude/skills/algorithmic-art/SKILL.md | 405 ++ .../templates/generator_template.js | 223 + .../algorithmic-art/templates/viewer.html | 599 +++ .../skills/brand-guidelines/.openskills.json | 7 + .claude/skills/brand-guidelines/LICENSE.txt | 202 + .claude/skills/brand-guidelines/SKILL.md | 73 + .claude/skills/canvas-design/.openskills.json | 7 + .claude/skills/canvas-design/LICENSE.txt | 202 + .claude/skills/canvas-design/SKILL.md | 130 + .../canvas-fonts/ArsenalSC-OFL.txt | 93 + .../canvas-fonts/ArsenalSC-Regular.ttf | Bin 0 -> 165848 bytes .../canvas-fonts/BigShoulders-Bold.ttf | Bin 0 -> 94528 bytes .../canvas-fonts/BigShoulders-OFL.txt | 93 + .../canvas-fonts/BigShoulders-Regular.ttf | Bin 0 -> 94396 bytes .../canvas-fonts/Boldonse-OFL.txt | 93 + .../canvas-fonts/Boldonse-Regular.ttf | Bin 0 -> 77168 bytes .../canvas-fonts/BricolageGrotesque-Bold.ttf | Bin 0 -> 90952 bytes .../canvas-fonts/BricolageGrotesque-OFL.txt | 93 + .../BricolageGrotesque-Regular.ttf | Bin 0 -> 90920 bytes .../canvas-fonts/CrimsonPro-Bold.ttf | Bin 0 -> 107352 bytes .../canvas-fonts/CrimsonPro-Italic.ttf | Bin 0 -> 108828 bytes .../canvas-fonts/CrimsonPro-OFL.txt | 93 + .../canvas-fonts/CrimsonPro-Regular.ttf | Bin 0 -> 106696 bytes .../canvas-design/canvas-fonts/DMMono-OFL.txt | 93 + .../canvas-fonts/DMMono-Regular.ttf | Bin 0 -> 48852 bytes .../canvas-fonts/EricaOne-OFL.txt | 94 + .../canvas-fonts/EricaOne-Regular.ttf | Bin 0 -> 24872 bytes .../canvas-fonts/GeistMono-Bold.ttf | Bin 0 -> 78304 bytes .../canvas-fonts/GeistMono-OFL.txt | 93 + .../canvas-fonts/GeistMono-Regular.ttf | Bin 0 -> 78232 bytes .../canvas-design/canvas-fonts/Gloock-OFL.txt | 93 + .../canvas-fonts/Gloock-Regular.ttf | Bin 0 -> 95156 bytes .../canvas-fonts/IBMPlexMono-Bold.ttf | Bin 0 -> 136008 bytes .../canvas-fonts/IBMPlexMono-OFL.txt | 93 + .../canvas-fonts/IBMPlexMono-Regular.ttf | Bin 0 -> 133796 bytes .../canvas-fonts/IBMPlexSerif-Bold.ttf | Bin 0 -> 161000 bytes .../canvas-fonts/IBMPlexSerif-BoldItalic.ttf | Bin 0 -> 169840 bytes .../canvas-fonts/IBMPlexSerif-Italic.ttf | Bin 0 -> 170004 bytes .../canvas-fonts/IBMPlexSerif-Regular.ttf | Bin 0 -> 160380 bytes .../canvas-fonts/InstrumentSans-Bold.ttf | Bin 0 -> 68084 bytes .../InstrumentSans-BoldItalic.ttf | Bin 0 -> 70004 bytes .../canvas-fonts/InstrumentSans-Italic.ttf | Bin 0 -> 69900 bytes .../canvas-fonts/InstrumentSans-OFL.txt | 93 + .../canvas-fonts/InstrumentSans-Regular.ttf | Bin 0 -> 68028 bytes .../canvas-fonts/InstrumentSerif-Italic.ttf | Bin 0 -> 70868 bytes .../canvas-fonts/InstrumentSerif-Regular.ttf | Bin 0 -> 69312 bytes .../canvas-fonts/Italiana-OFL.txt | 93 + .../canvas-fonts/Italiana-Regular.ttf | Bin 0 -> 27184 bytes .../canvas-fonts/JetBrainsMono-Bold.ttf | Bin 0 -> 114828 bytes .../canvas-fonts/JetBrainsMono-OFL.txt | 93 + .../canvas-fonts/JetBrainsMono-Regular.ttf | Bin 0 -> 114904 bytes .../canvas-design/canvas-fonts/Jura-Light.ttf | Bin 0 -> 154308 bytes .../canvas-fonts/Jura-Medium.ttf | Bin 0 -> 154488 bytes .../canvas-design/canvas-fonts/Jura-OFL.txt | 93 + .../canvas-fonts/LibreBaskerville-OFL.txt | 93 + .../canvas-fonts/LibreBaskerville-Regular.ttf | Bin 0 -> 147584 bytes .../canvas-design/canvas-fonts/Lora-Bold.ttf | Bin 0 -> 133828 bytes .../canvas-fonts/Lora-BoldItalic.ttf | Bin 0 -> 140332 bytes .../canvas-fonts/Lora-Italic.ttf | Bin 0 -> 139328 bytes .../canvas-design/canvas-fonts/Lora-OFL.txt | 93 + .../canvas-fonts/Lora-Regular.ttf | Bin 0 -> 133888 bytes .../canvas-fonts/NationalPark-Bold.ttf | Bin 0 -> 79208 bytes .../canvas-fonts/NationalPark-OFL.txt | 93 + .../canvas-fonts/NationalPark-Regular.ttf | Bin 0 -> 76424 bytes .../canvas-fonts/NothingYouCouldDo-OFL.txt | 93 + .../NothingYouCouldDo-Regular.ttf | Bin 0 -> 32020 bytes .../canvas-fonts/Outfit-Bold.ttf | Bin 0 -> 55392 bytes .../canvas-design/canvas-fonts/Outfit-OFL.txt | 93 + .../canvas-fonts/Outfit-Regular.ttf | Bin 0 -> 54912 bytes .../canvas-fonts/PixelifySans-Medium.ttf | Bin 0 -> 51072 bytes .../canvas-fonts/PixelifySans-OFL.txt | 93 + .../canvas-fonts/PoiretOne-OFL.txt | 93 + .../canvas-fonts/PoiretOne-Regular.ttf | Bin 0 -> 45244 bytes .../canvas-fonts/RedHatMono-Bold.ttf | Bin 0 -> 34420 bytes .../canvas-fonts/RedHatMono-OFL.txt | 93 + .../canvas-fonts/RedHatMono-Regular.ttf | Bin 0 -> 34488 bytes .../canvas-fonts/Silkscreen-OFL.txt | 93 + .../canvas-fonts/Silkscreen-Regular.ttf | Bin 0 -> 31960 bytes .../canvas-fonts/SmoochSans-Medium.ttf | Bin 0 -> 59704 bytes .../canvas-fonts/SmoochSans-OFL.txt | 93 + .../canvas-fonts/Tektur-Medium.ttf | Bin 0 -> 76248 bytes .../canvas-design/canvas-fonts/Tektur-OFL.txt | 93 + .../canvas-fonts/Tektur-Regular.ttf | Bin 0 -> 75604 bytes .../canvas-fonts/WorkSans-Bold.ttf | Bin 0 -> 191304 bytes .../canvas-fonts/WorkSans-BoldItalic.ttf | Bin 0 -> 175772 bytes .../canvas-fonts/WorkSans-Italic.ttf | Bin 0 -> 174280 bytes .../canvas-fonts/WorkSans-OFL.txt | 93 + .../canvas-fonts/WorkSans-Regular.ttf | Bin 0 -> 188916 bytes .../canvas-fonts/YoungSerif-OFL.txt | 93 + .../canvas-fonts/YoungSerif-Regular.ttf | Bin 0 -> 105136 bytes .../skills/doc-coauthoring/.openskills.json | 7 + .claude/skills/doc-coauthoring/SKILL.md | 375 ++ .claude/skills/docx/.openskills.json | 7 + .claude/skills/docx/LICENSE.txt | 30 + .claude/skills/docx/SKILL.md | 590 +++ .claude/skills/docx/scripts/__init__.py | 1 + .claude/skills/docx/scripts/accept_changes.py | 135 + .claude/skills/docx/scripts/comment.py | 318 ++ .../docx/scripts/office/helpers/__init__.py | 0 .../docx/scripts/office/helpers/merge_runs.py | 199 + .../office/helpers/simplify_redlines.py | 197 + .claude/skills/docx/scripts/office/pack.py | 159 + .../schemas/ISO-IEC29500-4_2016/dml-chart.xsd | 1499 ++++++ .../ISO-IEC29500-4_2016/dml-chartDrawing.xsd | 146 + .../ISO-IEC29500-4_2016/dml-diagram.xsd | 1085 ++++ .../ISO-IEC29500-4_2016/dml-lockedCanvas.xsd | 11 + .../schemas/ISO-IEC29500-4_2016/dml-main.xsd | 3081 ++++++++++++ .../ISO-IEC29500-4_2016/dml-picture.xsd | 23 + .../dml-spreadsheetDrawing.xsd | 185 + .../dml-wordprocessingDrawing.xsd | 287 ++ .../schemas/ISO-IEC29500-4_2016/pml.xsd | 1676 +++++++ .../shared-additionalCharacteristics.xsd | 28 + .../shared-bibliography.xsd | 144 + .../shared-commonSimpleTypes.xsd | 174 + .../shared-customXmlDataProperties.xsd | 25 + .../shared-customXmlSchemaProperties.xsd | 18 + .../shared-documentPropertiesCustom.xsd | 59 + .../shared-documentPropertiesExtended.xsd | 56 + .../shared-documentPropertiesVariantTypes.xsd | 195 + .../ISO-IEC29500-4_2016/shared-math.xsd | 582 +++ .../shared-relationshipReference.xsd | 25 + .../schemas/ISO-IEC29500-4_2016/sml.xsd | 4439 +++++++++++++++++ .../schemas/ISO-IEC29500-4_2016/vml-main.xsd | 570 +++ .../ISO-IEC29500-4_2016/vml-officeDrawing.xsd | 509 ++ .../vml-presentationDrawing.xsd | 12 + .../vml-spreadsheetDrawing.xsd | 108 + .../vml-wordprocessingDrawing.xsd | 96 + .../schemas/ISO-IEC29500-4_2016/wml.xsd | 3646 ++++++++++++++ .../schemas/ISO-IEC29500-4_2016/xml.xsd | 116 + .../ecma/fouth-edition/opc-contentTypes.xsd | 42 + .../ecma/fouth-edition/opc-coreProperties.xsd | 50 + .../schemas/ecma/fouth-edition/opc-digSig.xsd | 49 + .../ecma/fouth-edition/opc-relationships.xsd | 33 + .../docx/scripts/office/schemas/mce/mc.xsd | 75 + .../office/schemas/microsoft/wml-2010.xsd | 560 +++ .../office/schemas/microsoft/wml-2012.xsd | 67 + .../office/schemas/microsoft/wml-2018.xsd | 14 + .../office/schemas/microsoft/wml-cex-2018.xsd | 20 + .../office/schemas/microsoft/wml-cid-2016.xsd | 13 + .../microsoft/wml-sdtdatahash-2020.xsd | 4 + .../schemas/microsoft/wml-symex-2015.xsd | 8 + .claude/skills/docx/scripts/office/soffice.py | 183 + .claude/skills/docx/scripts/office/unpack.py | 132 + .../skills/docx/scripts/office/validate.py | 111 + .../scripts/office/validators/__init__.py | 15 + .../docx/scripts/office/validators/base.py | 847 ++++ .../docx/scripts/office/validators/docx.py | 446 ++ .../docx/scripts/office/validators/pptx.py | 275 + .../scripts/office/validators/redlining.py | 247 + .../docx/scripts/templates/comments.xml | 3 + .../scripts/templates/commentsExtended.xml | 3 + .../scripts/templates/commentsExtensible.xml | 3 + .../docx/scripts/templates/commentsIds.xml | 3 + .../skills/docx/scripts/templates/people.xml | 3 + .../skills/frontend-design/.openskills.json | 7 + .claude/skills/frontend-design/LICENSE.txt | 177 + .claude/skills/frontend-design/SKILL.md | 42 + .../skills/internal-comms/.openskills.json | 7 + .claude/skills/internal-comms/LICENSE.txt | 202 + .claude/skills/internal-comms/SKILL.md | 32 + .../internal-comms/examples/3p-updates.md | 47 + .../examples/company-newsletter.md | 65 + .../internal-comms/examples/faq-answers.md | 30 + .../internal-comms/examples/general-comms.md | 16 + .claude/skills/mcp-builder/.openskills.json | 7 + .claude/skills/mcp-builder/LICENSE.txt | 202 + .claude/skills/mcp-builder/SKILL.md | 236 + .../mcp-builder/reference/evaluation.md | 602 +++ .../reference/mcp_best_practices.md | 249 + .../mcp-builder/reference/node_mcp_server.md | 970 ++++ .../reference/python_mcp_server.md | 719 +++ .../skills/mcp-builder/scripts/connections.py | 151 + .../skills/mcp-builder/scripts/evaluation.py | 373 ++ .../scripts/example_evaluation.xml | 22 + .../mcp-builder/scripts/requirements.txt | 2 + .claude/skills/pdf/.openskills.json | 7 + .claude/skills/pdf/LICENSE.txt | 30 + .claude/skills/pdf/SKILL.md | 314 ++ .claude/skills/pdf/forms.md | 294 ++ .claude/skills/pdf/reference.md | 612 +++ .../pdf/scripts/check_bounding_boxes.py | 65 + .../pdf/scripts/check_fillable_fields.py | 11 + .../pdf/scripts/convert_pdf_to_images.py | 33 + .../pdf/scripts/create_validation_image.py | 37 + .../pdf/scripts/extract_form_field_info.py | 122 + .../pdf/scripts/extract_form_structure.py | 115 + .../pdf/scripts/fill_fillable_fields.py | 98 + .../scripts/fill_pdf_form_with_annotations.py | 107 + .claude/skills/pptx/.openskills.json | 7 + .claude/skills/pptx/LICENSE.txt | 30 + .claude/skills/pptx/SKILL.md | 232 + .claude/skills/pptx/editing.md | 205 + .claude/skills/pptx/pptxgenjs.md | 420 ++ .claude/skills/pptx/scripts/__init__.py | 0 .claude/skills/pptx/scripts/add_slide.py | 195 + .claude/skills/pptx/scripts/clean.py | 286 ++ .../pptx/scripts/office/helpers/__init__.py | 0 .../pptx/scripts/office/helpers/merge_runs.py | 199 + .../office/helpers/simplify_redlines.py | 197 + .claude/skills/pptx/scripts/office/pack.py | 159 + .../schemas/ISO-IEC29500-4_2016/dml-chart.xsd | 1499 ++++++ .../ISO-IEC29500-4_2016/dml-chartDrawing.xsd | 146 + .../ISO-IEC29500-4_2016/dml-diagram.xsd | 1085 ++++ .../ISO-IEC29500-4_2016/dml-lockedCanvas.xsd | 11 + .../schemas/ISO-IEC29500-4_2016/dml-main.xsd | 3081 ++++++++++++ .../ISO-IEC29500-4_2016/dml-picture.xsd | 23 + .../dml-spreadsheetDrawing.xsd | 185 + .../dml-wordprocessingDrawing.xsd | 287 ++ .../schemas/ISO-IEC29500-4_2016/pml.xsd | 1676 +++++++ .../shared-additionalCharacteristics.xsd | 28 + .../shared-bibliography.xsd | 144 + .../shared-commonSimpleTypes.xsd | 174 + .../shared-customXmlDataProperties.xsd | 25 + .../shared-customXmlSchemaProperties.xsd | 18 + .../shared-documentPropertiesCustom.xsd | 59 + .../shared-documentPropertiesExtended.xsd | 56 + .../shared-documentPropertiesVariantTypes.xsd | 195 + .../ISO-IEC29500-4_2016/shared-math.xsd | 582 +++ .../shared-relationshipReference.xsd | 25 + .../schemas/ISO-IEC29500-4_2016/sml.xsd | 4439 +++++++++++++++++ .../schemas/ISO-IEC29500-4_2016/vml-main.xsd | 570 +++ .../ISO-IEC29500-4_2016/vml-officeDrawing.xsd | 509 ++ .../vml-presentationDrawing.xsd | 12 + .../vml-spreadsheetDrawing.xsd | 108 + .../vml-wordprocessingDrawing.xsd | 96 + .../schemas/ISO-IEC29500-4_2016/wml.xsd | 3646 ++++++++++++++ .../schemas/ISO-IEC29500-4_2016/xml.xsd | 116 + .../ecma/fouth-edition/opc-contentTypes.xsd | 42 + .../ecma/fouth-edition/opc-coreProperties.xsd | 50 + .../schemas/ecma/fouth-edition/opc-digSig.xsd | 49 + .../ecma/fouth-edition/opc-relationships.xsd | 33 + .../pptx/scripts/office/schemas/mce/mc.xsd | 75 + .../office/schemas/microsoft/wml-2010.xsd | 560 +++ .../office/schemas/microsoft/wml-2012.xsd | 67 + .../office/schemas/microsoft/wml-2018.xsd | 14 + .../office/schemas/microsoft/wml-cex-2018.xsd | 20 + .../office/schemas/microsoft/wml-cid-2016.xsd | 13 + .../microsoft/wml-sdtdatahash-2020.xsd | 4 + .../schemas/microsoft/wml-symex-2015.xsd | 8 + .claude/skills/pptx/scripts/office/soffice.py | 183 + .claude/skills/pptx/scripts/office/unpack.py | 132 + .../skills/pptx/scripts/office/validate.py | 111 + .../scripts/office/validators/__init__.py | 15 + .../pptx/scripts/office/validators/base.py | 847 ++++ .../pptx/scripts/office/validators/docx.py | 446 ++ .../pptx/scripts/office/validators/pptx.py | 275 + .../scripts/office/validators/redlining.py | 247 + .claude/skills/pptx/scripts/thumbnail.py | 289 ++ .claude/skills/skill-creator/.openskills.json | 7 + .claude/skills/skill-creator/LICENSE.txt | 202 + .claude/skills/skill-creator/SKILL.md | 479 ++ .../skills/skill-creator/agents/analyzer.md | 274 + .../skills/skill-creator/agents/comparator.md | 202 + .claude/skills/skill-creator/agents/grader.md | 223 + .../skill-creator/assets/eval_review.html | 146 + .../eval-viewer/generate_review.py | 471 ++ .../skill-creator/eval-viewer/viewer.html | 1325 +++++ .../skill-creator/references/schemas.md | 430 ++ .../skills/skill-creator/scripts/__init__.py | 0 .../scripts/aggregate_benchmark.py | 401 ++ .../skill-creator/scripts/generate_report.py | 326 ++ .../scripts/improve_description.py | 248 + .../skill-creator/scripts/package_skill.py | 136 + .../skill-creator/scripts/quick_validate.py | 103 + .../skills/skill-creator/scripts/run_eval.py | 310 ++ .../skills/skill-creator/scripts/run_loop.py | 332 ++ .claude/skills/skill-creator/scripts/utils.py | 47 + .../skills/slack-gif-creator/.openskills.json | 7 + .claude/skills/slack-gif-creator/LICENSE.txt | 202 + .claude/skills/slack-gif-creator/SKILL.md | 254 + .../skills/slack-gif-creator/core/easing.py | 234 + .../slack-gif-creator/core/frame_composer.py | 176 + .../slack-gif-creator/core/gif_builder.py | 269 + .../slack-gif-creator/core/validators.py | 136 + .../skills/slack-gif-creator/requirements.txt | 4 + .claude/skills/template/.openskills.json | 7 + .claude/skills/template/SKILL.md | 6 + .claude/skills/theme-factory/.openskills.json | 7 + .claude/skills/theme-factory/LICENSE.txt | 202 + .claude/skills/theme-factory/SKILL.md | 59 + .../skills/theme-factory/theme-showcase.pdf | Bin 0 -> 124310 bytes .../theme-factory/themes/arctic-frost.md | 19 + .../theme-factory/themes/botanical-garden.md | 19 + .../theme-factory/themes/desert-rose.md | 19 + .../theme-factory/themes/forest-canopy.md | 19 + .../theme-factory/themes/golden-hour.md | 19 + .../theme-factory/themes/midnight-galaxy.md | 19 + .../theme-factory/themes/modern-minimalist.md | 19 + .../theme-factory/themes/ocean-depths.md | 19 + .../theme-factory/themes/sunset-boulevard.md | 19 + .../theme-factory/themes/tech-innovation.md | 19 + .../web-artifacts-builder/.openskills.json | 7 + .../skills/web-artifacts-builder/LICENSE.txt | 202 + .claude/skills/web-artifacts-builder/SKILL.md | 74 + .../scripts/bundle-artifact.sh | 54 + .../scripts/init-artifact.sh | 322 ++ .../scripts/shadcn-components.tar.gz | Bin 0 -> 19967 bytes .../skills/webapp-testing/.openskills.json | 7 + .claude/skills/webapp-testing/LICENSE.txt | 202 + .claude/skills/webapp-testing/SKILL.md | 96 + .../examples/console_logging.py | 35 + .../examples/element_discovery.py | 40 + .../examples/static_html_automation.py | 33 + .../webapp-testing/scripts/with_server.py | 106 + .claude/skills/xlsx/.openskills.json | 7 + .claude/skills/xlsx/LICENSE.txt | 30 + .claude/skills/xlsx/SKILL.md | 292 ++ .../xlsx/scripts/office/helpers/__init__.py | 0 .../xlsx/scripts/office/helpers/merge_runs.py | 199 + .../office/helpers/simplify_redlines.py | 197 + .claude/skills/xlsx/scripts/office/pack.py | 159 + .../schemas/ISO-IEC29500-4_2016/dml-chart.xsd | 1499 ++++++ .../ISO-IEC29500-4_2016/dml-chartDrawing.xsd | 146 + .../ISO-IEC29500-4_2016/dml-diagram.xsd | 1085 ++++ .../ISO-IEC29500-4_2016/dml-lockedCanvas.xsd | 11 + .../schemas/ISO-IEC29500-4_2016/dml-main.xsd | 3081 ++++++++++++ .../ISO-IEC29500-4_2016/dml-picture.xsd | 23 + .../dml-spreadsheetDrawing.xsd | 185 + .../dml-wordprocessingDrawing.xsd | 287 ++ .../schemas/ISO-IEC29500-4_2016/pml.xsd | 1676 +++++++ .../shared-additionalCharacteristics.xsd | 28 + .../shared-bibliography.xsd | 144 + .../shared-commonSimpleTypes.xsd | 174 + .../shared-customXmlDataProperties.xsd | 25 + .../shared-customXmlSchemaProperties.xsd | 18 + .../shared-documentPropertiesCustom.xsd | 59 + .../shared-documentPropertiesExtended.xsd | 56 + .../shared-documentPropertiesVariantTypes.xsd | 195 + .../ISO-IEC29500-4_2016/shared-math.xsd | 582 +++ .../shared-relationshipReference.xsd | 25 + .../schemas/ISO-IEC29500-4_2016/sml.xsd | 4439 +++++++++++++++++ .../schemas/ISO-IEC29500-4_2016/vml-main.xsd | 570 +++ .../ISO-IEC29500-4_2016/vml-officeDrawing.xsd | 509 ++ .../vml-presentationDrawing.xsd | 12 + .../vml-spreadsheetDrawing.xsd | 108 + .../vml-wordprocessingDrawing.xsd | 96 + .../schemas/ISO-IEC29500-4_2016/wml.xsd | 3646 ++++++++++++++ .../schemas/ISO-IEC29500-4_2016/xml.xsd | 116 + .../ecma/fouth-edition/opc-contentTypes.xsd | 42 + .../ecma/fouth-edition/opc-coreProperties.xsd | 50 + .../schemas/ecma/fouth-edition/opc-digSig.xsd | 49 + .../ecma/fouth-edition/opc-relationships.xsd | 33 + .../xlsx/scripts/office/schemas/mce/mc.xsd | 75 + .../office/schemas/microsoft/wml-2010.xsd | 560 +++ .../office/schemas/microsoft/wml-2012.xsd | 67 + .../office/schemas/microsoft/wml-2018.xsd | 14 + .../office/schemas/microsoft/wml-cex-2018.xsd | 20 + .../office/schemas/microsoft/wml-cid-2016.xsd | 13 + .../microsoft/wml-sdtdatahash-2020.xsd | 4 + .../schemas/microsoft/wml-symex-2015.xsd | 8 + .claude/skills/xlsx/scripts/office/soffice.py | 183 + .claude/skills/xlsx/scripts/office/unpack.py | 132 + .../skills/xlsx/scripts/office/validate.py | 111 + .../scripts/office/validators/__init__.py | 15 + .../xlsx/scripts/office/validators/base.py | 847 ++++ .../xlsx/scripts/office/validators/docx.py | 446 ++ .../xlsx/scripts/office/validators/pptx.py | 275 + .../scripts/office/validators/redlining.py | 247 + .claude/skills/xlsx/scripts/recalc.py | 184 + .env.example | 36 + .gitignore | 50 + config/mcp.json | 6 + config/models.json | 41 + config/personalities.json | 38 + docs/AGENTS.md | 130 + docs/AI_IMPLEMENTATION.md | 235 + docs/AI_INTEGRATION_COMPLETE.md | 138 + docs/AI_QUICKSTART.md | 262 + docs/AI_SUMMARY.md | 495 ++ docs/CHANGELOG.md | 210 + docs/CONFIG_GUIDE.md | 226 + docs/FIXES.md | 148 + docs/PROJECT_REFACTOR.md | 68 + docs/README.md | 51 + docs/README_INDEX.md | 21 + examples/ai_example.py | 156 + main.py | 42 + pytest.ini | 4 + requirements.txt | 14 + scripts/migrate_to_vector_db.py | 206 + skills/cmd_zip_skill/README.md | 7 + skills/cmd_zip_skill/__init__.py | 0 skills/cmd_zip_skill/main.py | 13 + skills/cmd_zip_skill/skill.json | 8 + skills/cmd_zip_skill_1772465404375/README.md | 7 + .../cmd_zip_skill_1772465404375/__init__.py | 0 skills/cmd_zip_skill_1772465404375/main.py | 13 + skills/cmd_zip_skill_1772465404375/skill.json | 8 + skills/cmd_zip_skill_1772465434774/README.md | 7 + .../cmd_zip_skill_1772465434774/__init__.py | 0 skills/cmd_zip_skill_1772465434774/main.py | 13 + skills/cmd_zip_skill_1772465434774/skill.json | 8 + skills/cmd_zip_skill_1772465467809/README.md | 7 + .../cmd_zip_skill_1772465467809/__init__.py | 0 skills/cmd_zip_skill_1772465467809/main.py | 13 + skills/cmd_zip_skill_1772465467809/skill.json | 8 + skills/cmd_zip_skill_1772465652075/README.md | 7 + .../cmd_zip_skill_1772465652075/__init__.py | 0 skills/cmd_zip_skill_1772465652075/main.py | 13 + skills/cmd_zip_skill_1772465652075/skill.json | 8 + skills/cmd_zip_skill_1772465685352/README.md | 7 + .../cmd_zip_skill_1772465685352/__init__.py | 0 skills/cmd_zip_skill_1772465685352/main.py | 13 + skills/cmd_zip_skill_1772465685352/skill.json | 8 + skills/cmd_zip_skill_1772465936294/README.md | 7 + .../cmd_zip_skill_1772465936294/__init__.py | 0 skills/cmd_zip_skill_1772465936294/main.py | 13 + skills/cmd_zip_skill_1772465936294/skill.json | 8 + skills/cmd_zip_skill_1772465966322/README.md | 7 + .../cmd_zip_skill_1772465966322/__init__.py | 0 skills/cmd_zip_skill_1772465966322/main.py | 13 + skills/cmd_zip_skill_1772465966322/skill.json | 8 + skills/cmd_zip_skill_1772466071278/README.md | 7 + .../cmd_zip_skill_1772466071278/__init__.py | 0 skills/cmd_zip_skill_1772466071278/main.py | 13 + skills/cmd_zip_skill_1772466071278/skill.json | 8 + skills/skills_creator/README.md | 12 + skills/skills_creator/__init__.py | 0 skills/skills_creator/main.py | 147 + skills/skills_creator/skill.json | 8 + src/__init__.py | 4 + src/ai/__init__.py | 14 + src/ai/base.py | 130 + src/ai/client.py | 475 ++ src/ai/docs/README.md | 545 ++ src/ai/mcp/__init__.py | 13 + src/ai/mcp/base.py | 219 + src/ai/mcp/servers/__init__.py | 6 + src/ai/mcp/servers/filesystem.py | 123 + src/ai/memory.py | 466 ++ src/ai/models/__init__.py | 7 + src/ai/models/anthropic_model.py | 120 + src/ai/models/openai_model.py | 235 + src/ai/personality.py | 232 + src/ai/skills/__init__.py | 6 + src/ai/skills/base.py | 552 ++ src/ai/task_manager.py | 327 ++ src/ai/vector_store/__init__.py | 13 + src/ai/vector_store/base.py | 113 + src/ai/vector_store/chroma_store.py | 336 ++ src/ai/vector_store/json_store.py | 198 + src/core/__init__.py | 17 + src/core/bot.py | 105 + src/core/config.py | 72 + src/handlers/__init__.py | 6 + src/handlers/message_handler.py | 147 + src/handlers/message_handler_ai.py | 1197 +++++ src/utils/__init__.py | 6 + src/utils/logger.py | 63 + start.bat | 69 + tests/test_ai.py | 628 +++ 453 files changed, 99883 insertions(+) create mode 100644 .claude/skills/algorithmic-art/.openskills.json create mode 100644 .claude/skills/algorithmic-art/LICENSE.txt create mode 100644 .claude/skills/algorithmic-art/SKILL.md create mode 100644 .claude/skills/algorithmic-art/templates/generator_template.js create mode 100644 .claude/skills/algorithmic-art/templates/viewer.html create mode 100644 .claude/skills/brand-guidelines/.openskills.json create mode 100644 .claude/skills/brand-guidelines/LICENSE.txt create mode 100644 .claude/skills/brand-guidelines/SKILL.md create mode 100644 .claude/skills/canvas-design/.openskills.json create mode 100644 .claude/skills/canvas-design/LICENSE.txt create mode 100644 .claude/skills/canvas-design/SKILL.md create mode 100644 .claude/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/DMMono-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/Gloock-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/Italiana-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/Jura-Light.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/Jura-Medium.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/Jura-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/Lora-Bold.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/Lora-Italic.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/Lora-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/Lora-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/Outfit-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/Tektur-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf create mode 100644 .claude/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt create mode 100644 .claude/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf create mode 100644 .claude/skills/doc-coauthoring/.openskills.json create mode 100644 .claude/skills/doc-coauthoring/SKILL.md create mode 100644 .claude/skills/docx/.openskills.json create mode 100644 .claude/skills/docx/LICENSE.txt create mode 100644 .claude/skills/docx/SKILL.md create mode 100644 .claude/skills/docx/scripts/__init__.py create mode 100644 .claude/skills/docx/scripts/accept_changes.py create mode 100644 .claude/skills/docx/scripts/comment.py create mode 100644 .claude/skills/docx/scripts/office/helpers/__init__.py create mode 100644 .claude/skills/docx/scripts/office/helpers/merge_runs.py create mode 100644 .claude/skills/docx/scripts/office/helpers/simplify_redlines.py create mode 100644 .claude/skills/docx/scripts/office/pack.py create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/mce/mc.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd create mode 100644 .claude/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd create mode 100644 .claude/skills/docx/scripts/office/soffice.py create mode 100644 .claude/skills/docx/scripts/office/unpack.py create mode 100644 .claude/skills/docx/scripts/office/validate.py create mode 100644 .claude/skills/docx/scripts/office/validators/__init__.py create mode 100644 .claude/skills/docx/scripts/office/validators/base.py create mode 100644 .claude/skills/docx/scripts/office/validators/docx.py create mode 100644 .claude/skills/docx/scripts/office/validators/pptx.py create mode 100644 .claude/skills/docx/scripts/office/validators/redlining.py create mode 100644 .claude/skills/docx/scripts/templates/comments.xml create mode 100644 .claude/skills/docx/scripts/templates/commentsExtended.xml create mode 100644 .claude/skills/docx/scripts/templates/commentsExtensible.xml create mode 100644 .claude/skills/docx/scripts/templates/commentsIds.xml create mode 100644 .claude/skills/docx/scripts/templates/people.xml create mode 100644 .claude/skills/frontend-design/.openskills.json create mode 100644 .claude/skills/frontend-design/LICENSE.txt create mode 100644 .claude/skills/frontend-design/SKILL.md create mode 100644 .claude/skills/internal-comms/.openskills.json create mode 100644 .claude/skills/internal-comms/LICENSE.txt create mode 100644 .claude/skills/internal-comms/SKILL.md create mode 100644 .claude/skills/internal-comms/examples/3p-updates.md create mode 100644 .claude/skills/internal-comms/examples/company-newsletter.md create mode 100644 .claude/skills/internal-comms/examples/faq-answers.md create mode 100644 .claude/skills/internal-comms/examples/general-comms.md create mode 100644 .claude/skills/mcp-builder/.openskills.json create mode 100644 .claude/skills/mcp-builder/LICENSE.txt create mode 100644 .claude/skills/mcp-builder/SKILL.md create mode 100644 .claude/skills/mcp-builder/reference/evaluation.md create mode 100644 .claude/skills/mcp-builder/reference/mcp_best_practices.md create mode 100644 .claude/skills/mcp-builder/reference/node_mcp_server.md create mode 100644 .claude/skills/mcp-builder/reference/python_mcp_server.md create mode 100644 .claude/skills/mcp-builder/scripts/connections.py create mode 100644 .claude/skills/mcp-builder/scripts/evaluation.py create mode 100644 .claude/skills/mcp-builder/scripts/example_evaluation.xml create mode 100644 .claude/skills/mcp-builder/scripts/requirements.txt create mode 100644 .claude/skills/pdf/.openskills.json create mode 100644 .claude/skills/pdf/LICENSE.txt create mode 100644 .claude/skills/pdf/SKILL.md create mode 100644 .claude/skills/pdf/forms.md create mode 100644 .claude/skills/pdf/reference.md create mode 100644 .claude/skills/pdf/scripts/check_bounding_boxes.py create mode 100644 .claude/skills/pdf/scripts/check_fillable_fields.py create mode 100644 .claude/skills/pdf/scripts/convert_pdf_to_images.py create mode 100644 .claude/skills/pdf/scripts/create_validation_image.py create mode 100644 .claude/skills/pdf/scripts/extract_form_field_info.py create mode 100644 .claude/skills/pdf/scripts/extract_form_structure.py create mode 100644 .claude/skills/pdf/scripts/fill_fillable_fields.py create mode 100644 .claude/skills/pdf/scripts/fill_pdf_form_with_annotations.py create mode 100644 .claude/skills/pptx/.openskills.json create mode 100644 .claude/skills/pptx/LICENSE.txt create mode 100644 .claude/skills/pptx/SKILL.md create mode 100644 .claude/skills/pptx/editing.md create mode 100644 .claude/skills/pptx/pptxgenjs.md create mode 100644 .claude/skills/pptx/scripts/__init__.py create mode 100644 .claude/skills/pptx/scripts/add_slide.py create mode 100644 .claude/skills/pptx/scripts/clean.py create mode 100644 .claude/skills/pptx/scripts/office/helpers/__init__.py create mode 100644 .claude/skills/pptx/scripts/office/helpers/merge_runs.py create mode 100644 .claude/skills/pptx/scripts/office/helpers/simplify_redlines.py create mode 100644 .claude/skills/pptx/scripts/office/pack.py create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/mce/mc.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd create mode 100644 .claude/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd create mode 100644 .claude/skills/pptx/scripts/office/soffice.py create mode 100644 .claude/skills/pptx/scripts/office/unpack.py create mode 100644 .claude/skills/pptx/scripts/office/validate.py create mode 100644 .claude/skills/pptx/scripts/office/validators/__init__.py create mode 100644 .claude/skills/pptx/scripts/office/validators/base.py create mode 100644 .claude/skills/pptx/scripts/office/validators/docx.py create mode 100644 .claude/skills/pptx/scripts/office/validators/pptx.py create mode 100644 .claude/skills/pptx/scripts/office/validators/redlining.py create mode 100644 .claude/skills/pptx/scripts/thumbnail.py create mode 100644 .claude/skills/skill-creator/.openskills.json create mode 100644 .claude/skills/skill-creator/LICENSE.txt create mode 100644 .claude/skills/skill-creator/SKILL.md create mode 100644 .claude/skills/skill-creator/agents/analyzer.md create mode 100644 .claude/skills/skill-creator/agents/comparator.md create mode 100644 .claude/skills/skill-creator/agents/grader.md create mode 100644 .claude/skills/skill-creator/assets/eval_review.html create mode 100644 .claude/skills/skill-creator/eval-viewer/generate_review.py create mode 100644 .claude/skills/skill-creator/eval-viewer/viewer.html create mode 100644 .claude/skills/skill-creator/references/schemas.md create mode 100644 .claude/skills/skill-creator/scripts/__init__.py create mode 100644 .claude/skills/skill-creator/scripts/aggregate_benchmark.py create mode 100644 .claude/skills/skill-creator/scripts/generate_report.py create mode 100644 .claude/skills/skill-creator/scripts/improve_description.py create mode 100644 .claude/skills/skill-creator/scripts/package_skill.py create mode 100644 .claude/skills/skill-creator/scripts/quick_validate.py create mode 100644 .claude/skills/skill-creator/scripts/run_eval.py create mode 100644 .claude/skills/skill-creator/scripts/run_loop.py create mode 100644 .claude/skills/skill-creator/scripts/utils.py create mode 100644 .claude/skills/slack-gif-creator/.openskills.json create mode 100644 .claude/skills/slack-gif-creator/LICENSE.txt create mode 100644 .claude/skills/slack-gif-creator/SKILL.md create mode 100644 .claude/skills/slack-gif-creator/core/easing.py create mode 100644 .claude/skills/slack-gif-creator/core/frame_composer.py create mode 100644 .claude/skills/slack-gif-creator/core/gif_builder.py create mode 100644 .claude/skills/slack-gif-creator/core/validators.py create mode 100644 .claude/skills/slack-gif-creator/requirements.txt create mode 100644 .claude/skills/template/.openskills.json create mode 100644 .claude/skills/template/SKILL.md create mode 100644 .claude/skills/theme-factory/.openskills.json create mode 100644 .claude/skills/theme-factory/LICENSE.txt create mode 100644 .claude/skills/theme-factory/SKILL.md create mode 100644 .claude/skills/theme-factory/theme-showcase.pdf create mode 100644 .claude/skills/theme-factory/themes/arctic-frost.md create mode 100644 .claude/skills/theme-factory/themes/botanical-garden.md create mode 100644 .claude/skills/theme-factory/themes/desert-rose.md create mode 100644 .claude/skills/theme-factory/themes/forest-canopy.md create mode 100644 .claude/skills/theme-factory/themes/golden-hour.md create mode 100644 .claude/skills/theme-factory/themes/midnight-galaxy.md create mode 100644 .claude/skills/theme-factory/themes/modern-minimalist.md create mode 100644 .claude/skills/theme-factory/themes/ocean-depths.md create mode 100644 .claude/skills/theme-factory/themes/sunset-boulevard.md create mode 100644 .claude/skills/theme-factory/themes/tech-innovation.md create mode 100644 .claude/skills/web-artifacts-builder/.openskills.json create mode 100644 .claude/skills/web-artifacts-builder/LICENSE.txt create mode 100644 .claude/skills/web-artifacts-builder/SKILL.md create mode 100644 .claude/skills/web-artifacts-builder/scripts/bundle-artifact.sh create mode 100644 .claude/skills/web-artifacts-builder/scripts/init-artifact.sh create mode 100644 .claude/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz create mode 100644 .claude/skills/webapp-testing/.openskills.json create mode 100644 .claude/skills/webapp-testing/LICENSE.txt create mode 100644 .claude/skills/webapp-testing/SKILL.md create mode 100644 .claude/skills/webapp-testing/examples/console_logging.py create mode 100644 .claude/skills/webapp-testing/examples/element_discovery.py create mode 100644 .claude/skills/webapp-testing/examples/static_html_automation.py create mode 100644 .claude/skills/webapp-testing/scripts/with_server.py create mode 100644 .claude/skills/xlsx/.openskills.json create mode 100644 .claude/skills/xlsx/LICENSE.txt create mode 100644 .claude/skills/xlsx/SKILL.md create mode 100644 .claude/skills/xlsx/scripts/office/helpers/__init__.py create mode 100644 .claude/skills/xlsx/scripts/office/helpers/merge_runs.py create mode 100644 .claude/skills/xlsx/scripts/office/helpers/simplify_redlines.py create mode 100644 .claude/skills/xlsx/scripts/office/pack.py create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/mce/mc.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd create mode 100644 .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd create mode 100644 .claude/skills/xlsx/scripts/office/soffice.py create mode 100644 .claude/skills/xlsx/scripts/office/unpack.py create mode 100644 .claude/skills/xlsx/scripts/office/validate.py create mode 100644 .claude/skills/xlsx/scripts/office/validators/__init__.py create mode 100644 .claude/skills/xlsx/scripts/office/validators/base.py create mode 100644 .claude/skills/xlsx/scripts/office/validators/docx.py create mode 100644 .claude/skills/xlsx/scripts/office/validators/pptx.py create mode 100644 .claude/skills/xlsx/scripts/office/validators/redlining.py create mode 100644 .claude/skills/xlsx/scripts/recalc.py create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 config/mcp.json create mode 100644 config/models.json create mode 100644 config/personalities.json create mode 100644 docs/AGENTS.md create mode 100644 docs/AI_IMPLEMENTATION.md create mode 100644 docs/AI_INTEGRATION_COMPLETE.md create mode 100644 docs/AI_QUICKSTART.md create mode 100644 docs/AI_SUMMARY.md create mode 100644 docs/CHANGELOG.md create mode 100644 docs/CONFIG_GUIDE.md create mode 100644 docs/FIXES.md create mode 100644 docs/PROJECT_REFACTOR.md create mode 100644 docs/README.md create mode 100644 docs/README_INDEX.md create mode 100644 examples/ai_example.py create mode 100644 main.py create mode 100644 pytest.ini create mode 100644 requirements.txt create mode 100644 scripts/migrate_to_vector_db.py create mode 100644 skills/cmd_zip_skill/README.md create mode 100644 skills/cmd_zip_skill/__init__.py create mode 100644 skills/cmd_zip_skill/main.py create mode 100644 skills/cmd_zip_skill/skill.json create mode 100644 skills/cmd_zip_skill_1772465404375/README.md create mode 100644 skills/cmd_zip_skill_1772465404375/__init__.py create mode 100644 skills/cmd_zip_skill_1772465404375/main.py create mode 100644 skills/cmd_zip_skill_1772465404375/skill.json create mode 100644 skills/cmd_zip_skill_1772465434774/README.md create mode 100644 skills/cmd_zip_skill_1772465434774/__init__.py create mode 100644 skills/cmd_zip_skill_1772465434774/main.py create mode 100644 skills/cmd_zip_skill_1772465434774/skill.json create mode 100644 skills/cmd_zip_skill_1772465467809/README.md create mode 100644 skills/cmd_zip_skill_1772465467809/__init__.py create mode 100644 skills/cmd_zip_skill_1772465467809/main.py create mode 100644 skills/cmd_zip_skill_1772465467809/skill.json create mode 100644 skills/cmd_zip_skill_1772465652075/README.md create mode 100644 skills/cmd_zip_skill_1772465652075/__init__.py create mode 100644 skills/cmd_zip_skill_1772465652075/main.py create mode 100644 skills/cmd_zip_skill_1772465652075/skill.json create mode 100644 skills/cmd_zip_skill_1772465685352/README.md create mode 100644 skills/cmd_zip_skill_1772465685352/__init__.py create mode 100644 skills/cmd_zip_skill_1772465685352/main.py create mode 100644 skills/cmd_zip_skill_1772465685352/skill.json create mode 100644 skills/cmd_zip_skill_1772465936294/README.md create mode 100644 skills/cmd_zip_skill_1772465936294/__init__.py create mode 100644 skills/cmd_zip_skill_1772465936294/main.py create mode 100644 skills/cmd_zip_skill_1772465936294/skill.json create mode 100644 skills/cmd_zip_skill_1772465966322/README.md create mode 100644 skills/cmd_zip_skill_1772465966322/__init__.py create mode 100644 skills/cmd_zip_skill_1772465966322/main.py create mode 100644 skills/cmd_zip_skill_1772465966322/skill.json create mode 100644 skills/cmd_zip_skill_1772466071278/README.md create mode 100644 skills/cmd_zip_skill_1772466071278/__init__.py create mode 100644 skills/cmd_zip_skill_1772466071278/main.py create mode 100644 skills/cmd_zip_skill_1772466071278/skill.json create mode 100644 skills/skills_creator/README.md create mode 100644 skills/skills_creator/__init__.py create mode 100644 skills/skills_creator/main.py create mode 100644 skills/skills_creator/skill.json create mode 100644 src/__init__.py create mode 100644 src/ai/__init__.py create mode 100644 src/ai/base.py create mode 100644 src/ai/client.py create mode 100644 src/ai/docs/README.md create mode 100644 src/ai/mcp/__init__.py create mode 100644 src/ai/mcp/base.py create mode 100644 src/ai/mcp/servers/__init__.py create mode 100644 src/ai/mcp/servers/filesystem.py create mode 100644 src/ai/memory.py create mode 100644 src/ai/models/__init__.py create mode 100644 src/ai/models/anthropic_model.py create mode 100644 src/ai/models/openai_model.py create mode 100644 src/ai/personality.py create mode 100644 src/ai/skills/__init__.py create mode 100644 src/ai/skills/base.py create mode 100644 src/ai/task_manager.py create mode 100644 src/ai/vector_store/__init__.py create mode 100644 src/ai/vector_store/base.py create mode 100644 src/ai/vector_store/chroma_store.py create mode 100644 src/ai/vector_store/json_store.py create mode 100644 src/core/__init__.py create mode 100644 src/core/bot.py create mode 100644 src/core/config.py create mode 100644 src/handlers/__init__.py create mode 100644 src/handlers/message_handler.py create mode 100644 src/handlers/message_handler_ai.py create mode 100644 src/utils/__init__.py create mode 100644 src/utils/logger.py create mode 100644 start.bat create mode 100644 tests/test_ai.py diff --git a/.claude/skills/algorithmic-art/.openskills.json b/.claude/skills/algorithmic-art/.openskills.json new file mode 100644 index 0000000..8a7d8ac --- /dev/null +++ b/.claude/skills/algorithmic-art/.openskills.json @@ -0,0 +1,7 @@ +{ + "source": "anthropics/skills", + "sourceType": "git", + "repoUrl": "https://github.com/anthropics/skills", + "subpath": "skills\\algorithmic-art", + "installedAt": "2026-03-02T09:19:50.038Z" +} \ No newline at end of file diff --git a/.claude/skills/algorithmic-art/LICENSE.txt b/.claude/skills/algorithmic-art/LICENSE.txt new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/.claude/skills/algorithmic-art/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/.claude/skills/algorithmic-art/SKILL.md b/.claude/skills/algorithmic-art/SKILL.md new file mode 100644 index 0000000..634f6fa --- /dev/null +++ b/.claude/skills/algorithmic-art/SKILL.md @@ -0,0 +1,405 @@ +--- +name: algorithmic-art +description: Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations. +license: Complete terms in LICENSE.txt +--- + +Algorithmic philosophies are computational aesthetic movements that are then expressed through code. Output .md files (philosophy), .html files (interactive viewer), and .js files (generative algorithms). + +This happens in two steps: +1. Algorithmic Philosophy Creation (.md file) +2. Express by creating p5.js generative art (.html + .js files) + +First, undertake this task: + +## ALGORITHMIC PHILOSOPHY CREATION + +To begin, create an ALGORITHMIC PHILOSOPHY (not static images or templates) that will be interpreted through: +- Computational processes, emergent behavior, mathematical beauty +- Seeded randomness, noise fields, organic systems +- Particles, flows, fields, forces +- Parametric variation and controlled chaos + +### THE CRITICAL UNDERSTANDING +- What is received: Some subtle input or instructions by the user to take into account, but use as a foundation; it should not constrain creative freedom. +- What is created: An algorithmic philosophy/generative aesthetic movement. +- What happens next: The same version receives the philosophy and EXPRESSES IT IN CODE - creating p5.js sketches that are 90% algorithmic generation, 10% essential parameters. + +Consider this approach: +- Write a manifesto for a generative art movement +- The next phase involves writing the algorithm that brings it to life + +The philosophy must emphasize: Algorithmic expression. Emergent behavior. Computational beauty. Seeded variation. + +### HOW TO GENERATE AN ALGORITHMIC PHILOSOPHY + +**Name the movement** (1-2 words): "Organic Turbulence" / "Quantum Harmonics" / "Emergent Stillness" + +**Articulate the philosophy** (4-6 paragraphs - concise but complete): + +To capture the ALGORITHMIC essence, express how this philosophy manifests through: +- Computational processes and mathematical relationships? +- Noise functions and randomness patterns? +- Particle behaviors and field dynamics? +- Temporal evolution and system states? +- Parametric variation and emergent complexity? + +**CRITICAL GUIDELINES:** +- **Avoid redundancy**: Each algorithmic aspect should be mentioned once. Avoid repeating concepts about noise theory, particle dynamics, or mathematical principles unless adding new depth. +- **Emphasize craftsmanship REPEATEDLY**: The philosophy MUST stress multiple times that the final algorithm should appear as though it took countless hours to develop, was refined with care, and comes from someone at the absolute top of their field. This framing is essential - repeat phrases like "meticulously crafted algorithm," "the product of deep computational expertise," "painstaking optimization," "master-level implementation." +- **Leave creative space**: Be specific about the algorithmic direction, but concise enough that the next Claude has room to make interpretive implementation choices at an extremely high level of craftsmanship. + +The philosophy must guide the next version to express ideas ALGORITHMICALLY, not through static images. Beauty lives in the process, not the final frame. + +### PHILOSOPHY EXAMPLES + +**"Organic Turbulence"** +Philosophy: Chaos constrained by natural law, order emerging from disorder. +Algorithmic expression: Flow fields driven by layered Perlin noise. Thousands of particles following vector forces, their trails accumulating into organic density maps. Multiple noise octaves create turbulent regions and calm zones. Color emerges from velocity and density - fast particles burn bright, slow ones fade to shadow. The algorithm runs until equilibrium - a meticulously tuned balance where every parameter was refined through countless iterations by a master of computational aesthetics. + +**"Quantum Harmonics"** +Philosophy: Discrete entities exhibiting wave-like interference patterns. +Algorithmic expression: Particles initialized on a grid, each carrying a phase value that evolves through sine waves. When particles are near, their phases interfere - constructive interference creates bright nodes, destructive creates voids. Simple harmonic motion generates complex emergent mandalas. The result of painstaking frequency calibration where every ratio was carefully chosen to produce resonant beauty. + +**"Recursive Whispers"** +Philosophy: Self-similarity across scales, infinite depth in finite space. +Algorithmic expression: Branching structures that subdivide recursively. Each branch slightly randomized but constrained by golden ratios. L-systems or recursive subdivision generate tree-like forms that feel both mathematical and organic. Subtle noise perturbations break perfect symmetry. Line weights diminish with each recursion level. Every branching angle the product of deep mathematical exploration. + +**"Field Dynamics"** +Philosophy: Invisible forces made visible through their effects on matter. +Algorithmic expression: Vector fields constructed from mathematical functions or noise. Particles born at edges, flowing along field lines, dying when they reach equilibrium or boundaries. Multiple fields can attract, repel, or rotate particles. The visualization shows only the traces - ghost-like evidence of invisible forces. A computational dance meticulously choreographed through force balance. + +**"Stochastic Crystallization"** +Philosophy: Random processes crystallizing into ordered structures. +Algorithmic expression: Randomized circle packing or Voronoi tessellation. Start with random points, let them evolve through relaxation algorithms. Cells push apart until equilibrium. Color based on cell size, neighbor count, or distance from center. The organic tiling that emerges feels both random and inevitable. Every seed produces unique crystalline beauty - the mark of a master-level generative algorithm. + +*These are condensed examples. The actual algorithmic philosophy should be 4-6 substantial paragraphs.* + +### ESSENTIAL PRINCIPLES +- **ALGORITHMIC PHILOSOPHY**: Creating a computational worldview to be expressed through code +- **PROCESS OVER PRODUCT**: Always emphasize that beauty emerges from the algorithm's execution - each run is unique +- **PARAMETRIC EXPRESSION**: Ideas communicate through mathematical relationships, forces, behaviors - not static composition +- **ARTISTIC FREEDOM**: The next Claude interprets the philosophy algorithmically - provide creative implementation room +- **PURE GENERATIVE ART**: This is about making LIVING ALGORITHMS, not static images with randomness +- **EXPERT CRAFTSMANSHIP**: Repeatedly emphasize the final algorithm must feel meticulously crafted, refined through countless iterations, the product of deep expertise by someone at the absolute top of their field in computational aesthetics + +**The algorithmic philosophy should be 4-6 paragraphs long.** Fill it with poetic computational philosophy that brings together the intended vision. Avoid repeating the same points. Output this algorithmic philosophy as a .md file. + +--- + +## DEDUCING THE CONCEPTUAL SEED + +**CRITICAL STEP**: Before implementing the algorithm, identify the subtle conceptual thread from the original request. + +**THE ESSENTIAL PRINCIPLE**: +The concept is a **subtle, niche reference embedded within the algorithm itself** - not always literal, always sophisticated. Someone familiar with the subject should feel it intuitively, while others simply experience a masterful generative composition. The algorithmic philosophy provides the computational language. The deduced concept provides the soul - the quiet conceptual DNA woven invisibly into parameters, behaviors, and emergence patterns. + +This is **VERY IMPORTANT**: The reference must be so refined that it enhances the work's depth without announcing itself. Think like a jazz musician quoting another song through algorithmic harmony - only those who know will catch it, but everyone appreciates the generative beauty. + +--- + +## P5.JS IMPLEMENTATION + +With the philosophy AND conceptual framework established, express it through code. Pause to gather thoughts before proceeding. Use only the algorithmic philosophy created and the instructions below. + +### ⚠️ STEP 0: READ THE TEMPLATE FIRST ⚠️ + +**CRITICAL: BEFORE writing any HTML:** + +1. **Read** `templates/viewer.html` using the Read tool +2. **Study** the exact structure, styling, and Anthropic branding +3. **Use that file as the LITERAL STARTING POINT** - not just inspiration +4. **Keep all FIXED sections exactly as shown** (header, sidebar structure, Anthropic colors/fonts, seed controls, action buttons) +5. **Replace only the VARIABLE sections** marked in the file's comments (algorithm, parameters, UI controls for parameters) + +**Avoid:** +- ❌ Creating HTML from scratch +- ❌ Inventing custom styling or color schemes +- ❌ Using system fonts or dark themes +- ❌ Changing the sidebar structure + +**Follow these practices:** +- ✅ Copy the template's exact HTML structure +- ✅ Keep Anthropic branding (Poppins/Lora fonts, light colors, gradient backdrop) +- ✅ Maintain the sidebar layout (Seed → Parameters → Colors? → Actions) +- ✅ Replace only the p5.js algorithm and parameter controls + +The template is the foundation. Build on it, don't rebuild it. + +--- + +To create gallery-quality computational art that lives and breathes, use the algorithmic philosophy as the foundation. + +### TECHNICAL REQUIREMENTS + +**Seeded Randomness (Art Blocks Pattern)**: +```javascript +// ALWAYS use a seed for reproducibility +let seed = 12345; // or hash from user input +randomSeed(seed); +noiseSeed(seed); +``` + +**Parameter Structure - FOLLOW THE PHILOSOPHY**: + +To establish parameters that emerge naturally from the algorithmic philosophy, consider: "What qualities of this system can be adjusted?" + +```javascript +let params = { + seed: 12345, // Always include seed for reproducibility + // colors + // Add parameters that control YOUR algorithm: + // - Quantities (how many?) + // - Scales (how big? how fast?) + // - Probabilities (how likely?) + // - Ratios (what proportions?) + // - Angles (what direction?) + // - Thresholds (when does behavior change?) +}; +``` + +**To design effective parameters, focus on the properties the system needs to be tunable rather than thinking in terms of "pattern types".** + +**Core Algorithm - EXPRESS THE PHILOSOPHY**: + +**CRITICAL**: The algorithmic philosophy should dictate what to build. + +To express the philosophy through code, avoid thinking "which pattern should I use?" and instead think "how to express this philosophy through code?" + +If the philosophy is about **organic emergence**, consider using: +- Elements that accumulate or grow over time +- Random processes constrained by natural rules +- Feedback loops and interactions + +If the philosophy is about **mathematical beauty**, consider using: +- Geometric relationships and ratios +- Trigonometric functions and harmonics +- Precise calculations creating unexpected patterns + +If the philosophy is about **controlled chaos**, consider using: +- Random variation within strict boundaries +- Bifurcation and phase transitions +- Order emerging from disorder + +**The algorithm flows from the philosophy, not from a menu of options.** + +To guide the implementation, let the conceptual essence inform creative and original choices. Build something that expresses the vision for this particular request. + +**Canvas Setup**: Standard p5.js structure: +```javascript +function setup() { + createCanvas(1200, 1200); + // Initialize your system +} + +function draw() { + // Your generative algorithm + // Can be static (noLoop) or animated +} +``` + +### CRAFTSMANSHIP REQUIREMENTS + +**CRITICAL**: To achieve mastery, create algorithms that feel like they emerged through countless iterations by a master generative artist. Tune every parameter carefully. Ensure every pattern emerges with purpose. This is NOT random noise - this is CONTROLLED CHAOS refined through deep expertise. + +- **Balance**: Complexity without visual noise, order without rigidity +- **Color Harmony**: Thoughtful palettes, not random RGB values +- **Composition**: Even in randomness, maintain visual hierarchy and flow +- **Performance**: Smooth execution, optimized for real-time if animated +- **Reproducibility**: Same seed ALWAYS produces identical output + +### OUTPUT FORMAT + +Output: +1. **Algorithmic Philosophy** - As markdown or text explaining the generative aesthetic +2. **Single HTML Artifact** - Self-contained interactive generative art built from `templates/viewer.html` (see STEP 0 and next section) + +The HTML artifact contains everything: p5.js (from CDN), the algorithm, parameter controls, and UI - all in one file that works immediately in claude.ai artifacts or any browser. Start from the template file, not from scratch. + +--- + +## INTERACTIVE ARTIFACT CREATION + +**REMINDER: `templates/viewer.html` should have already been read (see STEP 0). Use that file as the starting point.** + +To allow exploration of the generative art, create a single, self-contained HTML artifact. Ensure this artifact works immediately in claude.ai or any browser - no setup required. Embed everything inline. + +### CRITICAL: WHAT'S FIXED VS VARIABLE + +The `templates/viewer.html` file is the foundation. It contains the exact structure and styling needed. + +**FIXED (always include exactly as shown):** +- Layout structure (header, sidebar, main canvas area) +- Anthropic branding (UI colors, fonts, gradients) +- Seed section in sidebar: + - Seed display + - Previous/Next buttons + - Random button + - Jump to seed input + Go button +- Actions section in sidebar: + - Regenerate button + - Reset button + +**VARIABLE (customize for each artwork):** +- The entire p5.js algorithm (setup/draw/classes) +- The parameters object (define what the art needs) +- The Parameters section in sidebar: + - Number of parameter controls + - Parameter names + - Min/max/step values for sliders + - Control types (sliders, inputs, etc.) +- Colors section (optional): + - Some art needs color pickers + - Some art might use fixed colors + - Some art might be monochrome (no color controls needed) + - Decide based on the art's needs + +**Every artwork should have unique parameters and algorithm!** The fixed parts provide consistent UX - everything else expresses the unique vision. + +### REQUIRED FEATURES + +**1. Parameter Controls** +- Sliders for numeric parameters (particle count, noise scale, speed, etc.) +- Color pickers for palette colors +- Real-time updates when parameters change +- Reset button to restore defaults + +**2. Seed Navigation** +- Display current seed number +- "Previous" and "Next" buttons to cycle through seeds +- "Random" button for random seed +- Input field to jump to specific seed +- Generate 100 variations when requested (seeds 1-100) + +**3. Single Artifact Structure** +```html + + + + + + + + +
+
+ +
+ + + +``` + +**CRITICAL**: This is a single artifact. No external files, no imports (except p5.js CDN). Everything inline. + +**4. Implementation Details - BUILD THE SIDEBAR** + +The sidebar structure: + +**1. Seed (FIXED)** - Always include exactly as shown: +- Seed display +- Prev/Next/Random/Jump buttons + +**2. Parameters (VARIABLE)** - Create controls for the art: +```html +
+ + + ... +
+``` +Add as many control-group divs as there are parameters. + +**3. Colors (OPTIONAL/VARIABLE)** - Include if the art needs adjustable colors: +- Add color pickers if users should control palette +- Skip this section if the art uses fixed colors +- Skip if the art is monochrome + +**4. Actions (FIXED)** - Always include exactly as shown: +- Regenerate button +- Reset button +- Download PNG button + +**Requirements**: +- Seed controls must work (prev/next/random/jump/display) +- All parameters must have UI controls +- Regenerate, Reset, Download buttons must work +- Keep Anthropic branding (UI styling, not art colors) + +### USING THE ARTIFACT + +The HTML artifact works immediately: +1. **In claude.ai**: Displayed as an interactive artifact - runs instantly +2. **As a file**: Save and open in any browser - no server needed +3. **Sharing**: Send the HTML file - it's completely self-contained + +--- + +## VARIATIONS & EXPLORATION + +The artifact includes seed navigation by default (prev/next/random buttons), allowing users to explore variations without creating multiple files. If the user wants specific variations highlighted: + +- Include seed presets (buttons for "Variation 1: Seed 42", "Variation 2: Seed 127", etc.) +- Add a "Gallery Mode" that shows thumbnails of multiple seeds side-by-side +- All within the same single artifact + +This is like creating a series of prints from the same plate - the algorithm is consistent, but each seed reveals different facets of its potential. The interactive nature means users discover their own favorites by exploring the seed space. + +--- + +## THE CREATIVE PROCESS + +**User request** → **Algorithmic philosophy** → **Implementation** + +Each request is unique. The process involves: + +1. **Interpret the user's intent** - What aesthetic is being sought? +2. **Create an algorithmic philosophy** (4-6 paragraphs) describing the computational approach +3. **Implement it in code** - Build the algorithm that expresses this philosophy +4. **Design appropriate parameters** - What should be tunable? +5. **Build matching UI controls** - Sliders/inputs for those parameters + +**The constants**: +- Anthropic branding (colors, fonts, layout) +- Seed navigation (always present) +- Self-contained HTML artifact + +**Everything else is variable**: +- The algorithm itself +- The parameters +- The UI controls +- The visual outcome + +To achieve the best results, trust creativity and let the philosophy guide the implementation. + +--- + +## RESOURCES + +This skill includes helpful templates and documentation: + +- **templates/viewer.html**: REQUIRED STARTING POINT for all HTML artifacts. + - This is the foundation - contains the exact structure and Anthropic branding + - **Keep unchanged**: Layout structure, sidebar organization, Anthropic colors/fonts, seed controls, action buttons + - **Replace**: The p5.js algorithm, parameter definitions, and UI controls in Parameters section + - The extensive comments in the file mark exactly what to keep vs replace + +- **templates/generator_template.js**: Reference for p5.js best practices and code structure principles. + - Shows how to organize parameters, use seeded randomness, structure classes + - NOT a pattern menu - use these principles to build unique algorithms + - Embed algorithms inline in the HTML artifact (don't create separate .js files) + +**Critical reminder**: +- The **template is the STARTING POINT**, not inspiration +- The **algorithm is where to create** something unique +- Don't copy the flow field example - build what the philosophy demands +- But DO keep the exact UI structure and Anthropic branding from the template \ No newline at end of file diff --git a/.claude/skills/algorithmic-art/templates/generator_template.js b/.claude/skills/algorithmic-art/templates/generator_template.js new file mode 100644 index 0000000..e263fbd --- /dev/null +++ b/.claude/skills/algorithmic-art/templates/generator_template.js @@ -0,0 +1,223 @@ +/** + * ═══════════════════════════════════════════════════════════════════════════ + * P5.JS GENERATIVE ART - BEST PRACTICES + * ═══════════════════════════════════════════════════════════════════════════ + * + * This file shows STRUCTURE and PRINCIPLES for p5.js generative art. + * It does NOT prescribe what art you should create. + * + * Your algorithmic philosophy should guide what you build. + * These are just best practices for how to structure your code. + * + * ═══════════════════════════════════════════════════════════════════════════ + */ + +// ============================================================================ +// 1. PARAMETER ORGANIZATION +// ============================================================================ +// Keep all tunable parameters in one object +// This makes it easy to: +// - Connect to UI controls +// - Reset to defaults +// - Serialize/save configurations + +let params = { + // Define parameters that match YOUR algorithm + // Examples (customize for your art): + // - Counts: how many elements (particles, circles, branches, etc.) + // - Scales: size, speed, spacing + // - Probabilities: likelihood of events + // - Angles: rotation, direction + // - Colors: palette arrays + + seed: 12345, + // define colorPalette as an array -- choose whatever colors you'd like ['#d97757', '#6a9bcc', '#788c5d', '#b0aea5'] + // Add YOUR parameters here based on your algorithm +}; + +// ============================================================================ +// 2. SEEDED RANDOMNESS (Critical for reproducibility) +// ============================================================================ +// ALWAYS use seeded random for Art Blocks-style reproducible output + +function initializeSeed(seed) { + randomSeed(seed); + noiseSeed(seed); + // Now all random() and noise() calls will be deterministic +} + +// ============================================================================ +// 3. P5.JS LIFECYCLE +// ============================================================================ + +function setup() { + createCanvas(800, 800); + + // Initialize seed first + initializeSeed(params.seed); + + // Set up your generative system + // This is where you initialize: + // - Arrays of objects + // - Grid structures + // - Initial positions + // - Starting states + + // For static art: call noLoop() at the end of setup + // For animated art: let draw() keep running +} + +function draw() { + // Option 1: Static generation (runs once, then stops) + // - Generate everything in setup() + // - Call noLoop() in setup() + // - draw() doesn't do much or can be empty + + // Option 2: Animated generation (continuous) + // - Update your system each frame + // - Common patterns: particle movement, growth, evolution + // - Can optionally call noLoop() after N frames + + // Option 3: User-triggered regeneration + // - Use noLoop() by default + // - Call redraw() when parameters change +} + +// ============================================================================ +// 4. CLASS STRUCTURE (When you need objects) +// ============================================================================ +// Use classes when your algorithm involves multiple entities +// Examples: particles, agents, cells, nodes, etc. + +class Entity { + constructor() { + // Initialize entity properties + // Use random() here - it will be seeded + } + + update() { + // Update entity state + // This might involve: + // - Physics calculations + // - Behavioral rules + // - Interactions with neighbors + } + + display() { + // Render the entity + // Keep rendering logic separate from update logic + } +} + +// ============================================================================ +// 5. PERFORMANCE CONSIDERATIONS +// ============================================================================ + +// For large numbers of elements: +// - Pre-calculate what you can +// - Use simple collision detection (spatial hashing if needed) +// - Limit expensive operations (sqrt, trig) when possible +// - Consider using p5 vectors efficiently + +// For smooth animation: +// - Aim for 60fps +// - Profile if things are slow +// - Consider reducing particle counts or simplifying calculations + +// ============================================================================ +// 6. UTILITY FUNCTIONS +// ============================================================================ + +// Color utilities +function hexToRgb(hex) { + const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? { + r: parseInt(result[1], 16), + g: parseInt(result[2], 16), + b: parseInt(result[3], 16) + } : null; +} + +function colorFromPalette(index) { + return params.colorPalette[index % params.colorPalette.length]; +} + +// Mapping and easing +function mapRange(value, inMin, inMax, outMin, outMax) { + return outMin + (outMax - outMin) * ((value - inMin) / (inMax - inMin)); +} + +function easeInOutCubic(t) { + return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2; +} + +// Constrain to bounds +function wrapAround(value, max) { + if (value < 0) return max; + if (value > max) return 0; + return value; +} + +// ============================================================================ +// 7. PARAMETER UPDATES (Connect to UI) +// ============================================================================ + +function updateParameter(paramName, value) { + params[paramName] = value; + // Decide if you need to regenerate or just update + // Some params can update in real-time, others need full regeneration +} + +function regenerate() { + // Reinitialize your generative system + // Useful when parameters change significantly + initializeSeed(params.seed); + // Then regenerate your system +} + +// ============================================================================ +// 8. COMMON P5.JS PATTERNS +// ============================================================================ + +// Drawing with transparency for trails/fading +function fadeBackground(opacity) { + fill(250, 249, 245, opacity); // Anthropic light with alpha + noStroke(); + rect(0, 0, width, height); +} + +// Using noise for organic variation +function getNoiseValue(x, y, scale = 0.01) { + return noise(x * scale, y * scale); +} + +// Creating vectors from angles +function vectorFromAngle(angle, magnitude = 1) { + return createVector(cos(angle), sin(angle)).mult(magnitude); +} + +// ============================================================================ +// 9. EXPORT FUNCTIONS +// ============================================================================ + +function exportImage() { + saveCanvas('generative-art-' + params.seed, 'png'); +} + +// ============================================================================ +// REMEMBER +// ============================================================================ +// +// These are TOOLS and PRINCIPLES, not a recipe. +// Your algorithmic philosophy should guide WHAT you create. +// This structure helps you create it WELL. +// +// Focus on: +// - Clean, readable code +// - Parameterized for exploration +// - Seeded for reproducibility +// - Performant execution +// +// The art itself is entirely up to you! +// +// ============================================================================ \ No newline at end of file diff --git a/.claude/skills/algorithmic-art/templates/viewer.html b/.claude/skills/algorithmic-art/templates/viewer.html new file mode 100644 index 0000000..630cc1f --- /dev/null +++ b/.claude/skills/algorithmic-art/templates/viewer.html @@ -0,0 +1,599 @@ + + + + + + + Generative Art Viewer + + + + + + + +
+ + + + +
+
+
Initializing generative art...
+
+
+
+ + + + \ No newline at end of file diff --git a/.claude/skills/brand-guidelines/.openskills.json b/.claude/skills/brand-guidelines/.openskills.json new file mode 100644 index 0000000..d03a32f --- /dev/null +++ b/.claude/skills/brand-guidelines/.openskills.json @@ -0,0 +1,7 @@ +{ + "source": "anthropics/skills", + "sourceType": "git", + "repoUrl": "https://github.com/anthropics/skills", + "subpath": "skills\\brand-guidelines", + "installedAt": "2026-03-02T09:19:50.041Z" +} \ No newline at end of file diff --git a/.claude/skills/brand-guidelines/LICENSE.txt b/.claude/skills/brand-guidelines/LICENSE.txt new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/.claude/skills/brand-guidelines/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/.claude/skills/brand-guidelines/SKILL.md b/.claude/skills/brand-guidelines/SKILL.md new file mode 100644 index 0000000..47c72c6 --- /dev/null +++ b/.claude/skills/brand-guidelines/SKILL.md @@ -0,0 +1,73 @@ +--- +name: brand-guidelines +description: Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply. +license: Complete terms in LICENSE.txt +--- + +# Anthropic Brand Styling + +## Overview + +To access Anthropic's official brand identity and style resources, use this skill. + +**Keywords**: branding, corporate identity, visual identity, post-processing, styling, brand colors, typography, Anthropic brand, visual formatting, visual design + +## Brand Guidelines + +### Colors + +**Main Colors:** + +- Dark: `#141413` - Primary text and dark backgrounds +- Light: `#faf9f5` - Light backgrounds and text on dark +- Mid Gray: `#b0aea5` - Secondary elements +- Light Gray: `#e8e6dc` - Subtle backgrounds + +**Accent Colors:** + +- Orange: `#d97757` - Primary accent +- Blue: `#6a9bcc` - Secondary accent +- Green: `#788c5d` - Tertiary accent + +### Typography + +- **Headings**: Poppins (with Arial fallback) +- **Body Text**: Lora (with Georgia fallback) +- **Note**: Fonts should be pre-installed in your environment for best results + +## Features + +### Smart Font Application + +- Applies Poppins font to headings (24pt and larger) +- Applies Lora font to body text +- Automatically falls back to Arial/Georgia if custom fonts unavailable +- Preserves readability across all systems + +### Text Styling + +- Headings (24pt+): Poppins font +- Body text: Lora font +- Smart color selection based on background +- Preserves text hierarchy and formatting + +### Shape and Accent Colors + +- Non-text shapes use accent colors +- Cycles through orange, blue, and green accents +- Maintains visual interest while staying on-brand + +## Technical Details + +### Font Management + +- Uses system-installed Poppins and Lora fonts when available +- Provides automatic fallback to Arial (headings) and Georgia (body) +- No font installation required - works with existing system fonts +- For best results, pre-install Poppins and Lora fonts in your environment + +### Color Application + +- Uses RGB color values for precise brand matching +- Applied via python-pptx's RGBColor class +- Maintains color fidelity across different systems diff --git a/.claude/skills/canvas-design/.openskills.json b/.claude/skills/canvas-design/.openskills.json new file mode 100644 index 0000000..d85997a --- /dev/null +++ b/.claude/skills/canvas-design/.openskills.json @@ -0,0 +1,7 @@ +{ + "source": "anthropics/skills", + "sourceType": "git", + "repoUrl": "https://github.com/anthropics/skills", + "subpath": "skills\\canvas-design", + "installedAt": "2026-03-02T09:19:50.075Z" +} \ No newline at end of file diff --git a/.claude/skills/canvas-design/LICENSE.txt b/.claude/skills/canvas-design/LICENSE.txt new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/.claude/skills/canvas-design/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/.claude/skills/canvas-design/SKILL.md b/.claude/skills/canvas-design/SKILL.md new file mode 100644 index 0000000..9f63fee --- /dev/null +++ b/.claude/skills/canvas-design/SKILL.md @@ -0,0 +1,130 @@ +--- +name: canvas-design +description: Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations. +license: Complete terms in LICENSE.txt +--- + +These are instructions for creating design philosophies - aesthetic movements that are then EXPRESSED VISUALLY. Output only .md files, .pdf files, and .png files. + +Complete this in two steps: +1. Design Philosophy Creation (.md file) +2. Express by creating it on a canvas (.pdf file or .png file) + +First, undertake this task: + +## DESIGN PHILOSOPHY CREATION + +To begin, create a VISUAL PHILOSOPHY (not layouts or templates) that will be interpreted through: +- Form, space, color, composition +- Images, graphics, shapes, patterns +- Minimal text as visual accent + +### THE CRITICAL UNDERSTANDING +- What is received: Some subtle input or instructions by the user that should be taken into account, but used as a foundation; it should not constrain creative freedom. +- What is created: A design philosophy/aesthetic movement. +- What happens next: Then, the same version receives the philosophy and EXPRESSES IT VISUALLY - creating artifacts that are 90% visual design, 10% essential text. + +Consider this approach: +- Write a manifesto for an art movement +- The next phase involves making the artwork + +The philosophy must emphasize: Visual expression. Spatial communication. Artistic interpretation. Minimal words. + +### HOW TO GENERATE A VISUAL PHILOSOPHY + +**Name the movement** (1-2 words): "Brutalist Joy" / "Chromatic Silence" / "Metabolist Dreams" + +**Articulate the philosophy** (4-6 paragraphs - concise but complete): + +To capture the VISUAL essence, express how the philosophy manifests through: +- Space and form +- Color and material +- Scale and rhythm +- Composition and balance +- Visual hierarchy + +**CRITICAL GUIDELINES:** +- **Avoid redundancy**: Each design aspect should be mentioned once. Avoid repeating points about color theory, spatial relationships, or typographic principles unless adding new depth. +- **Emphasize craftsmanship REPEATEDLY**: The philosophy MUST stress multiple times that the final work should appear as though it took countless hours to create, was labored over with care, and comes from someone at the absolute top of their field. This framing is essential - repeat phrases like "meticulously crafted," "the product of deep expertise," "painstaking attention," "master-level execution." +- **Leave creative space**: Remain specific about the aesthetic direction, but concise enough that the next Claude has room to make interpretive choices also at a extremely high level of craftmanship. + +The philosophy must guide the next version to express ideas VISUALLY, not through text. Information lives in design, not paragraphs. + +### PHILOSOPHY EXAMPLES + +**"Concrete Poetry"** +Philosophy: Communication through monumental form and bold geometry. +Visual expression: Massive color blocks, sculptural typography (huge single words, tiny labels), Brutalist spatial divisions, Polish poster energy meets Le Corbusier. Ideas expressed through visual weight and spatial tension, not explanation. Text as rare, powerful gesture - never paragraphs, only essential words integrated into the visual architecture. Every element placed with the precision of a master craftsman. + +**"Chromatic Language"** +Philosophy: Color as the primary information system. +Visual expression: Geometric precision where color zones create meaning. Typography minimal - small sans-serif labels letting chromatic fields communicate. Think Josef Albers' interaction meets data visualization. Information encoded spatially and chromatically. Words only to anchor what color already shows. The result of painstaking chromatic calibration. + +**"Analog Meditation"** +Philosophy: Quiet visual contemplation through texture and breathing room. +Visual expression: Paper grain, ink bleeds, vast negative space. Photography and illustration dominate. Typography whispered (small, restrained, serving the visual). Japanese photobook aesthetic. Images breathe across pages. Text appears sparingly - short phrases, never explanatory blocks. Each composition balanced with the care of a meditation practice. + +**"Organic Systems"** +Philosophy: Natural clustering and modular growth patterns. +Visual expression: Rounded forms, organic arrangements, color from nature through architecture. Information shown through visual diagrams, spatial relationships, iconography. Text only for key labels floating in space. The composition tells the story through expert spatial orchestration. + +**"Geometric Silence"** +Philosophy: Pure order and restraint. +Visual expression: Grid-based precision, bold photography or stark graphics, dramatic negative space. Typography precise but minimal - small essential text, large quiet zones. Swiss formalism meets Brutalist material honesty. Structure communicates, not words. Every alignment the work of countless refinements. + +*These are condensed examples. The actual design philosophy should be 4-6 substantial paragraphs.* + +### ESSENTIAL PRINCIPLES +- **VISUAL PHILOSOPHY**: Create an aesthetic worldview to be expressed through design +- **MINIMAL TEXT**: Always emphasize that text is sparse, essential-only, integrated as visual element - never lengthy +- **SPATIAL EXPRESSION**: Ideas communicate through space, form, color, composition - not paragraphs +- **ARTISTIC FREEDOM**: The next Claude interprets the philosophy visually - provide creative room +- **PURE DESIGN**: This is about making ART OBJECTS, not documents with decoration +- **EXPERT CRAFTSMANSHIP**: Repeatedly emphasize the final work must look meticulously crafted, labored over with care, the product of countless hours by someone at the top of their field + +**The design philosophy should be 4-6 paragraphs long.** Fill it with poetic design philosophy that brings together the core vision. Avoid repeating the same points. Keep the design philosophy generic without mentioning the intention of the art, as if it can be used wherever. Output the design philosophy as a .md file. + +--- + +## DEDUCING THE SUBTLE REFERENCE + +**CRITICAL STEP**: Before creating the canvas, identify the subtle conceptual thread from the original request. + +**THE ESSENTIAL PRINCIPLE**: +The topic is a **subtle, niche reference embedded within the art itself** - not always literal, always sophisticated. Someone familiar with the subject should feel it intuitively, while others simply experience a masterful abstract composition. The design philosophy provides the aesthetic language. The deduced topic provides the soul - the quiet conceptual DNA woven invisibly into form, color, and composition. + +This is **VERY IMPORTANT**: The reference must be refined so it enhances the work's depth without announcing itself. Think like a jazz musician quoting another song - only those who know will catch it, but everyone appreciates the music. + +--- + +## CANVAS CREATION + +With both the philosophy and the conceptual framework established, express it on a canvas. Take a moment to gather thoughts and clear the mind. Use the design philosophy created and the instructions below to craft a masterpiece, embodying all aspects of the philosophy with expert craftsmanship. + +**IMPORTANT**: For any type of content, even if the user requests something for a movie/game/book, the approach should still be sophisticated. Never lose sight of the idea that this should be art, not something that's cartoony or amateur. + +To create museum or magazine quality work, use the design philosophy as the foundation. Create one single page, highly visual, design-forward PDF or PNG output (unless asked for more pages). Generally use repeating patterns and perfect shapes. Treat the abstract philosophical design as if it were a scientific bible, borrowing the visual language of systematic observation—dense accumulation of marks, repeated elements, or layered patterns that build meaning through patient repetition and reward sustained viewing. Add sparse, clinical typography and systematic reference markers that suggest this could be a diagram from an imaginary discipline, treating the invisible subject with the same reverence typically reserved for documenting observable phenomena. Anchor the piece with simple phrase(s) or details positioned subtly, using a limited color palette that feels intentional and cohesive. Embrace the paradox of using analytical visual language to express ideas about human experience: the result should feel like an artifact that proves something ephemeral can be studied, mapped, and understood through careful attention. This is true art. + +**Text as a contextual element**: Text is always minimal and visual-first, but let context guide whether that means whisper-quiet labels or bold typographic gestures. A punk venue poster might have larger, more aggressive type than a minimalist ceramics studio identity. Most of the time, font should be thin. All use of fonts must be design-forward and prioritize visual communication. Regardless of text scale, nothing falls off the page and nothing overlaps. Every element must be contained within the canvas boundaries with proper margins. Check carefully that all text, graphics, and visual elements have breathing room and clear separation. This is non-negotiable for professional execution. **IMPORTANT: Use different fonts if writing text. Search the `./canvas-fonts` directory. Regardless of approach, sophistication is non-negotiable.** + +Download and use whatever fonts are needed to make this a reality. Get creative by making the typography actually part of the art itself -- if the art is abstract, bring the font onto the canvas, not typeset digitally. + +To push boundaries, follow design instinct/intuition while using the philosophy as a guiding principle. Embrace ultimate design freedom and choice. Push aesthetics and design to the frontier. + +**CRITICAL**: To achieve human-crafted quality (not AI-generated), create work that looks like it took countless hours. Make it appear as though someone at the absolute top of their field labored over every detail with painstaking care. Ensure the composition, spacing, color choices, typography - everything screams expert-level craftsmanship. Double-check that nothing overlaps, formatting is flawless, every detail perfect. Create something that could be shown to people to prove expertise and rank as undeniably impressive. + +Output the final result as a single, downloadable .pdf or .png file, alongside the design philosophy used as a .md file. + +--- + +## FINAL STEP + +**IMPORTANT**: The user ALREADY said "It isn't perfect enough. It must be pristine, a masterpiece if craftsmanship, as if it were about to be displayed in a museum." + +**CRITICAL**: To refine the work, avoid adding more graphics; instead refine what has been created and make it extremely crisp, respecting the design philosophy and the principles of minimalism entirely. Rather than adding a fun filter or refactoring a font, consider how to make the existing composition more cohesive with the art. If the instinct is to call a new function or draw a new shape, STOP and instead ask: "How can I make what's already here more of a piece of art?" + +Take a second pass. Go back to the code and refine/polish further to make this a philosophically designed masterpiece. + +## MULTI-PAGE OPTION + +To create additional pages when requested, create more creative pages along the same lines as the design philosophy but distinctly different as well. Bundle those pages in the same .pdf or many .pngs. Treat the first page as just a single page in a whole coffee table book waiting to be filled. Make the next pages unique twists and memories of the original. Have them almost tell a story in a very tasteful way. Exercise full creative freedom. \ No newline at end of file diff --git a/.claude/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt new file mode 100644 index 0000000..1dad6ca --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2012 The Arsenal Project Authors (andrij.design@gmail.com) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fe5409b22e6b22a0ce80c65bdbb333d7d96e7a6a GIT binary patch literal 165848 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 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf b/.claude/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fc5f8fddee4c9e5810b1ab0e518a69acee3d2c50 GIT binary patch literal 94528 zcmdqK34Be*`#(O*xoeV}D@ZI6Hz9U$v&T}hQxqlkC=o%3M3Y#ns=KOctF3OTt?sC* zwyLVAsw!Pn6;)M5QCoFaRpZ zdhW#~WrYQ8<_&Q$7KGf}^ClEbov5|v7SKn6-cwpIq3DO+O~M$Hn;5foo>*2dI4@&){)qC%wC zF7!j%>;Kw*zR*6(wmpCXpw@z@>`cH@hd4B4qHJQtbd|#?W5!nU#=r`qVmw@|rT8i( z!EWvT+QZKd5AF0TlLp^?YqEN%@Izbs5BzKUg}(Mtjv~ag5_c7#$+_Tw@>}X?E8t&X zJb`N=s^#n{#`JXd)D0?<`gJSo<6%!R&!565k26K=^)UW`3e#3t)A8`27F15B0(PN_ zhM+ulHj?GBT-KSTusGI?MX8bqr>F%QjvmFu&F1qt^V!RMW|_}5h~Y#Dxb{4#`&IcK zhOdW7b1Sg1u#Mnv%yQs%V~gQF&sM`-!}h`5&kn*p%+A66i`QeEH{i|Sw&3Y-Gx>FJ zNARg|r}HP^KFwc)`v%_wcQ4-$_keJic^4uK{hy0C(HCxiu?+4Cu@UYj@h#j#;waqj zh0eHKERhrWoJ9HL3-Tqn%jI&oE9FYKtL0m8&&Xexl)q_iCbe2x1j<@ps}HxKhPKyY zv>4=>Gl@ED0~-$ORv2_?fp{u5lfOxwSu_WDs9tH+xF$5IX_{5Dfu6DEd@nd~4etV5 ztt~TQ&KhX*O;|9yHphe|OVRR7SYu5!uL)Z~A8x`{7Nhb_JngKGJYd2O7B07%a1isz zB_q#qxMx~F#22@w|MD@fLCjHzISKIt;mgP9ix^|5tOdw#b>HP< z^`v?li!%D5%TxQy?x(&K?(!V+&?3dG6r-W>EWmg<4R#D{8CtFgVII_T8Tl&EM?5Ht z!l=^qrnW6c>lFawL3#UH7+-3m0hJ=81RM$}{R+5o zz?Orfk>gP4k=ilh7A@Ezu5Ro4@u|>$F3t%F}RgsaY>A)$|F@El?MEYy?U$i`@rV zXa!r#wy-^zE6#E|ug9BmFYm;=@jS>8C44HsjX%hr;vewOMYt#u*NYp)UE)#koOo4y zBYqHnN-0BSL)lsu$f@!+d7oS;mq8xbBKOE+@~mdp>S!LVjh3cmYkjnQZLBs`o2@;l zJ*BO-I4n_?QpLJ~u|g!B#>8ZsuNBIKr!yF(ri*%fjuDSp5qjJm z;cnt?=kDn4>Mn85aW8N$b}x6Yac_3-aPM~?cmGx^xK_PdO>22;b*eSJ)*ZFx*IHC- zNv&12HrD#2)>pO8hYbiD88#toM%dk9kA=MywmNK6*r#Fp!%l^ruN_poLG9Su-rAjN zcdgy8_I0(3Yfq|ubM5d%_QwY`1JO?vqyFsr57vLG{<8Y-*8imbm-WA^f2RJQ4Qvg< z8bmi}(;&4$R)by*hBO%6;O+(wH+Z|jo(6{+iiWO+Z5wuInA@;#!(k1J8&)=))o^aZ z=Nj&7cq}p~G9t1`WV^_YkzFJEMGlV~7x_fwvB+N{^+rLBA{sSsl-j6kqk)aaG%9a& zW23o^7B+gZ(QA#?H`>K-*XswnEMsQ06`M|~4@I_j^+ zj>bJ2&uhHB@u|jtcr;I_r=h2rC*E_F=Sj~}&)c5Oo-aJ#dQN)IMr+aTXis!m^n&Q8 zqhF4GEBgKD&!WGM{yruorhZJ*7;j9cn65GXVhUp_Vs4FjAm+)KB{8dFHpc9TIT-U} z6W+w#B(h2KCJ9Y4nq1RlaFbC@Dw^EgWOb8GO}01L*W_4JXVcWCSxtL29o)32>Ge%# zG@ae_fu@U^zR~pErXMxk)AVp`Tx^HfoY=hB!r1cIn`7^beLVL0*f(M~#eN=pF!smT z^UdtdYBy`#tW~p=W|_^dY4&8ZCCyef+t{2n4{lzs`LO22%_lW~qxsnu5iOduXxE}k zi{34UwJl^BYw=Z!qb+`Jp|=cb8PT#y%XTe0w(Qz+V9Uamb6PHF zxxZD*R>`e0T3yp>SgYbzlUhB~>XlY+wtBDCr>(weUAJ|c)@iM?TlZ-_qIF5@8Lj8G zUf6nB>$R=7wBFhJK3_UjoP+so7^^|?KN!& zx1HGb-nNgoeWC4ZZ8x;t(spOt18q;XJsYRR)ro5y*E%jWE-S8g+>p4@areb7jC&{U z!?@4l4#b^|JKIicSHE3syZCljwHws#)^_){ThVT9yDjZ@wmZ=7WV^Fo&Fl7d_s;h& z@-FeN@^1F-@*eU27H^FYi;s$ri|-uYJ$^v^$oSIunep@D7sW4+Ul+eMepmd#_@5F) zf-9jQVM4;Rgu4LoQz@+NgkdMW9Rr1z6POZqnH zRMH>GmgHK=jgs3Yk4v7Bd}s0l$%~SgB(F-|nEXkKJ*7^HC#6kFT1s|GpOpNRu_;qi zW~V%o@?y&BluaqyQ}(5tOgWpXrMgo+sqIsXQm;?FG4-z0hf?24-IaPU^>pgFG;3N| zT2xxAw3M{Wv_Wa3(k7>#A*?J)Pq_KhpX8&Odejvy0Xxq)T|0#$8%; ziSN>(OIDY@T?)HYcDcRFf-Wy~S>5HsE_=J2=<;)yKhtG;PDQ-EPro&NZu&#j%(C=%(?3rCCjIA(;Ec$Ot{F1j>}HT?ws8{yKnZ8 z?2*~GXTOmBYfffP|D3Tocji2ob2v99H!(Lmw`cC4+)23)d5=v!8}#hdb573%*EGN8p=(a|>eB1E-uB*8dvEO%(x+9QoBJ&3qhH(p+R@kE zf9;2TL;B|Sy`k?1ef55A`X%+t?$@{9_n4jMOT)}TiRy)tOapl=499b9{G z+~CfG2M#V9JY(>j!A}l;dGOnVKODS!@W~;3NcfP}L#`Tf^^ieBMi04R$X!DoAF_PN zmLaEy))^W-G;L_Fp<{RVS^2&5hvtvT zugJe4|JMAw^B>56JpY;erTMG#H{^eszdQe%{G<6lym9TqXH@vy6g4H-6O zSS4f%rSnm%`Z{VwM^DW@0?&PrFsv*eQb~I@lgC4*n91+u^P!Vi!N2B5`3ccbv=xaW zRSXtu#d`6P_*!Z*81h6IB#Nf8g^ZK&GFfhjazuqjMMO1NI;ve%Dn{t5qxwY+ zjVg{Ri@G7|_NaTK9*BB4YEjf5o*<9gQ`ghL6Xl7)2<`PGdOCQrJ$*eBJ<~jQd7kz> z>v_TRlILa5O3xdfHJ*2(Ye$Di$3!=aj*HHVzApOF7!hNQ35^MhsTcl1VE{R|}>Y|t6x>RQL#^vT#!qi~ z;b=9~X?BWz2OZVdkSBMs&-Kh|p_la>YI3k4w0-Rl4fc^7iaqqgp|OXqKKS*a;)CzQ zEInieMew0eMRD*9xpNQBJvjN`O9v~y-Tp1~q~9X1-)@A3UiI5ozJ2D~S>KLiY=7?l z_CBurBlkDhH}tDvwh;8weZZdOv&3StRfVH9yfQ(KlB4BVxkM_hB7=5owOk`N%k6TH z@>l=K9df7KD-Xzn@~}JtY4^B1DNoDuno|pgwyT8}2dTG%ile2Gdqg{_ozbA>y7;FZ zCW?dF5l|n|j#a17kXP-b-x{Hc7P!NTUOOHbLw1opA&d8uFUei<0eQPDm1VN8d`EVZ zg|e&6lUK{`a+7>lz9)Oh`FMY$pl@u3bwyXK4SHjBFbZqGu~>^#vYXg5>^bO&mP7ye zF4}cJI|S|HX<07&%L=(oj?-#G4_O~t$Y|&wGoXRIn)l+v`AA;GOZh}-As69|c$&Wi z9ppRwOXwiK;RpC}IT7oG>*a^g8eSuxmv71!yDHLA`0r31SVQm#WVqSq!@hqfH{-$Lm;stT~53Uvwjz zhjHjuwusG<>)Ar~G26)AXCI)SKFeR{q3i;;@^Bu)>+lHPh^O+Fye;14!MqRe$NTf< zSOML|Z@|d)D8F59;1BZ;`8xhCe~*95pX7&F1P_D$SBIXfHuG@kzM$uh|;9 z!&>qtES+~?UfzmzAHyc_Vs<^Bz$WwS*;HP^rtor%veVcj&}QGv zXRrnQezq7o;1~E}_7Z=Vy~v+ouka=8b^Z!_jW1`f@@4EDXdu_}H`&{K75j?sX1n?4 z>^;7o?d7}J7yL8!CI5mQ;QQDSevlnyKkyUmM}CT(;V0RB{BHIs-^QA=HqbvqyTQj} z4SNHh49%p44di{^KAAwU%(phx~vg&icj!I zSS=pR!g(#$o+q*{ygeJtu}0-X*$pf!gUI!ueiTC|Z?SN3#M8dhqjwb=7192$~o)AQ&?x7#5mc-*&3iq;99?#Nv0!!xY*l_G- z4C8~?J$yF1m(O9h@tfEk{APA1zlF`_x3b&$EOtMi%N~FR`aym#dx+o1=JR{lM|=zW zgl}crvH!J$f5JZJpR%2NJNt}(%#K5&{XPGVo#02=DgM12Ba3JZohfgU)8!0#qr5>b zl26HNp%-`sBkNM^9K0@HmaF6n`Ko+F?uVveuiS@m^jrCj{8D};zm^|i#N8p+VeI`J zqwo6|TTjaGxxrGh9to?))TMvK+ zPc54DQ%_~BUz+|-@L##*|AJQWO_e*4H!sro6wk|9m6uj5MdInRct|t4 z!zKeKP3sHa41X7dDY_Q{cg6FFyp6RXyBR!{6)5u^##6z8R{N0rW91~KS;IjGtKH6u z?GEFq;6Q7IPBqYvJP*7=n|6hCSIX}qI`oNw*b6I`v)Ld@OZAWHwqZ5@O4b$oWmjg8 zuxn*27Iay=6KP*;Q!atK6y3kaZDz676c%68%9$)e7GkgLN^B(d(Q4YYY^bbm!vp>H z^(^0doXwTbvQGaC+vrN;T86Mr%F6AmP|jgJE^9wyJ+#LVj;GIB_W^#F<;lD7ymA}< zFK89t3}wZ0tfBmZWnR`EME(zAKhtCfVK&*Uf5Sh}ujU^cR!&A5%D&;_$qL1Mf(yhv11IlMPyH#eiE+#4tWep&JO#p* zmjc2L0Dc+ucx5)`3hAzt-$itmr;r!bCqBcwjy4ysp{&)c{(GmJH`EWOyuI96Mhu-GfI!K{_6 zX_uh?{;LtWEWGqD(&IYd1-5%Y2sTmVVS{( zD~mPfC9Unw>UjA)%Jk3Ha|JY4!l#FP0qH4QBTY>Q4tXQ1!sY<3ZlkOD@5b11rS>=* zBI_{M-`dw%e_7qe*6`O1zcT;xtO>^KrZue`!fMH0%y~sNmBq`Nb_MFEx@}U;@4*<{ zoDH({WK$vU^cRg;vV4_YBUiBwaxY}j&sbmR7W(6zi-bJd2l9HZxC<+~7g-~56T4d6 z$vTQ#S!;nh7PqrZkHWS4zin{@SkHtxwTD)u&jFva7X;c;3r8YGuaL@&HS> z*qQrE`CTa;t$TLj*co&}SiLjo4%DtL6JC}lxbl!k@u znW8LKuX!Q?*27v^=0MhogB2`P(NzoI&pL^Zu^MiGRX$`5Wg+XP!)7QR%F5x03#)lp zC+mB73OtppmH{~`#|(=CZUcDrhK*-Y;yj+`(FSi~-g}c>B}M@rML31;Bqjkr2~P{_ zC6B_EvRq~1&r?=5W(~zp$k!prCx_s-BQNvuOhYeFS2VtuGB01wFd8gx+F)og(5r2nYa2igeW{{*fX`mP0b9N^us9|C_4@9`5x zxJ`rX4|!U20F9gVfgOZ1bYmp)B2i~r8$1;Zt7XE@WRta9*fiLwiZ{;C4boywngTrW zj-agFE%|7lp$LnD{TBGg!T&hw=oI{eSQ_TUTw5R1Gt#iMVuP(`@NA9uYX$lHoBpBd zDViY8BZkGAbC8nLCCZ|#*5?w>KY&NON<7hHr@>Bv?F-utR`uc-SQX~8T>;~eD$c$z zoVZ~)cjFIJCpJgGDn5!{ofqwF!iwI*5t6LyaZ*Uf&)bhO>~+wi~BO1(VPyTCj6s zL;N6|+zUahP@Ji&1uf^L=^R%`XTOL}LoO9hHy-NLt3U0UDc3G2D5+#83lk~|*^$D6 ziXwKPuyDdewr5mH@ffyaRB71+_R;9_fAF`;lGn^RHYjc2neCXK9M(<>%Ttbq1e+W@XW-P9ppFu4|Tt>oIstq)h4HK}5S5Vjs%0i)`Hvj}qQ5>ELegZkKy+3&O8 zVsC19<6Ox~+q1U0Ff(lvZ6j^H;99L`t!u20SSM?(_#Qr)hqE2fK6gM|6f3<$v&V{7-(K|HUtG9a-W+2q`pS z5msRncHt0b#UJ9F_*0x0e~Ak?l?&Y;gMJYy{RN$%9Xf2c(nsUWc|&Nl!&wxx@mZ`f z&xMXT8Yg?-WKB>`JLQYxB(ut&1$zG|rp|Q+i%=w5BwTQN2`AhP5e)rL25>?2RA-tw z&j{er3pLsT@q>|R>OS zx9kH=V;*)V3P}&Cc0MLzr=c9X6|=B!aErVZJ04XjK$HD5PC?febwpj9Z;BB0M19c! z`;w8Ok%$tFg-1k-7|}#D6|th3Xf9fame|#6E!tq`GETI^{$9LDz#e9jNERvB>q`^u zMF-JQbP`vI&Z3J*7a1Z`WQlB%BXUJo(M?<}x{Ds7r?^J+61_zqajobp`iVT8zaAh4 zib2>59U_K`d@)R1Cx(j=qCkukg<=%WUX2!G#8^=*#)ag&%OZWgzQTg7eSc5#QeQ_RNctvTXuF<0Cp=81d7ed2yG zUpycl6c337;$iU!&UQT}9v2J66Jn8gQamM|#tzvt;#r*ddS1LBUKB5hC1R;qCSDfH z#VhDluZor8HSxN5L#z^Siq+yRu|~X&{oHr3=eb^N5buhO;ys)we;+%bABZjDL$OtC z!(Q*l;uGm$`ii0?bepq}bj)~7bnC?aY~%V`Li?PNAZ*RS^Oe?6~Bq!>DXb(z#h*4X!Zy3;n=e%;8R6x^$1ai?-8 zg|U*U`6!5GV=T?ZXaVLNA|=@m9@iO)*2NGa0*JAv;jK z+HgT-d{@BMUKAqOUqol5+*$w4v{fxB7oRd=E-O-ga>;MT6{=R*8`xi5fgMIwtFK`!SdP_JU>@)l4dV7fsLF#% zu@};5gHmXyhj2(#I0wLlJf{W0#i;40dsiqRNL#m~cS#Q%gF$+xUVM(|(YhV!4{*5yCJt;2tWTbrLj{V);6e?aT3Q~70YsQf~XRQy&! zk`>|&w4o5ML$Vdnek-mkA?XV7DkNTkbtAY+F6O`mC+dajT@mtG{^@^6>iYlA9QmJ< zy8Kes#WL2G|E7G!e-|D|!Y%(R60nkf10~=8wA}ljtN+VOy_af_|Ek1Wb5)4h*o8BO zZk#d1HNm zomr4^rb5Pf4&QJsXDitg>~+W!i`hCzJxfXId6lG|*GcMG#Vt4)w3i3tq|aBp7S8(Y z<8^TY=xdz2>df|IZpgssp3QSGzIWr-V1)0@uf^yN2_54*By`Xf@M*j;zk$!-X^_)j z<{fa>@=ZRDzs1+{3ObcFUCHeHMkTZJo79?@KZ6n1!;Cq&X*71j0*-?_0v}+b7?JbnyMvlh4WRdF{ifWal9SA+==H2I6>8t zwZhrPB%X}$3ibUl&S8DR)1iyVz&S28bE=xpWo@A=h~wQ@ zJDlU|&U^5lXo+5Ei9Y!5*ozfYJnxGZ$-~LG0em1@WiT6!Gerr|a}C9*wa@r4%=E+g z2(;8l><7Y=k^}K3BJep<9s210y4^zbSiN%&cwB69U!$l$DhaP zvW~11&N01+^KdUgmRZV|p^q(xuJ09`fLp;|zikF#zcKqFX!HRL$H6+QAJ^rTXpo|=F&VxO`cyipe*mX-1C z{4)*>BmW#y&QAUX-vybd8_t*QhDPa2Rt_oaE546^&G++faN_I${}$)|4)R0%F#irx z*in9rf6tFYJKCN7!B0RkJB7ag15Oy4Iwt5&ce6^RX~J2--*8Tlv`uW1U*80cCNxgi zFM!U8^{%dU!g#GHn6&01tZc-rCVXML|1mRU%$d` z`g;uv8w~xfsb#^6EuWnfBiI^I;McaWVPXtB`oGt>VAc2T|G%{^7tKLfjY@Gz`TJ6{ zQv{^r`jDC%LYi&_DZ4SG?`WLwZGvwAVsXm1IlcsFDO*8$ZUd=04$`(4Qg{NS^CZaA zDUh?%Ab)p&T;2)tdS}^1rppYODYIm@%#pb`@!XA0JomsHa1CYvLr2&b=cARLFi^jk zUrm2hC`XYFaSTp`7t3+x+!?4*tkOhc?pwqjXSJ~!tBbW?1T?Dkp_gum{l{rI1$hHz zlN+Tv5$V%GLU&Z9yQCQyGv_Z#SEcmCn1Sz;_p7-FXPzIziRg#rBRC2Dn0y?krk}uR z$|rH2@@d@3fO#5sGT;k-+{y4FPJ64toS*Q7JObr3g^h>#y-G(zQ?=TzAgnrF_$NA82 z=xpdgc?jq1zr#uUqwIEhj4i;4(Btw1*6KfC6}g&u*u5+on&gMrgX{sUBn#NHEJL2e ze#=6f96ik*V~?`u57N;=3!ioAX*`}$nWX&Q_^fOLpFw`a%QF3Dyo@x{ zpF#8qUXxFT?`b5T;7zb)OeiQUFDtcWl#MAXEgJ94C@(G@Q&2dmvdET^V>~Hq-n5{s z!s7D6NfSnw6iszzjVh}wC@d^0t)vv`2)@@`#xxp$SBdA;TIPp0NN!F{Y znis{-B~}SuGq(x80#mNzbFv8UP4H&et~PUjwUJxv)s@91ql$vMS5LtkpGXA*>r`t` zYAtKes+vV;rq&aAHZoX6YNnoOrkZ4QhWM-uYcGREuK*TF$wurXs{HtzBwvD=CO%E( zl#a3X4k%`Jyb+XbwqLfHV7A$g*(R%OgH?jjOS}mQX5%IL+TH9ISvi*8W6R1*O|E9P zb9~%Ps%*0|bG#wF$4){YE}t}^q+k*i9#xuS>mAr3lFiu3l$IB-P*CrRl7fn{0bM@H zpsWKNUoW|9A8_QiRR>l^uM_7@$&T#tozgqTYsZlTl%Zf#@e4cx6!<* zY1V;MT|oo=)#DgAs<^1UsG_*SI&e&R!Q`T#!Tvxap7939=j0|?2NQ{b&NW*n(X7hc zH0uyz?;KL&Wp1Bf?Hi}|sDq3~Hesr2f`e)3O-}K965_p8p7@;Pj4BW6IibpfkR0-a zWDV~&{OaL-hvy8>8lGqR`VG$;o-w?ywV!_+uiE-b|h}RhK;##tsV#CezLW=sy&g4F~}r%&DzLrpv=y7>C^lz+ z;;NU#n~<0qG_HD@80%Am$B!v5Dk?20C>>Q?Xf2^uvzAm$9B%?DYBxGB03I+m_wLGALl8p*Uh&OYcY?dP4mqM>wG;GG_I$0TuO7#gs%c<~F%3-f2O7OP&20YMWb3rRX~1lqM6)V$+gqm-d*}2T z?{@n{YXObcK?Ou$!c>O=LwZJTfG0CG&=Vi%NeuKPS9#RfO&)iFzXVmG7_t4N@MH&u z1g4eIJ}@McJgx#?B?X2VnF=bPItdIgGiZ+gMu<5HkjF_g0f9jU)IbDV#~7$F)hk8~ zmlP1{A2Z1>M-LxufgN5uHz1Q|p%Z;n&4vgzKvmH`5GC?~ zNYV$Q-U?mS>eLKTHR=OVpFYsfP}QXmi<%@5a-&KnIG{>>Bnt2FRi_W>%Lw8TSXHZq z&Z;^sw3{_r7~-E~iJ4iug_eRMmA*Oe0@Ow-r%(|Unw=65jRL@7LM|FrTvDQH(WoY` zDvB#$o`yHXKUKr0je_GarfdUJi#9+e1Ah&9eYKA+3(=?0T2wg}4^3s!VMqo9`P$53 z%<#Y&tl||bS5aUuH$yUgoU!onH$#@cU9)`E2?Ag1p=K2rj1n6HAv_^|sh}#^OjQMr zBD1^uQVeKUO3{=Rs$#|a^AS%ennFVrL8h-_ybu|H)kZ4^??R!&_a*@HwTvr3m@ruw zFGyiX;Ok-LEqR4CX{T-8SmAp|&A z@kI@Qnp7nSE)J+kqsbBi8b+nlt5Y*h7LYb2%;0I{n%EejRT+%WNu&al(3}oZZ9)}& zlImSrDIA9(?+{cynIzTY4faXC9tau8*Guq9sC<|N)ZW z=PJ9XMdEX^{hdGCSINNo--B#_F0!j~0m%srgUf0(q>`k7rz%NE^mEQq)Q++mZK~Sb zPV$u*2kH8vLk{!~*G zLCBb*@(B?1N0zAMHT4?UlyHcr!;lXFQPam)MO9LwiH*-`?<*(r<*&sQD$yjxWl~k2 zH3UfDT$3*9v*4+U8a$~+=To91aq)FCJIRkg85NY{FJ-R3l+^krfj?6@DpT%i5~axp zsT;*Gs=@M8w377yJhK%VaRN2rbD`$!dHe^mft^lzU-ry?9lc;=!(x$?z zO;fmOzUp!X$fPRfw2Nvc&DT|-t)NOWBvlX_MbGs$4HkO-X3wRpPFHCeqANkZ9v0%4 zW2^YISCJj6OOOcWs_OHm*B93i*k~-K-tYHgHRFpNO0pQe2Z7-#i7G$d6IC?wJEj+v zm&K{C2JFx)8$jh01LLe5i-juT9HYx7m77rUWRtF1^|j*S~1~CYhyeOzTPxim%&f#Ej(%cg(t0B@Fc|>p0x5x z@TM9X1+St1@Om?eAD$+^RFhw-$uHI9mum7$HTk8Q{JbXK&`e{$z=x-GA^fz$OGq^o zfOxhKEt*n9aeR2G+&R$*#SEGjQ98>RLLAgYZbs-TgRN=k|< z33eKjvWn~)Sx`9M?+vdJQ>jYuO^w4y5Vqj86@|5Gu&OAmUjt(@ zM_gJGdo!|~ql?E(LXM#gHd@bEEn_X<4H`Rb;#hP^mFb|OQbl6I6RKd>#Da2YVTwi@ z#SA5HIdxy7tauNL{J|rY*B|Uw{_#bS=FIrDOoX2#Y|JEx`$ZF!$Y&DOu0quy!v{EH zKpRL#C_fo$tgNyK6A4jap!N9;5{zJkFhfJg;|oH~8*x#4E`o`)ubl?CO~ zv{7ZHW3-$}G<&YG!-K#S>%^i8#5aS@7crAm7La4j4sWPT z6HFZp78}NkiZ|b0G+|=pG;lC-oM60B30`{Q1xdCQl$V!HnKaP|Z=Z^lGyGIlCMwNA zDAhGhOnU>PD%ZrM7?_b|m17NP(!@~)b+WN9mXMs4iXMvQ8dY9YSm`jpk!4efK{9l^ zmF2|+W6XRcV=IyTRZNVLDA^n-k_{bmLb6#A$%gXPn`n##c&0jNwks@~Fw#MDoPtzZ z2+IsIo>_7D+RMZlBT=Hcsgr2dPog)&L9$yw?4*#fWo6?FMwU%R->BkgXxS1CJ(@Ss z*haxKGZ@nT$fA<6DSqMv8s@x-Mq}Vd-@{)YW%>ib|bWSFmyFTQE7ksJxUV zO(-ZI&!Q%bpMY2(kmk3747>KAK`aZ-57@AK?m#-~>jK5g)$W#7bsE=+42xK22^MKM zu{0ki!y4c#xXw6#V8tnT^_3oIwf!3YeL~xTvjplyJ?GKdimGrN@QxS}F#>-KvKZkJ z&Lg;Qc`uvl{KUD1l{;5CS2&kAH{v_c(QJhCS={QDhqLzG@U2BBoPGC#SEUVK9*B+KY`3va>=x^N@n?!6ETc*KQufY)630kx&t1ZV2yVVq{? zxIqwK)8Wg2Fojb!fRh8Cm{2Alb;i(&kCUzkTopIGJMQV`b?4TMD`#8Njkxk-tNQwm z;#$4~wkmF;N}Q$RjmFlDtF4xqX54SYQeRwKUBXH_aE?sf;i&o`)egQ2D+P89cz%cTSOYFHeek{9 zKbdTNU*|J{w4HHQ%;)cnZ}Tp1aG`INsY%raC)IqW8BX5^8V|k}{3lZfUl;n!q6Kn|mYtBr3S9v2_jBh5F zv8DKG@mux@PFlUlkPmRd`^vfHC&2ie#owpH9(12$yw)y!Q+vXF%ze>tK{S$lcf7)1B*1cXzaSF6PP%Ij2HGehE2^JNgfX z?89CC+e5a7YzkQyvN~iX%%+fKAA{uol?IQ685x`(JRrDF zaQEQs;LgEmWD?-E32qkbfo%|6C)gEihZRBRgPR5Y7ThN2OwjS5!>GUVp#4F6f_A|A z%|}6-VKxMIDT8R4*(y$Qs0y4a;?&gZ)KW=jkeQjG%+g zea>C5+nrmTo1E)lRy$WZ4?34QpNG4Tpr@RVIUfW(k3wcUZ*k6WPIgXoj&qK3UgsR- z?Cb35%!L``Om}v0COPB6;+!pDV(^S~hCAI(C#>eU;5h3H5ANgm3HGGph~t1`uQSrI z)A5O83!WPtYaOc`D;!H4&pH-49&yZf%!R$fG0QRCQRyg!9qSnB$af5I^g(!cM>c3W z14?rwINCUxIXsRAjyf>Pbvf(~VLxyG&4Ew+?Pu)2*^k=~+xL^*W8Y!lWBMlhz~F1J=E`abYLyPxSo6 zy2ZK?@LKCC_*Yn$Sf8~n!hH<$t#hq+SZ7(MTPv-lFte;>}%@~ zjQ;mq)Qse^&VYNX74i-5NmAu<%gunVC3rE(mM@a~A-SJfUPtH%<;p>7juK1B?L%%) z3uaDUY~2cXkKxh`xzJh(%tC^n#2q`FKWWW?`-Al}nF*`>C?o9N@v9O(e`d1F!M}Jkbz0qctrA?;>|A^@^=j#;uByZ>3UfrO+2B#dB0+ zFBmS-ucy?{5&a7kH;v%usebOI`WZv@^D))WvnHjgpBD^R@wc>7u&76AQ9k)M1b;w0 zHxcCrhO6*`dXCslG#jaX-?Kjqp6^jVe2?;Wf!eVy#d?qU^dtCP%G(mk+bxv0W0be` z2BqzH@Ojz>S&Y}UM=G9%OSSQyK||^8r}uF`z0v#WE#8mSDd$`0?cPFf_ZE7ik63E~ z-;mzxEfnhmT6?abwdb9*_B>5%&n>j}d_k=}c|%%tZZTZqzs2A{soX_;?jp=;N^v!% z^)+FFO#JKM^M(N%u8J$#C|G={INySQCk7kgR-(-fOd?jJSRE7nQVLye3so3`L&%+B zxGI)BNO5;tSAk}?^_X%g&$}tlt*m%AfhU)8Zj7i;SnDFsg4&`LaocUZgD6$bcT?(P z3BQY4XFavf!_+!|QS0n9W2sW?HekxhFO=@D#Nk)M|ElofG==t6<1;&CdrY|s=6e*L zeWxhdF@g^%4(yQ1E#ByQa8oGskg7@G(Ne6EFb530>JQ+iI2@u>&ME%lT1W0y%6}uOv2BJ+9DY+d;f*NnHsUta;6wGZlImv;)z2BK zpAQU5;=fICwhST6ddk% 1}2tb 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

wbe>c!3?16lSZzuYkw&UNm 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 JHVSe0{huHv7!&{i literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt new file mode 100644 index 0000000..f976fdc --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2018 The Crimson Pro Project Authors (https://github.com/Fonthausen/CrimsonPro) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f5666b9beb8fb808ee56e78726a5b754e67d1ae7 GIT binary patch literal 106696 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 UP~`mP%sU;q{`$z#sr7vOZ>oB+(f|Me literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/DMMono-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/DMMono-OFL.txt new file mode 100644 index 0000000..5b17f0c --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/DMMono-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2020 The DM Mono Project Authors (https://www.github.com/googlefonts/dm-mono) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7efe813da72c7b1c0294cae782e88f262ecb75be GIT binary patch literal 48852 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 IKfd7q0nomVmH+?% literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt new file mode 100644 index 0000000..490d012 --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt @@ -0,0 +1,94 @@ +Copyright (c) 2011 by LatinoType Limitada (luciano@latinotype.com), +with Reserved Font Names "Erica One" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8bd91d11773f5b035a9e6b6d1bab2e59b08051e3 GIT binary patch literal 24872 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

@?}o!+YfkLE?0`ESNvqKKe`du&+LG7kS=0l z;oK`GK_>=b(_v6Eu&h8$jH=q0C60pdug%iETefUjk>5j;MXOz~7e-`jdgQOzyt%r% z+T}`2=szH)aS!O9kO%>Ws8Qqy9SsiDGL6L=uzEPPvjEtW3##Z(_WbU8{PghWeyp@e9cR zIx3Wj)3K_VjuqoCTd?u!=gv84X*rz-9V}wsMHRx)%)#xRUyPPLEAXfX|>%bP2Oyoxp~J zC)1*K+M{1iTEA^u68pIL@d4?&-Fy8&^c#HT1O>X#W6bZtA|Mt&t(Fc6X`f#?DdjK? zw24B-uFcuO!8bU1@d?x;h-JU4A5lTb2i(MNAN;?&2DuDFihC+cEk`sZzB zQkT2J<&%o6Y0h$8PhcQhMnjnNgZ<&{K#Qce#UZO1{pca8(IWPKN;9Cv2BxP8b##+c;wpBPZP`eQ>O{7XJg-hL+4c zHg4Q8wz@D=^c~C;JSCt4+x=m4vFU;zh6h&YJ5s5w2-(e!cGya9?|iCcz&%G^h;wM; z^!|9&X-ne9&i$ES0i;9pGeCkC7!S9uJm1WH&zZe3&Qd~InB}p4ffS8*aqpSawMLT% z%SY-q$!as_4D$-Y;>GlW>9E4!7+U5|@Wq+)Y>8XJ{ZE--zldFt7ZRgf%%)6_*_5m0 zIL~J2VijyXr#qa=Ca(iF7_Jr2a-~uF2w^#<9x|1{tv7nwXHHsA|0F8`v_JF$YYG?x zqlz3xWP*Dcp?x*l9Kr(W;VBP2@ht7%snr%s%Mhj}Kf2_o=Yf_&0JWjEHH^JO$X{qM8brp5J;r= zKf9Bvii&Rh{2?_6qn&m+ve;0wiyAJz(^DRws(W{gnZcdF;i_50hC^kbz{!d*g0(lZ zGKVgWrv|Z)RBFz2CYjXwMy?)sZ?u~WoPKW~P?HPGC8_mT0K#324ojcobhsXNIOuosiWull@W+`u*%P*5 zZ+Ob2QpD-llAy>L6-kUjZ-6!eQAak?qtMfNj4$1m7j`liDC6K_p&RwG$XXz_SAgee zuf|AAN_q-)u5S(|m4SDh1_XUp}ZiRAnY3ZFT zejUSl4~Guzs5Nx4wQgC^c3->P<^4^@MupR2UN$(jWzRw|F4<@(xihMN_E^(_tu{`% z=^Te7rlYliMQrAq=?iURF};Nr(Gmk%*Qiy*dR`Un8L{6sdS?3y966zUg!x!TfZf)1 z$9-olS~P3XrjAZ$$HbPM3hwHfn(7s~cI-Snb|&tEjFu%!Qz$4FMYAG+CT>Hl=Ul_L zjbXGCh@ZjpEQg4q@TKRu$I>0i;}Nb*X3JxbZ!V!TEKxO%xzxGFYrzhONaajP$$kVVPj$DLzOraGMiZr z*s)~w+Tvxt)5h2qeTh3!W9Y}csl4s1HruA(vh4?07O{TsKwBP-Yt}Dc4Na||;47e! za>8F^)|VrXRpN9&u(QZxbKKj~P8%V<(t^R7KsVP{K^M9Jbm4JmSTM*W06pkPqf7`y z1EL<~HtMCLp1G+WA1^jY`Wx|1z=KuH;mPBqBmL0<0^~cW>?Uyk&5u6Q~!Rj+J zhg)>bRuKA;uCy8s05u;83xl&rFQXHv1ka%vo)=g&%GR+@xBKSkC*AFc#y{m5dsBQ2 z_=7f9Z!E@UZ9~2^i@P02X=TNx#$s{e{c%Y~BNHat#3X}(2@@vKSagnaq?38KZWW*7 zQodD;?iEhTy+D)6-V}g1MF8=Xw^KtGOH(FV7r=KG{|@mAQ3Va&K$;mbT>O zwlJZC8#e&1kA?)B5CR6sc56y?+gmqt^YrR16US^FS0{9uI&<^P>dh0zZXHv{WFCC| zz}k*B*sGd*G?CX*LODMpTZ?Bg!2b++oJ(oF?4OsmY`0_N2i!eU!nd zoidTu*E7wPMTC9NJ);~P=hW$nQ+BL-;ec|0#;Mm8q#`*LYX}jR3*c?8xwMW`a-O~^ zR=G+RBR2;u=^IRA`8CkeZ;pK40vgj(V$fCtHx?Cd6+^YkJbM#%vtqLOrg$p-eWP|F zk9RI$a=oB6)HeCzrao4-{k-P$s7Ch5@)rnoq@E6!oa^p!oDjUq)qF;LUFFg~*v-4ryKqbW4JN5nmGR*S_wnaucgkx#~s|1tXcI3wDx2!Ybyarw(Q z;{Sw6`hUb^&#%UW%W4^uWKNUzzn&(18T?0F?&T}v*O29*m|U0fDdG5Z`PKNeCFcJl zc8|89>Hi8`h3eM(HO^G>8D&}O0h~GeFEDRoOZbnNSGJG_zXEHzxlur1$C9xPN3mrN z@L#tU5CmvxM*K%)3z}IJzXDNVYNL_CWW-f*HLU3X@>9dW5_0CIP&sqpuz++^%0iyA zK#aOKV_|e*+P38i>2gBHiM{PA*TNy|hLznvd~8z+!@e#(-Y7!$Jx%V6_^2>y)rQh` zDx>mG2(6ctl$JJ6Wk^nzR?E2z%aW4xX67aYj(I%epe?(Fh0JCDGgNzSw;-0l?3R*t zB|5#|U6RD@7IF53<~a%3<1?DsEv7izLuR0!Ze#?HI`-OfQWzhsNnU4p4rC%D4Y&P5~KjKkY z?zA~1DoYx94NSnf5=OmrmjC<<{k640-*TJ-TCUDE@lZFdN4{etJ3)&%g%1;UP9nEE zX%?dxiZu&OmtnTt14 z5V~GuXNnu`thNShqFL8l42|P9v-wDnX)N3W45Kl5wm7>WX$C2Pu(+6(89Syz%l2$s zFn^+S>7BP&y*5j?$EWo_mlw6z1Y&P!-Z z(QhkPfu3tET!7+yK|fUf7@!R*xF{8 z7&#`~BD*CnZEU}-soSRo+qa2FUgI)g7VtHpJC6_WlTa+q6gxE_L?aYNA+O>1yWM*{ z+N1ks{z(rUkgkPShC(aD^z-nFP-sP%+as?cuJRZ-4$(~>|Cfz1wyVh4r`KVz5Qp2%XG$TejK$FK}1> zB3yZYWn5%KCLohLZBe2vLD_l)t<1MJh}7iK<+izS2bVNZF`8$bgdy)+W}W=PCwd&7HaOFVWm-Tb*cLXH42D zUAieVig7kFVff18{>J9GHO4iX`Q}>U+P%d}YC=1uarrQv3e@h4Xd>ck%{#uqxp0&J7aBF zN?kX^M8hnv&dxIH91h{)X>qq$hwQqF{kVv7mVzR>s^f94W@J-ZywPlV#D<+QhcR7^ zLr5&eX{A(HR5*+!rVnf1o4yVwICqU$^vpG~Qi|~0bS-y-bJ=`V+ygC_WnFf{_@bJk zQ9#I^C13Iccqh{%?P``F6q~z71^2fJ9jkk@4AH&4x($`LhRQA_BeyMAHasdv7ilHe zaA{1jO>nZ5y2M22y19*O-x$?tZrIXQeIw^esIt(uEeQp>3~AplM~un$QAq zG4wi&q$yh+X;TblS=Hh!i_B|*n-(O#6>H)f|bM4QVwYV<^u1}tN6 zC(kg3X9*Ei%c?;x8C_OB zqRiPoUOk#7cI#haFpf}X3nwgQeS$4+iXzdSVlqwBdVmQ|X3~w~O00Fl#ANI!991QB z?$)g{`w&;=OmE+QI`UKmG6}U`M{N!3)!N!DKGn?X6<0QzwCJY_6lCvGL_f|vo|qFt za<%P4yDK3)CX|#AS7IyyT7@$Mj&Y1Br1;mI~MBr&6vgBsaZ!u!H7_yc37 z3DXg&Pp2K&5iOd=K85$|vwl~f#rkX)`AIm1cPMqkk30vClm}VJI-6!7g^eFA$C+Jz zi`m`C4)h1iEWV9;NH~G_FO2*pwI4~iRO^5DO^?Ud%c_bK1V_&drPt@*(p41A`BPF; zDsJ5eH-mXtA&qQ&MovP zIO5sa^q@MAR+qmtFeS;R`JbT^>9Ky@`yT3EWQ}_mkZiODExzZHLO$!sj-UI(J{wx3 zy3k@+jW8W8#*8f~jMqHG==a~A2^Y{yFX2s&7fa}Aj+wIgkDJh}E<3~#xG=0a$_x6J z#E=Jv0(-z^*t7W2P57tZ^ouUQa0(0>&4pn#(&H_MHgAM2PV>-$=A#7c$X>C6pL}O> zK!yg=;Ou)8wEUylL3p|^dNTHtjOK^pmsgdQRW&~!pMu@}HRiVl$2;vo_?1C%5ggV5 z`5c_(f@>2W3yeha-w)odbiu4w(1f(m@BpTo?PU!d zrk9Cn-L1Cy)obcz-C~lA}4CTW$IM=oLN=oO=#E4msW1)pa*(%X+s|_$jT7`4Ur76PH%TwsSy1JR#sgvvG;0TWhnq5;|1kKp_ ze8d(MQ9HoX;#;te8T;wjF%7Hvfns51@XibEOIi>FTdU5G5OUOweYoB5)k%gE4Gln z#WS2@nS@TdzbShVHIM^^tQwYW27^IuK}dtCra31csKP^;)!%gChmS)RgnIbCLe!S5X3 zwab8kwZ-i+q`xm5nA^#dS~M`X16^PI;H6F-b23v>j_v<)>!yDFzpJcFO_jdbJG^Rj zRZead!vg+JF(k6H*Wd}9U=C6*6+=INLzksUe-&tih}(XCLRf-vG36BiZD3x{)G*1Es*X%rZ`bpcq6;8P;r8NGK#|n7FFVQ?AQd`9gcrd zFDE=sp?0>(!LR$SGw@obcYCU3U`Ufq-o6q6>Agfj#pwpjQxl&q{jKD6pZQMG(W=Bi= zg=6B&OkYncRzO|CIes?DqFPYnI3ZUHnL=QtLxnhZ_uARTR&zgx)!JL9Fy?!v%3uWw)#6w#20vK9&SzZ1+Zc|seH5ov zxoim|bA%V(Kg)ziGQaOhJCB4L#;lIJ_jxD3Hdiju-Z^(J6FFrcg+5xQ!NK0Dk3xKG z0eV2#i&?~s^UUE;x*b{6Zu+n^gW`yF;K&g=@cA{z;*;Ot`xtnru|Cd|g=9$>q6b)Y zX~uyAU!g&_=hwWE9Dj`SSpi-NH;-x7NjT0c`kn8LIDTvd9ZYf7Mf#dp@Rr#rc&m5` zI5LGtM8nuUD)3g{>3F~0-FO4bc;iQ6jE1e!yBS^kLs#! zr#Ms;6ZK-Ae-3qZ>eR1e$DgN*f&Hq>qSG#Jikmzqrb>YaAH-bH8dc(PMdd$@cqmrn@(CN0fWnfCbzch_8_+u6S7pg*139sbj8fvZhH85W?gRAtaNTOfm@}Bq0e9LVz5As6c>lh6Iyvcr2i+h!-Lv zA}ZpAiubXe=qjt|s;jQLUaP2huIsw4vMwGZ|8I5onfB(Eszt^w2yQ;dny1Tkx zO^0#DSTt@H7B#7^zG1OglE#=ghcUi>(v0b?uNA%fHe8K}j@9n%$9`ZeW(#9M8B06*Rs$Y| z^ejAsmUf-F)qVA4W zouOY;y}?+>4#on%Tiw&wU!7^qWUM?6*~hQ$?OeUgdg%qoPxT3Wln-8TpXD;VGCnxS zBJpHKGuwz7EN5Z#=JRJzE~Nis;9baL&X1+X9~N7UFMV<#YM^eOa(Rf0#a-P?@uaw= zPsNFMqp736d*YeBDmPzpd*#x)g!z$`|7M25`N`-T|Big@ld3yk`LT4+0Ij3IY-NI= z_#9T%edU=0G7g~U`IJ7$PEqJyrqq*a0;s78PF$d28uz9hVgZHWG z$>%W#M=J}?f@L{&BNKyB{O+IC8)LItCN{CX%yw*0$-_9xtv1H4rgV`c4&h+~ub|8# z2nMol#ESt*N62LPxEHWC+-I=`xG!Yq;eI~55BCRfarO}V7WePi0OP2t4fhN_9rqSK z2lu)BG~DO&MYwnJrMNHWt8nk(J-DyoYj9u3*WrE^--!Ep9QgV9{CwOu^Ub(l#4p2r z8{dZec77G^yZE)ZU(avA{U*K-_x*f7?sxIKale;?H~s(zZ~RIAB<@f1Kj8ixe-8IQ z@;~DKGJhHO*Z6C=zs}!g9P$OX;!omFxW6u5$Neqw7UM>=5skae$U=MP80EN+GpYb- zG#XKBj#gvLj*x>81<4sQFGJn}7GSthg7nic#u|l25z>WkI?BYeLRP^VSPPrSy4hLi zfZN#~wx7Mk26-W`;0=5xKOHi=h+oC`@;mu6{7?K{{u%$b;38Zki)>LWmWoZ{3Guvm zLwqQ{5y5jO$BgHUKN}wyf3pNyVlAUA<1CXbEtZ9rZp&Gg z3oP3#_gbE{yk>dd@`dI5fTV!NfLQ?x19}5C1Z)l19dK*F{Q=)vW2|M?)z%xWcUvE` zJ{uSom=u^5SQI!eupw}5;Dv$P1NQ{p5%^Hx>w$*@zY6>z$Ql$Alo3=IR320xG&5*% z&~Jk-54tw!&Y(wvUJLpx=wCs{gTsT9gR_Ij1y2fY4W1v|9eif+`N4MvKN9?h;8#L; zNO(wcNLGkFq%x!_WKPJkkp7TOA=^T(3%M)gK*-A>?}vODax`>&=;YAW(0QTDL)V3# z7kXLfHKDhJ-WwJXRui^5?Ch}3VONA*7j|3NyW!E{Bf}Sl?+Cvke1G`w!v7HdO8C3s zpN9W4{HKV5h{+L`MeK^WIpUs($0DAMcr|iFDC#i7Jj7A2m5@QB+UV*-@LLu84Xu>f5NFqpi`=(W%ib(Ho*Kirx`@ zQ}o@@2cn;kem(kw7-!7Nm>Xl>i5ZLyiH(o7#dgN7jy*eebLOWeJ2PsY6v_h#IOabLy#5}y>G8DAJ*89yn0LHx$}i{r0~zd8P% z_{ZX3jejrxv-of0k0lrh5eZWhW+ikabS11yxFBI$!nFyvB|MPuWWv#e!Nicn_(WS` zVPbh=UE++yQxlgY{xsXb{?(iuq` zlP*r$m9#JE>*Sc^l;nxYQfX(?$_)7GRtI4W{f!Kn68XN}r3YTu}XqmJ0ZZ4O(7t=86T+icrz z+im+IJt=*3dP#b7dT08M^y|`ZOaEQ^hZ$)Z&Wx&zDH)v^t1~XkxIN>Uj6Y`lHRF?v zzi0fCX~~Sttj%o9T$OoA<{g=DW`3O&npK=NJL|Hn$FiQuI+~rE?Z~dlZpxmMy)FBp z?0@FO=S)qP<187u{F% zXwmofV0*HCw7uLu#eRx?x&2K0MfPj#ci11WKVg5?{wMoe_7Ck}+W%$$sn}J#uy}3p zZN;Ay|Kb?qSnAm5c+Sb>73&=1tar|LUg*5Z`J(felJb(ql4T|5mTWKCQ}SrZyCt8M z{M%)9Wx5JoRjx+YEY}j(d9FRKH%fy_qf5t@PA^?lx~25$(pyWPD1E;4jk3V9{Ice< z%gX*#_Ey=EvTw?Ma$DU_ccZ(*y~F*y`(5`}?qABo%WdV(^4jv2@}Bau%D0x^SpI1F zYvuo_2(E~(NUbQXm{`$PaeBqFit{V3s@PZYWW~!B{~lL7u65kDagUCBcHHNcta3zU zZe?xdqRR6tAFTYOa&Ua|_?q#jjlX#OgX2FM|5H_5Rb|zps@+w;t9q+ya6X>xKq-!P}nDoiy(8-f0FP(h-aMBxPdza8v#I}X3Tm3$w4rH7)BdJs zn%-|3oK`dK@@c;`CpH&1Pi^jO-q?Ii^MlPVH-A2zPj^pmnZ9!RuIbNB|LgQ`XIN*X z&T!0Vow0Pr#u?jZ+%e<8jMry;Hsj}+ku$SqR?qBhncA|nrN8C8mdjhNZ@I7K*_O9k z{@yas8rquHI;OR%bxLb{>!Q}xt!KAh)Ou~}-K{UQe$$rRmeW?&HmPlT+uF8k+iq|B zUE9I7Keruj`+M6@?E&qn?YZqm?Pcu~+8f(j+UK?}Y+upd+kRI2dF>asU)6qn`@Z&j z+MmMpEoLXi#)uHIOe|zy>;-G3yk}8Je1juO*$Ut6A$MZVxERauu_qyQYy zF%1u8A^aO14@3M@9S=wRJspog{52hqWN}>c%%fNW>YRvnLFL9kI2JeH;M z6*?Y=va@tNp5<{ZE1m%Sup~&HJdvewtBxnZ`ZD=UW*JP&ji5*^QEY0Q*i7U=4BheZmzANENP zTg5tHqfBA_cy__^Uc@G`PCWYnnTGUkgt4p^X&p#g=@T0+Up-roa=pk~i*jAy??lLO ztM~uZ$s%0(C?BsW&^ib;}dx$IrOvDpisezaP=VG367Q^){PXUHw5Ve zyb#b{NKe(P5BM8&J{xOAYza!NlYDm~jWo?R1OwIHtZ^^m{Zb}WdJ5XZ#-?lfzL-h= zizHXXLjiKl!m}6HmrLq4tbYn+u=#N2&$-D>2l}3pO$XLSUBF`l$IB%jBypl!!)D^y z0ayi||9=u1T52Ki5%;SQNUnu=>xU#r%X=XA+W(qPb*@3V#i;e)q*QAWqgJIJ-j5jN zm?nAd1U?&^i#YYwrFc6F&;N~I$&}>WC9(Z)dXvEaa_~g-8c>e3wUeDG>HaT%PSivi ziPX3XYJdU|Ccpj2`+MtW=vAkextj%Eh=v;@)az%OhQ_6p7c#&WiS-Nj@1 z7+%cFcom<_r|}K^a;(o^;eQh&M4326JSGl^7sLmK#RxLOj2I&itKn;nJB%lcr!6U# zOiP7jqGi5ik!7W2jpa(q)s|~5H(MUGJYspm^0ehu%e$6OEPu27Gh#wodfEkPd(xgv z`#$YQTbwP$mS)Sa<=E^tC)Ngaw$-*XZ5P@0+wQVGWP8l^WO`tFVtPh;d-}ZeYtpYz z-=BUz)(D@ae~}?FtQnCRF&QaXFO12UoUtIIGcz}HOy({oL)*bRHMJ<*FvcRTv=UUm;pzzV&Dm-8Cl$Y;pf z|A~K!T@|zThr~MuGpt4kYM*1cJhf+*5tb~h!RxRBUt#IR`g^Bkx8)|wJ(h zV>x2^(((;zZ%f;R+8;>!F722t)|O;Twb^9t9ky~=`+nOdzuG6D_O0osrf);-??}Hd z{lWB4J++Vasr};299jEN)P6zMS6PFe+CPx}aQ1=hr?X!~?bo9ALH0P*{t{Jt?63^; zH*h8UmjVymFwn`aVA!hj{G~89_{+ff0sFwHff0-ypMuckN%f2T^4f8W2{>9$v5)_t z-j6itXXcULAGz#E!^baw{5xFN9?3tFb!6m`lq2yU{RO$NW$YvDmwkNt$88@^|G4?% z#E(aQ^!JaBeDogRfBxu&j}Cma`=fIR(}#NwA7||F%^z(4AP~>g!;y!B50lR8zYnV4 z>wUeMUS4ltEcjvcgI};WmV`Z+N5y&KF7bePR2&qqVUGxZ*xRui6%?aC=y|2lU^E*o zh+}`&{4;h^UoMi0yYK|#Q4dR0zQmm#!m+7Nq@#qmN4Rg;-W}2igQJa zcvXBO9zp#ViN#`ucw01xd7@slib-O!I4u4uJ`hcUWEBp3HjX7>|1b+DA}vpZnv-iMvV-?OLL3)l<$3wxKn z&pu{H*q7L8Jj(vfe#GWm0FUC)=!J=Vr05jSh$Z3^VHZ=ei}x4t3ij^~ipPu!@i?C$ zej`2=PZ)LLDefE#=Za+icu~E7H~8y;$$|0 zrRrJ0!4lbISVU7X545mp;$6(^T^Mawz}7vBwX;EXGxqLoWVf-K*gkeUyPG}Ee#ahR zkFr0rKe1QXtL#DcIr|zj?pN3|{kwRN{ga1qD-YtqJc)hJQ?O5b3&z|Vu$y};cDe6_ z)qW3)W%t6`zY9Bs_rpGafQ@2Lu#xOBj6(-l3VWF4vOlnF_6)}E=P)BYi*f%&SmA$U zW$aDnVz0AO_69ZrUdEX94ja$@$|kT6Fq3@9s@Y-8bRWU${sgnmXP9w6h0XK@o58+; z)$|WoQ2%0c*bkWbkFitOf7og4CpMoQ$3EpR>~!`s>*NMo%mrJ7ZQnC^Bz zU(e6voA@H$!B_Eq>_4~iHr~!p!5;MKd>;0o7x0C=8#~Wu@YTGR_hH|8Eq0*K;pbx4 z`6|AXUyYsR>#(o9m*0qe<(v7f{C?~sKg1v8zvB<{$N6LYQT}`WEOwIj@EiCcehq&L zJIqgGPxc^xf*;_2;QRP3{678&_OGAk7w{LbgZ)Q-A%Bt2=DYbEel6d^U&2oA%lu;O z;$DKe@>2dPzYP1(Tlt?cf4t7G;BR6M{R_X6zr}Z8Upk*1V(WN3>*q0SEstaA>`C?; zK7wuFsp4#Lj#wwo6laO`;t%3kF_`Gy$07a&xhB>XqNQc;G|gAtl_p!cdFAs_F-K9bcG{S3sDWI(j3j#dQ1S%WZI2cka?p&5Z>L2XENp)!<4 zdJ%+>j}VD42ElA!dQu>HlDu*dsJ-b)fq3~ff%NOw1fsPO;dzAX5q2V6h_DOc5`>!& zE=9Nu;n(J)I*vdf-Jp6>JPd(!k93J(6sV1UEzVz?j{zsb0Ce}~*ATXfImbWue-5lb zI@tc>>{IfDHiW2MCAtlj3ncaR=fQ2u|`k2jM&f8^SCd z-on!iq*G?xEKBd35#}KfZqh&Mhx-t2ML1iB9e7f>1>stR`w^&p_9IXp()DtLI}rL2 z2u`x2e8d;kq1z{XiugMSkbw-4fz*TTcz%meh2Vl5+94m{_-Qg^b^u{7-k(I6jR4&z zIs3}m@4XLs?(*h2As_hpu@reKffs%G$KNCG7QElA%21k#kJ`->PeT0fC?gQYB0se& z#uFKkHn0wG^zY*@q7I~Q5&BtxC+Ns=EE-P=lt%LV3&L3lU+XXvPYM7DWueZphn zq<1F*@nquOgm{z=XcNgF(g#iXUj-QDC;8Kp%72gachr;O41Q+pT!b$Wp4EYNls-k+ zsssGWWZH#zUWf2C0{p>bxF64_5Y9)Sea-a1a&R;#8wB) z3z!qof026CMKvY0NK#067mVp3^yePMq z12ewZ54PHJ%<>(=v4A|w*B)9X9bXJX%4sZ$14YFfPX&DsX3OXL`pEJ*IGQ8t=B4KejU37^!9kJU6ws4w_RSB zS~goYA#Ao>3Xd$hZ?^QqJ8K!jLV2BLnPoXmUNbC>*g0-g7cf*wdT#ZkxV%2MIIN#r zKerTEauC#IvzS*3b`(?O72%1cNIV)F@CIQoGRP8S{DQm0f_=)LTH zlkus^o!Pd=VMy*3DTO`8JF=deE#062niBgSOJl%l>VbgqIA92!fE1;$+9ZNskaWb95=8ny5ow1^|PGkI?l zUm{*0UX=GsaIY4JaCeGs+{cI*+$W19+;e3992p-gOHGxKsXCQPjge(jNl8;}c~(kM8WZlHzEUQ&Ms0JMlbL@@bb4yQFTH)N>^yS3+_nBwOAK zC8SWs+hn{z<}8r$e0`_d)yq6dk{|Lf<*-<&M%!ebZ8CM6q~0VkG)Z`qgf|hKT_f`s z%RCMV&y)8;@dfY{3i9796d%ibBJM7k(9R@~`Drk$)}UN&dC`YVxV&yU3@O zUngfp@^PksFDTe+XV{xo?8k_VLA{9Wl>X^gW8eNtwhMjeDt3+ZPv0#))32v*1ZSdU;BT@UvA_Qo zyIFdd-+~&E^~QNO)f2Xw-D|7y1NcJ2c|Y`VGQJ?G>jiuhdja20^dXFWh3(+0fG@#4Nld_f zG`|0Eo{p~*1gCff`Sr7dq6_hx=+2(w=TIu;XAkj3xKGA+!g$!ViL3x$tqSp#Z~}UA z4Zch@%I|E`@V#w1T5BfScos&-Mbfuv2}a1PQI7{8hd<(b*ZcUUbr|2YK0>R~*R{XH z-v0-_WBrqT3xRSjxWO$LH!Ju!UdhM9V_^!$zomR7YIZSNZ9hh^KVqbM3*P>LXoXq? z(#%o>^6t+^AR9Z4xF^1G-y-h~@*X1Z7t>v2%Xl4hl^exI8A^FZmw+5Zc|aHo;~N6v zPIejJcrP=L@#Qer5#xP*y+uzm@6ac{H6JlvGhUR}v&M^Ny78158}4a5Dz68OyFAxE zGv9wN>B+U%@LV1ks2jWGwZqsduPt;3^cz`2pIR7u0o`hxH{3<|jB~t~eD`wdjjct# z)qd9sla~{po_xgF7TpSq@!V?6lh+)&pIA;oj23w{QGN8a1>Z5%Rc%xZcbyEEthvJS z4QQ4Odlka(;Dk%_@)W+9o(K7mBvzYLC}vd98~7_R3h~T9kh*2&(dEC<&s5_sGX?n) zkh@T}OO#GOPiY6e8RuviS`%+XD?~vMLp$JZfe!8!^h==v^f6e+=+m4#&_`ew%RBWv z&a32|ev5^1Mc$L-y;$CJ<^8ll{4xilG3AMt@n{*(mvQQ`oR`aZ&fp5f3*Lm z_m#o!8wcyp1vxChI7imsTxtECEv>)XrS*4*wEjK^<2HB+ko6ab*{F@zO6#v4R$T`? zu*mwG3hQqr<}0%PW=iX?MOuHYu>Lln1kKc^Nb7H|oGnhp=yw_HM6&)CV2r;Km@s?6 znk4IQv9$Y^O1p2FwEI>_yRS>yeXFG1*DdY7UTOFBNsF%^fp!y=I7l9vVMhCKK!gkaWq5grOJ@h~3FBVYlH#t45*dXvP! zt1S*++{ch#3EJyr>ACR}dlkMv$?(t^%SYfhiG_S5{27Y)C~o8F@JfL%A=)LAXTgsl z8@#>-kB_D74W7eu;SF^!W-2GaZU?JD49Cg(0_OC|d|AJ3k^95#WC=hf_UvRL>;SSru`9jRX%3zN4h&UBHUdz$)r^9!pi@{3c^Wpiq3Z5DDu(k&v z>KSI0HT)uLx z-(at;6*GAoYsY%ye0~9&1uNt;_6z(fwy=xXY^*sh##-Z2HivD%F9kPYUv498)61dJ zSMcrdT$u~4-T|H737@0W*w_4O_Bd8J*Ra$1ZuSLMI^^*|{v3O?*T*gJ``E{CZ2!9ar26+U&AdkT(g#139gdfQ7$;N{p$RDJC$RYTDynsIOBJ9pR z@cDQd{vNNu*W)$#dAv>*AbdQif4qa=^1a9Z%HQW7@WcE={t^F}AK{f4 zepi@7o>F48$QNToffy?a;RR;LuMHi-DN2M(l)}%^Ey_iO7$+*lcu^%Lh-y(IYQ;oR z2d}UO=@m8wo?}x*lb9x&;h{1^%!C(NE51s!!LP}*{F2~hl|p`2qFu}qv$0k@Ma&ha ziqpjDVxE{U7Kje9P>|1Ar&uDEie=J6g}hS8Lxnt5$UB8RRp6llpP2R1D~9}IegnJr zDEzxN!ei_Q{7Uj%_^$m{oG&gAo5h7?ZhSU5M{j_rSJ~VH3o?;y!Ud{01Ks4~gH2hs7htYpIASG54v zZ#Dd8AIGmb4~Qq>t@eBIH2m5QO8*|(lXwi>|uD7k&oO{@Q@3@?(jbR`tt?x zNBH)<1mB)N!Tar1_$K}tcO?bn-1z){)#Jl1>_~^Y4FTKO?1NsQQa7W-V_bI&Y zJ{MnzFU8;BBlLH8#{C0ce*c6A(ZAqB^gXu(b99QfIX&ueG4DWV#8rLVfna>QlpH1 zoeP_69Cq`@!`FS47_!cN~5>`6>Dnv7}K_nU6aFlNHSYsGhf_t`}F zxPAzax{u*e_W`~tyodG2N7x^1H)a{LjXC)J?Obck!rsocoq=n*m)nac)&R8m< z(;ZmTv$UtXb7knnMaz2^ty#6Ct8;zG#Kk@R9g7xqcK2KB7Ih#O9=$ys{nmQ<7EJ=J7UtC{1QIT;sSSQI6p_9DWRg%LIGRccYmU7rtQhkYK^1_bZ(8)e!rf4!# z6dCK3{^ebZJ42~5_L3UA(_S3f=#yPmvfi!mIZLfg9gEiVcUqeyGa6cJZC21`A83io zsPA4HK7HAm?xh{QYgTo2tmzM&u83P(RQ?v9{H{`KtAvKO4k7O-mgI};%j+#|sE)PG zr&y^>|t$v9`-*32*nK*siPFuBsc*-n+beskL2J+B#biob4qTJbUr-&fdq!(eD515w*&EieGA^SE@2O&Y!fD zjoaGc+Y{>pJ9J}r=$^R9+jb#~JiJ*KOHo@p|64rjhLlk0TCT0i@Km>O2)&qHtH8uW%&})LG{)JWaVXCG2-xH1aS`|4qrwbLm6@SGlGI1 zMjXD3;Kj>`!^;Q?co=b5yNDlWs8TB(m(48WiV^2TozU0S(YH*-{dsUldb=DYyCXV% zW#x|ac08FJ>Fq-D-MUBLaqQ}3)8vj?1QmM>m`lUvC^+zVh z`nT^eFgfU|`LU!}&ATPVs`Hl=tI4UPSoMn%yMC7IeC1|(iR?Ee#V+-<>vX$`r&Onx z>8D9g4FM%~HAIyZ*XZ)fYA7kL)%neLGhe-iH>jt!7fSS?RpQWmIZVEFeuw7Mq4{)Z zejJ)Vhvv&+@@3-J^c|WXhsmdz&wMxQZ_?5H+BJT=rf1i5>?S^wKTXfB`ParlNvXzP zrr~88f4Rn6uG4FDdX2_ctJ|Sg!)tZ^TAhEQPOsDa)a!iOUMi{Ac$_+)Q@5v6=W}ZL zx=g*$>E-&}srhtjxwteQmx)L7qC+rg>j<}}~Ud?vqIjwPC2 ziKbVg`7SZ}*7-{`pCy{l63tJE=C4HaRbujG;@9*`G(ROKpJqPu-K@V!NAv5__+6Tw zOVe?g_)PvZJ(uQR&r>C(I$xQtPno7uuJM)Y^ctOBqw&;gdDLontU2Ho zb-sG@y#aRgs)dU?WcPE{lw$@rUme9t%N->R5{sj(Ox6-lNd-??OFShuJf)QIl+^K* zQpHnB2~Q~nM@hZPS5hil)lpI^Yk{Yf3Z9ZnJf)QJl+wUc(Jv`g^h-+J!Dn^$_Rv^Z zu40S3dsYQu?NcZt{p)&UB&2^?Z>NFs+D}ljFmaoQ>Rt zD;Tws`Im*s+NgM6DAhv8!z60`BJtSWO2T%xlCa&aBy4vp3ESNYzum1QYoHJ;(A@o9~*YmKpMjj=0@vD<6xG0V<98qN%2ov+S}RD-`Oh*#p)zq*a&~veBZPvoz~Ua*C!Fg`vB&9pa~k< z0kc!t#4>ZtLfELCU7bt%=fm_=T(9ozUEZ^JzTZQpB>92ncb>7Pqe~`4>jW<(YEe&D zPq$B&xX$&9&?V=ev8J=He|b;0DyM=%HW`Q%82cR51g zDMvEoll=rwsn>wZkql2cG6F994W4TJt#>vgLNB!H`srOP!KL=}$`OVXK1sp|j^L}L zF=m3drQ=MHZ@vfudh?bIQ77{0NeVbr zXJR!@-)=s_ALfTU#!Qpwq#maDf&6lNFqv6YclIx4rgnT*DhnWN1&&k&=KnhId%^Fn;*lNad6+o++5-h2|H;$3N* zFH;HLe7+4C;{)#Kml)!GKwgO@`apg0rue|UQHdzS`##?%>RUPvBNz=|G<(ofmZKr8 z!L5z2;^H#vs^#6Z<=NM{sHc0eoZySqz~d-U3nWL08ps?@wIIS%nPN`0FmgC2Y7@*} zYpGw;+arw?X;d%Y zG`S&Irpi$beX>$D<*Sr~Yhr_yHgUQ-_3OmIeqvlp*M&8neAl9JsWqO%rK{>vwm#mK z$XpYZjpx!T;8JUMhfB>}4wqVs;$5wEoOQ%c_uQHuZ zjajcMoldvh@j-gwqK>{!{Zi)p;`Vv5%O=!i?6R@l;eMMe5uQCdY8JI-bLcM}4sGK) zCc2H*853g`ViRiRMA=@8Tl;%^R(6uF0C^0A@CpMTM(H;hoax_W{J?^1=GNQTvlCm| zaGzQ;7k6yH+t|)&)0=QcQ*%?Dja9TvpN2RNQ${MbVR4tg&mHuC${qNB%1x(MoQxAVo=M(g{dhll{=^Pw6n~l;l0Uv^ z(W=$_K3cT#{Yzk4^Sxvj@i_Wy!6W27NZtkA*)OzGVn6isF79UE^eyjR!oEcN6|=** zJJ_4JJK2l4m$0XCFJ%woUdHai-OX;oy`1gpTeGl_ZSPyNx)0wON!pR}9*%FR9N$$L zkCw56h(*cRGl)gX*wcv7?`Al@jWV1;K{5Q=hlk17lZesz9vokW89YI7L%WfuNdl8T zMrc8TsbBO2%ecyg^H|_BLFa*t#Fxtq_?P6uZ)6O-7VYrvaKRI`9Nrn@Sv9^5*27<- z5nd3@@NQ_q$sn`ghj1Fc@OHp^afv)Jqzm2_XTV2d9ZnAU4ZIe9i|?vi*v0s&xDDSy zci>y;HSAiPCbAdbk#A+U<6H0D@FTe&-;3!)k;lM`q4kWoCC?`Vb+Djj^!^0y`d3 zY;(*vG4IFR6tgX+I;JrC6`Zi!7+pDPS=4J$PvPDYRX1u`xTI-|MeYjUxa{~4U>~S0;2iHb+mH>w|&v&y(=? z;oD1C6=pgy9sb9jH!D0Xs5E(bdvgi&D`7N=N?lO(_XHF_AOY1H@Dh9LBgmf`SE7WaT7k7T$5JQYAP21^KU z^T=VIEb|cR{)xmiPh#+=gj5qRMl>Pr_r(jZJP+PvoKLDbQo8?u2k!^N;6r zN#t!*3a>`rdaImwN-75AK$4(8cvi|cNnaesJITP08)k#|B{WrB;N=Ilje&VA9~w&- z=D{P0Bso-ScOX|%g4u%v@+o=Wff_#}X%R%p+pLo(hlE2fqnAl(T;Zi2J!@EL5cdqd z-Cr8}z*RnEvD>2shh;r+b}{POBo;|N2nIf6pAqndl5ZvliEl{`%DfyTKKoxdxMc_j zH$w_Juq2e8E9}JS%@V&s)HHR{g%hdIkvq0jNX^aucZ0-D zn)iWff62qidmsL*gXV^#pDp)!OBj6BD;G$ZEH~Aktl;hz%$Ju!Qe@33DB-!@ZaL71fJ8En&XX2x{`7<)O!M^KGf* z%9Isx1}%vElIAsWi?1F;zKId58}=s7Q@}`CAV*o%(r9PR!G%iV)bdgmSXXKKhJsPL z?Abo=z~`@zWSu5KB1*5k^#feng=Sk`2!1usA*V@6?(<4Aq!D-)%D&o&Uo#TNYUC%3 zG_o^z*_s#$i#p?ibQkHe|C-#Z5+?7SH=nUX;XB{M564*5?RgVX=+%(ubzbhGPS&ew zQj;%||wBT-e~@hqK*-KX`e;JVaU-0QYzzSt-j1QP`vdG(T-kO z11Z@E$KV@2l(S^L1A}&A?5e|Wb_!5)HFBxiFr4%4E7=|`S#$0>jPiQcl(koJ3w|kK zj%_+smc!_UwKHk^7B3H2y$etsZcJSTy(_T37MbTWIy|F$z$#CBC=Ff(sXimEbJBHh zOPlM>i+w2iT0{z;**{gemC&*z>zs)Dz!gDM?_t<$Q1<^&3h&7}UE)LG1=MLcOLsXA z(cThr1Ujzps=2^x8JhCB$OqTS<+GIJgY!RD_{m4%g!buv>3P>{muK|cOB_&(q)P5D z^r1-d$i7Lq>hC+RF|0>4vkY zRIN_+w3w>bT(o#0zYqT#<|f_ZURlre;lLwL(dcOpuXIg)o8ZHRZ+~o*t>@n#ah4Y= z5LGNSv>?>xSrsWR=}a>3Sfl1TqC2#Y%H05QBQ(M@?xGe3_T(D%Zoo6JiVhDMg8`GR zIZMi(G}E*gY2;JdO?4Y;CC!pBQ~yjHW=qgs;2Fqajw`YsayRhZ?8_gA{mB+!3<|)i zhE^B8Hj=7+tL95td3XUk8`9>jz(+V~oWN>L+~La~ z_W6fj`{4X^S#IW#9*B26cTo=dBW~%mbv0u9w>olrXk&~LH~G;fooUl!6j_W`tYb?_ zMnMBZG-SF*4q7K94=PR^kaV7rl>F&WA431C6X?(I(Ek8!d*MZ z6(UN-x^;!wYt zGT~|9dXKMu@G#J=K;N}sXJxC8y-HG7XY~1uA6g@a)51ERx;_djH~3Pay+E`$QSsk7 zRhAILFA-HAQ!_JOfKAP>l9r^a>?VvBe&d1Svv!D_YCPO<@i@MQP+dG$gxKrH8?{4| zZii<;$&mXa%JMOJpz>7`hq42RZ(x*snRzg~u>$NaU=;xTN@|L`2_Ej0<-l;_%1}F{ z%7;fa2VCpNrT-iNeUY5{?t79B5ufUOAF{(uT{tYcp>&eM&^e$|!p!m2#Nm~g;^x*9 zxLJ)aXlj3&*6D|V*X_3}Zm#DmBvl&i6+gbCz3M-TKgvHGe-*>3I@w`+M&|5E2>;(SuXXna&!LEi_={l>#`>|{8Z!PK~U z$V=~plV(}pH5=`y%eCYQT8r|s1ktpjhQyh|r24r{?mk`b#~bybt?&m>THC1k^WTRe zsKO&pK7rjYA(9JIa}5O}`cfL+ceUqa+V3VujuU!&G59sLjO1ie^wud0Cun%zPPWfb zk9lk8jz_(qZ>IR4-yR8@?P;M^&w+};q_UenmM-YXNzS(#+pZ25<`ACfVM})-m4SIE)PT_)j44vendZEIZ z>4)l`5G4(XPuzD>>HgJEx=Jr;SIwUSK}>vVB)QuUBaI|guoKis(kkaa!a-$( zz`HD;BJujyT*1t-&&;PvQd`9#(9k#Lrok-d81$3WbYCb2VDfe@}1iX~8kR`_`KTDb3D?2PXbb+=VLxoD z1;A>BR?vB5|BtX7_p!7qg0rQ{a38}Dw?Om&`BuinOPnf+e&y#I zH{2OZC-}=@1U}&`9r2^|q8qEUpH88H+#Q1}_(8)4Jq=`Rc654lc6xNWgKrzSi5CpK zxzl*~mqv%tLgOmDcwrgQ%!(e<7we48G>qIbXJYKZdk$WH@x@_TpJs_e$16n2@z1Y5 z=N$4vmL-fUt!kzYG%{HMyT=2+!UHE8!VBN&f#;qCp5q5UN9WHq(g&}BuTr3qj&soN z^3d_p&lr5ihfcqT4xO$i=?~`OoToz`xE# zW1*|GtYqO-2mYptLmj6V)a6?O#n@@i1q(Oug53O~v&Q7+(s*VY{1zu`y#+5#R-ciR z#y_dnEm#xpO?Z!Mm}+gC(8dkUq(dPA(6T(kIDD(Pid(MD@tx%bJ=lTbwt#b@uF5 z99Q0QLvQb%)=g*hp3w_>vb;gukr#cSVQL{PJi@EtR>QSrBytY}g|^NfMRyi~V2Fvz?HX%YE?la$=-UJv|g4?Gv+{&4UdKlpESe(DXk!hf53 zLm#`_gKwh;U%Fp8Fa34wWH5bJE?kH<;kB<`OzNf(6RB* zG5R0#O3Pg7B~rlxbE|~eJh_h2QdcGvj@##)S;a3(b?1+Dhg}&vsdK_9=hW7nIU~1p zqGsLDT~m6BtGXnrzSBKt-GF|Arxn&WU?`ED^S950j zq-FJySA>?2MOUy@j>&SQ;;>6G-#RLwXhziRTi2pTRP@XYs;+gfn%>;y&a5fy8Mu6R zw6oo5>a@e45fJtQ+9(fwUiE-)g+uC|g6EzDp5uWV7$>O5P<|`U9P?tQo}sX$dvX(Y z8ut`@48hStQD~ti$ROi?Nx=mvVEDLw`3Ev*-a^#O2HFA8>=+cp! zxb^(=cvjTxeQVCR?X>Z$rv;6lRM9i7X;rzcsiw`f|E9+#lU<9`O<{A;7)hfWnkf+X z%;-ckmVK*>H@LQLbqzf35{CxvwcGj3;}yK!ZXdW4dWJEBMpx9LK-Ss8QUI0sq~r)1 zXvjGNbQ+O6Lia=$D1i0MXlH!mwb$}zuf28?KeTDnK*c7Kn#?Ijt0IZPoUIg`#sdX6 zXCDQp*@xgK&OR!gT0xadM=omPp>)hyNx`XgRDN?-YD9m-e_!yx?f89$mtX3)Dt|uV zM~ySknikX;-T|c1xn*(?cR{>yRvtHXEi3t$`Y##0AQCEjH@iEo^wlRNl@q+=g62p{T1aOm?lzP%drs?wGCd0Ut9 zJ;1nV_9kGHyS?D@1`UPX6Du{<;CylPd3*bE`u3g|y?7zN-E#apsB0BJh{{G-2FMz$MroP{@S7fR z9!n~2L|0$(+?Gplvf_Y?zXX}QG~fbtnN!xGPSru%N(xTer{LynRE;_SvxcJ%vSunb z>4eIybV9J|!4-NwiicK6qrv4QLn7P56;C`pF7BL`x`C%8dplRhL@!%eGkvEopBO7> zHg;pIh{Vd(Z^R_?L=NI=Y?sCZ28neOCajw^YkgJK`dN9Usi~!Txn-%T7{+g1w{G9; z+56V5yLHwEXIFdss*;jb?d@Hj(a|ksfj%L%P}z-=w$vI0H+!OjQ%@xLi9J!JlO3qa znLSRyX%trFG6!G7Nt&efn;4BWDxG?yDrfe{RLG!Gj=BW58aQv=lbd9(a_1wB`baQx zPuCIyhS?cpW;q>X$VG^u5=(@&U|NfB%wM^3e(~huyz-PeUB$&+b52=V+^vlZC?CE#Dg6z@z6I%^X$@t@ zBd$!x=Fb{ePnfW}arWfOii*m~;!ye0y80#M1AL>SxEQN8iGzB1EcQ{*$IWtxXw!-dkAhRrRq))wqYCaBeF%=8J4j<(KD49|T7r>LjoN82jbIX?H-SrSn8Pdq z#~HG3CCZh6l{;qkPOx5X%_zyTjZI3a88_+lg7Q_(Ocmsfd4 zR8{Ycz_C?nF`3CD@-rf19L?iuI$Z7*O@Y~^sRcR7S*ek+Rc-F-(@RL3B|oxOr|Mc2 zO70b$YNg<&g^~~39sFxJZ1qlRw4$ZZN7Ca1 zRVCFrN3VFwNC44sXRYMySXFD%&< zmv1X7Ua_aNY#jr=U5fV25YN-ECeglfHm0?eo|X&NoV&Hu;V9jDZq$Vv z`JV?eE32z3`3D0<8!rS`vaD>2rMfNDc&OkseknNkl+smjlDdMM{IHLY@+t7!$N@l(Oo_^Gs_PPZDy z3(UU8C$C<;t8mxVuVPerLAWupa9TSF`tMhfXj_#_=FG%KU&oZqV~Pr9`%li>K2XAw9l;&m4G$e?IU4pXF<7%e<1;jefi;IPt3Bxk#n)Lcz(F zR&Z%cLpq=0KTY*RI@pVE&4oo1_+7-daDMt5J9oZ;Qp4MM!&pujm8v0U`cGRCG{<@7 z$v|v!`AiVipU&tWH_5&8n)U5%r4Fa7O&oGAoHV^7dEi4XXig}`AL+QnChNCZ*H6s} z3QqM?aC1%|oJdTf}**rdkQSc?&_l8Ri5UMzXd17(uAf)lR_PP=#tZV*=*4qk;93$>8So$kqv zI>rzCYv>KVIq(=(+i3ghZtrz;G2bw!9G{*<}iq4y3q+c`u z?CG-yJlMT7GhXmwr{1SH8Kd#!!fwyf&_KgZCpwroj1W)m(f{;7#pfPq{%asw?LUw?wRo$T2DW{)j4hKmquDr zY@+4t=+=QdGsk64ZD>eLNs0^T4WC)xG{YG-EyXs%nUa$9#!_QMTw-$Aj`Ppo;a)qh zWWu=A+^|zy((2p|Gb1CbOY+jKvrp;mez&Z8Nl9f&NI?3i)KQ;Rm6V`cuv&0mi7_#T z*(B$=fwXlZmBlpGY42I@6!WDOGvY1hZHb%du3q4BEm&ISc9&(AjvVOG0-PWesk`qpX9Em@OGoRhO@lyid0XvoNa58B*;Bc-G*Xl%T>n%30RtZACCY+~?* zA@0#-6DE}9mj_=MRJSawVPk9ShDnaossqQ`+ow)#$Dy$k=DVm}6n1Ly{YuMxprlU< znj5V0CJ`qdC`JSi25;URotL3Bu^n9}vxlbt1#vs#*`wPF+u0*x-vh{B8yd%|2# zCL|6^gTr8WYQ~Z!t&WLNpc35>IAU~CV*ZHH1qFO$N`Da)Q8l2 z`)&6@f`LXcTgz$3z7+5*@j5t)z}gBnUu$l5qERSv%hK@Q5wyfJVEpU0r^bLDX8TfYm z8PlenF@9{rjLi14YSuI~jGtInTT@R`F9s*1L5XAo`OcK_@#&sEX6XK7pW0Vb-8;4M zjOu|M0TUeAB_UfzocYqb0Tl&>MX9x9$V8lb>_O7;;}6Qqo;N{ z`IxDVj)|Ggjg3=D?-eJXKz2{d7SFSKp)?vOXzsAkoB&T=Bh{0)Ai)EbBZtC}?#(ML zKm{EGlh$BakVYe#&f1cnGo~Dyh#!WGb|yPc9Y3&-S5>*Hss>(yj8haINazK~ z7-P%ePM!-T|C!)&#jW5ugR7*~gw&1#J49_)7q~?^^g7~} zu+iFao1{(fLP7FSRB}LtlfSK8lhP^{=y5_dEn?#gFDbWd%XcO2+`+lBEi19+!O9l62`<+Wr~&rB#$#a9x{p|Dk0ms$e2imkP-JMWeVlt^Y+OWq z*xH!*h=fp)bhc4jJF))%7566KZ53DFxaLZhyxX!YOSa`jk}Y|WWm~c=@B1F_cAPkI zcAV9AoW!vcXLBHguoOrNCbWd5v@D^8Lfg={rIf97VGERorIZ#3Ybh@+ZGj}Z{{PP0 zD_b_9@B93p?|VLoEZw=YoH=vm%-Lq9wtn$)@fy}&kQQT474KpFE*t+r_-#Uq(VRaM zehmv}7g}iAtBMTGZ*r70rya@6G&ykx@iBElU24IyQt^ANth~rnm?{2_`XtpwBl|Y* zsWodZmBv*{wTnCzSV6n9sX041>8vW5^g}FpaQFdupp%pZlqL<`)n%l07}Iiy_stj8~j>D7N0#* z3CpWOQYA@XrcB>&>mTHxR(L#>E{9s(41Y5#<*$S zue+378Iev80~_C5YYV7#WGVQWHxU3^wr20>X;Z8QV^CCz{yqCzQ^W`LAx z&)})x4rqBcHRoO8RaKxuBYN+gFRlHLZj1c3jozTcA+G#fN3_GywJI}jZA<4mm*xsp zLRM0?E!LCQ-k0Xx5T4)VQk&teiPmX@wb|AA&Q@nZw^JRL8e`V$j4`26nWZ_dCddpj zB-EELrM@@`Y6(8-i|%wI$d6Nx?@MhhUL{u zg0;%r?!tjh`?B*=Gh-*S?6&OcGSNYFO@Cr>vI}1w*Ub76+pWU`g2C7M2ZKP+qKK-<(&+FP1Fv*8-cGlGC4}8pUrREDLKJVd1Ll1$_G zo>=V&Py5@VrAIRDnZ;M^Q$~j^4JHt+{+I6K0qE=RiRlJd88C~E0AXa5uKxJugEVND9XQL?PbNq$p0M{Eq=;Y`aWR6 z;unBJDo0qP^FRG-rj$zfl2WBLQ%WU#QR@6Pb74JLGXWJb??OODl4YQOt@(O+1P z<&C*|Xmq4{vQ*SZGFj*V@jO3CJoGi3-Z=2>UtfB-XBWyI0p_mS#l>hc8vewQFq! ziHQZaESJ&f3WxNybYHD8%hc`rpe-wRS0>3PnVC)bxy>2Cozxm(l>8jPDAxm|RKlo~ zn!zQ0DU~oPrApet!c<#8UcxBl1xAl^j1Ce;7q)3RLl~7(38PZ&*>XL0M3)mrDU~n^ ziqsR_ zA4=RhLnYSFSq%N}kjf}kvTsp6kD&xoIju@Kq||4n)RbBLaCj&cwL^_2-`XJw8yxRn zDZ{NA{#2Ank;e6TUS=)q7iV~ll4YTI9koOK&f=*bNbP)^Lv{(hlh#Yr$JaX4cN2fN zirz`93B8k6n&NwY^D+t_0l_{ zJV0?Xf43GWz>Vg+V3Rq6^%w7YF!KM=#pZ$B65!u?zqqcfWMhKCkf_=g+S}aS85$B2 z6dx6nZVV17k5A61*2QVruDon#Zn!=N|U34?G*j1B zvzL4)#dFj6jYxovX+ijmIGAuiRBU zr$}qO{s^?zJ&TkFRh=b{3Tt|0dUdtQZK?FSs#OOyH6u-pLuHvAURKqgQ#%puUR9&c zFE-_yq2e;OmFcq6Y|d<}+S}vI>-FZ;X9a6D-k!Y5HD02EDhWq4nrp0D1Y)?gI=5gv z@~f-ykK$&f*i?)p?$oS^o(yofEdyCn~hTdnq&{J5q^*{!mfOm@0id#;|M&f2u3 zq_o;j8V{*PS`k)p8j~V;lr*yiiZk-tnwgss5h(G^ejxtqD2wp@_oRji$3!1tn(!;( z8g=rroNmD`INfG}Zuv?2*q!&ZA_{YfENMhnR!&e>ZC+BU(#iHteluOuyJ*U8W+I}C z`^Dall>{Yeb%;&|71eSo;&xE}j5m1CBUlluq2@8Eh(bet+8?2zS<4&I7P5~gzaTJ$ zKHo_y(>_}#XjHC)cIBvv%iL zA7Yw{N45H5_PKa~9rT@W=TU9EG)14VA&!#_P%=f$#-Y|4j*~=++#C#$kK{<>S*xFc z=-kn_x2|q)-{O6Bb^8|AcXid{6Fk{mf1q#4{`&g;OZpDfj}EkVEMMNyKJZ`EU9@dM z8;Hh2&vv10Nv9{T2GNifTRpfLhvKA3*MuV;%^Wu|SFfkE-!j*{z^k(o1$PJuIFsk){FdY>!nv!r%u$Lyq&+ZewlV41V#3H~PMn?hE zNsIx?tNb{YsSGvveHuh-d|scL6s_zb(K^{p1xt8w9%B!!FCn0H;tJeSL@-c@6wM;C z63y21(&Td|uO1h3**#+Jc-K$>IDxea@b_-!w4)^L48Dcg-h4VKJ}dR))G6hF+=&H| z$2|c{gjI*-g4;ye{p-WK*Yeoo*~Ni1{+gBt^dDm(R0ET=n+v~pNNWv9U~WGbLyruT zi92`i-kF%_EiCjVvcgGJwR7v}*l0;fNwIh@p@_x>oLi{i;}T6PR}Xq&zbIt-r*>bv zq4wo@VYQat*^bvd* zedf=~y^wVAj0mlTyGP}HG{|4XaT0{`6p3k&@vha#YoXrikAl$?h}$Pkf}_PjJfhf< z;!1v>?E>1bn&lH!ZPv={*NL2HrfbpvMlPq(JO!tlwc>-uu{%Q=Qon7SyxfP^4GgRs z92gL7li^cW*vw{IT54+agO5M)&_ho={$Mm8+w9TNXC{waH92|Jkx3d)P$o$mpc-j? zL{y_rHc`8k9`ehB#|g%37w@`x+S^pRwd3ryy&hbu#G@L`@oPF7*Sf_=p5oz+0!3R2 z?WoP9NaYkbiwQUwtR6qCYW*xavRiVi*A&)F^i(e@bHUUdfRf@3^^1l}N9#+xRcSSj zmpNMKmKg=-{z}X%K2Od1^o!2Z7`9D(>$*Nk%6#`aX{JW5Uj5UBGnMw^OEZ=D2(2kt zd3NaFhQRbRz<&wCCVJBlcU3}sqBvu2Rc(nW&OVb>q+7JVC?p|nS6o7>NHM9y<3nO{DzeR0`k3^ee9a~a zW;qxd#)85k!=r+kGALnRNSL5hMn^}4DU~|$@vq-K!N@v@o#c{a!f`_QqBstX^20w( z{m^|NuBSLNJRvROHjv%V*$-OUN7J1?ALv?z)q>fyn+a>3i-v53A?95P$9=s4#~Y?nLAyCdiJdNdns!Bx1*!K4UF8D;X#BIa7D5L!4qKnWTz*6F9pPha|{K> zh!eNojJtBEJXQpb=dY1oUYLAxf&9X2yO<2a6bw_fcMFk*25*Bu zrp_ONIB$ORu#+!--88Un+a^BuwbTwcBw3W;kYv$p&>F@1O4gV(z)RK`#3*1kXDCVX zbpzkfF(jD06@teLA5f%n)&ai29V7y*SwtHRh>Hai&DG)X3cWtfnoc zmD?8Cic?d)w)EmumRua2os+S@WBK8Mgea3Oku?ukqAdAMh02@?bH%pSwjC9lZ8Z)@ zby`}r!%>@#@m~S(B4AsNf>vqfyjgNf<@1eNb0P@$*Hdi8ir-x_R8!g9zHQU$QF~Ul zZL~ilE8E^L7~7g$#Y$y$adXE;b5fGIKPAxw@@6=3gH}<=w?NvmS9=A!LVTcJFm9?6 zwKSSi4ze^J2ex2oTtqmNQhy8>Lj!bkua+I#EAHksu!m^15!>aOP$pe&i)-o zXLWD$BF}H!_`IB*R?>}FN&TKt%mltuP1dErTCEyfp-o$tX}4NpVyab>!tQo$J2i|S#e?%0IZ`yR6F_<#__BEmb*w<#C&&u{TwK6a^?;`VbSlE!WI33Q$%3);DS^q-pkM9O)VlObn3g&FsT&mnBl;^oh%iIn}w#${3 z;Svr6Ppn$EqobBB>f0Oc==7?rS+*2wCR=7TB_t&pgX%jv>YY^~k)dtHi?wgQOiBhCg%WEW~6W<{p zkYB?FPPk}G>+!eWyAfea6TxrX{FgbT&@Z$hm806eC()gaU`#-5iJU6t%jTemgp>r6 z%Em4o|4x#ou4*_fjjf}h7vF1y3JjYFN|vG|csa%iE+y#XA8d0Jo$>vFvMK(`~ z@5Z2A4PjN%(Hq#a%2TDT59W!e2x_4QNz%cdF{ zruthKFK%t^>(h?waSA}&Xu0%vsI{i1l|JH!%7F{tJxIyVwIL>({^iG>FnPj%4WbYt0!G6GE`~)M(#04a>%j z^p_8)T44nr0uz%dV1f2coeLAE3*aJcdnxLQ0)!;L6O#+Dmboud zuTmACtW0GI<3)y`ri$0c&CA!US#Gwan9V7+VT;W_=bJ$)k1y-(TDlS16spF0g0^TJ zzfRYtX+5iJpO@+t4~#EmiFT=Wxk5t2e{bA)1+Nz~O^%qsT>TQ%E+`7X!ztp~uK~}> zH?p!V(Y=@4tT^t6N+qm2-V!75l$4w`MRT5mXStW1YRcEjP_!t48ORHRtC2?!xVx zpBir+Uf0)`>2$st-=5pO)c3&?Pq3`RR&$D#Xdhf5LUKZG> zH;!+LF~>doY}Xp$&0ZL9iSsF-89dLqfHaTcx0ufd$Yim1V&mxk16wza(C&+okJ%-t z{KVS6-c=hj)6z4Ub{X9$K)T=}U?Na|hP93B&)7;Is6X57Zi5wJ!Re?wyfUJ}@uZ_6 zvSNRhCNX|@e1axxaN^+4_Wyj_&kp=t{F%U>hWwHJ^tTdqy2Nj>B=MaOeog;v!VMh$ zwGoyE2U%ez{Ccwh^?8BjY*;`Cfqt&t5pkAKV`-8pJ;4wblM)dgkr)web=i{hbg}k3 zFA_6)YHu{cOf-?e4Z2<7F-j$ijE)FVDU;4zJfM`3#LXp8Sm|~^YT?L{l;yV{ zpE}rXT-%}xF*_m-VxigpaZ~$NYnpf~)>@nlxmf_G19eN9Z7lhOxOSU<5do3?aoqQl zy*tM?ZQnFDw)fMaeLKaUkL??pzO&-3={ccjzNDz)>j%Zj_}h@`w+9MWPmJIC-i?2Q zcop)-x89n5z!g{>RgALLT+{SRH-2puD}i6eVZR^ueIdy?({H^sJx|ubY|2FWTtJ~F zEr4)@{y|dJfA+ge4<5YqcVk#U#6xVa?}O?0-zWO@=ciQ!SX}~oB9P@$L+rp8{(||N zHsuEv7Py4dfVM8KRlhLddm|vKh=83JStKY*F=Hu0im!%&TJ-{1a^BFy}gH8(`s^# z&LrkqVl$ib^I9@>R;OtsY3WeOn(4m2=`|%oOOr;nsj?fExtoV7Du%EJtsz^r4I=@4 z3MbK>mi*g@m9*KF#NWW4VJl1)U;{Jj3`#+jU6m7cBqSlxyQreUc%?eZptbovKfUU~ zswCoyS5`66+tE+Kq_kWwSkDu5XS4w1rrwdi|b6sBapH|quaiY4QzNvUG?_^U$E zKp(3UPo-Elvww==>?fNy6V|d}f1rKg1#_#P*D!~edB^v8^>*9rNq%6N*hiV$HeT&q zTEPn2vPw5M<}T|@ZcpjYw0cai%;w}|S6HnT*(o)Z3C#(;>!ZDEDhoPY8m%U$!RhVI zOK@6NXSw1s5-mQ;Auq!4zw-lyzHx}2Y3T#E+WkYUVnj*0-u^XY`IW8h4i7VYN7o+hT0VIoa9in&n%ZOUmoIB6OjH z?X_z_CUj1)6dM&v5f*DaW)JB>IBE!AtY3VRWqqf&SNz$-*Y0FbigkOh#Tm6BfSy~r zp#P;wlqQ2eizys!X%0NZ4?F0FD}s(`3Y_^RiMgrfg3xbfu{*_=;*+)c<<^D`-pXy! zg)2&f9gd1}>>RfyYS>Lve~2<==qrXBnn!U?ETZYLPoIxVuAjOk(bP}Xf$hz%@!U4f zoPFbEsr4fr4J*76*K6#Vj_P#g2+Qv*Y}`;>J=R@RUgS;pCM6a`FFLwm>G2&^&d!3+ zM5}vrxhl0Ry>v@c$BxRWsm|mlP!o z{q~W?Q@a~3zvkO;o#9?M8GgF=+~e;7=G{CYRkp+M@E=L^i;dF-%Bzm{iR#szLUnKH z#)gJXB|SAl=j!V5j=Z{ZZ(&7Uo-HreZqLn&&RtpGu|6s`y0fZesmryrq^dJIHhQq5 zer4`{XMwA<)K%bQO_^D?%uHJr*yjT5N;^L#H@BZKi9z^xFBl}Zki2<;Wi8n`huvU% zhNC8pIYM2Xg$)~vt9N!4l@}Khb`dJD==zO*^d_YF(L2;Aq1Rh0qnBj)PqD&Mj1t`x zj~O`_fCH}uFoDNIu;lw!3=2)aET?N=po>1S(VNt1Ta>DFTU=!NQnEcP<$sTFS+#2O z=2fe>7e$a`Xd+|1>0IGiGdg$(j` zru%+uq9eyy*I3=A?pGxx8sdXvw9ag&_L{)9d%}znh!%Ag)YO&-rC|4eR7_N`F)qL1 zy|05NgQRE)%l5AVgHFrZ0c_eDoRGCZ1i;P?uXU&AhJ-k*&XQ7ZP^`fir;Dpgh%>|+bgJUwd*(w(`jJEn#GkN`47xqg zuApS;-FEL+tp2QG9gaHt!KwcKn1B{IK?`pG zSb**?+Uv}w&Wdt_H9YjYpBwu_6Lj(MrUZS0YE@8ub3p6Io2!Z&!^2wJ&PGR@u{kj| zCdgefzngQtjK^-m!aztk3xs`;sm1&#QTEt{b5L=Hm9Bg;a<> zBOX%fxwK!6=6*oj;#a5t;zdq})mGcOsLp0}I9q#@%;u!z)YN2sV!Xi+pBNVa*YR?f z-4hvRPtPqV$W6D0MR+n?<*mj9Lux8c&A2x7CMO+8pfE}9>wNnbP_ zzPyX3JCJ|nMc~9O12Ze2Y0CYA#GHbYQ()U)Xy?J&KTnF(N&J+?LlUy2!NI5mtYd{X zmNRg$zW(6A@`H7C2bc4R`r6vHZui>S*2T7t^75vTrK)6uHB%XynOfc2*O+3pr09~g zIM8zvLAeO*mebE_pOB{j;V zOSWJw@XLVz%QG{-Mi7?I*}j+v3_Ko~`GUR1u2ypj5PyM`UqgU7$}U3+93edA1X3R1 zd0>I!DbpzR1W&iu^AqLID30U(WBeJ|!1L93eun2K zN}o}Dht;rC{5>#%=WFo(S^ge)AS~edIauWWk77Z1{y$*>ty<7DA{`;0YJhw4q`^AJ zx-VUOnYi_`HJ7rd;g3^@h=~Nm@SGwd>uHr;u+30JwM~eIp;{x@6?^$uC(nE_`yOsU zdVhi5XDG(``(V895}rqS`^*;f8Sl?a@2}(UseZ)Z@%rWRy#7qZFn=G8_pQ8q#>}`> zK7`6=D)#XAdeo0S{k;4Vsr}FBeU@U9zmLKD2KjxbRQ^+XpCi8~_&WLfteH`%{5k3U zAzog3Pw;2VY?sP^5%@j=<>3>Yas~3d$V<^oq?F^x^B7N|nMf&DBjp)hie@6Ed%qdPua9lzx)OAq>m176JwIZvAas*p3N~HzX#h`qgdKjdji(M`G;v zS#4oMew;BFl6I^yAtk81wx+=8HN-_2!{}ZgnR`(DF8U`gL}cCPx<37w*O=su&+4pF ztr8L-RwgH!Ogf`JF4lmP(bNnvf5Z_aj{AV!8tCW4nnli5F6wzEpb{MAtAZx z?plzrpG(0?8bLU)dT_}EY4>)7@RgtX0S*R!q@UHcHh%h1TkFkZVAg& zs%F3=b48iL_(&6iWgULD>e+EuYt(Vfv8Yd8ft4u+YlbQ;GsV9G$6y7{QLH|x-zU2WHYj+u0jd#l>**z`J)my5;4Q1{OiX^F2 z-X|kFdH4ziEocFKdIM;cIeJ@32CZAvT1ztMqQxYCk{l|_pscjqmEnn)6Feh5_KOLg zG=~3ARt7N*H{!g(C`J)014USoi6e_WbfJko$W%l44_1xyr*Q|(t8%WexqNQq4P(!J ziKTuq`xR3T^ZyjW`D+zkAwejE*9dcRg3;y(@&z46gwM=T{PCTeP?vboG(*IX_{=cw zg!jGoKb5)gg7WQoWt8*Ufo*lJr6AsBV0%Fx@iC?neaEOxFZx5lM%47PelR!;MRRZu z&ce;E6n%^x!wH|t^Uo?Hiv%uKPd#UVCF8?p+x*Oo!r() z8YZ{uA$k`Z9q1YuumIS9K>Qj#<^U;XU@7qQ3{|i3#FrHml*N12R6lZOd3k$9Wm{Rr zod>3tZRfDR!|YMkmYBtpbEmxQJj7(33JsCly?%dhV&`K4g!JmF)4y zpTd84jE;V^bt}d~%tzUKX3O%D{!(K8^B=Ou#47d}%E%>VX2k6ZH=7iS2p-=Ji0I?r z><+;5M_S*JgXHG7gfl9e(E4+Nv&Huq;8cQQ6`&TU45wlp-j4IAHIDL;9D)Uo~HMI$NPu5+|teQZ5O&{4&c2; z=sy1%a^?uZT^!2`YvK-eDK$OWek zVlwo9y7i`;koxA#IyQ+^H9U8?Kn2J1e&VXRrS`;$n~r>+WMf`RP^oP~J%%s-I?D*-(c{LpHVShsEL36+_*O~G?@rRCSdEq(sZHV6Xo-)>J8Tb|g#1Wj z@(!)3in}0Dp5pUxp(V;;uSid?u=BrnrB&MOWoc<;c3UOg^|zOeus4JkDUPPc?!_)b z2zFkB1`a8M#{Tz)is9jkhSE~`n~h{IXZ>t>_UhICA2c$TvUqley~Qa~Q4O7iq6%1Q z`R--s@L}=4!G9F1lZwpHS!Bxf&nmB36NK5N#5XhV+PX`;KAOE1CARM#+POQ5z0J2u z+&?sQKi@KOH}P_&=))Wk_#99y0p0g;av$;2dBEFxD{~71=E4--QpqzjpRr4Ew>{R! zz&#wyVav<2;S-UUmX@2FmX-%B^SlDW{sq2+mHx6}p1zJ9M7mwTi6v~9D4+Xh6J|aW zYIxlwsqiyU_$jg=Z+Czk9r$}FJtrp}pA%_LXBvIeGk(v4;Rnb6P574JqWem)Q)+@1 z1)4z`SRf_q79P&2V{V91yW~!tt-iA6%$b@itN%V*4b`%eT`J^Dwe(;ErZk@<3k_6$ z)OGF>s-{S;g;mMbFxPA~G{4YmX?{W9`H%A}0KTuCXBD>GT$?>N_dm?GcjmWFbFLb* z8?9F_m}lq(b%RfNFP9XhezBqXQ*LgW^XAcCw({b$J;st_o@<|ILGc>9lucnK5{3;cA7-uZ;kr1w_3C|gZZ3T#yXE~!x>++;@xD+ummVwRN$GVnR|w#x zRL>Id_&Roa_wL=uAEbCm=wUaL1z-@`3pYl~?lyybjw;;8cbLj8*21`?LVZhgaifKv zyn1?yDrtBLw`%CKGh5ONlj2asVQ+#<2sPg|bBz56vx?>hAr2eI$l%LzYU{2zyt}+? zWb>;-ufP1tD_dR}LhkP&_d{}S?Emr<*xe+Bv+Tp=WxEewQ8zM#jIX@>`p~O1@Ak}G z#{MMyo8|@0yLn;^q!`t{}C#v$5Wpp**+=t>(v$>+{g+X6nlg==oFVIb`vA+`~wlHF0y< zX_j~U?cg%wzU$}b!7faSCe_|>`|T`mWLy{>M?fuZP@lP${X*%%c;bc?FhCt^KY4QN z$&=gJ%k1}J4vvyyif<#&kL5g89b#%&C~|D|=RuAKXC7zI;*1BZ-UN$Uh`}b7cUfXz zadD+`*LC9W#g~!m8sxfL%C)30MzEW;*C0b5j{CbFw}Iwdci{;2>!ji%_9tZtK{Ua; zb&|PX{0L4>k#1n!GjlV$pM6MgtFbo~y8Hd&b1$+FeLq~yJ_R2rnYmU-;jn^!mhc{- zQ}}oGoM#xahrngtDKz@y3DKQSvAwpAdJE1RzUou#iep*9fGsk05o~gof)0 zhYe&jQ;e|hu#X`7@Dm%Vc^r-xzBGs*UiLakc{kA?;S9-oetB<%9YYzioHfi`FXTe< zY*38io9=P=4x8e&Ddf7?s8s&e=_`IfP`!$>V${2N|oRm^db;ZuQ5wsEcE2bBRAeC-p0RLfAgCMoe%OqG}b2+t?cKxF&NZ7Xtl$B zqG3NjGCh6dWGm%bkYhrs@B}KFo|Y=2wvXY=ji(`n;A}>WEu=>c&N+asb%|<+QM_Q> zp~Cz2-gD=A#fQ-1r+C_k+@N~t?h0STt_Zg4TyO6=)KxJfLKgouJmZL$lH;5U3&CAU zyu?uxc8c4qSQ($B%nn{sH!+ZyqI78b8cNxnyOR>wk?MBFCKD6IUA3)@T}PUS!ZY(d z!K$QPLVB!eush-m3oW8$B}@F*-z@syt>U>iC-&PrN*k6rF59zV%;PC67+a0~+3wZL zl~Wg{mj8z75 zR>6PW^BJ%dnYDlgtIgn^Lyz29QPy5j(GCsukpRtAJTx`6Y?wJ+<+c54P4Lp1GFQ%U zet%hotiM*4F3X2lr#jb!p@+Xf)f!L z`ZT{c(1@#{W&e`Bgt_;}ACU(6N8i6lo`81Sjj^V?;W-4=Xr19hdhPjZ=TusD_u!y- z-{9bVms}#1nzI(oqYx?=NFhO|&*cT3o;BXA9UA&Qx4_J^9sP$IU_sh-;fQkAS85== zybzFA$W)4Po}*KO0+;>4h7|~l>do^O)tm1zr6`g~$yWrEl2Y`EzIDUHFAoigzxF>X z6hX3us9dgHOVah6m5A!sfl+av%$%hOwxavaFIL^xb^7RO@x+TqPZu!;1J(s`MsDG^ zr%yBQ^Uq5d474hc)rjMqVUhIX{X#123X&N@yq|0e;8?)hoaG99k2)Cy1E4r@RPL8> z`-Ojy!3+I|)eIVv^860i=}LrJ^o8ro5}qV`8(CWJnzQkh`H>^u5oGf+4GY4tedn3~ z#|t!e0``Z!$yNyU62%Pi*%bt;N!R1RpHbiS!h^mJ;lUfX9>_T`dedd%kG4*4l`u*) zLr@S`;TV-60qZ7gYGfP)j@b*xPFI~i_QI6vlk+jEPb7%Wi|5!&FS3#sUpzBBjDMVp z{dG&$CqDL44{59}kOgz*dUWoBIPCADk6okM`Zay@kH4R~r177{HiGfY42rE6n{zIt z_%W~gf(D;|R7X!A6^@-gO7=n!z-_}DhQ)!?8(xq`aBl7>HrV|mc=#wRmcmhSM){o! z$z(Q_%!@^YaZqDGnZemIK8wFl(77+4Cj0DcA-|1t!Kj-#W(X&9SUx`~w+tlxD(JUG zIP^#w_8^>d0%Y@1SDqgM44yeElAyr-@Ss2q@ZkgOQU}x?vb&P;HSgT(L`F=i=u7zr zh%)F)#L|EoNdG5lh^GjmYCsh<+cyf24X_4X_+3!v7eDkjfpb(M**_*>=($`I9JK#d zrWqbSEp;9=f6c7bN46J=Llqoa5}`=K&MnkGhW5HTv*B9)^>3ls^$}@@*3SaG~6nE&Kt$ zZYm#R<4mwHG(!TZlU4y~CEye)-afQp82BmV+|17tfFFs+(%uB3 zQSdPE@N>np^!biv;)^Ra6R*y4EQwe_q?d43AU@5B7tgRU$+N~k17=qUX%6_?xad51 zCn)3Gt3era{D!8)dGX6ZiQ(||!OwAKxtV`P*xh#U1|=}C5DQ079}|wgaO^GOWfDJ= z!TplGxamc)e|Qt;uLTMnA`lAr7%Mi&{541(6~?X=x3lL&kLbqV?d)3JzLPm8_xTy_sm4^3O2N+m zRZ+x#0sgl}qEZcZ68a(h%C`V@gJFfR!|yZa|MB~Ql9R|S z6s?WZCD>?>QHk$lM z_?>{$2Pr+>^phfDz<)(gO))Vh+O#$QTWgF{-%acMg&;$6T#Sj{F8CxS>R?Z17X*yf z_b^&(Wt!5Em+LFNzqt2nLGR%e6RcK^Z<>ZtdHo#;DF%a9a)R-poa+ehU~FP~QgQ}P zx{o%-Z`aw&vXg8QP6F}6e{$ z1l=c3*adz=^BjT%cnRPikP&NU)8f67$5854W<^Hq_5}D3$zv$dJzMfuKd_eKMw`R! ze*!lU(_!a+R@ekjS(~CCS|lu?Qm874r+fX7 zXk-wBcnQ*L)p3_*mc(l`*;VNVOR%yxMx}{1#H*AUJr$+BdCH)!R%KEO6Iw1^+CN#Q zQf5_Dxk4ige20}%Pm*l$adBE@vW@1e))1Fy6S@%mr_sk7(llyAc;TwDiq&3yO!7xA zZ`+EMhnro?%GRvim5UZtR25Uz_mC{@5+mf=% z?Yiyp#^^X*JovH9cW3zudOPR7*BT5d33qU1 z#lJ(OS|N|5`@{!v54MI+-iE*@@2G2n%ohXO5^U!DvSrwT=%%1_vvO0G*PF!-(_e7| zyYI~G!(^6sFWZ3{B4@6_&W)!P^>mJDJ&)srRe#Ru$>TctP7-pGz{C`%L9o5wQ7Omm z@<+}u>@L6Ol-vUB!JN*t=ACukkKYfsvhU`CWg zG3RyM=>t;nyWeOlhZm9S8f<}vRSv8SU+9F+-y{5vdwa{)joAr+8Ci@ zdsTUsCC8Ezmb=WkkrQUKvntV|O-W2P2ggLOU6S8Yl^UPtN$FX;yt#6f^N6;{5>>p} zw#^oox<5Md7K1z0n!~!ZDHdHqa%y5EqKu^-ZFG7iB(xn`zoS+#k!^73UaXaK#w?-Ml?%{&Sn;0*c)TNg!H%VBFYO1OF)US=sEiVve4!Nt8d{P-4Wi*?u!;c2#Kb(N@X*^vp_grxAu ztZKK-8>27IbT!&pi!~`eB|17OMwbfH3QonvDFMCc6GdE?NxkwDBAhccOfn7fv7+4; z+?z*)D)$h>#$D<-lq9?VP)p09{{F))Er)6s)e#Z_CMP%Xc(8gElLZ z4RoS}F-5gGWM%lk-6LD?8W^~1>&V>$i<&N5zWh*Q)8O;zHlIOaND>Eye_y_hH2}qS*>X#SM}dA)SelhNO4qkL z9PR5%`FGm}T=HI6xTd;tt=GG@a943dvZ;ERCyAvROeRC>?K#L$y1vcfXhVSwZHU_$ zEH4`@!@u&uvSyZDke!?pI`f)tT#1LsRp+z_{&!w%2S@{{)0y7f9(L+O8Z<+g^kd6zV77q9L) z{$^s^J?(4*ZVmY*s}}EIE9u^gjt<;>u?kQ4V4mz@WAHN)O~F5kn8{g+ktvFL#&^sy zM_yOn?7!sf?Bpa|wmIhPa=AKlb30w`PUptV)YPo3)YMGO+dr^BvO}1+@W%E)g8GB~ zNCErfU;hdZ$0Xjo37>~e_~l*1y??n3E3D#USb2xIm6u!aKc14K6NG>_6w8M`D)ISv z3hMvW{M2U+{Y6i@Fzq$GMdaH-xPX-M-Zi+y8j)iouh z)iF^~F)@*mOMZ{@Vrs#DvC!T4~cOLQwc$I6vkd*rI2DYPCM_fK_}> z{?W)<3avMpJf=I}o&AMAMxvL}X?=2Z+79>t(%~W1!9hsT%aKBv7{`u_8+TUzt+L{i zicbis-GW72R{pp0Pw-6hh;W4{bbL!1KTboyF;`R#PLGr7IdSvN>_<2bAxk_nFcYs=p%fBWqUtmt&6gLDe`Y;9`@9;Hr+D&^X6xkwxP(aonPCd4x= z>@O8>y2_Z}W2>>6`{SX*Le$vG6FTdd3jV z1mh}BUgX3;-#Baqqf8$qezSD(O=kJyA8TuCiQazy``Utm+U37}JegIp^2`6W>2H>y zp_Kyzw=G}ZHZ-JXi^QM2B3OKHvL{xr#%L8_w9+tI{LH2vdF~o$PdA+5HxHI9v-g(_ zKEC4bE8tyjARlFFSSWrB6!2RR?7|;Fy=G7Ytl!u{HakxjaP~;y!^+l5;p;CI z7T)ru^fm75rJIFURN`jgzLrIO?mSJ^N(i?&Wm&O7s1&Z|YYd&~l1&lBh?|&g?_w(r z(MJ$IO8J{Pz-Pg8D=sN3yQCu3V>WwIQwvj5Jr9>$Ucwxg7au-ce0hnu`tp*?zg>1o zxsACz022^o>M=Bg30%z!iCkLyu(bP^ zM1uy(GiO~mk`#*#*1Vvuw65)y>Z{ad4-RvQPiUyA8OSRdYHuAX54tKSKHpwYXsjyj zU7K09ZMky)g-g3iw{~iBDw1QY@k#d7=%|9u;))e+@A_sxe$+^dQ=CoIv^s+MN{x z0(Oi}>+M}9JYBq@u6}*7$PT#R zoeii_I`Nk5#Znd0h6EnluEugq{Ga$bYY<<0rn)A%*zwFW9XqSaM;76j05Ma@@VzQz zu&`0w=bdjHb+4|&R(|nc?3dl$r@CmFAo~SwZ+RNFcdU)HQcyGaf<6I8M4AP^9n-44 zf8}ka)RkTJ;w6mLb*)S_-6~{@E;CL{_MNWp5}wAJE$pbt?4$V6WYkLMTx6h54<9Nz z0c(~>{Gu8cM!_B+gq!s#IH_CMzB*D1R4m$98ggr}(~^)8X9&CbI;GRac8{8R-NCxx zZd-Ly$#PHr(lSlD-H;KVSen{hIbb{poJp-pv4jwLXcRbZ{AanAvpv zlACdL?q3(2>FQNv31&oD@wj?zkAWO;85xX`SEq73+r zS%wp|({gesATVA27C&TXBXgktIxSEt4&ql%4u0K>B^{8oDs~Csay&KPA3$}qN@3Kp zD;e##D&mB2!NcLDC>U^FvVKtBJ8v1k@<(DafA?Hx1kBurPMph4*L z_msB-LMIBTW@p4#C&gFUna!Jzu}8(4@9x|QDQ;YWSV+MLDefKnF-URm*hkQ-4#lTJ zC_72#oME)UjEMo`kN`|~Db|icd)a{$hcQ|g5fZE4vZy*W$Dr3o>UCQdeX380(FSE^ z_O3C;8zbo(HTEiM1Qlz6N0j`(hzeu3il^8QYwjErv44#rV&?$+tAMz6a6X)831_2b zWY;%#4XsI9jW-tY&9iiVWw2tM(8+#|d7ME!aw32yLy<3(Sq31MlwGVT(uQ?EE48Vi z5#E$pot|Eunbi|-?8?ckOi!=Obo3aFy(#f7oz4{>9T#C@&Nx$qAu=IfAM09|(~+0o zp5rcX6|kK4{Jf5w0(W8ls3jr6%%T%w5-iLNoiCap!Ad>p!zoe%kBw0*fo}vlH_q`k z7&Jg3g~mM4A6}4}OHy-saLqD_+eK;26y<_^*b{Xe`)C|kMb$h7dz z?%lp5;T<1EJ3=eM+~;|Bc)TPhnGIk~-aGEVw7&;`m+t=Pqumo9e>@@Ss{WI*dCUY! zE&K{Q6#LfEy~l6fKEAD=MdKRM3*Tk`5F>^6#>dfy|2#-N!4r5LqI6HXUEgqp!;x2b z#lff&YjSQF?o1WWRM$0Duq@vPO&N|9)32!QqM3g|_kS6^N}_!rg9T0jGJ-PTzy&#Schp!^>-dQ^ z;-_UpP0d4PW_O7@x^J>-b4r~j&0}h+tZ0HKAJV`V&>EhXd6%8eRPG7jS%KPu5;pRn zuX%U8x~HeQs;8&Qn2=yJCMLGCo0r3S<)$Qhg(M?hv5_VH%li73^)G34$^VJiE$S-? z{z^K{6u`E09&DA0MgRZcGkgu)hsv6o%E}rW%XIiJHYR42-O`HHG1yg7;wmgJcSUHm z5s}f+-@)%fq!r?KB+>%f3NIt#ry3;SU&FV4;`F1NSN_ROCG+D}o$;8f02z&~Qu zngvgY04frS#ed-7xCj;@J~G0LIP?t{+JuXriJOFO-~A|+pmK-NLLy*hn?ow_ZF{%3ImM*q)8z+wBWksJp!yOdi zg(D*j9)J8gD*j7|L3dCFvN84z$n6Yj%vu~sZD4l6fDWu@UFb~Ph7G(OcA`yO-cDuI z=ueBkKLNhbZ~1+bP}&eqAi0Tn(2M}v+T;A*5vf0Rt=V8kcf5COWP3M=ms8yXZEy33 z2in+o+cCeH;$fkW{hLS3*~Pelhs)?YC{(L?7Z& zlQaKjZz^M`OugM>&}uwhgB}5{So0q`c<@IL9yk#C(B3Kb%L98KdT{TQSb1PC^+&6? z8&Tr#3#Q(v-842UJm*K!r3oT5WD|Ke3uGrRbj zR6UFQ@ZNi_y8E8@%Ba55p_Br1swa75`^mfSxtCyuEgt&h9%(gNLwEF$?#^Bke*o#} zr|+I+heyQlnMWU`ys%^l4gS14taL28L1#ETjGRCCBRk9fIdTQtE9YE{BhjirvV*K}G>_$1rQo`QU>b>hFjm29d+3@JkKbTe_DFTUbjEJ?b67 z9{IDr0in?MJG@Q7JWB&qQa;7!-JK?FR(A``_XcC=lj+h-ybcfbmh zB;_B}8AxDdL+l;jqwM87*xp}wL4X3d5fjn{wUlcDmwRCDUYM)L1a|o<_|RxOJBmE> zU>(%h>ELko(W8%EF*5QwM)5HKid=5gS>&&CFi4jUw!;R*R}zUCjJBH+S;n8*#I2m; z1Ov(zKa>-8FNNrReD)pKB^?0sm%sQYr}+Z(oo=7xeeY2Q>A+w*O}v`XHuO6)QC!!? zu1AdwSUd%u97((%^Q6a1`XLr`T~X zk8*N+f9KBc;}d?G9eCk+5t|4ZMz#Yd&F&%Z!$KPf%jvvy(V|N`I}a{ebg-jwe`oi; zrlx(}o%s&eFK6BD0KOSVEoqk?Too=$Sy4~G*dEFgN`#QV!H#P0=>fF~f=(d3BnLRLh%TK4(~r#v5W3k3=Ph zJ3`{acZF#+rRs=~>tn3Zh6q!nPo=72D%G3O$r0hvY5%HHhHA>x!K^zjGCs^2nJWIw zt4qiUjVZK7rNrnX;@Q#Cpb()_87e-2>@h4V8N{nnRR*cpvk^&=A+R`ZP)CFohQz3c zLgOOLQArWUa>MjtmZ+qH5JR{#RIAoUrfQ9m#;}`(u%I$kuy7(eO&4v7{9Co4tWX89 zmJppa3XqAvC{>4t6oy8#Lzd)tXQ;jaztv@`2=TW@z#S4}W!04`C020N*{CE4Fjn1} zpkSd&2-7?q5g(QwkrLw$i`Eo{#D&xBkR<3s;DwO4=_Y6$WMT-$I^W5Yd+xpW_`UZ| zo;-<@R%*mY#Yg?$phC#;LI?X2H7Is47R;}<2IT5tOsDrcq?c0j?8IlgrP_9&Hae-B@|l^^;N^hq zp4=@Ai8v?m6{^jR+8qAc08zTeAULGA5@5(qwS6`dA}nQhaxInX2c(UEwtYJr{9O2! zZ@rKK<(|#pvS~S&q89HngejIUY5kwk8|6Qx@;zX-r19|bc=4pKoN_U0g$?ptyp7Mc zf3EuLc_<`u`~LEzpUkySS*U$z#s`HZ>=pQ@acl6+{MO(NB5HkKSjM*D>{arI!0P+{ zRl+i^@jNATvm1nWDZLsCEK6Q?tU~Di<~IqFfOq6Wd8*>rGJ1tJhCmM=3-6!}>plGL z^`$=KKZ`x$2f!<-4UpB@)IFt0NfzJ6yK7P6cfto;Pxj&*Yb;XNu9;l3uF=>ibliM1 zM6LOGq@%8_*HVUcYbFKU25>XMbOZG0r-XNCRfV_6K6ei#bIiMdQs|t$cM_O;N~mNv zC_}k6B%enClK^zEKs|^#9A#zv6B8E~gO5;IlI@_TSrEc?j+;Ea*|5PG_S`*4X#O7=@GyGe2!bGfS`YeEun zI;D-#+r61Vp7gX_18RG8#*P&_nxgOPxi;p7qlKGy2^V18 z%$8Ra7i+mBRT~i%9v-hrh%9+6-)_o_cSL6z62rnHL)44HVo=i|>`Q)`pNGM1Vux5K zi(j&YAdY08V69#uQ7;`nQpP@^lL;7hOeC?tu+OD8>3VGbVM%Lut;L%<*u&`-7f>VZ zIj&>dR*Ba|3kAMssoWIwu~*rYzs4!Hltt{=L2q^|MD}MvOK-@2wwtXN*Z+Xy*@PO) zxP_h9XktGc6+5Ga_k0P2<%2>O<{frUDT{A`Cqr3`T^LO9E>d?0ZxF`?wanTNnIqM1 zPsK;*N;6y1(k$jQsgAGAUDPbkT@`Kx**`ur=jLW5`$m9pbF-3!SHD86Ok_-KWsGlZXq(+}?xHo57)yVHvGCU#Iy$RQe}Cdm z#^xSlEc?;f9l6c`zp3{jzYSQHcDSlsf4S|Ia+E!S_nFJrbgwJ9{^WOzMc&F-fPGc> z&^o}wk)DEQz^eWWR$lVNK{sQU?O^QDpx&PD6-hNGtB}4M=|#N&j67kb{LOez>0L9t zap5$}n~WtKU~F7u|Jvo8-5b|w1MCar&qjXRnx5hARlj`UdAt+d z+=1>jJs}fkBrp~Pe*E3*)(#ENNVX<3R|)fQkA={i=})6vNdLS0J;-D3_eG}k6(`=c=I-HvnhOS1ZocxNw|?38)snFCe=$wr{A9{Ke?va@N#!H2eP1*Z2wErb zYGs0;_#xOT||n* zc-X)%sIyRlf#nj!^8iUgNM@P1XEPV>U2G}t%h)#DFJ=31e;gNQPq43X|Ax64M|Ewu z+xcwV+xcAF=ktZQFX78^@8PR(@8fH5U(46xzMikg{d|5t?wk0>;#Kh~?r({=aDPXG^Ukl=V;5c0qrN+wb~upBigUE7qr*45468n{45ccNtQB8y=9K2 z+p@;8(ee|^PRpZ~LzY)9?^!;zeC-$G*WlOTx5RI)--Uix``zMquis;SUs}Vg1=cmz zyRCbz`>luk1N~$Cll-&&OZ;p6hy5?}-{pU&|AYRI`@iA;q5tRpCju-1;Q_XQ?118c znt<5>%K|P5xF+DXfQJKq74SyDX93>?xC28269Ur$%L8Wyx&oI5t_!>{@bbW)1wIw{ zo4_}ML{Ml@LQrZ@UQk6)OVGTazM%C%mjqoGbXU;Nf}Ra}HRz+DzXts)xH5QFuq${; z@ao`=!9NM!8GL*21Ht=3!a}M;&I{Qbaz)7XA$Ns56!O8i$Z?6|mXEt>-0pFYjN3o% z#c{8Xdw<-Y$9+BS$IzV6#?Wg+Zx4MSbYJK*p@&1?44V{I71k0qFKk8Fmar?sZVbCO z>}O$5hP@E>R@g^jpNCt*!^0mHryQ%7!e&YIifS- zl87A{io{D)r=KYvI$9x@gGFFQXjctnUitUc=k3B#3ve;d*cf>vz`*`fLu_t0j z;)3F0;%sp_aiwv!acyx6;#S6Oi`yA@d)xzYzl(b}?s(kSaX-de<0IlH$7jZu#@EKT z$1jZ^h~FH4Mf^?i_r?EpeAxK7@iWHH9DmOE<>NPvzi#~g@z0HadHnn1PbbVwSd?&i z!u1LJ5)LH1m+*1IUlaa0L7NafA!@>e31t)NCv2Rsb;1J^UYzjB#BmeTCN@qyZ{i&j z-fh6%(pu8)O?xiw>-3oP!t|E(bJMR*ek~4ZCQ_IeVbjIJ(T_Hss2+7rd~Vs*winl zp3Jf2gy&4m$;c_lnUT|+^LWmuIe*XjE@vb+AU7g6AvZZUJGU@*UGB!*t-0HCcjexi zyF2%x+r4bc}aQag;h{Ip#U~92YpQblm26*zvgI8OMu`R~_#-{^a=F@lVGO zd4+k)@;2l>nD++Z6Uy*-r{>%BN3Z@k_7pyM$Nx_W; zy9=H!_@Lk~1^-(ZP?%ciD4bE)TsXI|xA4-!-GzTF3Mz^!$}O5*w7h70(Je&}6g^Y) z+oC@d`xj>w&o16s{95t5#h(=aqxi=X|B`}|rjlhPH0KVAMsg|)&~F|%TM#dQ@=SNx@tS5By`sa#!oPvx_f z$EF8OFPc7Q`gzlLPk(LtsTq@I)Xf;0@w=*)s#mK1Rh?12r}|h;QO!j)r)vXiGi&dv z{kATwZe!h>^(pm3_4m}jTK|6ipX#QaB;(f4KFwRbLRM&T{G9ud}QVi zvu4h^Y}VVe+>Or0MUA&MKGXPm(YCgtxS}>~0;`n$cR*x~TR1*6UgyY5h&>(bn&0N6&7W-7|a3>_=uF znf+Cp)|SxbXlrO&)plXq^=%KdJ=6AD+b3<`%?X|}c}~HcwmI9{=e2KW|4I9G?RU37 z+J3P8kL`bLcXvc~Ozv=YOz-IESln@L#|0gicU;$TcgMbt=Q}=fX|5dCG*`20p=*Wf zYS%v3v#yt2@47y7ecQ=8!#Wc>^E%5rYdf1eU7brhS9PxKJiqhe&MP{v?YyP)r=5E{ zAMbpo^M%eobpD|W)&~BvL=agg7P2q)__gYBSS@~KdK{L6U$!3CSc&C?9=EU*%Nu&! zk0n_4>v1cyTW-|j0c@8=T0g)a$d+pN>+oRa(1!JRh$%jf+eNz$4`oGSq8=a5A`L!a zTZM49g7Y92$-mU&!7PX$*W)3GAJOCE5PwaNha&!>9uH&Duq0&Nc{q#Zx9jl;77rUm z!6R7!-=xQ**hJW43LcHJje0zWWpKM5j|KjCJs!sr*$;X=-YY{s-YXxT0PEo^JYx8;?KABBq8}zu1MY0uoJPEc+r5?AlAXcEqlfh4{9!~*X zz1?Az2BGcS*;=-Sb;CxP#fI_hhxNUjHLxB$hX83o`T)XIR*kf7q@8Pujg_yCZA7_2 zUF$ zt&un1Sg^6mx`4kAGButZQm#XQ5}!8Mian6tTG=w|k#B_#Ujf)Kt3vK! z$PnN;fDS@>s$N6DU$5u0u@1ymqQv=J3%OVS+jOdP70RtZt^X>eT8$XBD)s7N z#3)CL%3QJywOPwnqjt;DR@9Q~@$3bRbl8Tyi_zM$3UZ|!>!G7L zC`IFUE;N^9tXe1+k}}5csh-}N11Oc8LeoE1tZFwRnq~&Xv0D*9I|ZlMR_q&W2F6mh zg+0oncoxs&#k`Ww1W_#JVRd>yyd*x-ELwmTqD5*MSQ+1;J*+*W z9ke7^lCd7Gu`IDHx14KPZ@Iy8i{%c>eU@KZer&Ltf5dX!^10=lR2~-^eLZU6sW(nr48Vyx zihcZodOuG4koY^EeEffoUvs?v<5xcZ6|OsuXC6;EKIwSE@t9+OMD9BnJBGcpj~9LH z`gr!otslpIJn7iqjvYVtKHzU2d+FGLW49mMOnClu_tDdg9lh_P>p$|xbK=pkqk%_h z2TuR{XvX`4Z?)3PTlI_u?ngg3g?+MkzMDTOwuwi@@u#_!fHmy>(x3K&dLjlsw3FHo8tO@Z+7Ffx;(+2J zS2T)CM7wxhd?kL3`Y#tNM4Nb5)QiQUPIQO{F;g5BA7C%4S&*#8VP`R##bYlq1#?0! zE5R6AiLtbnHDadiV&||07@=0lacm>T#EZo$;S#;#&!Sr^XLqrOu^YAzyNv(C4zic9 zFZM_F9{Z4e%#O3qvFmt({fm8%jW|CZ&LhwZ=W#aHDO2ZkK#4#>dLEOp%cpz2?-|_@l^0XTIDb_^~ zVAuN*Sn!XrDE4z${*PkU@E5SvA7_)#QuOyfmbkQ9bpyh12&y~gqh?|Yz8}u+5H$S@J}%7{24Rxr?92| z!rHL){$(!3A56E#UKb7#rXr ztdIM%bv%@<;lXSzAIH}7D0U%MH=Eg3p2)Uw8@q&0hMMnYS?sr1lRVGL+56aIcC(e- zqD|LkXiZubc3Z2_e`>T!&8{V5l`rSrd<`GQUUUa{@lHMu`_YT|V(dpR<;(a0cA?MX>-Zoa!XESn>_%_q zmtY6_CVn%&1-s05Vvl(@zXyBF_wfh#FR-Wl1pg)f72nUF=1=h_`Ty`2v8#MH_GJ(A z+xT5-?ANYZ0PPtQKpZe zJ=+lfPay+&j6h|LK(x#u5$`06`m=<8$Cr_2$cE}lu+g}(0UIl%0B-PTej2>~H&5b! ztUz@#<21)9%@ptpwjQkk=f*|H$`%Q9Z_@N4&ev63PJoPl5E# z;E7~Rbj-m>8|!Ime~&Jh%l@Z0l{fmj`T6hKxE*CoLFygJg=FyW%KiUI8(sI=IxW%x zLuZJG(fOzy%MeHoR6pW@csF?2hB$=;1S(7U%;QQF-a~XarBU!lNJ22{a~a+#5Dk(k z@sfr>d8iDj@0)k zZs4Q5M5_kDXoEOCUWX^qEYSnS=O7TT)JKfE5{?RlN(72ipmru=L*+Ej*QK(td4 zh*!c%{1~+9Npz{r2@ka!)rHDXS^`2K!Zd_%gnR^}&5ZUVxl*~&aH9R+1k$hnCJ_Ez z2p=HqLHH@c%?S4)+<~xHe^UIv%}2Z&AySXW>rc`@k|%{2g#Q-jf18iyD+D*%?Z#nL6Ab<8$2E|{YhvyXOCgiD5uU{R zM+gfLW-0laWleF7DXljX?D`aMC;BBwk7oh&O_T>w(G;?|_fIte$e*r+g$MdScw;m{&%Qs3*m- z-eg!oVw(YfAL`*|JjoAhw<)}V_)dg92(-`fnI4|P^KAqwgWVPRY{PR0!u1H`6ZR;= zDbU{yDj(vy8JOvM0~q&U_5C(-oWiR4L&*hpN+df$SkumAqPD)-#X|exNrrt8x#5DH zL)zg%cUjXtcrJ@wbMBgRrT3LUx*t*~7gDkMw+1f_yxw{WYwr@|uww1cu^S;6x4wq; zKew*K&V-9R>mnPZREtpNO&2Q3b!FA4~1V7@=Vn!1OUV3enGfr;G5}P zmXnrm5Y*+3(fgN{&k*Q3=E?EC zw%ji-%5A2r;@|kdPFilYT#s-ou2$y@fJ|JUX z$~t=MV$j-T8MbWFFHg)mY#p`?Sb7oYS|;BYTDmL?<<;hiH3E07=c<%3C4~};(~^zg zw3Nsvy{B1h*eADP?~krfO8^30!aA&-A{y#aaqW~Dh8*8vZ}B@^U&wvNFYx@rL%CKv zsvSX~>xd_Il<*nY5PM5|1wr1e1KMGPgO*SeTu+mE-qN1douo+|U?$as#7 zcgT2$UY7W;m+^Q>C0 zh?mGbrLt_P%rjBOC(5{8(zQ#9Su&oe?vj&hDbB8ysWI~Yrc8ZP&wnBCXKHlMl8_2* zGvbxnwRD$sr^?hESt>{7$(HeK#07Sy$>)_}pE?sy@_C(t-RY&Q9lO)pu**q4uUn+g z>m$$X?_`G805k9Zj_k+(XQsDE7JxKVx zVjmJdugC|VSLB1wD_==IuP6bZSNMFw=N0AP^NO8H_`G7D5@&jW6+4aadF8MIF@N4bKCk>n z@_FSqkUdtQU6?_)_tFGp)d^Wp=WX7(gUdMK!@2p}s&^G{fBlRVAv-BLl1-s}suv^iS zZeq7d&+*%(&-h)mW6$oEUg5j>ANbqs9_+Ti!|s!Q-}j?NWJ__rjOq!?$>Ft}_yK$` z;d~fcITPP=)b$d+P`!jN8TuuAGxccmbv=5tyx8;L?*Oj-^4f>-MO}OG#mo1)AK!x1 zwa=46UgGps;d)@X6=5&1sBk^_%7z>`zJ-?*X{UW{YE!+7-${P6wJ3e^bZ2t^2_rF9c6-yj`Moi3>VFp_>e}t{x>1!daG}mr$1`f7 z?Huc(vf6gTftKZzQCdSgAV-j9@e_i6!;_6Zh7kh219mIE z_+k{1@mhJOe#d!*yvNAxTCe zS$s{f_|C=bL>Av1Y4Np7i?0I~-xieEhHIX*_~y&GVFAXvYhWAh!nG75`VGK@xe68} zS$r#`t+z_rdcD%tTPiIh?{-95irB8kbrkvrj`Mk%BIH1du~VZWo%9N+Snv7cc~ z_rr|v7-sua?1P+!Kg0@nH~6!3@^HXRkO7~8Aj}aj!#m*jJcN(qp_uQdU_3u5Jvk!b zQ5KD_-C5+*f%bYudQJSmUWeb!cz8!lTQ=m*bW#+uG5&|f|y`-IoPKB?pNyaAd3 z8wHxs41YM-DewxL18q@$2whkW%$42<3*ZOShn8Oizma|h%Zx99H|84bF4e)xc0<%_ zp%LAz0saac^XE+XR4gZ78NLFZ7CmyV?1isJBfMbxVA-9^`>|#iU`^1xb+Fang(u$z z_zj!~{|oYSfTuQeVgr70*GfJTY&JCVLd^Z2&`hp;C)h^56?6Ip>_YfzY$A^c__16B zkCP6}+b-6LHO8gXd1E7>_%XIzE##SYl~TQCD}WtXsvVMSjHjlPaw z53iB=(CQnZ(>KH4XCeEN-@=~8s^&Jf2%hzS!Rm&*Ey$O`@VK}iJ{NoVgZv@>F!cWs zsr`>h?I%x+U&0rIJTZO^Ka8i~k3l{c&%y`ef5@VP55^19H{&pTFJ3~Qco|ma-SD?~ z1-=%q!O!9i_*lF}_8$BzsDB*c@A3Ef2mC|+5kJcR#EcS)Kh52I1i#J0R)Eli1w*S< z_=^A$D1t;Vez7-Bgo-c`4j&`(&WMJmQLKoApWt|rASQ^3VvjB^u!k)ht>>E4)M6#2nEsI`GBD1)n0r&WneKQv&%oiB8ca&cXU{o|rEdh=pR2 zSS*%^rJ`Fb6XfsJBUXx4qE~u{kVgo4hme;Dd4`ae2)sk!kFrsEq>yjQMX+*Dz_;pR zcx!zpw!(jGoA`;iR9q%57gvbw;!6CU^=h$0TqAahYsD^cow#1yAZ`>liJQeO;#Q`K z+r;hS4soZrOWZAfDt3!|#J%D^ald##>=6%&hs48TuXqH$ct3-uRv3Ju65%mrfe)4) z{#P%sE7&;k7%cfnHeLK&>=VC$&)zS^6XI85zxXxwM<0hbR<(E%>y{AsG%ba#I|Dwe zPm5>ZMe{5?#r{VegiqP?(zoU}*e!Sw{#8%FpKCuny2wB6Ie4e}VP|%a_$@qYeh0sr z-@~uwRd}Ag4!^)RG4B3BybVvZci<;?M7$^7hkx9M@Q^zSADm{S0m{2+dW zKi21%wVoHJ#A)FcBk(rmn$R@NV$U*vc;5QK`_x|xV3%S4I+W~h_@dd^wOFl9#!Bo) ztjHdO&-DGU@ULfgYJu!_b{l&@3&I*LfF0I?;kP?Z3)RBND+s2YK!NNZ>PjhPdu(}GhBCVKyC5vCI zPQy-G1^m3o^Q#K`YBgG|RtMj&2JEuU!ahV3Y_}Hdy3N+wv^iS4)`8vk58+364OSON z;1Bo#RvPcYgX}0frn$6EtqZ?_ovY2$=3A?l4fbs4@n1jC=g6z6^{-mfy?k)(fPdB6 zRci-&&JC_v-Z!{>{hF2iJsX2+R;(TFUcS6%VAxu_yc@aj7+l*uY^{@TL3N&V|2iE_ zokBzC^XjT=6q%BGYlAEi+~CEolAO+<1}_#_%IQ!^bp@80%en`HXPU~)(#gzHWURA> z`}$Y(1XE=k1yzoGM_zEFDZ8v>U5Ub%Uu13WUcP>~$J#8J(V^AWRt0S}K?@4Cx`9>W zX7{ciSk*naeocS(`eFasinz61p6wID`;wNjDY15& zdt#k`x8B&@dQV*LZM&f59^R}gq^PYu@)6YIN$~H{%lG(n!CIwZg{9V2vPAGIFIv?D zocTekyjY}qIP+9eU7@9yx?r!jOkkhX16O;Kf1ggUPw$L+L`Vr#$ZPW_TS9a>`@P|yJrw4g}qL8n~n(?!-QCai-h|DY*y z5)j&Lu&5W5Ov!kNu8sPOsZW?@1!U!ATruJ_F@m^<5vQ3E=V(TpzKo!thY_cl z5xjUAae5g+0S_ZiYd`UmAFR|$kIQD3am7e}jh-;n-#yeTJ(9$WxP3L7wUt1rGgLs^=>;(hFq2Dab2SPlulFFz^)V>Baif zpr?j_0*4x+3i7J-^2%x`$g9@#8}CNGIvrlGp1QqIpbuIFPMt5O!MC2@sq^X7`E=_1 zICcJLKCH25^~8Sh5@4LUl%4jsQkr{~b=I1GFSe>y#f&cALP6cp+B zi*FHHEzG}T4s&#m^p1)epU!$kj>ipE{`E+}!piak=ujk9x+cRI! zm#@pW(9jD#y;OhC*ZIuXGTS9{`GmPph(YGtkdaGG?kuR6Se(VhvX*#CDtO9T z;wiD=DW!y`q>iVQDxOkGcuFZa3+hz9f+E?f&VnLY3p}M%@RVHQDW#03lm?!PenF9< zUr{hC2ZLq>=OMRXbzRWwwLXvlm-L*`R7WK_|R86^#h zQA0TMR6oR1Ng%JVFc7tp`FlfTZB%?Hm};TNLnLbbMdERkC7 zdxnN2f*2EEi3b|1L%U&iDw|klj$8&CwWq&l)$dq^=(2}0> z)_3>Iga|#s3khGowtww_DNA(E#^vaeOU_&0Gc??{c0iTWf!=a)W{9bHtWnMv!Q?Z* zzUisZ#AQ8$Lw&0TmW&ydY=ldL%S4TIF5dxrP1Q@7cIRD8wS^9SVnID=jJ7Gb=3(xVhT+T6gBd4R!zq{6!#q41O=8S=?~f~VALz~xAWryLmpm;DA$HU8G+*T+FGbk+6IyC{N7 z?HQCK3@LoPgb^IUtfY}fg14ok4UjosC;`2B!bjr?muaRPu_k~C9B&4j2}G&{Gbq6a zPZSXT4$nkoaSym!58L(JJLv#=%gMd_<($JdoUSURCo3*W~6yBhD+8> zdE-m~GpF%pxQ<66k1;1uTtX8iRPU?$$YP>0P9~%AWabFt%`?O(q=o_*`Mgjw17V7k zXRJ}VR2z6JI?0<$sezC5RIODRGwx_pDTeFL=RIn=X!?Z65-!RM)g$625jNX`N^kU8_!f(TD# zish??ku$$WH^Cg$mb&$WYb6p#wQdDeD?3e}-JOmqWv4myRga^((7$_daP9f)*D2zq z#aOrFU5;crs3cH=Xl&LYr3ylmr4A`lkY#I!dsS@xx)nxl#X?@4Vkxgq84`I_$^gmJ zS;|ujB4?g5fbmoYOi`?^yU(SAjycc6S!4xyxCo)}nY4wPFo%h#@1 z7AUu#C`LSC558J%{pCAqa=QCv^8u#TE`aHI$R^awIAmj&jPu!K z3H9vJQM0Hun^XVN;nZzhXHALL(N+_=44Y8r*2wl+(J?%@_S_!w6(Em+AYP{7!zle8 zf;0X15Z|%Ds`+&`_F_%D3-_j~`M6^P-o|cjnca+YlUkc=ZLF+)b_?P-*chqUhQ%G{ zh>YO7C1DouVW8hl1mgP}eZQmgCc^MdF9KitjBlG~<_`Ej<@WzS<)#xO&c=y_!~x!; ze0V>5{V=qqf_&Izbeko7$pkEJZx}Fhl z5%QgW$77YeK7%{?&T#f(MoD@|+QGDk(p+gX(gM+}@?y&Vl#Mu}v>^HY|FTfY{pmnozSkI<9qy5@GJN|&W3pd=d}D0{zZZCflA;u_$n2^ zlVg-0hy2ox@8%xvsYWr-Hx8eH?`17jO$9X63Z1?hefS#C!Y?B5o+5irhV;2I%Y;s; z=IAN&O&BP@^qa*O_hUZrXh_Oj`U+W^e7cFYL4PaGy>1rez@i`=y-q+9`0W|`3fG$T zybP!0Xz0_ivX`T6#0N6vX<1G{1|LvN)B#FqW*QSEjcFzt^h>!k)E#q#EJ?J$hl$#g z$PufTF!C_8gW|}bj(44J;+bkvF^WoxPNhNe>suo_1Bpg`Z*2&orW)6#S()rC8Qd7F`^0a3o~AL<$3Uqr*lFTM@sh}_u&0# z47^D7;6?q#FMaTmlpFQ>e+2FI<>Uo!SQ8|d4(XE3LX1b7j ziC0d*FQCJ!br(xazS4LM_~I==INeHdq9n)QlgI^0lirD{-V)kw*|Lv%DQG)E!6E68 zju<*Y@~7W~`f3t+8x_H;(Ohqp^ASlwgB(Z_^asyM`6lU$qj)D7_;AB)@Va(q4Zo~CrXwustg= zo~NO{@)tFzk&?_7{)HvC13w^YS^n<|`QMFhsHOPp|o-FCosAi^0aVq7Z8TJ@x-eRU1b|+}I z$vT$E{%VZbAITAt!6(odAruccND3M>XtAQE*O>Av+P>oe%1bzEJnm*tztv2A+@)uw zu4et~Jk*VMqCwO@(Cq*vZ@iC59pydL<7NBa>}}t1R&V=8Y&5kmPA-(?t{v6BJ3Z}7 zIn0tadLD8Z^g*#ov{lmN4FF1U2~3 z<)M$`#@i~%l_4wQ3|bKOIn8V0ezP8gy^RrT0QM%%GQdchEk{|^(r9O$gDaH8spa+Y z%aDVnV3aO`?eF_3*2hpQa-?xg&B)$yOqIXHOFa@g1?ty(sYhau=Pa`6kQ&19 zznctcE7@$(=_6hCWUp+f1j$Bexc+96jT#rWc=+M$_L1+rykH(8t@DF@TJF z@S8_yBF#g_yDw)K>YO1zau6q!kNA^sGL`1P6o{21OVl`v9r>4u2k-pY49>|;@Xl3= z>IFI%3dcr?$3sI>B)TRFVVNUudntrXlyt4w=cvTon}a^C=3Z*S#geZLo_ZSZzV*a^ zVUjsj2~ZN$d&$N$Y(-T!5jq34za293SS6u3Xzxn&1z&s1pgbt~R+!`*A$8E8qgG!= z8z|m}Mrp^OtbvqlsB`2GCdw(Y-u?kMW9+KMZ+5a#b2W0Q+Ay54t#B*Zt<@!K%w0!O zUY|8(?N!`@UrHEbo1QAmVf4b#?u~3 zgV#W+hop5*y6$ahW4(EmiK5veQuvJismh%TEsM9#4c!N>2%>rq!(M~3|3_1JU)Jer z6NQ&hr?D*EJ{(}ZJ?J=eT;Wx7f!8uLisXYcI#&D0N8yC_>HX64uCHAV z>2oh}KrJ#+a({)1BFQI1Ul&qtn(gFTN@7$p>H+O`n(xqdA+k0a$zPvqdUWd4CW?NK zM<=-lLYOS76kvFh92$5O9jUeAosq}A{E3$&=K-u5zmjm`R}@x^33l*HC20It8i5s( zE&=1+x5qBi+f|h?Q|lf1g^3z|zX>_{hwSCIYX?H^w$z*Yh{C*7r=)N!L4Jxsw%Vss zw%2;GX>XlHGZwKx%k`|8PIkdao5Sn@FX_AUhP)Q(^;5Q*F~Uce;$B(LH*w&Rr)UHZo;O1#y1q>} zabfO{jk5K8`{P{X%@&nxVsLh_&9f>}T+TI7*88QTJGzg`-2ib9G{Q6Pq81wV^o+Md}JK0lxdp z{BhWyY$?VdKdfqKbz!!VRP8%-zLb@R7hqM^8;ya6j(FNYpE-0JLGIfbJSu#yQElD< ze7Y`UUKHYCGk@6UAA9YCv&&_0%Z>Oy96p+XF|E+V4QWP+-ZE6y*FsXX8b;}P{iuFVy_{&& z%UaWV+35F*L;cN=2~PyqcboNthk$Mw`Y!&57i=D{y-HH2uWw2dXna9T_6nN)2;v^Y`m-8scfEX!3%jNTcQ@T)gTOYe=88>5BKc%aHxkCIcBhZ`=Q z#!8w?{JIq(cKh%~?a-{Z!y!=8;T1yl82E8vm49C?gCZ;z^_JK z#ocrdcO*N)HT?`brP9Qsngj0e;nH^wfWAmh&HJ9DLxh{oOi>oSp$kXx?$K7XfvQ1x@Ww(>nbqaFqD$iW}?sGM%5%t9kGEqWIHCn=|+; z8-qWB8T`?h`=AeZ)S@%=7FBYxgHvByR-S%sI@+a*fdiUeK z(zCWXq(iY9!DzbElWPm}7w>lWqX;03viK*@!f#AkoFb&wX!;?hWKWU-@bo_ zj)ebyfm1r;L;}unP8Cz}#Zuw1APPG&G>^u;Je?}U?PS@W8WcGTrs@(is&d0B#JT2VvdOkpx>?Oi^+ zQ6Jg~e*mSmji5yQ`R+pzRN={!_-Ty@h~&bsQ#1vmbSVw*yV`Ry`j^3x^Nik}2YwAL zqn>F{^wuc_Cun%z&bH4`hk0xCjz^uKZ>ISF+a3uU?*?BaX$IR}NgVl6g6cx~=-a4# zld1ZMiJ7Z*)XZgkk5fB6MqL!&vip$bvI$48r22TzVGD zJ#sAdrJRWtHuv>IvZk3jU1QY7st>ddNvMgIxZFou%%jLkRw| z>Asw0$o!sqiJzZA%aG`P{aX)l#^wLjVd&3ZeNi$dh~k~T*?2Xd_M{G*Bu4!sRATxH zy*gS?;evV$o#di=p~9K$gYyT|TkOa`$HYnhp)&)ciyB)6PMT^rM;Kk$*R(o5P^^QAx#1D{RqWB<$t zBaI}L7}wND(jn(R!a-#O{xg!AMH3`m-hxR7q;9Xass%aH6KhK9_xxV{Y;C zgR_O@2{SllhVmgavb!)BSwWrTCjXl!dk1he<};k@2Ck3`JMxGfI3tClyn&yyN_}6I zJSr3}%wGCvLI1@ZJ|p~;@B=l%Mv^k)s!*6;y)cWm9k%=1U&B?-N%m%)FG)gcZah|$*J%n$qb zmvK8!)^d=;4`*aF;M9pf<0NH+8~hhs;9Lr?GB+pO7WBRzoQ^}%&}$30pWYs{{-Kl< zgdH-SVfCZt*-e0vYzcz7Po0q=-_}vr@)5)) z;RK!l?nZ1PPUG?CrPZz=ocHr1Y%n{{ffDRpJ`?vh$fF1U3$PUTskAGCv!#l0 z&*DY6XX0ctjl8*VW)y5Uo{xJvhsO_2sLI1Vl{=8$##17!OE^>Yq<)h@?bH*_8oX`cqXpvZIOB8}I>{wRKh;I~yv;=o46irC<1ABpzm>>d)Ce!Qb8u!9&WDmc#_JJh z_`@l0ICYNXF`PK{InIzozw+^o8|#dvGyLT+0-te~j`&`B(M?s_Pp8m8?#_|b{CUj= zJ;jNW=R_n$q$WiqIr%R4y*%6f_RZS+pP8)v01HaY-CmUicc=}o3X~5yl zf1!>iT}v9-jgyM}wIpbSH{DC$K61naU*n;lW#Ajh5lh8k58MF{K=NN!^?1|+r{3tr zztaOJD+{X`l8>MhuEVgNfTWUQl4J5^NQy{?$ns-?j`Oxhckh0}{axgXxe0fP!>&KK z|HUQNpS~J`qcLVaFwjZO5ulw691;1>*qCUmHM!6kOOfPsc+3|Tq$MX88j<-gtv^4r z*;zR+ck6jq?`WCT+_+;yV{L8Y264D|es+C^HM6;3;c8cTQRxgb{T(GsKtJ81&WssW0E?b|z&{6AWOQ|V1wZ4L6zMu%JRzwSu(qjQrksodaQqqbLAk_Zk=BsnJ}7bIm*a#Moy2yFgC3$JWyx^iKA zOYhK7Z;LqG@zcS z(|upo?C=HmuFh>fZ+b^vz|56JU3<46sQ_y;IE0j2*%5yn`L zMj8s6CrUmw{4<$=u5CLqc5LekxV%lIoxTeEJSk?Pq8m=XkFrp7IR^wvuA@l7wTSvn zr@A(sLe4wI3gldI`cBZ6IVJzKihtcoQgG5e1vh4*dei{3iw=jBq(-RRq!B8&VT;s{ ztk&nE80dtw7Gyt8PDO1LS3G8w&DJ%i&i%4v?`Bux#O2GXT5mS!+Z(R%# zVrZ0>q;3b1?uKB$g8GeN2PH=!u1v@IM;Zsp%Lf{_ZFIG@xi*T!1>Lo^-39J1d2ii} zDyWgNrl^lcVFv|0+$f2NZdTFAJ#=Ue{tg{#TUTDbuI>GC5kLq}g`)`G3S0*9*RV;XqC4H3= zAPd?*JvKHjE;&6%B%4H0e`MXZoSA8sh6Zb7SA;gcFz3c?jjgSX+r;7XmOERrwGc~r z?JI|prbM}q^TC>m%4%wN>T|JDThGz8b)p=36r8kG!P7^+QE>EJaHPZ0b1gK!WkXBI z3U?S|b|TCom_z7I;8HirVUmDjyX;$Wq(Csri<^e)t@HhJo1D(t(YeaM0ii`KWw|8rt-X&%P-HLmA+_U*YBSw zuHgUbUbpa|C|FckwW7q8RGv}Q(E37kg?k)Pz#3D|R#@eB>y`lL?}>o-#2~DIov62- z1NB=b>rp8CwuH*LilE;0Kn7~9<|>t2)j9*UGecGF%F)7Pm*N+bSZB%Em{wN$w4A+e zYuD_irrBLv!*_1tueqIb7cQJj&rQUYEGt`Mm85T2CJIjSRd8bsJsNI|lnPEGCFMVJ zq#RAh7%3H;MoLv~^hl}FX{1zq7$aplEEhG;65OgeGDs^_ZdysJ+{Q{;!D$3la5aK* zIWNO>puLG9j2M`GwG;0wd@laEh3{Zo85BD)ws>=4p4M~8oXOba>u;T39n`w8HK=-i z>$b-DMwIFowWkk=8!`VnPQL-3XznkQ5+3rAu!56>72J@df|Dc(ex@Wx^#WgZ{S-&1P!9#jC>#Zq!7u5KNwiW(igEHC?#uc6?qPmomze14I{m4%xMf}`^^1LYRdABJf~O;uR!0g> zyehb~sIec;aHjiQXb5)WtI}cF`18=vxuJa1i`%!qNHQ7Q-W$V)!fZ$5Hto8E(ro9M zGyTy@=BeU%)464>jgKz5`-UBD^)p*{h{O3yYa18GyWixAG&@vRRMrq>iA~nDUKS35k|WtMQY(?E1+r-8~Hk~!?LCuMdT6+;6w3Z@#zI^zm6Fwy!WkXWA#xcvOF^$q`Ogj^=8Yd`S zjU%J!s$NFvs&|e~S3QE#RgWIy!lI4hlks(2_g2}cpmOw z*p^l_Gv(f*%>0m)s;t_kh?Lsuyd3|gMMFIwMus+W9-EhLFP_|(T9ch)3!0LYIt7wf z9326tcR@l{EjfYuje>sQfo6O?7BqcKXxcx#d4H>8NYj#b5%#1uZ9WAOd3l+92U0IdRG-ozw( zc36|fY!65t%Y;I`1&Z_Kz8Sx-eeT@$f|=>xTc)N?N($QhteLh`cOu$_}sSi8Bib8~Im>IDn?a_3f-&vVciR}U%^ zAtT>?Xk&~crKD|WY`&GL18 zxdUTJ%(JU5cMxTJO4FV!+2~jvECp3x;)-%LYq4GVj=I#;`n;-^mJlVW!X)?UvbLB5o3i$a= z{|xsvTOV)*GzPV7zGsR1UzNkN+lDH0o4V3n8>hD|THG>!VQ1$;l6tkSL2+cwndixv zm?Tdh(~?yGDQsFZZQ8lB>Q#pL@;fnY0N7}ETnN~OCMJ*SL9w+5hWh~~Y!3vd-Xhw)qqT|UPdGT$Q z_PT=VP?DGXee3M9%Gn~ZZnMjEQ7s9qtJ5(B0&_ppJgb>ng)AWT9fT}%TGwHVgH~`F zOvATlHSOIyIq5imUKBJmHKr$>eucl(*huBdM;4=8BE}r7pQtsBeau2NH5nhOpzK%& zYZx4gWXn>Ano_#35`#lU#mtr{S3ynRw6ayzCG#TNN_v}W+c{6I%c*afeQ#QQjx{x_ ztgI{3Sv}m;JXBqf?Q%!r+ZhjC(q23}Ye{?i64HFd35^m5Wt(Tn{xBMvJ|;8`{|HLQ zpv8DFWCweog2oPoH_4k<&@7~&S*NM56SZ1ML&GW=9(g@vR{!5*l8zO{pZ^=Vd{PUW2LPeVSLTOHmU065i49lL5}(f8ar_UxJJ=x{U1PL4XT_ORH4D(?*tg>@|m!-7B(9k}z%1SrN3p zk3>xFMt9RrG)am=s>}T@KjzM)f6sdQtHwsDXP}_UP~T9Pl4nxeC@8hLf~HOKLaD_F zioW}tv?;cnnTEb=D&fU$|IVA2+E`)FQhBjjZuis)*ik34H(vAX_B#Yw7OG5UB4HZ9 zm-{DWnRk>NmOunLG!i@V=yT`D9Xp5uUyP~G4Lp>d?wZ;55TAH+qun7wPJcD4MJ#S? zRM_y}n}}P&Mr+5bByCWEe=JEuQAq<8^@S7PCDa$r{0N?pMN+zd%zPIY>)!le|8$SWB2PP2d)|!8TlTpsc&2FN$lw(^OP-*m4y1fL2#@juyjQK$Bp(&WF5LmooEv% zHb%8*M2hXAOJ+4ulZp~sN@LTk)30INKpoU~AX@)^sMjG@Qql2w;HmJlk@-Pg?NLyE zP!IKBk@~2h`O)OPBdu}t!ZfMvamrwhOICKXq4OBpbnQnhqeTk}oR*WDZw(5Z?wC>L zO0>n;qFj@ba2Jsq#I(BF>dKjOSGsp|S3~K9vZ?OJxU05YMo7jkNCBQX`dTz@bpHYc z7bpZ3HcqLSlj$lepHiJJBCiO{tw=0dP(nSdu_d`C&;0_`N#UZ_JuYjSoau#9+bSs5 z+LRYk0bLIiW3UGU>7dG+2|V~+543}L43>MkQrkRV7sle4PwGgtyV~mApN(ey=El^? z%jH*xG3x+YWtg)PK`RXZwM)(l#?~lphMJ8Fo~`T&{jSUjn%7}@!m7e#)kYQ~1*)0C zOS1XgBpU@K*(hk5{JN^3Gzt(D{dBh+1(uG5$9}{Mr5Rk6NIp(;e)0g#;|d#%1&T(N zPU9QY)8>H|FyYBd@>h9D{uX>;ID!9gMyrctoUv6V+vmD)*C(b;YCY z^X9b|&Pp|{D-Jf#o7bG*n32(#KRzWYDrI~;-4EX5HznDg5pv6xtv6L{=t|R96l6u# zZ0>5?($JPWuL9PpV{S#oT*tqf)U4hHU7__S@d{6){QuY6o4~hKTz#OLD_e5B%eE}< zwk&J0E$_A@@2g~6wq@B?8Y}2%L_%7`4ztERgTbwL@@#co< z=?(T}ot?|DM?odEMxG0)HGMeP0NSlpkEWuK;18x$wpoVOR9CMVYV>D)!`WR>(Cu{e z6c+aERZktyF=t3^m7Cvu(=}P!Fxl8NSzj{=<(kJ(VFiAQm?3gSl`J0 zL3hYgbdhAI;+W*36)_;b>ecDr_r%4;ce~EmWNpZMhg~jie@sZbTK`Ghl~RfNrBthxr*eLo7D}!76Y(iOXpnke87-@k8t|3w3x|7MW6ZL+ z-uC9s%$BC1@si4k&aUP4amzHuhLR>%PE+;hM2T}{V)aO^rp8rVVkpqZCzrOBSN4@v z4OMFL%CjqrbBogBl1f|bKpvo$Afdisy`foVC#a=V>Wh?W6{OS>f;yC1C9Tf9FX6lv zuK)Sb@5sCr5KW}$f)e3X*jTx2OG6D#q_uKwClr_^tzC-dqw_mfcdpqS>}7Dk?B3SV zF}&0|)MU4}d0N_9`q*dPYZ}&%_Ke5s)U^S}icS8ujPeX>{0_c>jVMv5lQJjA!sxBIVT6jZ^#?as=oluXGk25BpNabP_w263Q*GyuLw9B+xi0jq|}MTjVstv@#&%d5#V|L z=%w1uUZQDU2dD$LwQ}k(NibAdjkv!A54gYFa=F|_C2q&W9OJ1Z1McPPuax_XQ0~$QII$|ob(Dd`6;A`5 zgUJ0Ma5Q{=XzKglpE@L@i9PIR^R)8;n1oi5#$%x$a7XMseah_{^|_}u%z8Y? z?_p<&-(XM7AEm%GKrNM{e$x4$m}6X$kWvYYQmV9CN~we|N{wDE7uSQ;5>Pn+RWYEF zeIy2OP7*8~&pf{7>MPbgc5uzNzJ>T{;koC;Iq{R%DZ<~uSCur1c;V8n(+Rf^^#!Wp zRjqls+VuQGQ@7nP_1lz|hP_^0daV$LK0PsiZ#l(XNu{Yb;H1=>3K}&jm3kwkS~$m$ zQmHqTir(D8M}KX&M7W;fx5BA3I#NAlYU<-C`lvx4qr4=e%r8E{ZWkY5%L43NZ$P|; zOSDp6suv0Y!B`sUPv#=^~@g~ zEUof4PS(^bwUm%Q9Dq-{<1*52+Fe>FPjevzPDy5cv zN*I+icSUcET9vReebem?kFlu zX-6nq^7H)M|AqB%7$8(ZYn4~VF{{%My)xG6Uo3jJC_e-StM1;=EpAv04PgzD zJCICn;TUbal`z`aPAyBeY3YB+A<@QO*f<^WG zLaK*butNQn?F@~aMxs+K>c*FO%V%&*pwCjggJhYIOK@uj)h^jekQ!mlAiKrSc>g4e zLgOl`sR_Nt_5qZU^rXfg@m7ZEowWAh9be@D!4LR5Zmp5l5qc-BF_GmYj!o|*j@|eW zFE>hcO5Bp(N!+rL^HAU(vz<~U{t#J0qGozWGzTa+|8MLj%DV*ji@yRdZ3+1h$3S^s z=~^R+CBm=sS$&7A{!C+jUQujt$#8q0cgd0jwJsr}I9;o4E3wv&g$?YYU`STr5sda~` z?Pta75!c3Jbog67QioUdP@JinYA_Isf>_{2pEl zazpy%ZSdS%>1?m~Q_9T{7%aZ4&EVbCQ z^{jGPP&_yI&XpB08GAqK=wV0a_k6T>??*y`IAv=gI!3z`xv3$~welPh`yU;9e~MUs z^byf8xYL|)Bw5JR6iQ;Gm=Z*(!W#GKUAIi%a@YJL{Ogt=Tg%ppw}`hW-#j9Zsf_T4 zH-JuRqx3eerfRhf21#Ruxjr&ZU+a`(&+PqM`_#*0*Y(#ASJV!ez25xxia>Ykn07+j zy`kNGM!Uu9WUWi>?ro`c6HOXtm$9X^x;c-rr7Y7?S>>oL*C4E}YRp;DZI9O_I7aH) zRzmoTikn?+(joAoPM2OMqy^`;;~z!L0(wNxViY}uP4#scanN}oxyx3G8)1)2<*VFH5DlRH2Zt~E0NHx+r03#=;ON!i4lU)Uv3Pn1vMxZkY zK&Qqx$mP(PtW}H+YFW+M;>(0-!mosD)XB?oid`d9YzZhQ(mA5Bn|rV^UVMGfsK9#Af@0mo$xHlMiBZ+?xP&l9 zK{c3BXvC=Vu$O}39|=z396qmzGHK1xkfjiHQXLefr=i_7c!vDP`Mie5#xXjpfb6y; zbxY7kNZr@AW@Kx#iw~~6^~M$NrZiOqbQx|4-F@t_`D@F06c{f}mVLH~4=bt7Tfp`Evv&egbTX6FMwIEyL(3AH2L!G8Be!SM^-?hD6* z7r6r)C#Pm-rzSV@Q9)0_*xQD-C0&VpR768MC-E_Am5i9AV8Zu~c7B%Znsl~K*9Uv* z9ZPG1?96<7Uzuxz=aWymhb>*@|3nZPpl<=6=$EMkql#E-Jq08&I3fV7k^L+9={;g= zkQD{R`n?~0v^NmI0PMj4pmdDNiM|`<(z4wfg}`E{FrU>g2E|PF5yI-v4bsT*;ykP# zdY&nwZ7R(zLka{mhoWlwSMct;uMgK20w%If%rDeQm{F59MsKE}%UVa6$8p_Hbcbwow1MaV5OQ zFr=BrtGDjny|ub}#P1)eW-~yGc;sB%@)PLl?Cue7CoG{hinDR@exwqGjnTNA6t;r> zN^UefnaEWAkzgS$C#JV>YId^*aJ1oDrc*XpbA2On)4=Y(49& zt>UA>yjODbM_O7&@|F4sA#4SD^cf+D=CvGqjCoGcxYBN|a;ypYi{i};ChlP6Y6vka za8@-)N{RBHy(E1qWvo*Q^Y0u>olL)^Rs1V6$ie>8hzc0x^$Uvwqw3!tS6a2SdQ zS6Y&JwqhmKN}d&N942{!+0n*iYM?`Eqa%`(OYat}Rl7CS{vKji!pZN|cJR>e^@!lPI4-N9WI8JD+DF)S`U|uWjlce|^CHO^8 zFm4MbSNf`nPxLn;u=;s63B-Ss^NQ1YKl!9{gm?vo8`FHJeOEnPN~75dZU;ZNWTOYG z!`=+|$m{f2ghL?{?2>iU)9YrYr^Sk3-p{wXaDkz-sw(xtgHJ#7(9;JWOyz^y7zq6P z(wlDHz5C{yE~W9riooYEk7&diiActD*)UzF){!qBYz}MWx4ysfzW(8+P2P8d*ZBH+ zhj}DpRn`h`&#F4{KBnq!Ywe=?2p1H0lBX(?s4#>J;+zc%xEj5J5c@!7&*?3mUCX96 z_&V+GNTf8M?(W|NmecF@hY&-$leEiNjk(2VtML@GHHA$dTRdIU0)dB5n69)FUnPtK zYT_oevVgyANr&eSQ`7+S5=fiG94%(8P7NW7qKvuUctd)l@!n!r`sq{460_5GrROA! z?+=bWyYAU-_`^1d-!Wr-b#=Y?hcAp-S;jBeW#R=83EIVj(jNwz_B}{+o{RXHX5u~$ zL@Q((3e--A6OndW4b0>g3j)2;Ph9Pk$-t-G%6NTzk-wBEftUYBh^VOwwg6VS+k-c}$ET#AIY9Ct~}Oc+08xPVn1_IDf-vNDFV(-2iM)$t`_FhFkRlYg@#yL8uk@g0};8c)Ak~rM7JX<4$u)hW`ix$K7 z-qA?)Map8F=O`;QGysB&=2_(KL#)yB??>!FB&aZl7wS%RRL|jwhzn;&gY!otV#7Ix7RQGR5i37=MF}yd zl4AZ9yg6Eq;WeI2mXTyeTFJ5cj_E>kJc8eubf|2~Aqhnd!5Uh7!>q2y$7l3mh1*7O zUz!it4-D>F%(<~7b0a!fmbrO!aKyZk_Y0Ah25X8EO{WAOM$M20_U3!1nhIcySP@UP z^$c)IGAY3!$)x3gfue&YYfJ&)C2I_Mp+CkM8DD~j)N!7T$qTmaaJC5zkRG+k>X6%e zk*8Iw!R}^z<*3DCDH&`nwxkAYS__@!20^E*@2}`u-_(AFyTWa?blEFBR>mwnsU@YB z-J`2_jpe20Tk=@bSW#+G&1kn!(PnHvtAFU6R=?d>TRTu*j{QGAFnY-|m;uXj3iL}@ ze<3AEQWFjhz@icsp17Z$qADidp4#N=8JgU%{LVY8T&}7+uc&Qlsl7r-8}6xViRo!_ zk9f<9Ep~62sn`lG`W+x34)trOZoaenJ8X;iSgDZaEfzCrZIyD6#qYbo7Oadzgfl7i zhky_+tdMr@)Uk(x;_h%UJvlqi*3;w7XR#oH@owTF3uzj(cWk+aiUO7lqZ zh+-b_ooW#pm6qlO%}ab|R27-D)vPA)&9eA`-YSUEDRluuT~!U+04K+D;+uWlKYZhj zyCZ3u*3|ve2MJ zb%QLi4;U1{$~sm%a95b8vDwp!*zZbbOI>AC%w*igz|_Y6cGf$3UZS-!;822WPyVrz_%pxr?ahJhr|-l}5SOxhQE0h%7nFnBr5>>Pa1RJKobK>F85m`^ zjs<8u-}8Fkqi>oqlHHT|3)ww+WEJ9v)A)`juC1GN6KsEAj?=+&qKiwgpm#)4pv)%{ z4+S+))Ut+Kg(0m0_Drdc&|Wv;DfT~4QQ(^>c>}11G&oMd;Q_^Bj~6^E=#2sGbYKe%2Us#W2HZdcVE|7djeLVAa$afsTf1k0rngNygqWyJwGk#N1PPEf5P{ z2-y4Nk$@D#S4PZ!=&DgtIh3XI8dW$ONufiMfl!3Z zeTpvb3Iy1n#dnvU$A^>3&L8Ci3Y`J%`Xb6kY2s8qvL1Gfps_8l0eI);a-j$t+nRD`P$!5n}})CP_ZTPxv`>ma0k zt6@A{3{m_oy-_eplp0wjY9Q@n40WZ*r{d5$=HxSzjIgA2pHOe?5}M`z4g_eDe->z5 zwqnJy#>R@8nu^A#DX+9tZLg>y?F=pTa~#MT_v&!nG>D|`85E71X{36^ivzu^L@(7Y zS4e1Jv0m>Jykg8WIa&sD^-EB@plZe3%>gG@^x%+$Bdgq!9m+{gRs=z^>VDd?-QT*Z zBWWVV>+ByL?RR)nCXzZNLQi=DH#vTJ>S32)zac}wzMR6>{z~hM~C#8NF(*W*Sqhu6)V@TU%BEmU=8z#&$}cZ*+29E= z;G>zCThJAVn^kQd%bDK%+EjX_6zS&yqz@j`q1iESkY*0+NI1p_rQSr znim*UE%BDA;L@pqhMHQ(mt?JoB`YvaiJ?1&!y2?x)}XPOK2n3WTI&oZLmbF&D{V;iM`_P*2X;maS9>3k{T^JVQZmzBi0n$ z7-ljYouN~?p_+a)LYzQ+x=y6lRX=IPMRm{vh7X9f!yV1I5*xgHFd{E=NZd$ z0|EQs`livHy}dg}o7NB7!R-XH(~&n!@^P;wHlrpE2L=s$A)2Vu8`BMHA*R%6PQ5ZN zH@Dr@-kW))CfSf?67{b(|2Vt3mOYu9?``cDyL358V4Uq@1@H{p750KkdovbAU@Ag| zU>@lUn2bfDGw_t)@OP07tJvaYpNPrQ?kJ|JlP!w%;q}jH2qVUzRgeKEs8esXgii7U z*Tf#my1{ch%0^omw(B-;aNCy+X1NO2R@ysF_HH9M`aoIPKwa@bPnIKRbakp@Wn0~d zBS9Bm-c#WmtI96VbDOJks){O|S!|fG;0yYaqOSal_TCKgcHGNiV-+Cs-h{8G2A%l|#ww!ZdBH+1r zeEG#5&&A8fFZR&P0ahs{fpZDcclbIgxx8536RRv$dXM-5Hj5;CGplXnI3wDV{D6F4 z{TA7NBT}K9bv3EpU z;KrkD6|ltjumiV{$RhXQ$(SNU%mC1l_aPRl-n24MKbnkhC(gV!ADAT2EkBQo~lCC&UAn`N1=bWx7 zT)jQuTHW5h#_4Snh9Bh#omX^B4Mxuf!>`MDSrM(IYVG@hr9&pSFgXA8Pw=S@< zDD1X0H7~6UWB07y5O#&v`>$PpD)cV%_m9iyjZr0IZqV6-30QYX%2Ulm;J{f7n84*B z;&Hzi1=EF;BjWz7qIc=i-rl7_Pfo_pgv#w2O{G02qiWeM58O@s^Shf?tk}45#fnWW zx|fWVp1!VBOJ=VpSxlL@>zs2AOims+2ggSOD+(M-$X+x90Ur{$N$*_jkzoa0H5K-( zRml-e>|?ua6}3zpjjA%D&O)N&t;PluMTGH9Aml|cfYWlLEZk1X!eSPA7mIr`x1iKs z-_z95tLca>Dak5{&rGkkmnB^m*>+P#X=f7Et6*M-I zq$Mm{PXq>?mi2PP&}eZ^)(IGI87ZkPGIg{!b!j>TV_{K2ab9+Ixy5R>nS>5?%TNS# z-)(mq>l5QG#Z}EM_Lz+P0z-CAqbWbnSdgWzYWqPngs=|Cv_Sj`5qUFp4bZTlXzA;$ z&J!&EY@o~GXnXA8&6^7&THH6$^pDT#ny$M}{8@DE;SuJ$R6cm&~+SWPL z(w0@4n6&TBtky(Rp2=8hDllPOdRrq}|E{OqHJF^duIW!{dV7)CV#re0G(>kZ+{~##2`=s8VX(K4`I-tV6V%n#fyE7Do(SNnC?m|u#kt4Lb-B$EjqP)9ovpPuRc}1!?@={}=ehwpa20OxIsvM50 z5^H?2%hb@^l%Jn(wc_K6+}zCU?9AL;aa|PDCmS!>wl14xxE4xNB?Pq=oaqEmi!naK zoiu7imGPlb^I)W`mNKR{WkrI@he#Q;%uEd0&uFOln29$>0SL)D5%Xq{&f-zS)uPf0 zW))kQK1sS|;oXy_!>@DFblWM?aYMmL^Or%ZIa#~qr^s(d`ihgliCYF1rlD=h{erEh z5a*`AOSst9gS9_Oj!c*MDHbnzEpzh00sTa*V-5?mOR}T%*}c}`Sli7%-JQdQZdXfF zLYtuXkD;bEUoEyJKy zSHr{C;z-Ntc6at+ij~;XinGkL7g1St|I3pzPaz7+CvBfh2nHU%vG4_Zj$N%G3Q&nZ zN6K3eb9b`cNU_K%2axg*&jTwI&vPqEJ_c4DM~@(;wg6^&m%kqW6V=- zLdws1DF{hC^b2TM1le@gca7!cEU!fA*|r}0G=P>?|~CM--`T?^JicL&wKIyY4TqaKJa`8-ao>h ziQ>^uJpY{M2QKh@59?z0^Y_3+)O+B8ups6Czr}*^%2#0lt)ed!zX`oe3*5u-!eF6e z<5&Bx7B9sII}ER!N^HVTeI?fOmoZksvalBAECTdaa26~4ZbVnMg)dOoiSKQyGx_^8 zy!QyNpuBZq6H21|9F@1Ju9eDjSWYZos#?e2!v-dF@bb2WuSw-${vmq2@Pzi4N5EI6 z+Q#1(p#3HpzG12SXH>pIwUfWkzqF)3 zRG#|x_sI9(Sok((qE()W%Ym`C7H-B&ERts;r5r%YLp%@7L`u08r5@)gG!rRhFY-Li z3gwwdDR&^xBRqv>BBk7fl%MlbG!rT19+bMDw?#9NPFoJ=p_#ax&qQA8|CR=s^($#m zt;|HeF9F7a&WN==q{m@d)neZa^q(M!_Dg&1l~v{T%359FHw#&FNSyEU^z?grJAAC} z@3qiUBR;F1YF@ydj3oUvjb6@h>^ARRzYqFsKIJeIHIE%5m3Rzd{IUB2+?6tF7 z-Qb1_oRU;3)1>U^;VTqGJD?y0C&{M~Ix6UNpsXafsI#@LqbS!@?(HS{ljKlY24&3< zJYC6Q!7~L{37kamq%l-r`9EDB|I^AKmaq)ml(a@#87Rt%OdMtGp}9WxAj|OKKUg)6 z{}#DklXE3d6r+@{4&Mpv@G%WLw3Ho^vZH`-e2>ZjuVx24N0^ga8Eupxf6%=wR-Bt< zG2+~@ZJG%O)8OZEaqjn2X8yzfRA%ng7$K^RI;x$N$d+Pxo009sUL-z)u*c)Pc?XLH zC{ok!C}40HoME_ULU6MmiE}Jw79X+4Us4x3af=W-A|5Beft@|7a4A3$E@$91M3nyW z+?cDLMD$AR=~P!_J-=7#gv;?f)e&|jyPrJqGY!VtHZ{%+#~-*F&J8yeSE^0L$!e2$ z9veu@Ov@=PF0|%kWTod6j3pH{loprfAT>QJBga~J#Ah&>aN4!W(B4qc-C|arRDxK) za3`x(3-Cu`<>)01ldR~lJwmF6%&Z*MMJ!Q|IY5LDzbd>u7d4Dj6!kb9Jw+8G4R1c) z*XnL?cDM9D{&oKZ;?YK6C}m?TueI7=H)Qvf)-CUzOknZTJrlL%%*W)IkGVInZoZ=0 zjy2YO{BQV;@A)6#TPwI1;3-kX%nhq5PM3T?#0*?TFbe32j$-jQH+=g)ZpYO~ zkI~MOS8m0B-}m``g#l5Ey(qgsR2Dc4mlAs;%Sa^_7Q~&nFa0c`jNqBS4kuagZ``1+ z72aCdKysY;Fqr1Agx6y%!rWGjM@{%(3|>=$BHO#Shf zV(M{2z?)b4e6Ik$7|=^(8BomXh*DHi96-^ze`>Dz@?7bUiVyjGx8mRMFrYyh_BRQd z|0QS!=U*l$kH3iY50P#a29ICK@j5vFBYbOw!B_Eqt{CsH;Ihx?{N4QhC{ER)8b*(Q zjBmA=v2Z>5LlHFm9IY9-FGR@Vjp|)3{rr^CtQTHrvf>m=* zjsED4?c0(1@dD0~K&l2FJi10jul>Brv90~)o40SehvZ{kip^;(f}6vEPj(5Vqueag zF%p!59(cGs&F%IQc{z6pSm{v4f3;N`6Y^ zy3lAQY?%BU#;q{&g=GrKZp~ZA8bkny74=qIat}^s!V&H58~Z!gI&+=nxdn-*?|8m% zX;GHBw4lCcuup?%(E6zsNE&%MbG7Mt07xz29JoxOC^}MvOp0}wqiBF{SR(svIv{8H zQr)F_L8VQfmfFhnI9%^qWPiy!GN&{-(5faSMMPdwQ^ zHNmomvm>1TRpX%fO`Oy>D>NSQ)@{P;BbWz%yrq&ypcQYzt$kP@VXFw)t(d)_ zxVQj+ai-i{6a4|hJTF@S)i32#k56_rPhW>77eMtqg{WS@tb_&O3-B1KnRxtV;r{cV z@$tXW^{il<1iMsEC$?isvq`eiKn~2^XH^O7m>v;<-NEOmjW0 zq}mj2pQu6g4^YEK%tNA*&p~6?;5NXQ*Z}cZ^3q?!I_8Flk-knf&pr*OuVdes$4W!H zOy`B3aC!!gyyxlug@=SV)QNg1uENhABSDXDFMLB7WtY=Vry1xk+#D@C+zi}v$z8|? za#~I1HbZ_>Zc~P%)0op%Y-#0B>CTQf^tfK5%+^#~okPFMtxd+79MpUe^Xdl7E1DgI zIBX#U$1<=%x994Ci#pmjZ+PR3cV7M7>l=T&X;E(M1Z$|b){z{}5(nBlE*iMnvw72R zH@^P6SKm1Uf&^1tv2ZPW6?J1~(99!2hV~+HK?crx3$`Ogh%tKhz2V8MN~5tdYjW5* z+|^ZC)!8+?W!2zVd27*FQEU0w;3}WGtYKGH!yLL}HS&K@yxu z>EuFEW}Th_5zyXKPJd@-Rb^MF-|3%_nw!|-6UyqR27>V{VQgTkp-kx;nQ1cy2NAW%aW78Ld`R5@ z=^OW~fB~knHIF{(fArCF*l*bXh!rAiudqPuVLz1ejGGV~ll~bp_?0YF%i{|N*^4;s z94oims54?KHG5G!%F-rUTH4jyt`q-9{0(wli(I!#xyBu7g4L+I78xd3TKhL}8)(IK zb5~GZ_o)8H-cUCYL|d_Qz@)o}RlV~!Vc0jnfVUSdd=EB@ztG!G>{NyBe!uwIJM1s> z5BdbUlQpogM-VuyL_NGm=oIxUf%j`Xx_3%1F@u6A8KZ81)HXX#Qqb%J1kD2ro7o@K zqa4TBE@RN@4D8N(@_h~Yejw!=x8gE6r$P6_`ak@>{>$qd zpJ(qKZv4YM-6emI>aTL&0G-r3+F#mWLLaZ&Hgeq`|0;~^6Nhc=K|gX!ef+MuS);L?7 zzX%P2;bf+ZPIhy}MaKsRVQ-`p3`InY{gTIAD!Uipls8C`g&K{Of{^`Fd4=klxPk8R z6}g4#TJ2yDV>8~oT=rBqe)Z?)irDGP*z<^}j8Szj+$reQW^jEy)-+fiaSEf(D(@2d zs=G!1?D^SY z2Ydq{bk$d&tG=Y@s^GnK(acwh%#zrz6WpG&Urj7H=S6Qm-rv&gY;d>sJ^m)?tq87k zLvIyl{r(9bE3cjCnFcSO>|S11>a!2k`Kw#G_S#Z2f-P0hRv}v+TZO^845Lc=5Z}GC zx`E-eJ^X=dQrs5(iRTNi%~z>Y=JrF&o&TeM{&9bR=@XegApUw*{520~qo6kYkskIN zaCyCO6f@!A@mH}9YlN$w!D>ABSX5hx(}`{=sui*Gq)kAF`#owOKPLAxs%7!+h`ufE6?!A~L*IUsJ%O3{7L-ls%=2H8 zYymxYqmaYC0KIWIItd2+k%oJGPguEScMlJXPjl^7DiyXJMNtfui=>#?BgZmgkAzG) z=S%7}*UA5@8lcO5dv25Z+b7gO8hSmbwo9g3#Oj6VmY`6dXkE%a_UG8_{|VW*T#A87 zf=YZ;c}6sKl)Wekx)I6RAzKsGpANRgJv3pv6D&vX9nX(>Z^N^*hs0kUo;~bj0@I3L zisCj&4}aqDVdi;;sA!RWfu9&owK6Q33f|{xU}2C95*S|41UL?C8DTpXxFCTP3v-}2 zvQh4raA@vNWd4dJyPefXZJh_JU6VkTKCX93c#^Dd6gu!?2qVYZLq8vgT^hnUQ><^? zmL`bzEquVHg$9XYW*W?(mRL}YSufrvoIQV?@ZkKg@Ze=*S0`Q-xMNoQ`Pl8F5=J9O zoMTjm1dN=psRb;H>F3bwvr|Ci^4N@HM`AO=5FL7!^&C0`Qw>>b2%AdXyob_ANj;<* z=T4`7(Z_L|9;Dbe+3uKI!Zk+q@#Nzl!Zt$lj0|e76Z@7*ZdFV!y`7s-e!85?aF!9}*(nNXRzd8Lr1 z_{#%itqm0-oG6qMG3v$;4Topx@f{({srcL2qcZ7G8lfs=LEQ`-*M+G_f&#b21AZ;= zG57lrER)Kw%wzWw8S#pa!=xI5F7``A)?oHZd(e~MlM?<pAvBtS8JRXi9*R zx611n@d<_V5aiN2!D*OblZ_QTg3e%BjD?NQa_;b3;%O3J3r&${cO4SXAf#X{8dXO2 zOToy;Saq7rXJh3tVYGP{d!d_XOCf$;Weh%$_(1T**%$GTelA|8$u1b0UDCXb8kvh@ zFFO9DJi(4Dlh*1Je66tM2h9l&R~IrzwrRc)I+6X(m>x z9PHQNFKsH7#1#!8ugWRBE0UK*(5{`8-8JRuS^8{SVWfM-RGyPzNXsb*Bo{hLi%N6# z+3ArEnT#yGu|Vl8ID+JfQNE)+GL)KcE74+G^@7UD?gp%@WlF_9Lj}eYz6B^EjG34f z9-**jNbwNK-&(`GTB7dbG2Ll~jGS_l_vGG@+EDS#m3nT zxw++5rQ`Z+Yf*7&cDmwY3a48N9+juc37u6stuM&cJVbss7893a%2ARdzj4H2mhcl5 zo6}*;ZU7$OpWu|BB_G%c7&y6aY!L?FGsAVS+WB45U_O{%h>aYQiwxjXR}B9z#}??y zhU3katpd}8ggA;px&jt^sJ-^^tZmfh( zd3GA)**gCRcJ;V;u4Vphp+vN@H$Gu+h*qHl$JNj6e^j2RL3!e04s3;2@oL$tXbdAr zfd2q{5@f_0+127tBB{gXC`uYD$O$0}G{XjtC;*#Vx(gcGl_zio(T)=|4+*E^bc`X@ za%h;al1hQB*nI^jKfIXoWj!$e$tMQ!*w;+BFtE`EdpNP9M;cVU3}h@XLs7Dt%nNNU zgH~JKVa_oxQTL_AB&O!%$EeGfwKp!Wb@%2QvHg7M*47xcy{)|>HpMmnjYt}gAX}j~ z->%W-6%CwRZkTRez1r8*GU+;xzPXlF+N{+# zh1{v3A5&vp-GM-N*BJHP3|8|Nb}Z6fUi|JPH>%{hPP0h>POf_)3VwulPRmfQH(C~UkxVlfV@UTaki~a z*)x2q!Br6J1TnF-PZSvSSs9T7o1U%DEiJM+3zGu{IVUm-iQ3C$Vb}45w#1gN3_X2E z6NB=G@l_3LCBvS_BZz~#pY}z})RT8Caz-!mZcC`riFFjYPMmM;4bl8%>sK>SVjoenL_uWuTVlkv|CU>RHKM_w~@j_A=)Vwgoki51G!ZbJJ;(ZfU1(10Qf6O~a!;5mPStODHZVQ;Sf1#f2$H z_3}r~FRaoQKRGg<-DexHdbe~|1ab$BmQ8I|Ms-B z05j(=oiXRnwAJtx3j?PSOQEZGsPtzYi= zli$N?YbM*;CTpMuY@ffJXu-em3)moENB^MZz_+4=w9yzzw|hvzQhX5Q=q~Qp;m5>E z!BZMse!^Wce1|3uL2~r0ZHgU_^K@3$8#;%30+#B^%1Z2;YngOugK>S0g*AB%Uf*&{ zSy`FQFkfMM^TtD~n z(R;anilZGnkjlp|>Fc{>eEib>{!7O_>zvMY9``zjW1XjVsJwirwyduz)~%_t)zsJ5 zl-6tAOI9YXxNFlH2Ue^&aK@&)R9#&ReUTBZoao%}%WTVMNP*&1urvELJ*mU&YftU*rJDbY?YxpYdGH|d> zWw6sYM^bFK*o6%HJU{7=thZ_y1JdzL|Fdh)Z#unbW7Agg`_0$>F~9le&FnO`QhbVa zinq}zKg{ZKiEkj~Hu}RH*~4yRFK~*IqFO`rBGVISAFK;lV)pXB^3Xq1O>J>;Z7sX8 zthb_~ue7wUqN2CVTV=LXS6j?gn6rOl@4_cS5};}fveVxxmpa+I@4pYv$NhM7FMJ^u z;VD>sG{RG@nBy!4R^I@(`l{U2j~EI}fJ0DVv3N5k+k@eALVxLfEL^@22(iIf)Y2!- zceqeEpWyKpt0^a>6x8%F`vwn^I6OEAcp`Jbi$(cJ(`BK&;#pGu`vwPD4vK(2;!!=# zJBlpe($N;2k&1#QwT?yj?js{DDPksm+dBWYb?p3h{MXje(Uy~uk&~OAKK3@iIV?1R zQ#H*WKFQhTf2K1q7*1d85)c~#EtgL2*2A}`w+yq*!%seW)>%)Yzr(6tAxk(P@uJzF zSaP>w$29-M!3N<6Hu%zG1qDC)QGxi{OOF*6{^&=Az06xva6?W_&K)0wexaAi=q2u$ z2aY64qjS=9*kWr;hx3pko0EkWaS3}!^j+xuyVH5pb(GNRM&dA@kK&nd6@yy*sD=DU zr1#@g2{;<48nr>L=leI_h+1~CHu345H#`6Ca2$30ovmgwQe}U-KB6{S&&lExs%@r-T3^@ogyO6k2wDRcjw<-I0xh=@qL!h3g@4_ni5<`v3W2~6$80} zP9N9s9oKYDQ;rn<vshuTX-~BD<7oOrF06 z@_@sm{JoimiTvdaGtaF2=Sp~ch`11L}p`csX=hV>P^ zJz03S-P4|Q>g$GucjpTxq?=DqxN{hoF{;kQnZvvJDnnChD;Q((L6cdjTYJY4!W+i@UVmoPl#anh9+cP9E$r z6)X*SCrcY=`};SvBCO5QRo&&w_jZq;R?)V3LcM+Naxael(lmH2*)_$*Ro2W5hqt4Ba)L3UMH>PJfea)_5H6V(|em1)Ao@NkqC`1}-WATRwBn5X7Vg?rvAz;O` zEeYax*~*0CrDwZbXD?l`J9A1m=5qC$O#QC5V9I3r?qKB;0>RQqqtg0DzWttPc z;+a)TT`9%!UTspsS@^lQ6#WxRo?B@fl}U%+L`)`A0VdYm z@1ibW*zWai7Y<8zFW}hP4g8qxh&rV+eaLbwRf1Y5o<**j5nm^56;~9!^1Oefq}TEM z^TTJgG@msbWG*ov)t592ehQLF_t5BrdB)KZx43?;XJpiv_kd6?T8s0AhWS_BU^#fPk=>YIJP!jk zqx#V-7PCLQ~FozM4epHKWfD`xw}huNSwCB6fUw5nVZ2dwFL4ZBC@B}>wCFYAbh#?P7T7VV20CX$?PS{J>`bTlO{WuISM#6J zGr{eFM>9>xfi;PrV+~#uQd86szcJTv*0vlcM^TIP2Xoy^^-5qIn^k@xdYT~dt8M{| zQlz%j7t{erDK1-fGNXOJ$_!1ShQmv7GT^@?TTpvHz1ef~gHnDo=k~o)AUFEor!oqu z+)52hOTNH9$u_N6qzOwAxn^V=nUESXT`MMQLDdg%Q-or`00_3AWy(zc#eQ~JY+`%F zbJ$_8_pHEG@mB@*&r;t&TkNP(Vl~;?6$|-M6re(fQD~3XvVV3z6(dadqM%NwS9;3Z z!RXQq>SZs8pZdg4*$ZCpEPgw%u0ftVUv;5SBjiDzd(V13RDnt;sEj z>5LofuF_T^ex^&?zt?Lp3OHTOo1Z&>Uw1c+eLOyVs3n#xB3l}O5*(JIjz6;Lh^S&e zd&e)FKYtajD8&+rI7^%tMH~)vH4b@%BHZZzi_Z|MPxn2!SDozh&3&Ryp8EuO;e+7b zNlt_5GzlP$8TDz&R`%uhLr-AJ<)if-~bVe(p3nZ zDeBugo^kqBBgXf-rfVBkb(DJ?=Je+EUG^@Ev8}wTzg--^Y*k0rI(d04f@ekQ3~KUtpW@w(ErCD_ z{TZ!RBmVl>J%eJ9buLO~nkLqjm=;dxaMc5hT{s|K%#Mj}C;RE*K6UCL z+8~HaXF{(q*I2TJG~!wMH7kAs&2kUH2HT!cr?fMpHR^D1wSifM81!I(Z9{LI1L)a+ zcnQ0o9;l2K{pnTu6ZT`W^A%5}6l9<{2N6mmV1<53pwo7x{#bQJgAv_velxP};{(*Y zE6^DyX1D;$P>_8IxeBKv!bD)CKo^tKXt?u^+fU!lYPX+$`yHoWAii?JkN4kx!3DSP z-?@``)vkrl+3(cpRLX5_FzB=mP6M495B~YX%P;@oy}NfWxo`F|cI>j*`|h3HEoyf2 zl`u_pr_jw_hBXSiXR$K?vEevc3@3-Gu^91xIOHf9W^gAfF3O6D)n;cmB#&wB?cD_y zeTXAS7P&3Yl-V*sJ0?* zeI7j|EffAfCj;?OKoM(u`k?q*-zs*=_inpQyqPXGzM15Z6U(GyPm$HHX$naC+GWT89%8DTY-0_g1p0 zwKA*t23PH@%=*q<2R7b$*Jn+BV( zee;*}K1~#wrrN;u77lMGf+ZV_X0??a@uB8#iGN{Kcb;#%_$03xn_Yw;YSz$Md0TWQ z__lQvOs$15Vy)YA4fX(+UiI{E7deo9y|e>>jdgj%5p{gv_of0)t2lJ|~*J^j#$LnvQ--ypW~ zpVVKS>LAu1wUm1%-9SPs+CDh{4Ey{b5NMV85fcj8aXA+@v19hKl2Aoi?;Qgl8gsHA zB1aUQGg>PhV$5E??Y8Yc-)}I6?*T~UYE&_B9;HUDlh_WcKWI*JD-#v6o?`7WU$CgBSpK#9880KY^6@ zIp@YWf2oeFI;Q6jKK<;|2M_-QU~b1B@sg_-{>@$nF9FwfQ*61DrW~_N8MY@p%|MYN znF}$V!#Gj-0cKSyy?CZO5#J{s|pnkHsWvU)K?3yPby``d+E@7!~HMn*P zw4*}UYpP(uZU;y9se(8&bG>Ra$>_v~u-^yvhFHlFVjw2y1p70DpUF>XFktryP_>hve6meLJup)@{KTN9Tl?oQ54ur0|xfO#ek-*w zMW2w9bSy^Qq*nhmIX5vOrD(269j9@|YT2Yd$q-+ZlrKJ9lV-3jNo_1j&P&ZmG_dbD zVzok}I!=55*;83kF3VD@8)MWjC*~wA(G{d@j!lZIiA&X-zC@o;kerkF?Q&?xg-N+} zar%T(r01fZ%%sft8-yjXju?$_XG)PSDJSV4&4S=k$FQL#y250AVz&5GM{J_DW=S%; zvM?{RY)QHUzctwYB_7TM&`VN_SZ||R&6?F8qI6 zVHoQrxXc#D;+Tn*urEc#+$_8R&FC57N_x}HV2ebmaHaTr@oiq}WpF#<6{;~KixYZ9 z7@w&W?zQL=_DH2Vbxhbph2|e;B?M)hY7I(F;uo|nNHkC#c!N+&`|n&s4R~?$DBaN1 zC75{~$T!AVy3TBu-%1c50PE2^r5d-O#!XUt> zBj7T}#tL@jy#yeNphm_PmI%w(cd&LsjwL%FDI<&pgKYeB;hOn#1xFAbD7NrB911Pv zQ*|SUP1wcS=?!Y2H|l>$HFTl|(tV^F@aEz9L1aUwg(YlU{V8%uo(UHGJmzo5^$G<1 z&500D77hV4nV$**aV^JIT!Q-Jet^!OVYiOk32E03j z-|;sTOYN9g(IqU~wQJEk@~gbvwPJ!^p_RRmrk_h&?gtrKLcmr=+op#^!ifNB8)h7fmyKLRMMR}xyu}%9ZgJ*h$@YcF@ zmk~t!gh^fxBr-aSBYb-$vqxWBIT^aG5>)W2(1E?&UvRBRKDmNyY0;-uFuS#(!AgI! zRv>gpkJg4-t~Ee&00esg!3)BhO00NQ1_WZ)`()u}+tfl9q*=F&sD* zOP89Nn4Y1oSJw+`bV2Z!Z(8U3kD4gBbM{kay zy>rxhzDmoRhR$&muj^3jS4{-@dhy{xDqDehiFI7wH~t}I_?W-PSjq3fW1;e+#>W>* z*!Qsx!n5a&I(dcUH%XRbmDNoNbxR7ebMo@4^DG_3HC6ewZ&w&IGBfn)>DdJ>l|qd* zuZ-~Vn}tfY8?`}qMr~y7h5LpZdkGg{;jFT(IzwONHl-(~CMV=9$x5vFb-6jGI>#1Y zkzJ6OlA_hR5|dHWUe#2;bYg-rI_+cH7Lxd4%k#;Bh*;#$!H&TVl`Cn7HYoN}c58#O_emK(aAYT@TUW zFysTGVc5K`XZ6f5xQ}*T;kG+8O!jtOqm4Zr5C>C*59f1eFW7y;8g?If8r6*t(7bEp z@XaB03Nr%y7t|86BQm=_H&>58VNI?fGcPaGkV|!(WbV?v^wQjo!CdD1`sEpm=i)`r zCjNYqxykG1GZ3XLJeNEp@obf!`OLzzjX%qC2G6DZS*CkDm+@zrV)0zgpJl4TGyFGb zPo@hzSM%qS;0L*6{2&)}M?8Oky=&9*-nD=8y=&p#qIY~R*u5v)3wH0X1_ysdyg%|Z ZJRXMuq>~}=e+yH_LDl@|$oH!r?ql^n8iUdSJ(0~HD?_1S3Awd{@@AH2&r@FfO)N+33)TyQW zc7zl{gb-Lo>p=sG2IjtydPoS%03qaF3uCk6j|dSuRtU$1S(Q^uz0aP!6Jh?S1e#sCaE|5ot%ky%1iz=E zbar|9_InmmmAW4}r*dBPzw;CRB}5|i1$CQKRX%6VAIEi}z3_@@B|3_|>0-Yb~+&{Th?;k`fOP%8Q z{L^cy&GYIq@;+>9Z8^@h-Gq#o)yR?e3ma`(X-wpLn0b~rifoytayI_^lMpBKg=cZ& z^~h^R7KyDQ=)7UJ&2n7c>=E)obzfdEPH^(j`d|02jnId@=sT@QJi`$v0#zxN*7AZ7 zz6|4n@3f`0;r5;Oc}#B6M#lP@M#!yv~I@dG&|?Uu5u|6Jlf@AjXw{pSPZaAOnFSO@on#w&WMl+QL^ z8FRVn(R4MRtDcQlmI+*~ZMquH)eHWz^Zn-!xf@J842s~8B1$9^riyNadE&Q(_lQRc zSBqx}pA&x}Tr0jNRI(WIck*|XyGMQ~EONj6ny^lO2i^)DlnMnBvuX|j#{prJhu{l@ z?}P|}&niEc2jxk53SJ@Zl3_Agc9%osb#k^`CjTJU$XDeK<1I@E%bk`-Eq}JWYT03p zuzIb3x7OOSY=yRQw&}J-w%^&Fw5_xK%^q#P$Nsqeul9EwNsi|npE!;!jAxTQ6$;yAWGQR7l5=ULhkw zCWp)oxg+G^kQYNcg?Zs?VYNFnX`e&QoZT`|`OWW((u5J5T+ih)kxBawj zUEA;5iFTpwrbl;*?iO7TJu-T8OlC~)nE5fkiCGo1I_CM9nwY=E?2P%Meb@Fg+kf2t z>)4psjM)6x;js_JCB?0bdnE4JxL4xd@Wgv&dggn6<5}fd?Rnl)6CWL)8ox0iDdC}n z?-GY3j!P^}oSnEY@nGWd#B)j3qSgU!-0NSxExm84~NFOBE8@O!bvhno)VDXCb9#$9eKN`FJamlE&%^$~O z8JqlZi^w)s_~TX)W6bc!ZDOnu?vL9=j6CO$JH&82qFKI^k?J9T+|?`|AbK-anLL5b z;z2S2uV|(R6BA;FsOFd><}o+u!ZA-w6;)y;Db>U?pqXM8=SotibN?DKkP%@l`DSv@ z!&RlIfY&3gB{q%N0#OQYIVmQ`EY4H8u7JN>l#xE4cp333;?!h3BdzWwaC~!Fsk$P%nL-`CbZym?T?)5q zld=O-{~bV9=^zj43UwFhB9~U>B6G(U^?5FDe5nbtp`m=THb&k?STfn5y~vYuRRyR;6vc!_RDBI;AU%nU8E4 zPqf+k~hjSd6V2}w4t5bjr|s3v0L1{lBdSA(es*TOS5)f8-G9Tw9(FxX6-CXekS=Z$?KE1ByUfy)$Oc1 z&+12})6#!Jzv5rRY#(bs^IyZi8eYGccZONt7n`AeU*wwUU$p2 zc<_^hUmQHtm`8|%Q#ghnTy}8C=O3^(`ZL5z?eqISzw`4&pO61MPl!)rKaEuUpD=s= zW_j7;BAJRBpp- zykY#^P;++u&-goOwJK`7Yy69`<_iCet=!pV>^Al_ziI3u&jFJf(~S>R%-CljnO2u5I5qC0ce?UCQ%zd?3 zBc2y8GH3s**dX2#@31=DCThh_@sZdsJ`)GTmvVxvk`v|AvbQXfi{T82oCmXC-1L%!z=KLX|J?p=A zA{tNDQFIcW>A8JGp~z>17$geh!;BR-ib>*naRVNCDAu+JudqPeCKie%^y53kePShR zsa4`>@wj+GJSpxHHDa^aC|(tBicRtn@rKwVc8T5M1M#_dTYSM<@>WLY`NAa@vljb} z2o)>XWw@PH&2L4dxLd@E`$dfSy@(Tk5N*ZpSg}1MlEfn-Q9O+Q_#?jPPxz2$S*bn7 zy5$*s-V6BRml)~)f*<}fKKW((?JKP3ym;7kqOVwwuYH|y;x#c?Y!M^G-|)ZxzytrC zG4OvFm3QE)w~GnvDU^tP;yUp@9`8djS?py5_&4Lg$9TDec)vN~E4<~`Vy-yM%J3G( z;djME@h|zKJR^US4f4FKm;2h^Zo~a`3WP*Avsx= z;OTC_hg>hK6Po{ zCb^ll);d`uH^^t@3-TrTkbFWuF8?mK%UZch{zLAN@5%S&HuYrzcvb+-D~GNCn4$-ie&s{ zG|=~xWtXrUORhp?B7t^anWiEG_be}Qp5QxaRHCCo5ikEo*jvyutUE3vrB8XU2yP^! z%y;J3ko?5=q4BYA-{mAv`OeF?eQ*7Yz7XwXGqS7&(`CMk*3-TV>{ec|tb_jIyI}p= zcaiu-tDWn&;3?z$jPIiHH)sae5PMA?c6VZoUf}TukthfHzL)2GKN^uD0&HzYBKImp zs{Bzz8MDxFg~|78d1Vcr^^kDNOc5k|izK-~w54x`%c-o%lGrDzrp{8Z{55>VBHYLn zZsT*2$9SA)oD;o`*F|?@r|2)EM24IUO@MA>7it7$E~MSj^gC6@Eh6F9@Q9xn*grB! zE}^W&j1)gHVtmR7^R-FFW1QtK#oD=fn*hQ5_uaPV)%7-FDcVmJ`MIYhxwQ<^S{sDU_7dGnz`r{`e(bA3e zyW-gvJMq-Y#;Q;_7-9*Q}`JE9`?SdS0X(LgXmY{JEly_QRt@ zE7{gJ!19X7LjS>*!}x*SzHjAO&XwSBk7#R25FM>Qh)(Ds9RCzr}3TNKduA z%o!fb6ny+rWbP>1;>%+d883iqfyhw=?p?vVD|LojZWN;|cY(o;&}G-M8<-9N+cerZ zfcRzCSe6G;^Ie`TG*Pxctufu>zo*WzP_&;^9*>_?+zqMoug)(YC;x5{iS5Q|+Q9h+ zt`&8qtdH>r<)lS(wu)#OOqx_R$&JRR!Wb}c_*l7OR%vwwer~LA_McSbk(q`4$9iO7 z;h3==Q8%prB#+oO;+o+e@ywWOMtH=MvD_6C$Br51Va6r&(-#ax?HeYv%M)ae`-TvqYT^59#nz z9e$|8-8!t*;WizL{Gf(`nTBSd5 zYk5^AvwS5@k`Ci_7@@;39fs@BLuiQh+Lop69crbd@&)S9l(m(P2k1~)zQk@+sCE-2 zGkv-vtCF^?OVo7~p?b1sW9`7RK<=4wbuWQy+zPQ|TY|O9a?tV+$9T(Njs#0^<6)fR z*kZh5JY(F=ajP-K7;EGkQ{*{$jAJb`>=~@-3q%8J0G`0;5}lmYDoH&<{E-%@Yeo0# zb1Si&HP9U9_9d(WMzJ;;z*-}Z9-PKH#Uswpu3Gi%g;m{Y!so?zglok2gsa6V!bcf< z4Ay@~2$zYI$n^j@PU!QC;#+-wUL4owHR2n6UM-I4^P}RZJ};v!l6;LVHmJKbk{ps> z%CF>M`8CgPjw0bV^0@p~o>0$kq-uvnUL%>|>gPR@70VY$+E|8^DU5YZSHkX7Qb=jV z&nQhOv=t8F{=dr%EQ-*;hxydJ4AxeCP zDpmPN6%?*2V$rJ=3U#K=l-8_q68u-0dDT`T{fq^}~c(zUwRXj95x z7)?($zrc@}E$>TuIM$+CX(cq|LHdDtPuYVhRm>~4s2gnE+$3A0s;%*tv zzGJ%VM%*RCWP6z=bBQ};sElFPv@3Ck3}F|wlguG*m#t+x*->T_w@GGJvV+Xxxvhns z8!X$<&PHwAh>ueJaxCFfoZrR2{Upwd3(RsGgio2DG|1D65<{phjFv>u$|#xeD||~3 zHL1G#aY(H3S}>T$VbQv^(ziE&;tmeG_9+gj`e6urY$KSbD8Ce=wbfp0zR|-|pzjGi zKO)xhA8&B*#)0})id?i7E8|2r>0$TiJUUMh-PwstVx-t7lbQX`5FfHPmx``B;yZhy z%g*RIoxQ8x;v1PE-jrQLA7=hvqsswerrO(MCvKLwNp{5=D%h8LhW)L9q5;S&v6VsM z7`y3`y{~#acwk~J46l@3*|8O$riC|w?y2^KIsVd;cjEE?^;Hzv0@y1o654s%hBwP zU65ng*_rk zgq_SOaw@y)r9-^bWvdxG87r`UsihJD;;8AaE~=UCl@F#BuI*!41gWDRqY zXW3u;E$ieL@SmZgpL|iigfCr>-51~~0@+b5!9V1)!}~var*soLrhmqhzRfDo#ti+> z%z<3&h2F*fr`lb;gT36B*^#UhxAR=|@A9wg1g?`_v4Yk1TkKV=XD4tYdxC0b@HP3m zd_%q|x3J&$wtPo!6?e+Nu{Zb+_E3YFWt?Ik)WfcAJY(3y?5#eC=PzZ4zQ5dt2YZ6u z!tHqK)#7=%gWXoA*v>BEKiOA&kG;g5>@L2~j^YRO&%JuD^F#5v{D^+~AND&x(fghU z^m`&-H1qUFt~3W>*ZPe7o?YsCd6rq&kL;kHXZQLd`=~zUt_{Pm7*@k(*bRr_G+c(8 zJ>gH;nO?;{@_zP_KVdcfA67XB#6f%iDOKgSlso2E%*@Ox9N_3byL4(*Wrd@E<@Cym z@|)d-WtG*XQ>T_!RNDtkE#(fUs>;%8dy&3!7d72?6#26jnOV&uv$NfUnpmuZr<7J1 zLxwtr_*sWEXU*wmA6`0jes#HhxGvi)Ag91S(o7xMEVXN{rKnD1 z>HKQPHD;;yF(&_*X8gI`?APj4U1)Yzo;qh0^(eBBy~LHB)!#l&!x1#DMZx3z%^hbp z*EX(dX2o>-1YKajgsC&Drp})|ZC3e0*Mzc}u7V;*slT>TzY3;a;w;mRwU_IYyS(X!quigTyg8uRIqvCAEY=xd@0yvR zmM<(rjhQz&X8JSDY?diIr@J5b?)F(GjqKF_>G z-=8;gp}Iehu3MoZ2A-thf2@PENDFIa=7-F)7@WAcYitE z{pED`m($%}PWK*0;TW^1{+YU}?nUOU?nS!j?98lgk#owcW>%Id7m9Bv(;bk#qUb9p zXQ<5zU1U+tK>O^O6{_#dE1z0fQKl=%%F1z-&#R{ER+l%X_*+*nP;+D!V?KX+{~~|>9?tUFbE+53E3eiGS=nZR*_rwb_PLJIs;bHb^XHiNdvtf} z>ndg0{-ivYPAaQhP~lJMVW!L~pVr9J%}kk6Sv|vy&7V_da_1Hfv@1t2tK3~Vr@Ugy z{8_X7jma%E8)U*M>&npryC-^|>CZsv7U9i|=R z`b{afz%-d$KVG?o{__0b=N6balx_7s=)X)31ja<3r3JQrrL59UuZO+6=5>lGdo{+!JIuIiby$}qI1++EEaS^gZR z!ZLHR%>g1OJ1@{IJx|-L|DwCT2ySYVdD+yk=Bx$!qII(-Hou$Q{Gzb=MYrY`{q;p~ zQ`?*0>)Pxht9g0Z&5Ou3n{2i}+Z0By2ubsJ#kh$@#U9VF*F^B>VP5;SlO}q*MteIH zmrV1l95>NxB$t{mcu!575*;7!6~$grm^ffPE4RXuf^@G;^Lk3ArF)IE#Q4Pcbgw1N zQ?|hp9w7<}yNWd99-su4fuYG2Zy{n0S@C zJ~%=a#CV7%7OW4GVcbjficu5Gi`Pd=#hLE4rg<%$y%B{IRej#b!a_eow5QDD-8#x^ zO_{X5gA6Jxnp)(w7fp=!T9S*$TsINs=#>*a-ch4S$}f)gc=J>&uejJ#V{+4?4kY=n zJl;%oKT~mT9W~Jd8Y@dZUiYYpC8T)NJ-3Q=Q?YI((IvcV9t~RFz{06sF=nDy3{%YU zTt^S{#;RECu+rCBi>Zp^HJg}HTwGSl>+_w9i~SN5d&-a}v7k8JYfJMKdA!!-Qe<)z zj+*FoBo=s`i3MnYEG6k)yM`MiJY_YGDFq&NQ;8dGHeZEaYe~^mudP!&Hw!&0Ju9iJ zCexM-LZc^^jEXKDQ#>)TIKJ59&A)ac_o5Xp{-&gR9cf-yVdwQM%{A&yE)xq9F_*-G zQm-*(npaMxAznwPbgwJTqgoq`SXMCw7TTL%Qmj}?2I$th)7HC!MPX4vr}!qr2}o;c zNP%W4vNKJf?a3vcqLqoIN~s!b5v>&B^+eOi##W-*#L@v~6+u_Y?oA>WnVUpwo+((_ ze`3LgAbtu`go>gQCB6qa~amUz4&z?SX}O&d0LVvV(IKyi{cs626Dx;HFs*yxGFt~C>* z<4F(G>EUTLBD8Sa#G261La!_>@P>3&T@KSKsA;8w)&yP|i7qV3qxca93IeWzm1vl1 zTX%|2BwJ$~drKZ_$E4NR)wz9IjYFMd(`uaR9G6z(Qs>TTpkdZ&q9?;EZ&1A@-J90zW@OXNx#rFEW;ausZdRE$J!!(*s`FLlM5tFyQI(v{<%>r? z5A8}oK6Oq+K6Oq)K6Oq;K6Oq(K6Oq-K6UPZeCpg0`P8`+@~Lx1ny0t!NL|uACEhkA z9-N*mQ8rP^*_)wkHZ#rJrL(sS{V|KKFbIpiVuwsD%}Z2{{l9Wxj_Ka)Mitit+l!RN zd9ymz*knY}M4Y11Voo!7uEx_f&6BHJo=a(FIYmEr6L_C1wpOK!$c;k%8_+i~ucoVv zP_lLd4+OYko)S7sXx`xF^0V(i;Vv6?dAf*=hnsfj6MAbNR}QM31NUO3LijlFgH0mglu6 z7Bq5uyd}z~KdNZJ_)*EIbg*K_eYft8C2)CN%E~XNHZh0k%er@6T)4lx~Yt!ia)m5S< zIG2musN#J5M}|Uipf{>;;;3lGR8Q~XjG9atPQUHn;_jH}Q7!Hkw7A=tw|RM&=O|3` z_Uzo8p)pfqg#*&Oy*jVN{FIHYq^Do4Z74Lun@JOkw8+YgQ%vMbnV=PzqAPPwq^D)j z^GtyTrq#F^Yn1hC%m2SK=|NXAu>Th;R(LBv);lpTI=-2`#25S9IS2>bvvVUVgSqO} zIbP{Z;o_I334$R&5Mg$EW+(LUunccEdil_+qz|Jw86M{C4$ts3Zx2o*6pBT_?HR}* z+=$l5G-c4<5x{&++Ik@d5*bBAs>tZH^-`ydA)-^RRXl^ZHCFMc$T-ELBI6a0icCn` zfG;d0Hjx-(JF()l4eaf!*d$_R+I5Ogs#iwJFRh>n!m8d#Zq*T?Z zB2!eIDl%2^3?@>hcvPfZ@u2|5u zY~3yutI+LIu}U!R-K4-d`pTQnjk#vDKhY`$x?=Mda5ayymZ;*XHlvDXzUEOk6wfVW z?$cE20)3@(EHtAk$09ST*l(qrK4y`N&8T8nVn!9iZSeMODsQR2(&a5Pql$gG8CC4R zA!lE+yxYyFVz|SMDuxyC_G>EdPJN}zyUUC!_TQRO#eO$A`ptILm?zJS1TG%+Cr(;X%Eu#)RtI_ZNh+y;GAD&q7kGD|F z=bnbJ++1E&A(Cd7R^2ROX5T#fW}cC%r}gR`A9aR9pVhNOd&q&-gRO4fLLS4j1v}3; zBz36Ahp|#U$=|}Wjy62kc#bDFPw_P20giilsv>w*{OyUm$oG5W zkAxcx%u!VE?!Od|>2RHKn)o`Sj__k0R_T=A8V5+3Y5Wi2F3nkC$s_)Ieh;9^`HHZD zx9U_mDqLq#E&W)Bzt!PP<6Ba8QCb@zTJam`R%4*y{_{Z2`F`rjxhuq52Ceu7MXLm; zk)L;2T7hS91Lv#pcU4$6J&nHnceaffDs+2tNHi7*_K{%g*7&~J@HnZ<`9-_rIp74P zzu;NWG-$9sH~+1!(wTlcz!*R|JO$@DsnXFA-XA%}yCvW1Cqm!xhRPY9JKf7uxemOo zup4bH;jRBX>NR+}ZPqT05LKEHVhN-SuP)h3ygA2fn&UOiQKvcTT5`zuRH}SWbEqf% z{ARf&hp|hSu}gED)Ep;?Tm0|Uw8I{GL&7pi-LXtkT!yw?!=iJn)j8JwJcm`ktz?bR zIp*m)=II(JykIbYK$>)q(n z{et@$!pGbX5&m9>ckA#mH+Z|3==d$}ImB<$VVV0z_eA#?9S+ywKpp1mu%`~Y>M%ox zCVvMvec2u3jwEcY!x%R`+HF;FSA**u;c3@#*Vo7@Twl8ms<`W89q!ZNE*-wB!@uiL z^SidVHj%^YLRW-n%k`9-cTQb@)S(%F%7w;U_qx!RYq{%I!fG8>=y17f1}Rhgadr24 z*Lc?`*H9e}&|zO4=IJn7hiN*56aEw(_qf^-4`;VVxSTG7uWej#))Ss`9wYophX-_c z%DJDEJF`jq@KYWCP=~u!=rs9F&RU(m&G9y`KfUH)*5p|0c!BU49X_VR zwGOP*@p~P=Tj|$vyJHEV8NbCb$8nRROoul%3n%LM7#$AR;Xoal{P~Wal+e|YLD)fu z2|A3?VWguq>28PB-e5nc!_zuEuEVcY=)ZfgS^VQ>@qPAPyuS6W{qH*5Lb%E9CH#vH z&G;rec58pij-RkUV8^rA@6zFN9X?>kChgV!xVl^6SYn@HpQ6L-bvRy!qjWe_hXZto zM}ohvj_294iKp392t9Ue)gErgR_#tZwrabe!+I6kowie?9J75zctD5yb$HCSN2g=A zw(ZJ3ZCh*WpSXuF&C99WJz0QA?U_ z7Ch5*Sfay8IvlIRk+#9yEzn_a9d=V8Ui3RX7x_-jOJplOJNeE`m&{#cuue}?^B$R| z<3lyi=b8r}MG5CL=Tv?7H=6S|I{vf{XDc3lVWwt6Cp7;F&7ZC3Mqe?fki4s;%Gs{d zr|6Mqw@%-!=N-FsjVE-tTXXK#rM;+mzSOlyefLFu_e)()f{M!o9naJ8JRMKd@iZOZ zr{nu{JX_7%WVV{a$qHR&xDKS zmv~z9?ALSQhgAviFu#<&b!oj7o-$acSk*k0xYn#HpSSK*tMI5Q)ST^gT|O;Ed!4Jj zMxeb;>7~PDjX;ntzr8Afw*ZwC*}8--ItvV&q2jwxD^i}JVsZ|!)T>aG|z*UmE`@8x+`buG9T3O2X)DBY5r$*d*gh;P*K4m#dJ$1`<2Q^gHE7d0Yu`ew^>@Nd?#T-5DfrDfTyrP!=fzEHJTBDE}= zbvc`L-UT}E4&9ywx+Q8+m-e8J*Qi`ZfUc!ROZ29`Tchu` z*YWl`-bEu|)3SHbHq%A(chLxR(Q*~*uukL9Md$6J^G?+1PwAA2I^}g;!rR)~U)OiP z)FERxXuqy`hUoYZ9p9?sTXlTAMs>VyPnvGec-@Bax`gq%Rm)Y}n4w$3{E9Nilh@$A zJ@uU?!TaJ7oYi-l!g=qsn@D6e^;_NwRo`j4gZJy6Wi70})AWS?PSYCw>!5?=`xsJQ zP@Nf-c}vx#zjJ0}7Mmc(X8qnZcEd`|U}Y`DK}h9!0Al=Qm3{TRN`uS&d2i+X5WH$N zsotS}NM0Zutiu`|-mhg^?&ndQ3w8SMb+|!?6*_!OhwF6sln$TQ;Y=OwB4qcVY3=(p zYY6ofs&GF0X`{+fI%uWe-wtQ(D)}WzTf!I)3C^l#C+Kx>3hxH16?O+g_3bao+u)gm>Ps4u zw|AAl@5y_({L+9!iUGW7EBOWaM8fMhB=2NSAynUap_lMBtz>6oG2t=}$vdyN6RzNp z=;Lm}2YCxqqOU&^KE|Q+_Y~nX*n|3Rm(u799FkwOzfAZFx|U)+hvdD@*9rf|yQPx% zM%7-&4)HI-_c;b1JhvzVl77E7a}#)OUh%l{{an@_k3){#GIBtLOZqkNK_dJ>LP2 zqrQ)PTYRr54$=<#zVP8geS5%B;r*FPRsYnLKGTkt|9t<{>598qOVEYV5G~ht_v=ul z(C#b$^L?m!>fmXrmH1)b9>PYO3*i&{qt2&W}WYA-_#bFY(+}ob9=xy4KIIL(x2?YBF^|2=1^o7F5qo5}iKX=P z<#=?{Ki$Lo+P}m9uHtRw`}p<2AN039%r9d+t-tW`XZ?+j8r}t0-^fsJe!sz&GPdY< zzqj!n3iZv8M(?J+{lS+%c%$Cjult7mx)XZGPVLv3zuZxN$v`q2q~r@E4C1h`OBPIO z7>7kmYtiyrkhnc59uA9$=dgi5GF~&4!wC|d3DY^8e9D#pD z9S$kBa#+PSj#i+&olxQIVjS5+sE`f@=`TUxGGqT8jGM|0XLRm=2?-d9a^GkAt z_~p0n>CC7NiOe!Mj!&fR`AomW6p;TWWGG_=QWtPl>QXocV6z7Z6`H{s&0x?xLJ3DXq&UXmlRTYr}4g-WKW%iELHZ>hDd*ORZjNH8kjW&?7+ug8DW) zVuE6VjKEWYA9I}I*w+;9BVHTWH83*J+IR#M1mp#z1V*~I21b&v*%5fkbs{Jx@MG6R zS6>c~E>D&Du`ANK+j+ZliIYzW!chxRqO&X@k9(fLNEPF34gA=d!9G+s`&#=__Cp@A zwYEND4YxdHS#GJYOtg%#^tQzEU8QMYu4WxAeW3aMqUL_kgD+_A3om`q=;uDM`4^6w z`$qkxqpNzzyXobZ`^U!bA2s^OOW#5IxsQAcJ2bzH^m9L{zmcRpWu1Pu@r{1EVR}pR z`G)eBSNfe>FV)NG;{*B9(>Pfoe@{#hL9F(@B_4;KfS!b&hSosObMHlHE%CoXHP8m~Y=mBg zHbI-AH=sA6Ezn!=yu*1b=WV{n#CE9GS1b0@!o{SkcGnBO^-J6L(00}CL$v!i?LLiv zKJVMl-Q(P;=gvk_>zV!aVl20jb3eZTbR+F9?j2XT=xNPURf?*iIp2PN>Gg6v$g~&I zcTyOT4YETH$PEQRflx4I#6x+^wEA(*hx$VWP$4uB8Uzi7hC$<@Vp=%~x*oa#x)GX6 zo6CHk(f0F$5;@3lqiLV8xztY0k|D_guP0b%GT~YHPYCc5Ghp6>9 zwH~6@L$cDh-Cy$|YCc4dUG7_f>?@Fc1+uR|_7%v!0@+s}`wC=Vf$S@geFd_wK=u{L zz5>}-Ao~hrUx7{!AoptQ;xzjI7@Z!V6-Q~s-L&FvT5-1=?R&y6|J}6YZd$Pd`Ri## zJ?pCf1q~qk*VK4`8V^w80l(Y_sOAz{zt;W8sYbT*%*q?Ekbb^B)neqLyjjwWgFbvSY!S#pn`5LP-|nK z-G^?zrOhW=w0Sfw8c*$)+Wnfp-MeVXF5N?Z!b*O^N`Ashe!@zA!b*M;tDyU!4bVpD zRcI5m8F~YH6WRj316@SZJ~S>Nvv<^iK^+*>VI9Z)IMjhd9XKeD^b=T^Jw)m2FfBMt z3l7tQ!?fTqEjUaI4%33ewBRr;I7|x;(}Kga;4m#XObZUvg2S}nFj#y?A3aY?6dphM zJ+t;zwCFgk_?}kOQ~NGzSF<=Yta4yms?FzHpl0^wMosT(YAbIHP(JfXe9S*tFV#{S zeGyMtLKuc5dy!->lI%s2y-2bbN%kViUL@H|zP(7Y7fJRa$zCMcizIuIWG|BJMUuUg zxt|v9WiGvpndpPm_b75b54{L&K+bKPw?nniPW$h9Aj{~3tkgSq=1UrozNFlcodKKCPZHC@}-h{S5??7sI{7Y&+ zOw0TE9-6m3!z2O66iK)Df9sJAQC@H>sC|q!731G3XoUIP@)a z0y+tug1&=JLua7xp&ztV2a)O^QXNF9gGhCdeW+z1znog{p!PeVd!Uujz0fM?KIlP8 z*vR=+XcM#`MpPAYwe+iIh-llc$BOE)qI#^T9xJNHit4eV zdaS4(X?LNIUFc&M`q+g&cA<}5=wlc9*hO8tX#Fnqu?v0dLLa-($1e1-3w`XO<-3~c zd{<1nyW{1^=Pghjn$*E zdNiiyOvmXZN+SyA{m66#Z5%*|@;)ibB77u3d_uAVtvJ#)Hx z=5+PU>FSx&)ibB7*K@j^%>Q;lyP*%DJ8>k%=4Yh|nP(1gOktG%C2z7!wL+MZ!_j90r z@Z>}Np#rE78VC)7217&O843*}KAiI?U!AA~&w2dyjB02Bv=CYZErD)>mO{&Y6R@iZ z*wqB=Y65mO0lS)jT}{BQCZLCX=wTmv*oPkWp@)6wVIO+fhaUE!hkfW_0=72++na#x zO~CdhV0#m=y$RUf1a!1dyiJ?lA-)?K`M_2et2@_8ru|gW7jc`wnW|f!_9@ zw>{`>4>kNi>3rFP8UE+sbb`10tk}nCD4n3_yPwUXrI`p&- zJ*`7eJ3(qLNX-SQxga$cq~?OuT#%XzQghMMI?$Snj@F^0)#zw7I$Dd4)}o`e=x8lE zS__&_f#y>n@dTJX#YprJBhf=zcl~@1(3c-zM0tP_L0~8Bvz}*?MQtRsZS#HNu)lB)F+YpBvPNmKDHzI zNhCjsq@63I`B9_-@xf%?Il5A}x%ph9RMGzc0D4S{zkG>rIg&f|Tb zg3=C9+5t*CKxqdk?Et0qptK&84ujGQ*w#*LYbUm~6WiK}ZSBOic4AvQv8|mTcn$>5 zf#5k1JO_g3K=2$0o&&*ijHKtVvvVML4g}9(XFIX8o!Hq<>})4?wi7$siJk4l&US+E zIS@XHt?dNmbD+$QGQDjVv>W;W+5>&Wnr}bE^94{ogB|VU`IhvpqSvjW*R7)0t)kbh zqSvjW*R7)0tlzst~=2wN)kemixAX7~d^{?txZ9 z_d=_n`=AGr=uyUp=b;y&4Ww;^UWGP6o1r(LH=!+%i3Z=(#@@C=wb=4b_850TyP*%D zJyWn&dFzn34(s><>-Yid_yOzq z0qghy>-Yhy_yMc<0ju}{4C=t34h-tRpbiY`z@QEc>cF55tM~znsKX+DK>m-hh*Ma^ zDJ3e7C zduK&7)E@Fc@!ZeioCEbEo)7hh3ZO!0AT$UX3=M&2C^U@taL(g>cZ1qd`qokU)=~P_ zQTo!NUpmqV&E?^-Sv5<>c$VJe(06G^y=K|OtuOBUG^OIi!3J z4^xMSsl&t6;bH3VFm-sCI;4IMsrj-FQ~(u11EE3CU}zXLijs`Vx{pz%1i5vy9WsGEOtgIL$2MG_#D;%rZ_h%Qy`ZwIERo615;v3lg;;Q412a zAffuoPyfZk`~*TjUFKnGL8}(DYC)?Ov}!@C7PM+Xt5$oMcQ`BWa%Io*G-y2yT5GYX z??J1UuS7{!X$EA2?2rR;Ljh1A6ofYj#_NZ1j)K}i?VxC=J>-Gnxu3;32kJ*WAL7vpR4^ z65q+ZZWpv0`T*MF`vx=*&?j$Vjq{-ID=c<5GldIaeO{Juz7d=cgY#i!TB&a z9|q^c;LM%~BX$@R1+{_NLD5iq$O9!qsZd9#6Vw?>hq9m?D32%cm%R6RFg_2y=jpRw zVYPd(+C8*xH&%NFY|nu08L&MAwr9Zh4A`Cl+cRK$7HrRg?OCur3$|y$_AJ<*1>3V= zt32N^ussI0$H4X&*d7DhV_;hcwsl~83~Y~q?J=-D3$|y$_AJ<*1>3V=dlqcZg6&zb zJqEUFm3bCyk1-ltU^GyD{!?&13eHEt`6xIa1?Qvm`LkH@S&%);9PE4MVBcfS=a`LL z+M&FTxZ0gu49`%Ie;DK+2Kk3U{$Y@R7~~%Y`G-ONVXXTo7JL-TJ&NTX#d42gxks_w zqgd`yEcYmudlZX33VKh1-jksBB3bjK-Uqq&LGFE!dmqHU0x7k(H`gdhC;)k@p#~3aGV5P58VLW2u%h1 zGL8Ss;9rN;9Q!YQ?ihXUSc^Vq_NghkkI>nE=u7wx`;H;GdWP~XR`4xW@U7Z| zz!JX2624_-l}XDUgbuJ~RL^njq&ca-zBY)>( zMt-@lTWwamZMm>Htv2V5 zasV-TP3KNdrx00PI^}lGb#`=i^u)Gn6BQXA>ag3aRAdPWwnuf&35gF$jt_|s>)O3r zH~!~#O-W3!I}*F+WUI@Z?8u04yTf6(M?@v0tt@jdv`dkPOIDP2ubSb z3=Xk7!h?d^1$F8fn-Cfj6%ZB^6BgF4opIt~XpFI`p`v^H;7Dh9myoFN!F})I%PB@; z`_SZe!9iWpR!1wwu&`);frp+1e;Mf_dxSl<3l7oemUn zBWxBW_heq6Hw=$4l8==Hj+&UCs(5UTJi=yc2 zC9P@QEDc+&>2cw`zsn0v&u)FB%5B7Fw=wRzc5tD3$dNXSvcP~w3!DV{77H&$VhR?Uv0NBdKIX`K zKaN%od#mNb73d6fIhWI~9d@f@I!{0XU9AGA3yX#ADJkPd2&dCMxplDNc6&wy$$)^y z3wNXami)>Z0)pJmfT~|tkq8QER!{!_Mn%yQWCnT|5KfeDP z(pwsBV%@RtkDZj=+wGPG-L6S&pZPzeT>Q6`NogO9Y@6IYwAO9(%Q3oicmH!s!{>dn z>$?{=Jk~z({ZHL#Nq>DHy_ZGxsl})nAHrW;M%U52F`FSq=a1yAXSfAJc997Y@d3_u zo%t{xLWC&6a^tfjwL6V9aH{r1i@JlqO$_s&L&9ZZy3sjN%8sKK6igj8w6fnd_fHw# zH>Y2}oW8?{PMAEZue)QsF)*QnyVJ0oo@3qCobf#d%aN9m>7~jkiUdsH!Sw$*r#E4EEQI(EX53yM`$^O!{Hf$hZLnwyh;im$Q3Bd z6B`pA+A26G(BMC@xBa(on?3v8 zd*ahlvXW!n0sTvR^_-HJm^xs|*pk~?x!ZRcTo_#Hoqx+KB{sY5-Coz_=4I!s8e94N zb@Qh0ce(IiX3MpY3-V=h?on~0>g|cCV5PKf8hUbCdZH{?wWoUio_j+>C*3)8=$(@$#<@Er z7)1#k-Q!+by!eH2L1Ug>u;7`|7ppy~&Ds{pPR=%SKhw#ja3vw3WdJ|?$iHuiqhm^7U_{%hv^|J&;D2JPDNk$UX};-WgV z?Z8Xx5%FOmVIhIeXg@}Yxj9$I3CDm_NKP9)`U+^h^Nzwx#stZj%OPucDyZR0PbyZW zHEK~7gPIsQkMc%f3$NeEW1KMTJVAm9JcKbCD@Ybo^GmP+x=j_6GK08Y@v(k?7!e|RTw`xUBC za|hm7yu8ntJPIX~=O}NnUYSRY=O$0xRe97nZ1No93(UHlOY;JMdsII(dA{VG)nBUX zE8YRUGLM=&nB{!Sce{Va!`uN)Ht~EX$LhHQ{=%F)sQDDy?t!-B#n}AOSJgIy0P;4D z1x@;Ok>AaLJo85UEsQL(Pr-Pev(V_QMD0T~IB zA+x2NzCOzI_IljPjgKHbA|lw3AKm$n zn{Ik%d1_7v<@ZBxyP?O8@$t!tah~Gt9fyUdC0S&FH7PB8!tCG@?}F-AN|pPcJgZw~ z*2=NtewUTiEhfT;h=}S7Z{OPQr!74!Y91S}?e!Rc=i+j`CO15+1iEPQ<5X%L)FYbBEFSUwK?J|#Wn&I-yAMIzcJSYxvaj_ zY$pP2(vqw)-$+W6Lls*2+8S6KaBkRy1vFX#=ejx*s*BsrvmDT{g%}2`tXNCZi#M&W z%b)0GRTLIr$WS#Hgfb5eZ8hDc1hZHtI~l#=MzjtNM6RI8;UPv)kS7Sa`t|M8o3Hct z>XDb*HLFWTI@7n5TJO?-QZXvu}%kYO)6ZAooQKDmhin-L&lN>9zY^YL?e=tRf zD0CJP@6ZDfzEzLXjruZmVtQKH$2>Q~U*oQ9OZbWm^&7+#-g;L{#7x;o&oOi>w67&y z``QUDZO$BRWS?d{bv&hLVVA7s_>GAiVNrh6Ea#B#1CytjA2sVz_HFWf$*;vOD+d-( zX;#-)>~dY1NBL2+oNw7N`WcTePND1PvCHq;s1;bF7v;SR{4S#VStq_^a^d|3YERb0R^SHBUx*YD!2{NNA)oF*Uef!6hVj>k14x_)dpI;#286 z>=DQo?jVP5B1Ojxxi7qXx3GP3YG|kMhW(u)A{)M@?=-W>b9KqRSPHdn8}g5a@sWJi zBfgy+)9?>aRF>B8Fn=9NX)Q}z<4N&TOE2k1I0uBIMP9!88!Y^N5$kd$ymltM&AJg| ziG8wzxunOgJYckl4$W0EI@$2}xr|yCJ#F!KrGCg0ml{!gYqO~eQe52PNvtUQT=yuP zSdO;T9NpH#yd(EBD^xt%>%+s${)o&rdmVBj19F;qPqLHSVl+TbW_HFPJ-VSbBq_?06>Qvo@pOl5HZ6>dCTjqloZd~95Nd|d4K;L>&T=dUX@!`9uhm_LqH^G9O88#{I-G5?%zh}LvJ zzosiS`px!9O<9`p)Jf-6c+~i7mUD<--Y6{^&BkAiNwadklJ={Vqt;AjIbX}ftCXY0 zUz6us*|B9g>{T`5-C}nU{ zdPz-@A|*RDJFb0bNN^z5)>gK4nz~74!@qHJCo+n4rm3Z5%&T$YAJwEWMk~2_*s|>G z)_Da((bce}Dq2Xi;a#~nwxo|%R-IN}cv!=VxXHn(iMy*}G!JLeSoc@EG^rw1{iN$egy$lO&i`E!yF$11E^KZ|Vc59Y&xsBn!utYc4 zZqwNe_1mt(ZL+x&rdH{KMf!+VGB8k-2AjBLc99}Cr%S)getNZ(5Z6AsUE4O1;b9@I zTLr8Au?(5fx`mCiKX$ckO|^)RPY51>oWi z?aJ~!lamkZxd{?y??_=Hk!Ti%Tc!)E9vK@uTHS!0VW;{JHW~+EqHr%pY~UT^s34ta zj>01|=+%gD>B;lfob513h_!XVwSZyjV38CHsRTY1ccv3$mKdQ-t~N{D2x<`wt4%0x zoN2V*STR&8_&&Gyp_!S7_Rc|Z@5%Hw6N!o5Z0o)8eQ4;`*_qQrLwNPyWP>+PG}i~Y zgj`oW4XzBp30r61>~R4+3b24q*^})J z$zK**l8$xIYE$ivxVbq!9`Wm^zj4!x-+0S24?Ot6TNW=JoqpZSJn;29Hr`S@APdn0 zwc3GjI5u?VzZ}?|_~X~!_udmH-h1CIPo8qt>S1F#`R;-K@+tCFA>?C1SqW;rBafJ@!^7mlwy{ zEY-g{yl}>-sieN@4NBg+_nBDAvhk0^U@y33_nwoo=OuoaOYEJpc0k7oF4a2_W*C+j zLw0~X260> z+I6r4q&9=VhUo6V;Zq5~Na3L0Xy7s13abzf?~Q{vzI)#hR9=p9>%_;yG_38S?Z){%2{r^dLL${p;`s!e7eh~DX5Kc6YxpAcA z68ae;B8|8WNR4pEMbOr;4i*K0bvpeTB5(0!1aa6pjQ$qEjgTT74y#s5#auR>iiSfy zey`DhNVy8<+fA4h@ecGJByN#?pw@u=gGFlR;d0rt%~TsaMgkFozaTauuLAo{Jey5= zC1a?POZScDvg3Evi+znBDtIoA5*#}}k5JC>yGlEIdw2HTZqezUT|Sf=?jPEph%Z+5 z<_?@XvwHdS;CMCb#4SV-phmtI3O5sJ1r(75dN+Z zSf{5)UWzQwGVtXQ46{S8unUJ?vV*{_DS&t9j~&0A`zNz6w#+=TpFIu|foL1|oO}3@ zGwjg<_opg_jhF0y;cUxG`A5F14$Hd=EWL$xGF><}Dv$Yl)O~M1hHOrG%-^AB&h}%- zzLm#(2VHmgm`(dudDiBAzK0Gx+uvt%%-^7!*!K4!`&NF|58=;VeV+(8f_Oq6^JC;U zbRtZf^x1spAFx#Sv$*g4WAT&V8=vqr=bI0iV3fDeBKie7IjCH0Aw_PA<%8mDYA{d) zmNN%A6t0S3BenlTzU$S)D2?PA_h`CtH}sS2dV;V*i6d5sI-lS}P#k$9grdOrZJ}dc zr?U>%mqSE2t$E|QLLIoUx-abdgO50h_5bP2#H5X%S;fbArpU%P`{UveoO2fM_g_W_ zBp?VshH3kcl=Us|9&;vOHmMDuM2Z;}l&L8ffu8Y;&F(=h>iG0pyuF5qpi=`RqwqJ! z!Iirt5Gxne9e*Yfd*Z60M5Jrqs_DZ`1;b-opCyyZ0aBrr6(^M!)G~5pqmx?XODc|U zn|26Ws1jJO#f^=^fQpT&i(%&n&Q3W8vLc&Q7Xr4o{JuR`{YbE6y`q2n2NhzLH^!Ly zWA%n4)%)?IOxIfW@>%xrjX8MtoU(k6-hwGp9?l;X%+bk*6PhZe(c4>izPcdX>!cu&P0GUuy)_Rgrg&LpuvAD@Yb zMny-#6ZZF_1*GJwTWCe4ETEK@QihFHHF=_qwL$UFUS6>cT$BefqW(2 zjFm_T@8NsyBO!;j6RGCEa-_QThZfm`-AJ_#G}R-!q!Xr&Z3k0#4{ToVHXt_=)$nc! zfJh#KrzL&3rSnzF<^e27G;WcY!= zY(KNv-I9cE{=Z$D28{-b|9#`Fi6XVzkZHnq%QI@y(1-k>G-8hAgssoJh5tvGD20H-0J!9vq=N>joVfLYoH@sU8%8OrFJN~S6Id}7& ze?fLFe?EW5J7sz(s8XlhERP|(SswF!blTfO59K}-`H{zbcPmy2|1ARhxFH&W*Hwl8 zsc3=TLMjq=*b&fdM^KvP_C>T+LMzu~5+Kwwi?u%Mey2C!r!Swb3Bo5JDg` z4ujm|cDvvmd*Rc^(;2N64n58RwII#P^SfhkD(dtWy{OiW4i!?!TvqKgG6SOg2Do6YTwLNA71TH9kOa> zZy&4VReNrl9Z!uV*r7cqPHeosFJ0eJ^M=NYr3U4bVi%@WE?{n1VZJ$=@)=cH9dHy; zj4gwla+H)br)nKeS{A_^tyaCR*8oOIt5=X&EF@xqY%oh1#_5D3=9D0NymCYY^Qzi; zqPC1_#WT7_r2$|d!{J4@$J19#-Z}!O!@I9Ca?`-bxg8JWZvN|mV9@O@X2&e*ibeb_ z_#__N#v6+Dxd)ebKQwdlqiglU&k&x zhClQ15t;!wSswpwbRm_mV`ji(TGziw_krY0T=}|q2i7bOB=2zZU^ZiAYGiEh1lB0% z9)mZDr31Jpd)2@fT9g1cuYsGRNV!A${W|Ui*_cdFdT64YEE75zb2?(~bizcTE(j}# zEG4hf<0YX+Aw{eykAD$=1DtFO5U8UA-Pr4x??j`1urhIBAy;!_X)86O)SJ4sw`zH* zx0E($`ZKjqPx>{r>6r(X_P=o2AO3%^x-Q4%Iec@tCPL-lPehmAOEgzW^r?Lj_}jxAzc`Ml!GT@jvi3Y}zoQ?+yr%baA%EfF3sj5b}S0gJ2w z^Q_^8oknmgO$75Jw&V=J%6lG~Y2Le>7`GUcp0}vpuVU=@2LwHxyTA<(g_x4cDR zo$>Kh@2$639^K@fo|o08r|(}r@GyAimDU{Ro~NuErefBR9_U~n;+~(1=v5A}6cvV> z4G)M!aVX%MYETO~vlJavq=OQK0Z?<%hb4fgq)pZrX%%w#4^{;kb=en5g16{nUb3928`TppPwC#Pq^kBz$ zuA}Ag=q;p-j}j&2`;d+nexqAQ!?$=2T>KrC324}ObHrg6MMR6ija+BMmbHK_5y&0S`vLsnhPtCXsPV7QdX849rpy%aF_1v9f@1S9J>ho-7`ama4~_y}O1?4~w5g0I!gB;JgwQz2J)i^2nC4uS{X1 zs8!8tMT17%xkLxzHfzX8Mum9wuh9viUI$ zfEYwGQl)XvdSCBHrB`GN zcimjiMSCo@RN|gT-te-B%i(ZFq7MA8(6>@bq;@7k{Z6-Q<=aDjiH6lT78|mA_7Cm5 z#p3WTSNEN=p==6Anjj5%_w4ck_VQ9`WmjLZ*tcs}sc+-4U^xsfdd1EvcQT0#Sik_;H&!|1YGE~VjdCY&)3Qobo2iU_9IFO3cZhATaC z=jo4JQBWQY#fB0_$g675FG;~OBPAS3oZR?avS^C*1WIYMF_Dl$eL*n^{xceF8!sCe zE6f)+ev~RmQX$0xo@y%6=iT^8urCDu+?>%6Y4)lgMgNpoBf@#pQ=+6sgSk z3ayIeMU5|S&6)HF9wfQSIg@hUQ|Aiu*sl&jf=ESPCpkF4=F@q;CW9m!+HXQ$ll&%M zrZ>TLEq}w!>tFp5zb@xMa>*-?|H9|x@!QU5oBMz1-<9!@NjgYR`MGIM0iE#M@P#_= z$0f7;oNp0SLif88Wg~6M@y{_W`>Xjb4+=K^&#pv;zrg*Cu#sn)lL4eG5K{qB0IqNm zRNdq$$Tv~ctW$I%uUUZ=A($ejh!^6>V%BK{BQuh#>+GnvR4H46Y(u_ZU{1X%Q7R=8 z%?(3%?pHdbjx_(YGj^OnH@lY1Kf8iU7o1DuLaw2lBh@J=x9%y7qCI7o z^N?k^x4FoeQnJ{3{bCZbj28mXE6zc-fjjX(JnJ9u4)4ZKRMimyTSFe?@qYn2Oi)a{UGW%;VbbsytB3<>AR((W8-A z;M~a2PGis6v1v*M-S`~-mW@Vc{H*m`CK{RccZf~BS@)7!vste<56y4<2;?B7HBcFC z^rD_`VI zbLP65=Da!Et@8sPzq+<%Zmp@v8bN#|x82_hW+dDF%PmdOb^U9K4Xwp~#N5Hd^7y~R znIVd1!F9s0;8xsWgd%m6Ft^twwh0JskiISq?I*8LO>;m$sC zG*AZui_~Dq^D+<|CBTX0aHn|mLPOl{wU(Iv(%`V+DId|{u&U>3!J^ns?^**Sq z-k-=b3ISv;b9>pMyt1V{FiX{#CF&J7oGCc8qf8({M>H|zk?g8IMOi% z`uGt4C~`|SA8=STF#0-jC%Lc6mwij_WGcyoWHD6?_tLffJzs z9mt#{I1YJEta5TDV2k!uK+XQWv4AboSDkt2qo1;Hf@;r!wx&O^R4t`gE^&Sqr1g2C z*~Ixd{Pd>hhMJ&lbo6&X=jqzzAwoFhH7CxNY4%OZoZ)l*sp<)lJjDU@&bzgF5?GWW z#MG(;vLsbIk)NSb>v^(Y%kx4C7v+v({*+RokqFY~MWd}>nd{Jh+t~)57^=6ZdL3b{h~#aq%lMk4>CTM2`-3gRw8#Gq4&>+}b40tHb~ag{v&{ znSoxo{xa)jQ^^c>|99Lr3M6*-v1~G#C4OAEXIkb*wg6NX2FaCwy3!}svFDS}fT;89 z3)@r#>TS^=fb$d)Ng$qP9ReW@2b|;1 zyww$GHl2};5*eT+@EX6{vFGvMNrGsZ_jqmaVE^d(B|tRT=%#v4@KAipQuzY5y@-4p zz_b^OqcivI-2cKEf9M?$`d^-&dC}MFneWf@-Up2pOckLISpLfgrx}fK6 z=SMz)GC#BL=(VS(GV$qc{CaV)dwx?FztNsw4D&mKc$Oa#E!dS|hek%yk+!Nt76?1% zT%BH)Z4ydhO`_;Iz)|!}FheN1(~(XA3kepuv>xaLVUhmKT{GlacH*w}RImT0di_9o z+_Y;I3U-(56>MtcKH#k%s+%mfq$NupPqX0*JaJj zp5>f3*PQkOXAS#o2sDa2Eljlt!x)YNkZD5yH%)RRi^7%OthXUnOJ%@mlqu4sm`N}5 zKo~(e#8_Rrc%W|7FmrCA*BWn`u(2qs)b09g zAmB}Bd}iCBT6MrXSPnG?PVRFDe95rIq|FV6(#1q2JlCYm$NzSGEuZuzQjp90$}=mt z^3KviE}IM%1J>lq*prw&pADzVCowxv z;X0`Gt9-`pd`1hn=SAYHQLl;U1Rze8+l3Tr1nWhWc!@H#xJ?Gu>8NvHg2RT!6-J3F zYP<|3MRLs0&I_P`!4Sep2s3g>zE+z$Fnc~>yCgkaca+?*BbKQF_F}VUW$FpX#&7KQ zIHY_(try-yH1nA5vsfn``wAQ3>uA9`;{C9`bRB-v3-~(X)U)r2_hGk}gz09}56}*_ zCCUgEU~K?np?pj^FA;C9*BjQLa9~%G>cz(qFDm57D*z@8ljBjRB0GeCL#AIn~f7s<4 zgUO-+ZA0wHyWn%-Jpcdkxqn&UmYgz2!WZT1Ul-m?G`VWLV&N&{DV|N^+ZNtc;}r|< zs_Tk{r`(6)-12j|g~y*86@QIOAYA8h?l)maaX+^e=T<(u`Oe?q`;uMxUsryF$QODG z!xu2Q?5Gk&w;vU9r)0F6vXs~w90W$Nn2P#+1e*^0B&Z(S{1fujnkM{;guWiTlb{nX zvTEeyB}%G+sFJfpb*jJqloSgwU&3uaeXA4>zCBQOe$>W3>kT8_NL|nU_y=B(KMDXs zTh4D#&%-ZW`H@PC_sa@Lnyy&bsRO!{@tTZkv@k{Do(91xLe*U&GzM}L5r@H>D&@|> zrVBp_n#Vf-NbhRFyCS15WcS;h1VD7XZHC^Q(yZvsJ6|2ybl?3GDIQ|}gvW7uC1(f+ zo{KtdH{GOB2mG(`_S)a2f7u%_7hg!3%ZJWxPRs0(Hs^&B)%RiD_}n;ueHAYRKacr1 zA8oz{^HlUry!620$IPU>mB#`lJHGh8+2Y1*mIy=gRK6D6;!Asd}yx5a@dy| z)lOPgVNC_f$s|K*e7k^waH#q~vA2+?d|;=;ZX^8zK>|-07CsTFy~4;ppyV`8G#ynn z@Pq{PIiexF^_RvG^u^X}VVf;xclWrMI;wG6do0s_UHEl9)!3fIT+Z%yZaf!}JodQ# zkk_7&RCascO9M53pdN|^dFf>|Q1%{A)bO(^-gja2p6Q^6u9uOl-}Ay~5vmq*{_j97 z{~B{nliZAk?2tNM3Bg=Axk$>P$h`^)ekv7Ly0GyvdBj&3(w{u`)ojN6jdVb9tb$m8@>$h$9NtQ@H$Ueil zLKXFUyg&S*!sD9${6>0l1uMwkny=tr$ee)63|iUl>u56c2>#r<&N+d`L!un-xZZJ} zFX7ZrPzA~E0{a-Ka$}iapw0C%znmm%Df5d8o{;$!`03ox4wK2vPWNAR}t)A?I{7jHv&#w%zRTdpG(ImKt8T&LKgJpPL`9zG1tzf!#lHhxuT z3KyE^$0{k6$_gI_Ro}}PzyS;VWH3Y^0kGgOAW0esR;zIx)op|bD8Y^BvYlBhrga<6 zdo!g?D+93QMuuw5fhKQmf$SUV+eKkRdjcf_4!}Vg(m2%fqa7!d!!_+_q8GI2atd1c zC`2w~qp&yCGPw%$Z87QE_&5(Tj@~xEvoY(Y1eM_}l%gD3YZ;YET! z5PAgW5mLvtW~_Wu$yZUKC$gZ*sZ3z%Do!3e(p>d=tSZq6Drq#_wF7~SMir&oM3&7u zhyZbonq`RbWvfZ)^dToW*Flrvq1sq|tiRM-zzy>}lnQ$AFb~Hzss2MQ`cT}xZ3C)| z$LT>kCwCDk%*y!uN6yX^=KaCF^{!AWNQ6-9#(@tHr1F(L?qu(Wi}K{*<@&ste0S*e zp;7^-ksqAcd3@#a*N8?N7ZODjV-dHgKM!uH3lr#keNcF!`FNC>Z2JbXD&W04K?Tk= zJlu+(Bnc5On~gJ3WZ6L^VQW?*5ID%?GOZ&VmRvG@suQm)N;Ab#!O7S$FTrBsl;k+aV0Mbb2=5)blW*=I&7RZ zu~@owI8E7QpUX?oHiBS=HILGgX7#}EpdcJQa^U#t@x8m3ch2vao1JP7E)6fqTCA^^ zf|MRaDG{l3+Wnw?I}@PAy_89}Nowu~Zx@bDfrI4$?xrZ%W(y1T1|3 zD#*@&;5b@Ko~|t3>3l#eXL6;_lx0y`mxEN7EibPfCK{Z*5+}*r0ordz9>yw$|C?T$o!r4t}&L2_)!hI*PAO_4dSG&?Od%Oa6(6OZ&%==mIj9IT;(L zHf$Y?$YJ<@mI=ZGF;6%k3&54gStLRpSaP^7{~Pp@_{}b9Aafn`5wxxg9JhjVf7XSU zH(!S6t0U5bte=5eDe2L0vy96Ei=|5zI2?*BaM?Hu+O0a!F}{rM9cEse1}=1)TQv;h~7(dw<%pd6ybJ`hcv!r<`u;wFD%S=8K0_#ar6Ake9XFe%*GydA4TT+J5( zH(ZB?gI451*)^CHkn})|*!{!k@x3g(viVpvAR28krZo;WKrZ+bMw`~wEd^{gMG82~=uQDKU^Pi9k^?S# zryQ_Ygmovp4}czXGfY5Oc6n}ja$8BS%)4^)SZ(4^ZNKcG-cEzo&7l|2gV?{X7+#8RH66K>I%&(WA zhV**Qb}=|P#B>x5Ajqau@fg>s6K9@x;;aZ2bhyi~oqCiL!a|J>^9{DeS2#y$p&3L+bOOGFVqSD_R zb3#wRX5^e9StQuV>_Dzv zTN-t+!!N7|T0C(h65o|9wj_QRXZ+kUp19*OklJU!9d)woP`#%QF|Aaqie?g1S8<6+ zHc^aJ-q_72W^=m%3_}xrf`HH&0DTZC?%5%V>a1?PmMCh4L%Yn9E-@rpWSOII&Dfnw z3um_#H(MnPZJzDqi!4pV2SEXf0q$-tBU2bn9jGmih*B-;hoG>H#5sl%`{T=KW1}J! zM)6LluuMvz1podF4{ySRZHMvzw^F&DqFtk`diP%7 zRw@0ZWrcD%iJ7?ouoi@s=90V(42I5afTIt{mFJT(>rs0t=+JnVC;kNefIE?>8ISr4 z!2+SQ(8aXzExb+4)w1wfdbq{g+v?kH4&Fw?B1#)&=hz>hYef?Af!mtqY$o0lv|07M zAaCjEB7od&3gjAcrQIN&%P3~J4pgtffa`jxJ|k61m*~U?7nB3lXy~O@ zN+FO-Di{D9!%L@7JE!fgoogtibC>!W!RfKN9&ae4+v7SuG`UNRIBZ(yU@(-`qy~NA z6bt8aX3VBP7szEi{-Hwu;$*3BaDMbdy-rOamWgH~eTg?4t>J_>ibP9M=)ufChM8N@ z9S+z!P1OqwhOJ`)jgC|mK1&yPQ_b+HQ|%!tOb@^d6MP<9*dA7rSmdd-YX~}uO)yJd zYx0BfW3}3`@$qBT>amGH(%GBzr<~3tJ6An2I(oEHIXXIeq$*VpHV&Sx9UQ2w4hW2A zS1hs1$QD7Q*=$1G3A?D(8WH%rT6h$eII$ZD?_JjFMS}hTqUN#*G-m1vP2l1A-)_J}i8E1S!68H1%f;9;*mrxsNz zd)Q<3s;#E^{_~R4^q@B2ELy_-!OZ;LGjk=iKOd+h?i#P(H0XDghu@kw{ovS%_e}gc zQ9S{fcn7HNMAW<^Hz?IXaM)icE)rr9SH_*eOFNlUsp`q#tq}nra|+>9BwKFj-Nxz5 z7G}<;ckN1_pP9LxzTZ9*DkB>j8>}44jzps)mci=T4}9Qkb+Gl_DtD!#-fe5|xp3!G z=oE@mhy*sF5)tj&_aT0U30Ncv770)n6Cl?YLFgDx@PHrBTOgvxP!RkB-H5bhfnDnQ z%i*S3;Ei6L9#2e*PWUKI|A4Ki);@}da)G3@*WZlZr-igLSG7B{ z6urmsAS!tm5{L}Zsbq!YuoZ9sJS&2fbrW|Vs+4o7#fCwOx_Uj{qG#^rfzj%~OBes8 zzwFXTDe3ropM0!7v@m>P@Xytd?0w6n`fY>5_s^QL*>8g;Zp2T2fVZv)$C^h9Os#b} zQ8z-U6HYbIs-X=;G--Hrvm+6A;(4ze;DD^vAgA3gIvGbpqEOIJjLnaVS^>9!KCq5i>MD;vb#`qpQo`zY^^)$D)$Hyd#&N&ddyDdY5Lyq2>vT6ixM& z(~X0b!hB!zj1={vS+7#%p%%;2lfL_X0zp z^ZW#{!ucm4oNY?T!B!a{LMVzyY}A8>{SYaPij$~*fl6is^vo25C<)abo&~fyrt8m; zs-l2&WPT_Lm463m8K0kK6-e0`wH{;pSbF;heo3M#Jn3}NCH+;-;xMU$(fJ#=xXG#+;% zO`&!FT4v$Y_@^5)NxNF=VPD`q-uC_eyPg;nP0{G*rJ>(hU;pZP5C`CK?eOO&hU z>&bX18_uG3zlZhEK7qH+mxq6C$pfV}6y@2nu)uOS30vj{3V!jh`ra4LK6GyN*0FQ5 zJI;;Vx;l63;OqcOX>T)<8qk^Pl!)1;>gjqY=ysZoNRL+wNin&}kS(bQPpUJ^jAS8}kIK^PwE;|* z3^HCh=64nS{(f)3tSjwk^WXT|z|{RaU-6bgCVOWx1O|)@Wn`o_JD_2xvu#+E8S+YDVtGAZU0hvVTs(AWA?C#YVlk)7<<#GM^Ue3(bMoXp zrbhkvabRRaM~@CQ$YMt~Q{hwWH&M??&!_xd7*b@op9MH2bhZZTtmfosI_x^+19E4c z=Tf*`K6}=jsKwNh&m}ospN*l3QXp;Lc!SHy>l*=CFe{!F7p9sM3d$fq4Bi2-e;hf6 z@E3s%KsM3Ogid$rtPqG(?`vS1XqH740^_1u&TFEBS~wnD(kAyAkQ6 zKGV=bZMA;CCty(P#P@5D*F9#RiQi}$T0gp<(i2m%NiX->} zPPPRNaSX6lr&4H1+d*+kn2=7!W04T~{w4|KuX&c2%O=wBkh@4po+MoVw&&kacFc>- zpq1C;(ChjW>0&YME1EUI#^6vkytm{JN>-mI(Of>DCwe{HXwD7|PWs*7$Y!O!e&cSP zZhmwEnTR6Jc>Woi#oi609(B37XaOFR%L2{7l(2n}jj94y19icEM%NfHjP@*5>j>~a zxpx(f&{QJjXgL6^-fYrqg)j>%Q)vZPJmlxg?vw21^9|p^o@5u_>-oc_L;0nCW58^| ze;REy9?JVfYb{ipSegwb^HE#G$k2iH-s6)uH)vM(lqdT4)f}F=k;xU)j=t&?!q->| z{oXS7;*sXfdcgg5;tDgcN8n7z#KvqeG2t{N+Tt)`2o7`$bk)>)ADnkUdUQl4_ubK& zZYeq4cQ%`|s`P-fGeeQ_NAJurX7}DB6)wJcH}}|o#`b`EUQ{gdIs#HRMPKbLLrwdrAm>IFX2xB|3?+XCe>Q)O}Gon4frkIw=6T@e1Cj)@APnaaL35V zj=}Qq^xj!OsZRWJh2rs0D4EnRjSnv9G`UEkP)I~_8r{O+_!9GGqR~_;8qI9{%iPHD z?A-A19C)Dzys*G|p(LOOnw4qbYm3x(adYJ{FHI*ucd$Vr7opx@UTOpfj^1R04vtnl z?6%mKk!td;N%WI*{o6*r#T=9wAe{FxnE@t;d6ZcmtP^ZKm)> zEv3ZM{ZA6cNx}(#-fS}9 zY3$Hr^89LB)fkn0P#^-pGPdX`BxCaQpjPf1U^5&l-mGu^n4?Hp#@O}1F=VyCxF!B1g87ttN0z4SLw2V z`WbNOE?#%ir7)d0q%hBKt1;PW7F2nmF%LHPU0Y+4aHdsjX-pBClER8gqGv<{`(t~Z z$*KO!)S2w`^^_)bCZx(N_>pub&Tj6~nVXUll2L>Ar*K#cjKyBRw!V~w4k>ql-M>72 z3E6Zb3KI=(*qy9LWr8|H-GOm^ny(3viFmQ7;Mg(00DX-bG14a5~i$8PDS|x=tDhc3`tx>^93q!KyWDX>H9$t=agf zVAN}k`bQz7En2$;9+`t_t!nLQ+GJ$XDG3cQc_PcSh*(c*d5VG{!@3J)5NX3oHj_vQ zXs$FjJ2O2wF<7tQDAe9U=3w?3Eoh_C)~g%p5L;gt@86O!svA|jrYr2>Bg7k zTDGISyKZEG)W|JIFEp%=oVnH~+|OmvZ86wGeQ1&mAE+&ktZ4qG(;IacE!Z|Mqx}U5 zuLvUp_LYelP%yrVZw5Wm-1G+hF2CRH#?fcJ{(?VG6+V%$+vmp7rfs|b+QJAG<6IhT zYk+~9?Kum&{HqN_HxZ;(`*76iYAL;@3rJE-X$P|yC8I^UXh*g2%LraVS5O3~;Zx&a z>$5n>&uBEQ(s_QyHMH0@8F$rcNy&E@aoTpfA(EhR=niejw4a?0_$buH-2}E-$)4+*Kz=LI!scd;qD@SVysN| zyRc3PRu%Y7OHWtu>7nNVQLl4@X5)E2y9vN{KN_blT+8`1@cgcyOB257hSc8PC!UX= zCnz~a(14q8nBjF$*m5@tYe4ITZDrbn-5cs9+xe6|SlI-N!ly(|$kje2;P)={RcSW_ zYPKL)EabNCWQ&eB=1#uyh9Fo_@Y)b89B*(^QWo4nXGb$XLBt0i0To4o&&RNNAB ze_A*!u_f@E7GA6Ppx|1z4*uOTQgI@-0d3{U|9qhBvo{3VK5>ISs25z6flS)sgTlPw z-e(DkrJ`8wKy3}af_JMAdN4IzY@@d6;mAwI9=$8u0o%f=PJrfnKy%p#oo!BS^+7vn zr&cnoK;>(?p>5Lr^4!oTehx1*j`{4ud_qE>u-M#TX(P9r-lXDpwj>&D1bCz*(IR0c zmRcLsk~VJJ%zEiY zZ076hG`!-qEL!XXQ05Tp=bvAs>pq`wr|DT{w z_Olx>kVv1fRn`!%Tt}Y_cIy+#U)Ua`+@ep|>QxE_dA)3zCB)0nCogW=uhJ)S5kwkd zcw4nHys1_|&|ouh)xZ{(spz3$UIDVL{%O(um#Kf)^7RxDXq{oZ*?w>o;hE^O+Nps$ zR1cV^T?MkKdNAW_K$@GyEH@5m-k3IFyKhLHV6S)~ z+PQYbknL^(nb!*$l6<`~$QFTvYlR4oMkJdGUE+xgE)k-6KllI#g*sJQFAf4lIRUN> zZ~PSPS~h;nteo$Z?5go)A^7Wy;jhX>EdK0UpM>Pln z;gp2#_fec#4)%A_K}ouAQ$E%~hib>qVn!jxMo#(RBg*&o8n;N(`rcZhXR$*aknR1= zJ__~GiGQ?0_>bzKsE7kVE) zcI@Ha!gw@OlKGgugUhkJ0ABz+g!6ON7g1&;SBq&iSjMeIW26Gp8Yn-kZ!(gP<}sl# z4xP*yP{+mb*1WF0JsR(6mQi1$HQR9*bw#%hIX^e`p-$8?EG1zWbV z&@(-jiPgeAwYcPq`8=uoP|~T9Vy=wKnPn#`@zzR6fnqXR>Gilr_72XS-oLjJEf4HI z7<-OdpCNS)+eLUv_*1qIbMiIaZMk=Ur_^h7yx_eG#h%*aH%L9<33fO89;#W-Ej?`k za6>KlWdV9Wpd1^npj8O2JtoTwT(e&_%5~MK&fDOSXxIl#kSkqD7UQjG+t8X*29NgB zy({J7N~yeDEG|ERA5a2VTJFO|nq?3Bb5;fStqM;zjeDl5DUVJoqT#uG6lfS>aJ-zB zsj*?z$h<*RkmJp;=~GDCSbExomrJ#be|a>lwrvMDpXY9LtS3WkV0f@th=dWJ!P)A< zDqAI1kfn9KK`e|4v^0uhkVBVFY&1p^k7UUC=>lF{0e4h3^zY6@#~=uBp-FTgOwiE&mj=tUoM$!@|pQ!MZE z<>N-9QIc@VqS5N_5v{n@pL^t&n^vp!+Z-s&3fu7~v&rKznM3Iw zd)SY2Mj*7bDy`XsFFK#yq0#wb_DDKlHhUlwl8}wmO-Y4>gk&>D3KtD4z?h67s0l~_ zMSUpGM64FUO%j&KBt)N+s{OEQ!KE@i_fz_Z`$Vq%Sd7542!fk&K8MvPsus~~R#-ri z4dtmC(G3E%u@c(1fh`SGpnN}t!GZz1T%2on&=C*bOao_*@PA%iwSj-Sgbt~TIKvP9 zR2qr<&4v4ZJ^6~?Etm^W;@|xYzq|`S{AT#cya+T|uYPhVySQ;!jl{Vb3k#X}^r!{L8pUh&h>;&EieN%^+T#Vdvo+wT{I> zDjjolqD^S%-20r^V)Lql$c@#0&_t`D;ayN6lb|jeUb!rhS5ikOuB`Up8Mj`Q%I6bmo%{3)ihixh9|+DT67xam zJ*~g^HrE>;FR#|6#(}=qzR@MQ4%PPDo5_}p#!@zW@1EKr7oKOtyG8MCNy;Zg0X%#I zk6RQLNhZUh#)ZSgP3suS_RvNaAv-C`!6haMOfE0+ZGZ$KGJV`gIK{gfqhYPa=nn?y zg#tmpQKJnRZxtR@~`7!}mDF zUd+9joZxKQJS0*o!hLdK>efWIX#f_7YVe zJgXeZln{jYB5(xQF!y`hD0|3xa)OJw$N`ZJDr`ZrpTcOB4wcAFg^nw%3ZH8%(SDo1 z>Hd}d8+X9Ad6(`>WdFC`jJisIO71q5;?Z8Bk`vpun1;_rT>o@jq z>U1U6;TX;~Ggn=~`r|!>|G_EbZaQG2Eb^toa)B(gL0ZPeCRr}rz@&-WBcfZmbB9;k zM_w(>jZ#Z!!?k^wVXY^uw}+jsP$7}-9Twe2R2(>+E~icx3dZxba%B(EEg+m=6YNQB z5v!p8kV%j8QY(d2Cf$JM_3D)GZ16QY-D`Bac0HkdKk+7=?oGNk;XnC1Ujf`{X6v0A z8T{Yt(P@4(R4x)U9Dp}WycgTe{n!~9O#52Ce6rO;5`(`lqK2wLM|Iy6|jj$_xgM(rLvPQv4M$v1&Pj z9fm)I`yx@R^R_gLnQh>)~aYK zoWMe$rMla0uecpnZMe`FK=_v*!$b8~==_4t(_}KpE|bok7)YRPH;&a#B)r(f?s{G2 zs+KENyK(^?tWjc+7E>X%q1Q==@7gza;@+wImnGHYfL^E554Lav^qgT$Wo)P~9y=V_Jx4edun@O5kW)L|OkrURsf`W-)`xpF~Scq1AP|zR`Mk8Ut z1-+W-&zc#`e(A8FgR(H_#Iu3{7?A;auhi%a>#L?j(YUeYOGp-^#Et4iU5`W=^cd$nj)KQ{Az4@uff(`}|d*8#)tTA!< z6(7C*k&m8Kv7wtM4112NqsObmvl{jM{qxbX*Pk%KZyz9Ss%lUtyfTZScK7duJgGC2E(k#1iRtlji1OoK|FX=kv2rI-?sMv&UBA1Nty~kUvpz;7>n}DMJ zYkW#MB1s-CM^|wlxCrz?LX&>}#}VT63q0=UeG-SR0Qpd1MHHvLD`lN%m?+nx;hd(; zs!r-MMh;91*=p4&@ME_(CAZ9SIPVGUhk7pXd4+) zE;N%m{Rj3PFD7@6_1-oxj-wdK8=J(IyH4Su*G)1F~xkYJ*Wt@|oD-EQ|=0$?73i5fT**Y6x1u zGa^(vWlum>i^85or8SLXAdPU6&?;y&4crY&_iy52D0sgJD(%ew%hQpLE5LuNvQuOB1pG5~q zq9!$h6mCX#oha-LHmjWNitsS@fe78h1L9f{ywOGfE+Atan8B~71wcv5u*}eU%LnEvG{i`EGtNr%1J^R+y z_U&04)4AX0)5UtcQI*<1=+Rm1gLaMjfLr%KJ%G;CRLk|SY5|fl0n7DN^X7z!sf?ln z_=C8UFy1AYl_)GR3Kvbl5iJrTPDYh@)@snBxe^7Je0Jf6JEetB z-nAJWbyIe`+wQP??JkElQeY~601iKa%Slj5)#)T~0!_?`8bDSuDn^;6kiWb_mY4MM z2E1;u@p6yocdR=CqE8q0+;{H-#~d!vCk8EVGW$gDkPJJb>4?W0PYo97q#4|k-Hm%@;1N6n#izx0^8UhCJ}zWcHApmX6Ll>e z(dbrnjThi^SejEk^xR{h(&l&_Ayxbn2>*!;oe^*@8^oLH{%uffCvKwRH-b;{R`%A7 zTQ{QY%*LDf8$8MO!-wys^NNt^t-gcp%@F1Xf!(A2nH>E{iFe#}P?%&1Su90xewV+V^eHG>&&cZ_Q+^$EC&r z@pPyxR0Mbj_4z>I2~-rM5qOzudp7(}f4D<{qm?%MMMP9GV*I-B;)t zjeTi+u+gU(Z$9H^U;4q0N1J^p#Rjz_S6;&ofZAt;`i^g6d$HA1HWXmy6$$^ z%#lKfc*0?~+Wt10meSF`y&j8vKa!#$Hmlu191|);%vLAKnJa%Go)wqTRicObiT3zl zzdIckkd-$P(5M-T7yt~R5gkgYz(^>TQt@7VDq#<$9e6!zu33#*rw7A_q*@aVjHW3{sTzZ|mFANm?j1U-CkAinbIn~pxdXXoSV z8_y+PFYTIVGnb<=XyGgWfs=!FLQ8~!aSRHh!adCkR<)>Cqt-_fciNenErF?#(Pc0* z9gI8dO|(HoV^&`JB}qKVo%@~^mWZJ9L;{v2_zMvW@lBV1srfFSkb`5EH@n}h^Mu7SPPNK0Gb(V`(NksP<{arw1EM_BWvT#=%*2W2J zGPQoRF|%1ft9wB}H5T-<{3CY|2s&7zn`*9q(>1Ucx^9|GywM?!Zn^d?$@=;wzo-0) z>PubI)<5=(&6=>G=n#rOCvXDC&}3tvzl6nsH1c^Jh(Nhxc00v9(V&GS4V~1CpWx(T z=iqQ-1t;QBWJu%0fHn>zjgENZ(#ffOx4VA$LzXCtg#`PdR55vs()!&ecQ4*KG56?x z3BlXlrt#{;M0I@U;_BM&@wquE7Zc~=S!r&LvH1n#>hv&%RSynL-ZG-wv4hRA|JXA# zyZ3VMg|(x1ZoF>?Bt+`UTg0y+0MduOhjU4gRHZ5-XC%UO1{IDHHDL3Ru0=_oUaf(* zp*N`YhDUL-fn=m?1Ne*B{_9v){6r^5$OV|lCs{@TpR|tBy|hHmFDFed>!_hKanAnU;3nXL_)d_eT1Tgrva3 zyCt+d89Z}j?!l$K_fM;j967je`sRDJ8%L#TLA7UHJo3lvo%KTld+viA+T<5PqxZ^k zD1^c{VFC!YX)J*1xh50!x+2r+3(TO^5AzfH>$iz^SbvyYbKIV6q>!}eVYGAuYom0 zZY56g!lt0p9_)^^J&qpc84EuaMDg*e;C(1r{*`;u8C8cDok$=hD~&@Boe(VWWn`Sf znWjN3<$v*;&wu)rlGE%A)dC)~#}tBDZ79Xxp|j}QI|P=Bd$8*BzEh<&4BwncWSYPC zTc!GMdHYYFPk-Vy_rLGNzI{xmUR!7E)8&=mb5DvNV}q6Ip~2jGYBZS~P4Tbq!C(4Ap^5{4OD3mvQ_e~#)K4RmNq=%A9v^|L zNnZ(niCy_5`>raF`r2`z1h+O%&JGscFi|FuAzFvKMn`_23)v+IM-kaC7qOEKq6$J% z62OyG$81C$t$Ljd7w{HqwL6!$KAroBTQ_^2)<5 zLGBU9uJ}HeTWn@^_M-=MW}Ppb>1zZAPfkj~ zTsbaDwz($D3@;_`UXzLg<vyEIhBM+azhwls;0TrXJu-mDaXwG zsAHxQ zxY5Msjqq0i;U)MRH+)A4DMDkw$jEX*r>oX0UE@wyzmc>;X29TJA^-o^b|v6(RoD65 z_vXDf8qL0FG#Za)o@SF~w2fv)qtzZsmTiqJ?+bQ}Wm(uV5QA}pF(rV*VmH)bE0m?A zp&@C%HVuR(4rvH!pwLoc+Gc@|Bs5DCnkH>&fYfz^_0<2|HzSR_fRlceJ^Neka_+h3 z{AcUw?*THA&7=zHLNnr{T`sqV`bW_JXi)=4BxSG+J94RjHhPi`3Xlolxd4R>>V*pN z68j+$H02N^@sfRv)$c0gH)W7ix+Uj(=%KdQ-mYA&W$Ds*>)y-kH~BjfHF74I3oY5s zzL2;rH!^Z)V)G3nfyR$IT9EeL>;6-RZf$F>N#sMF!Cwxn8Xo@0_a3gV=la>(;_pGH zT!t+6dy&On>0?$Z`%@#CYPKTV7nZ0=ngO;29}x)FGazNYX@Q0*D}n%h#o&~{CurMa z!a#p_j;d)<{S#PM>g&8NWOaaxnMqj2mX!duKPcN^WU8iW zlrbIdVc>t9@?lm{o9rU{?!J3Bm}kVx7~3meW?p;G2OFYk?EmKWk>*%`U0u+`R8fDI z{Zf2O3c@Ed)?Vr|TSBpPC}`jO@Ln4-q&Gp1vCTZZRaL()4o~-Vq|-Ny+vFO#(^fj1 zO1BrLi{ke|`-WsB^+Gc0!uVj#ryB!E>#t;ZAbmY}7_<`Fh)j|ynbad#?6d)?*uZ5K z3G?|bQYKc67Z-bFxv~)nLQftSM&1I=?TcgGyH^?|p(?z;3#={+kHZS%Cpt0oR(QFP z5^Bd_aqds7&*1*7C2;$LSNzox54s4>-b5-%mir=PSXErQkBs4c!u&zNmwM>LSiFqT^0l}0*xG)|L2S^9% z#1t^k3hDIq7V=b!4PLy7rU z35x~`2@r?zQU*G*5|K}6&7omW-QX(U($ovD)i28y+J|=7QO`IPZVFs^q_Ml`Y!7Q+ z{l>;MYnE=h(qWA@w?{O)*t=&$8)&pQ$I4_|_XjV12_&-Tl6;5VoAw9n%P#He zS#kRf`WYe|j1K<9)6i)9gtrX&$Q~nnX*Eo02(=K$%VG$9i<)Bd-xkk0tRnI>Bk3Qi zHvrU`F)KzvT)1^Z)`qSI#n3tl$1hzyUIEbpJ^xEGsNc5c_ z#|8lPIRmceR@n7Fty_XAZD4Ekzs1iqAIOU#HA_JuC)`r>d0jS(Nfwi_NXU;(8%YdJ z5~O?DlM>jVW$fg_5eSG3dlA(rz)B8Jz!e=;t7?p@Rl#BczXOGwKl}m*a#0<3&86K< zL3dNYWuan>g>0491Ca)U0yd`tfPl;%g=YYipQx)M(P5Z0b(R0e8xI%P-MiaT-_THR zx$e=%`%KYLqF{XNZ*J7I#?blv`Lu17*G=c2f5Sg~5UTLY`pybgC{!60XNp=LCUd^W@!_1TCP) z{JFd-k}%UQ5w!qP^J5L82vB(`mwoh;1H&RyHgAw^YH!Y7zwBU1>*$O`EDEaJXzl&} zfOywkz;qva#M$5c>hiI0tzrq=mLBQ#*W27Nw=G_3UUq2?5=?4cF}||UIx>_30&BP1 z@*ika+_AH_=d|#jW&rGK2FI;aw{KTZmg!k9&@ro|C^D~Er`x}-v-0;P{ zEbkp-GhezP&>abNhrjf)qD#oQ0Q65hh4F4fz7|M}kg$ROWqqP*fe{eWq95@u*lEQv zm#s!pVFdw1tSU2Jw?mTaoQSbtvVd$gfB|_?xiG>Y%ku)vck)8A zvl?vhl5aZw_mh0aG}fQ$Vy}4;|rB= ztIAlAu&NpBlG_(C3>=rCB1FKgAh2R+NEJ)s6(k*%W3B7(2P$53$&C%YS*s#<^#pJE zzz)>Q-SCWac}L%~C~ov@f5&piGrSg-{Z_jMQWlH7_Qsei;-71zvi)?rS)yIk78XCH8{f?Jkrtb9*t&SGc zedyMH^oq5k8!WqhaPR}!TkZSl!`>@47Pe%_Rwe-bUWVQz1Ty5P!t>%&e8onwZ2uGA zcTjf5BqU8R9#~ySPnlWJQ?RrJ0J5;|TP!u(xSmu?f+)F0cL*SQgT#GW(hBRS2C5|~ z8*|F>#d#)-O}c7o@s^}+AB)%{*4-W?p|fO%CK&sxXDkD4CHBy_@}t&?lC*uo)lqko zJz4MX_J5%%X186ouEu4y_pFfZcGqwxqF%=K)yiG**Ze_l^F#nA)ME0JX%t3^MVJL) zg_n^m3=%WD31liFttV%vz#u1URI|jhUOSMf)zRocH84LiJK$^^1Pu%FUu!V&Q9tlf z2U3K8C)5ZZwoXdJ8+9>Z_sNxAQ><&-!0a#B@Y>ByQ^6(9IWeVct4757*`M@H_KI(I z?Htzsgl#G{X|p>pn3dfyFKjDrVW{efQHRivjM1n(j;v2Lgn%M*A2QP^@H<3wH6#N} zKsgUxSzd@k-$%+aj(g?>xKl)3Eqn{~Qy7e~0lwGXN2)wuU&x=%gVXrNXSR%uy5nbW zdi4SDyL*1GcBr#@$Md8cZ0)=9)!SWiY(>ncSY_MrHL>z;Ckl?aS@DGUZ_wFmg@IzP zf_1}VD=`rg%<-5V0l_rTUYZ~R@%@e4TWd|mekkK;$z>+DR#H@58lE+mL;PcXQhyiE zzY-^pAD{h0cJ1-w`tQ;{1S^C1InY3gs2VxMI4_>xU9lyt#+^azqHsh;za+z6fT2ct zO*19;Y!2@`(k?{J}FTFIrAv`CPzdD133!MqT{!0y`A^%pPftgWlPI<Ho+&@mP8*{=!ScZ_Uiippv5wT7MFB z(j}ZRD1r(F%0N@dx7L8f=^H36{2N|Ju>5mH^XsT(COFN|{tkaFyRoamzAeeJQFA&x zfzob*6D8rD&WN)@JbA$a&Bk)@d}o_ckL>~{7k}N`5%h)SNH|7ES-OhTibj;Z2bcz? zme`%KJV}l)rq-BE_~iI8m-rfCPJAxsH(39ROpLXjJZXCItIyk_4UBCp1j4smpKuR+ z6@YhG?uPvN zJYD%w$cG5>hoJ`XL?W_iqXV@y$1a_*Zz|C~n?f?GKM=g&&`ZzsV9>vw#5Q={t zy97+{y`t`r3W2y`8!NFjM*LhBaSUtO&v2jls0YHcjW~>c^RZ**qeuDk)5^VfD|g+c z+ASc${zKXD#;s9iq(xdaw;h@xky$OV)yV05x+53xrBDK#>;z%2xv6hgtm zfnXKeAmN)3EsZnQ!>irp1ehrpPG(kz6)?*}#IzB~Vz{sn0;w9ls@$>cTb@9`;|>I# zVx>=)-?ICHZf`?_*BxA8u{;>`(0fl1l3E)JV7xwto~S}cu@%BBc;wDLHlFyMl@)(uY4RfVZ`dh z^KqZ*H&Sz)KK=M7mB;K4K7euU5{|MDi&0$BLUfI?mY8k@8xf?$MS-9yOt7k@p0aa5 zYonXekglg2>#wlVYsSrgN#lCXRk1n2t>}HOT5cj;m0e01L{6XP7dD!@3l|0zptXm^ z2&ZCXrUGe_nN!B4Wrcv2%4!4`fItOi0GtJy|5}*f1cNf?7pUc|1xmzeEYi=g(yPWg zU1#(rD?GtoMlOMR#LXNi?iXZ<+@p`cfgNsN!V!2QsWnJ{3Q$8HU0a zOe9eYDvH}9PqSG;c!R~FOxaN3U0DzN6}B=<`oEI<7Y>{=0`ol<1=BWey$0Vfk=xJW4yk2t!}E9Q!p&!{b6eGh zRd^lyG;}ybX#s5zkd>V;Qli{RS_P!J0E2V6sF(>uv0G5qe*J6U0Ky+wK21l|Bdtsr z`>G;Dc+Y&~Ffw>ZcAfW``6r-aHHn+=(mL@?aAoC^6Vp*UHimTA~rCR{W!h* zV|H?Qj2FB<`U||=v1#}~yPh3dg&sQ)&N+nj&>&D<)~&@&?MWAGgH(qUFbpILY!`?D z6V=NB--8a|(yU;x6-J*;yyg#RBh|7bh@3#3RChJ11)G;N`#iAk$U*~as71fyNMH+H ztjf~Goel{xFx*qocPxauIO#QfARw5FA6a#{DY0X4a5CS%K07!SOiYcBUp27zs_nbe zrA%g|y~&Z+Uu+v}X|#E_53Jg_sj zC@9Y2GP(pG!bGwFI}}{qfOnPMD9eB?uv*3E!nB%N*Y;Wuiym)d*ln)K?kw`p@L=ZQSs@bXw+U27(@dG;IQ2bL0LXP_b92&&8oSAQ{} zk{$$LnxZHGien}iqVz=2x2RkWwkadK9ARDZE)waOye?Rb^TRN0M6wq=Zd=ibWs(sx zNhEq{X>!#l(4q2VVb12;DSr}p7TMS_PaMesOm9#r(Jg_qet*WIYO!atmyV@CtA|hQ zNsV2aeKw}47X54X?xp?vMn^C28|=2f)LiGN$*-BrP2IhI{oPZ!$u;>JM_uzvpN-xz zweybEtMAx3bw~8GwD;KY^cZ?h=ngmoRx~T|nKAO0(NGX)0Ne+bAz@ZvM~Q2aoo#3R zvq#y#{8T(MYjTMgKuqUcyYvR;J1yLAggqkUUZovUWS2v00=3J+HvR@h)exG9MZOmD zI7PQLV?be_KyW110?vZH*E6phuaZVZw9fnhpNR7RW3EU1 zYm9`Cv~4TOrV+V7`vBo{OqFK{;=E0|2@Rzo0+1og(pG5v9MP6!;>Rcr?QLpu0gn%+ z)jR`N=5F&EV;aXNu(58{|3Lg?$mYHC4tgSm1Nwg%v-GCuLEBWJsTc-d9piFA)tu8oYoQuSO2AMI{hlmqxapCPZF%x$H`}o9 z-^F!wNMtS|-onmclp$Nh!hw1xoLaHG2}dxA+>iqY0)%eB`vS?1xFsh=rs}8$M9D{N z8^^;eFdR^$t+{k6e_3WluGJr*{MdoHH^dK0 zF5*vuyNG}b81)F5Kh#i<>TPKxq$x)rLh}VHN=eIIK;k=V z_9UH-v3-O2&0aeUviVqY?XcT6($N)Y^N#FZ612Mgd+xa;SsL_M9N8rUQ{GxsN^ouc z$m*3l64u)O#KbL`%%EycZtNHTu0}$=CEL1zfk(CtL z4!>zt|6x(@mkHy-;o`LpQrGziK$u0Gi>%h3JqAub241U2BH_|)2Bp(D3>EXa zg|S#US{xr5@9)hm%P)KHaq;~c<5HcWEzY4}VmaPAt?K>HE}5CR-O?cR$ggEd*^;2ro>kf zF^`N{j#?RhC?)KDT)0CNy@)kI1}Qb^>Gpe6q+)V0Pkig9sCCYY|4o~>#x?O^O}><} zvml~i->|oiXU(&B(v=}5c8edxl@rA%2$XWNSdqL)#(E<$fNwTa)Q0tl{87mJjJ1nu zA>IvxDB0-ZF81Zfu4{T2yU`<3zJ-9V&*&IfLtc_9GKGhohA_KG>tn&iXpf_ zPzS2+VMw|zAKfF4lpY0$x#&niu2b1R+f$`{&Fr1xL34JzmG@!78r`%tULW7OxrsW- zuRn&KT#4&L{{sYsp4e^BKoA{j?3-MoF>d3=kl{9Q&LxoF9PxSxhZ3Xut*qyoT@if+ zI^_$fs>dsidntpImp$#$N42SI3Zj0Shwe7_UChWo;%?wiwi+aqGZ>VgQ36S+fW%l} zl<0;Zs<&ruQELO3gj6YK5f9GZY0j=rV?t~+!iZ!P$9NAA%>o}l$U2T%i`gVqG)|s^ zW+9;wW_LTAMo1BeD;ptC%0ZPambbQGY&x{)A`;wad_fLf%UL9wQqR?@{AfJu1_g z%*pPY&V6*A=&*1&Azrt*vlSvVX1UUH@7&#DN@_w|l+TCkl&i_0ibczGF@aPs*)560 z7EasKl|jBhJ1W!@pZmTvD4qg5b5>Tp+8V*bkl2(|FmkgXmmsp>!TIOO4R`M!9Nd5R zhVpAu)qDOO_Tq)>CI#f0!~ha{f4-PJikPjAk5$fd%Os>Do+K)&mZ=Qd%(_-)fY zJ=3?1mtW6mQn+u=ZKcv}d-^J`BrgC}b3&6NOz^$iNCBnQVWiZ?_X;7szp1B5>xpVT zO?Z>+DKy7>ds#p$Xp!zFty{yJhMr`ihoT2DGL3W7rds&N&1XxKVS@JR7IupL_s8*c zN+a_H{jPoGJc}bQP|@_)NA@|2mS^ z=JD*--_+myI6U^{*?09EJIT)k_Az%xa)__t%=5+>Qm$I0gUO1oo5a^=W2Ap9oKcQ6 zo`()!E+hfP5;y$G~8 z>&u;D%BfRm$--H`R!cm<(NX<3nmhHKuY83r75o~t!8@l*4@1fp1>`IOLz>@6F%7hl zB4@9cJVJT3!O;CY<8(5j2n_R!3@X0-IobK)ue zC~t2}{1naILYoolegXgvQJCLVBcb85b>gRHckt%xN8y?NVI05E2bpt^vvvTti*^7w zgs@7t^rh^#XD#U5Y>#org&xu!femq*MlW6Ej>d3L>ML(7lK4XMIL(@{W-l}k1*C5} zcI-3}G>&e>(VZd`_{uC4Tyi6GpJw)B_|+l&oP|JFi{_vpX}^Dr*?-Pxr=zCdnyahYUI&YwU9(}|Lch-sKs!A zp<@?X{T`!^Uch!o9XYn;&(W8YPn270^rmXG+e9_58l4I~fo`E;beD*@16%*wTpIxb zh)R4BsPqE6U4{(}^hybgtCfjLBz1LwAJD6L1%hS5t*zn4wzi*?U&S4*VS2mpz5D`1N5#?Oa^JJG4y%viGwey?AYVfLs5~T&TAuBbX*6&YyN_S17IX^f zkm%Gn5?Q-&{7Ll=xv1Z}aMp2tDiA*QW8s_7YrKN1NM=XUN0G;>{en5kCKl%;V?RD$ zPBI#)QRH-V0-UPnvtxs2sv%3d>C$|JsAXz0q~4r8qTVZxs?R^K-cEg9I5*7C^#aO} z7C0JkU&_K(z62T9?!Q^R_g?jgIEoA0u0C&!+ZD`*e%XW!zed@S6Jv#td$2@d3J@A1 z?vbN_EbJ0R+sl=!0^2OdVPqBM;br}(<2c;bHVjpFK)hnza6FTV4+E1RD%>kPUDgWU zKf3=yG{|8GkvFV3faR}h(7^#vyAsN=W)Z#45$#! z6@Yvp*r2~S4xkvo9^P*r^6P|Sf-F(EZ&kku`J<$I+)*E}2;h*PH?$<`Trr!)-Q5sO z#_JtnyTzIn_bdtd{HCsf&=Pk8UTDlC;wOYN;pa1rHH-5QK2{UXEM)tW9x=tU)%pEaEW>q!`u)Pwb0-&Fm!mEV z*F}dHXA$gPls8bn|9n{jgL7fw4YbcMjPv$l`2d|IFCx?J0`m13sS7B_fB=}0=3zS@ zf7o95_#@)mSwlhwgcpX)O9n*~2u)dR2qA=v9XNs!26fo!_IW(D-cGMytM}XeJtO@; zGD*|h!a*$~E4@9evpLp^-iFbtcd+XG6>2~O5W9c{ga8Jx1-LxZQ+W+QIpS-;OX25) z?xQ6YPH8}7fGar^%q?3gKyc-Fu6OgOJ<;X&1=2OOo(7lM_oL3%r4x#EO;;q=m7JEa zy7=12fkVH1JwHbdRXDN*M}4P!R24^dao!qQ;K(6%A3y3MI5I!$|DPj= z*ebM0A>F>hjgcyu^JBhOEb!t`6)#TWthb4xis$FUIJKGwC#!kzFnI8{!Gn=6ivV{J z;`{MmOwxsU@9<*Yn*;AP=Q2fpKE$)Bu zyf%A2UONq5`{4WN9Nb@z^Vn&F$FdiA4j9kk-JWy8bF-`VF5-ghh4XSj{Q+>-zXx}9 zEY#_^!1d1Jst=s^dh=WrUWymss4PW}irg{_4?!UO=d#lO8yn?()F-?%NA+(I`Ai`r z!D>coLJLTS0RN;G1QF%Cz-F-vfXw#*{!YP5t_c6sv)Svf!CL?AY}N`-;)?96ux~=g znVXkN74|Luxgs+v?AvF3ex>r6ON$D7wS0bAR%5T7_4zyH;|*C#Vc+GSD^icbzE}R; hkU$jndii%l4p7)X@z0f=Qei(djxX;~3j2{D{4cM!nEU_$ literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf b/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..247979caeb26c286a33cfd33234188d370c1c0ff GIT binary patch literal 136008 zcmd442Ygk<)(1K>`{bmOLK>u=lS=xjX{0w=fRIo^Cxj3pkU$bZzyjC-6&0}|BKC%$ zh!A@R6~$|>*sta4wV>Am$@{O_b8=3I*YA4Y_r2dE%$~AmUX4b5|595rnp|}{B zX;f8pjctQ%6=ULRl-@V0ZeoLF)r4`38IkuIHmYGt#ZGb0_l%jhGv>=CHssiD-gC?2 zsGpDe^O~17Ez9`5`UA#7_A%!DUh~RsQ&6q;7-Rf6?pG~b*1FU7c=I+2RMpl9bMg%jz*q~TX!>-aBNv;%d%H{`IR8f<9OyR#+k-^m>&yf zUVVKm2zh2O@LyOuTf~f%!#_VzgK4*+CYSel?>8uE>^;(ZM4YMW$cl6^7-WfHPygeM zE8m(MRP+<`)xMxR?-yw&DL!^t%mF;ROPpyq3w3?bxa*(ZA7dj>AQmiXZ$(UL-!46E zrF7-$&Lx?(P2KJN36w^%IyQ@~WllDlEoOJH3f9dI1By4rjPmI%JK8G#fP9I<4@8jzwG$yp2Omvj7{E?_5 z|Ba~_Z{j-{`&}3$Z48`;&SU&4x+x53pD~l99-yEy{1Yr1xCbBvvOHYxWqVNe0sc5Q zaL|y4@DNMX&7G5V0Ag-3Rku~`;q#CYnJ7p%Bc)}UYW8T!HT8{&(@h&q z8^l*hwUKMSgJ{`4;{g49U zGuwtKn7skBF&+1P^i~=g_moBNVbeEmq&6EG6U}?pZQK~W5qPNl0rvPQ1)QB)P^Jn% z3A6!9R3G5$>d+XXL~}G1B$^Y=fOC2k`u5En*U(rENX^r;h~^or2Qo2)i45KY0TGmV z42fhG2kjCx$L&&U3jLZSR%q#+c=ykl2iyge-G=R z80`e9_y!fr@@}w(bZG^f&$OzV+Q}@l8JdilmOzyOFaz!~=wJ?ZyVKkwjY(!{Q|Dq9 z=6S_KRGXgCm_ZvYo@R5A=4{s5 bHk! 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

2Vg#uII0mg^od<0=1U-;`NhzcZdeEs?(LzUx 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 R@7OVaS9ndjNb=kr{|6P61VI1* literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt new file mode 100644 index 0000000..e423b74 --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt @@ -0,0 +1,93 @@ +Copyright © 2017 IBM Corp. with Reserved Font Name "Plex" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..601ae945ebe1a717ac3ab7ed393288975da83b32 GIT binary patch literal 133796 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⁣rQSDW#esk4*UBqI1R6Qk9 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 O8O^Eu)*9E2^Zx)#YBXm6 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf b/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..78f6e500de7faaec05bbbc60ccfc81083440b1c8 GIT binary patch literal 161000 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𝔥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 Z&*;P%?30M6U{)rX&5IIeWmP z^n=WOmtAA=Ag2$L&n34<-!;F%bJUmQ9|C*5Dno@3KpwT;A8L-IcoQlmV@_)g<6Do6 zYTiBd^cYZDj&CRjwm{u$&LOxi=Dip$`MxfnqR=6kLGAs5PU+P}pYkOuqUc(IB{MCj zX?#y%zsodku`xBp%)*R@c1Wot_7wFIx9F16_%AKBV)A6lb`a^5aOay#qoAobz2j~A zr%>3vUZj*k&3{JA^0g8$Sv>;&)!QwtC4{OL$G1sZ)7#PpF!T&=8L52jFmh{5s2^{E zTQ0G84K?Y*%Df~Rt)n*Q!)b)d$9To5U~{h*rTHZJK2MA!FkY%*)D?p^sU{?)JGwg;R(ob*Z= z)plTHmdPm1n>fJ9tcgHcpVYGU80pRQdFE;QE#Uy?4VKVTYVi3fr=Kb_Q0jUpm5#>H-niGeI+iM( z)@U`9uEv@G(od3KrE;pl)&Uw6Q5cymR_|*eN?P75jTI2bc;+b}(=alCBQ&ykHw;HTQT>Vr6d-n$(p~#Zz zzEV#2i|js*f9^el-~)DKT_$U6$i)OhY#l5`fA<}zlX)oGK77P+Ogax6q3*Q^wED%o7+jF+NnL&I1)r+!Riw zNdj#LTA_xeMO4((>+r2|5sr0#b=N9E!iUb!WKF^BtS0}I8?$~Hy@lp}k^DH#-BYrZ zL!iL2O3-xi5lSi0;G*+BpH`G()QcsY56g24CEDXsOsBij3IdkWU8~x49YM;Ho@l$I zx6bsCmHDO06O}MMnA)3#@kH9Xv;%qToTxISZ>zpdhIT9SaB#PaxV|Szdyx9AHo7R@ zDiab5^$$--;_u`7iTc||%%AY0?gHN-!gW-iDeR}=%%}EWD@`b@NTe%ktVRGNMC#gG ztw$lG7U`SZ()S{h4_w+8>7Cxq_j-|_r7j;Lq6eNnd0$_@sgRX6>R7mX`?%one4;B5 zpalP0_SzOJ)9~vR>0?pPm$9`B$- z0)KMf{Jz#;4^B_=JyK-F2v&Um@QGGF@lU(phYI$p^k~vZK|&j1CU!kHd{O0kZ=h|d zUD~E_PzfO%aNzVaHd>X+3UCwZd{=-!YDbm1r{`1YSZhz{EB(|W^N6T?+C!qctr{%t zi+rN_UT}@#rv(zL;tgn|J$kMOTuY#q(NpGuDGH;oM7@C4EhU0;LdY7%&+568`p5LW zEy?$*M&yIzK*|vxWN9QfOFWAZLp5t9+;P?<*aD%0fyyW0i1}<3*nPoVu!2sthiXyulkuBzQ^sRS zL1hCq1(Td3cQ9ThO%Gx9UZYf8dZ=*xL@wy(@FHmy+9x&c(`o2aOFoMW+7#r(>Ir!L zcvG2c$X(=J5#KmCLAPH@u1l_u%D4A7kiM&2Qj!1Gcm+HJd{V+~X~BHGrPZhMdXTm0 z$RSdaFtz}Rj3-D$WkdmX8COKw$`#>Gzk+0?rhZhDTUuH6Vg)-geoAZEMcr2$F;bBv zgunI-6Jn>q8HN4jZ-G|o+FvPK8RTt{el)&S)S^#0_5ld zDE?@v5`q|>`m3%8-&HY_KCVdHmbl2BtEVj~*5Fn(tvv#y_w#+ixo6C3+}Y{@guVrM zh0D$*aB3)-FYI}Rp6KHd_h-Y&nDTz|t#nBCOq|&Va!g9_J$}^cUi)Vy4nx^LtDaUm zmVN8fl;PXaw_Afl8Dmsqh1}po0=Hj{h;9p)x-fSnE>c9Ld$Km)vmNOSB0cxySKx-( zQ@UGqyT`1AksS6N*2fimi!B|ls;Q>?NS(^J8d=NfoFsD7`i&rwx74ZVCTV$ywW;bH zI;2yH^N_FC>e*u^oL(wuBHT}0$c5gpnLaHvaL+50hBE9ib_*@0wqzvGEBURiv}Bbn zGjh>g5uKL}j20WHsqe@kXsSsJahLMTnvJwsjY6d*oM@|vwoKIvUK;uR;)|4pTc&kR z3R{0V0d132+K9UNo>xP3ts7RTa;3B!{CDJ*Y5`jB?-EWm6>8%4rD9gvWVeg(k@j(= zkFLo0(`NO1ixg)p^%(CvF*?3anT0>_33i>0VAGYgmQLnh+EzTDLZVZSEhazt zD!M)QR)&qzJqZ4XuGS+5-Xekg2~H&~L)Psw$JSX9E1VkJZDp_ALFj6fKxYNgnxnRj z&IP&4d`9%*WR|cN7=^DO?N??z5uDO)WsWEPR;ZzjRq*Z6&uNCHj_R}#BAv2JyR8nV zKv``yoQ4Ip0_R#*#3G5&H961fJ;H|z+9ia%OM6jTLad(+u9dxpI*@#oe&Zv)qLn49 zY_X$l7%<{TZE>T|k*eq+BB|#oVOI;+L}Q4iS#*K7noAf3*xOs{QuMlfA5EoLB|@qP ziL>^i6xH+Xu1cTvVM0h`INFCJx+`y)_vjdjpQhwz9a5)h8P`BV)!)%p;&RF>`_9^< zJQ%rlH<31dI(0K!H#vLrZT2c2jRy4lCH{#zo@^8R{bWdFY zTKmn3E1dMPoUJPVifqMQ0CcT6d9@99A^vUUe}LS*6#jPfj}E}vkz4*O$(g^pk4XL; znZrM)(dgs5Gkb;>DR#2q8FjOc|G7Nn?`ShAT{)qabC>b&pcQ7Rwtx~^zyrW7|BXA4 zKhJFi)7#8;?C((DZD}1J;qtNh7Q6fhFP}e}InL#my$=VmbFmiZP-oaiW`Ue3%if2k zwkht-Y%|=O+t%3IuqUE`Q)N5yOxXUM0X@JTfc-#P+rj!Tvpmj+9b}H7B79~EcW*`@>gyH4Scil_4TpltT+Ud=v>YiO_8oU^(HyX<91 zuupOw_J=w3G@E@2FJgbmzREta*X(Q9Y190><1PCZ_P6b)rZ4B0e#uGqU$LjHF6Whg zZ~C!MA!Y_}I%%BK!)v)(ri+|X%HK8WxH@Kk-7VIb^GY+#0i0P{kH4s7xd!+)bo`xA z&Mw8y?gmc#Zt9w1Z^kL6lVzs^E-hRO(?s?=n5O)NtQCJdVb=raaJO-72-()P<$Q0> zG{xS*bs!`sn_|y)+2oSra|{6> z_27i|n>e4nKIf#~4D7eKTY;V3AEuc9DBa1wUpOljEZyVoA=bU_UUM{mJiO10Vdq_i znZ%zD?>7_q`{4upqw7KUpgEGiAUYzkg~B#b3Y*23oCYlvwt-UEMoM9YzBYiG3Wb%wp32==?I&TzI@?+)Y+I$R?Uc5*hc;$IVTG!8gsOJNRrYIUD{akDs@e&v z+5?}S-1|Y9dqaDL!tSrMb$_TwJ``AJYj>rsJ#?36Po=88m7exddYY>=G_KUMmeS2y zN-?cc%nYTNwUuIKD8;O;6tk96Os5nxrWDgD#f&MXvrxMG!OR2PO_bi%QF_-}>0Or6 zyG-ca2jKN%_IG7L^S))g6{^=jsa_)+gX%R^s@Djr2c9`gyNPLJIZK=W0yVeIImx~S z`@!mQu0c!et)YNTpnx5SB^0m`6tD-U;`g+9{I@0F_QT#EnwX_Dv4zsamP!X(DIKf} z9URN4_~W34ZIl|eRchEysbPDl;VNh%r&dGhgeG=`CY}uiJO|2{4Q0H>?9cA6>p72q z4V1AHl<{uUnY~{8`GLJ&>r5A@R9W1 zHt1I~EAsl)%r3B@M@?L`_=sPDj0-~#_>XwDY4fW8x^*8Mr~ie#!AK&xlQ!8>*R8_Q z+iDsp=5~W^!62LlonbO7)w!mG`A+1Oe9O9-RWtMPR?Mxx6+=HqCYAgWOn(X0X{f2} zCX`4NWThgS2y(s$D?xIugFLh$Gq+!G$^2GJwp}Att3mQ$-6B3>i!N3ler~)QcU`B8 zPkM+bWa_Q!VZv9v{OrD}Th%Y+EQwPc@FlC`9jqKBcU`k+*@T{Y`E{7_#4 zz~^&3FT}Hh@KBIS;dBcywdF{S8R2_eLdRf z=VGe(?CV2oXkP)U`uW9-YT0 z&pHxDTa?$X77j-<>RPlGYK!4pTFbxb^Z&*s?MLKNf(ze|Ql)4}+pI;X23lB!#^)2h ztGvKo4%E6GX}>I-Qtp?rzs+c{6RZk9H{zrVt%5U7ix6H(u9Q~r1zy|mPSDbKU_Mv( zU8LCrV;H?_NgE=cCP?_DWi@1;VTdmr;;(?5kgS2KT^_b{M}d%l zxWe}mK968+2Xh5!AyO~jL3duIK3t%MK^$O!d4p@hCDw@b$> z37v&+8r9JRGLui@?&&31B_5oA$|Zek0~A0;J;p!WyoQhHG@;=mEra+{ena_oQ$p#H zJ0vCCIxxOwDGV973HGH&iIJUUBKxaIzDOD}LVuckOWkSJq$BdDP$!`WYBBMX-u%6m zOK7ftbbr+EBzeSUrw;8X2GUlT$jq$X-$;vfuk?HwFFES~)0(HqjX0@5L${VEat8Lx6H4#o z`5N{)a(^yB0*zHlFO&&g0Ak!FZ{(gkDd}_M1s6Q|D*1W|2Xip+Av>VB1O};7T!gNP zOW0#xl{SbwA$7JXPriLj-vgwrsT*&h3QBi0j?mb&Hlz9YZy!^#^l=Hf=cSmh;tbsF zn2&y_y#i{@y^B6czo8bhw1-I9B6=dF6xgI4NWX}B)C=GVy*)9wXK1KK5)yufVOIIA z$En7Xl8TWvqx95I>B$1EmNX%kS%ikmBHKZ^g#7UOe`Vi9ULP%#=|dx89f^1ljA-2^vC+Ti1i zwf+iHbK(nbzN5biwzlX9t#y~&i0dobzJ${1=q^!1yBC?5^f*sV8zx`F=X))GXhrx4 zG`&zNhm3l=iE2vj?7h@01as+NG2W45Ti4)Ag8F_@`fH@l)bauu48OnGIeH z!=a9w(am@{`2cP*Lh~m<%E0;%T!`M1$k@3E!D$-26?W>)kIbI}KYfb6ApJ!~QJG^) z?~?e^pQNU>PwAKRuMdS=#9L%?VnlkDYTcezh!#kdOKT#mqcnACpNu&H>$G2`9H}@C z4s;Bzyb1hx;lwwA``#J%F0O#TV++^3r}E2t@rSTs{G(M)fjbm#_jvf<6X9VGg=4)G zF7Gn8+)U+PUZ^;hm@ zUzHFYtUS(!Dj^!HoX&nRK z1CkZ~#j8KfBRqY{vqNiz)2h?FEl{t|~>WF>Xv zUvbz)Vp7N-;|60Fxyhj_Hz`rMNiUU~l&IWfoXSm*nz-RWByy8JDmTefxycBXoA75} z9+=Ra@BRA=-aucg^lW{6H8KrWQah!j(9I3<# zx55-T{xxR~S4m2)N>ci$B&C*0Qo75(=P19(Q-*Rr-5Jkr9fpaJyqt?N@XrNDs$4Rpyed zGM5f2b2&g|F2yQyIY?zLZB*tmP-QO7kx<3?Bd456+yJ`a;EL427UQm?&lo;2$OpV_ zq%3mD$;dIDSv<4w6@M9d+9G>t1U(ixw#Z$O_UYY{r|>Kca#XpzR7T`3jWHtY7JoTw z%#yq35EyK7%NnZ=>k5(V$O+EATy@noOUoc!9l7Hw0}@HQzodi`TF-rE)h3rnjQqIS zjIu%lxnu;9F-7F>EmZR3OD*MZp{}hcaVtVgNuiZM;ctyj**!c4o7{4FS(3}q)1te~ z&sohG1P3T3jz$ArZ9?PyEJfB&X!XlD^1pt`YMJp%>V^D7ds}(S$&FD?_=;waaHVAT zF&gEJeV;|X|H)hDi86=M{cQrHj&(A^$v7vjg7LIV#wZyd)0}>(Raaa7L?qIRFsWKa zemtZckv^yD5D`jvF8_mz@^;Xfo*&nvnW3!g47--!BkfFYhX4O@cA7xR|4uSh zQ_)(W)bt+VaLS2bevgxk9scsIIn{=Q69J!@I6lS(&zI2fvg(lDR@nopE0DkQhx8711O719T}qWbjFJTDwO zc!0AcR0@u)rwLk0A1wX3XR8h)g`^eL=LYH?idY#|Fzm71j6SdB$Ip*H&2(+QI%+Sh z;|0b*!-z+HYD-BkM6i1(2`w7=nWP-)qlR{?`Kx3riVW^M$XHHj&Z8v8v&!-C;RQEU z@e@VUcW8;eeTw8;G;w8>?cwz9Q3}9W8M&d3Kh2brA?t9>L$M`rdOhE$-D*FOm|#_F z2bg?&k^U)j1kr;K-B-r2s-;zo{!eBJ3WqNj1!zqEa3K_jGG6%pLY~@^gu^5K6GLTZ!Sz+CrQ(#5OE`%sEr?o&f)Nt#3O8dX9@0iy`@W{%zP{2k z3o|*zSHJ|Z{kW@X2mI*#i1d|n!#nDqlKU?BJVH;PAxbebLa4pc_{st(HYF`wggT_x z#ootH4MlF%V?@bTtJ6@E!evX17E##$(mTrO|7M;Zl;rekc=TK>&++^Zq4llorz6t_ zq}|F$DstH^K_^6Jbb4xqyrtjqt}@z2DMwh-Z)#cc^&vHdDA=BF>2Gp+t@PB;>O2J? zei#p5{C>C4McaD`yQVjg`|a zgbvB*q$L$9ge?`fdTxH+2L%T<+0`Oavu2WhW!VHyk6}4MBf4ZPmHL-?A97 z<&}`0pAp5W@&<2UjdBZS^kjyR24{*$K;V`!RrZxAmI$>4F1du4{l&VTRC$Edz}wP> zNH2X{4l`PxX=NHJaglT>x6o^uqspZ%fKUN)AD%R24kmkz{n)QG9y?<&m&b6_^7p9A zv^kis0o~;$v7*$$Ucels*`zH^{2J1OL!F5{AmC-Eyn);28qL9?F<1*!)5BAPntXn) z+s{iu>rwira!bJN69KnTd86!<+aMoc6@4S^2fBlbIMTj+TlMRe5Xbkf@S(2=w;JBJ zLTN*STNytkPr;0~WWgWV~4!*aGaF?8RThbJnhmQ~=9veD+``e&Pd@_@>mJuW{bVNc1ro)btQSN_Rp*VG z-)_%q!Dpu=$(u92D-#zu_mQX8W@X^27KM=fxCPd)xOdC=fL-RK`?x3pv-y1l*sB*Y zKlPX*m$x*SP>tQ1r$~Ked{RuNCqa$3A;h=3(nJ~<-_EOh%J-h-Ob9(|ei0%YHdrVMWxNg1bny{5;3UNVCw zeC4dYim&8Zg)*mneOX9Z#!oSx#y29yml(!-p2GP>qYB%{n1E&Am(fsW(0)dcN;I<3 z#`boBzgJ0XH+8cEJvfnsKFQY$xP42n3B6DA(t3{C6>wJa7;8#f`*=+rxPhNmP)N}{ zh(^~SEl1;4$DjzeGWJ9l;UhiAJ=#|Yvrjk`qMhhCDvt;nCL`$%cE)}$bqQ9ZwL@A< zl-5kBTi^)n*}gQ>s1~A9R(WS8Un1Q)XoaLSpuYpRQiD&($O4YPO{E}hT*?&SeEUDE zPfay~Q*=aS{rRcF$@#Mi<({zUUR`>Mau2G&5I&SEQIm(b$$6L}T|$pg=r;KYcUjsl z+Ku|1I@MM_^#V?z@G5JM+~+T#^4Aw?fS^JfZb^r%{%@mNs1*t+G(*mY<+~Uc*h+4#Is^?v$2c2U>3i z?VRUCQw`f!80u2}eE;;j3A|IaXB4uUv;U0xC+EZ}{q%oFN$;Pb4f)`q9c@OwC_NWm zU5%;k(=oXn_`E&|dN@$rm(XOx4AMha_h&xTgnXn{ zE0}f4N^mcuP}P_cj&UcukBfSo!3Fkp(X9+&oer| z#a2%>1)%hVkTbd%S!ivd1<+9K!f_Bi_`S|e_Bl`3#myu;6bk{&z9Dyha^+kUka8TEj110y%>miek*Q;V*?%o|0D zA@k-yMQMZ5m;G*tP}*wg{hZIejoDILD&N(a&SyR;8UL{|qw3Y;$I2jnI~n z^DGKUiT#;Db4D~~nvtI9`G{6bYt@~RQ!?b73^~K2p6;;D(jC@qbcc0)+I%OlCFgmx z(_PhVbq{qr-9z0@cTaaDpF;ANf8@5;-O~+q_jDuOJ>6LK3!A8BVO%u}JE&%1Tr~?j zr0t}xrJ98qs##b|H48ITvoOBboz!x!!~oSG98kHd`T_7G=SMWv{nX8LKXp^xPu+^$ z)E|KXIX|M6?xe1xJE@!L`4NS>le(pzAHiQB*-71kozzV^147P^XsPE%6zcgAEp_*F zOFciLmF|^pse7ec>-iD2b;q>qm7ZiWb(eHK-6fr+yQJIbnGyAMe{?%NEux*C6VX;r zh-jyKoIC2N5DoM^i1xa>xuNcEZlt@L8>=>Cu4+T(sUBp1)qu=*at1_a)qw1!8j$@} z12S7RAp5HZWWH)Z_E+7d#iTi{~_*8;M=;Y#DBdfOS0wNmb@?8EXndB+p;Zh@ggUVvnOqnW>3>3-D#U9 zU4V1}y0Q$k6v`6XvUMmhkO2y*3vFRSfq@By7A8OoC3I*90yL#$GPIHZ-*ex4k{qXn znfd%a|E9<9>FVh&XTRs3dmkq~aMnXiDE6of#gNKS>`)ns36-IkR2hl^m7(ZY8H!1j zq1dA`6oV=&v0Y^)`czh8QspBiRX$?B%0wJgnTQFMiP)nu5j$1JVV}x4Y*QJBF_mi= zQMra;m1WqcvJ6{QW?@`q7PhDi!l=p}>_di^A}I~%6p5)%qhrG4(#e@Fc61G=U%;^g zXhq4ub*T*8e3g3}Q+cwbDo?ga<;gapi*_KRa)ydqWy=<#mo7vT$Qddj^wVWX?wk16 zpmJuLRnBY#9)HnRqIl7x&NA_;vqp4v%1EBde(hDX?^7AC{fhQUbXp79puOaxb}7nr zqu&N>J&JM(l{dOTQDqE$x0;hMuse z34J7Vor0cFPbkX2y5MWUmxBj_cLm=ayfxSrED5|8I1zY0@YBE#0yhMr{%`sB`Y-V3 z`HuR|^K~{q-n_K&`Nn=qE@%t|o{yHuKU$M^=lyG}qwLDal??}Z;&1$Gn4-7pU;RmX zea3(Ff6V?1*BJj8SsaI_m|uY z3w~E{cR?!u2l-d!=es`PDsz6-x!kEc?sr_^sLA_r-rafq_Cxk->>gxmR9Qe97OWbn z5;@bAoY}GF0q7D5%!bP^Eys@6sg|5)9;1nS_6Jt!BhLPf&pwDp<&=+{y@mcEZi?h|K7u%3m z-snuGyOVdq%b7lRD5-s?lG=BP2f~}-CD;5PlIJlS&r0Vmky~d^JZA>E^&nSHWY;ITF5~o_OJkH*%iN zy|V}O`(_Vux=pG6FlCPbUkAPcJdW32Neiq;K`GS&wc-Kk`P5d!HOjA+0hi1krRJlY zyW^o&k6G&swYsVGIJKRiwiCh^;sXNx_~8Tm!szc&v%e?k?+f(zD7CsX{oTi}jam=U z*Ted!8N-9XLCPNnj6O>%$Mr`ke~cXT$GQI|{ja9QBhq)HCHg9uVc)(k*qUSvMoWk3 z|6xuQBIliFZshxW`OSU6rzv}oF+EJp>;qJo;cNx)FS$*Eoqq5qwOLrm;?=^yG1W)G z0&mO|ysEyH=iv4*IE7*WyT|C4+w9j1^y>w)U+$cK3B{yO7KMxvIuunVXHRDOvX7c_ z`y-=xgg$&7_y+fn(ia&G)KPsZ$>|du#jmAbLT3YCLX|A74en8+RJ5elaq;FqO3 zdsq3jQ?KD_VEh=rHZZ-2S$LO2v!WC{e_)yN<%F=QU zcPkps<-<=i1_NI*>Q}MdPBcvwAoC5G|Mb&uI2aA#(Wbzx>N_K4W<>vwAxlT#%|l9- zE@A)ArND0byq9t8Lxvul{ht0saQV-`mw+z=U!|q0Gq*%56`aWlDq;d~H!b6o!# zW0kY0+;gxB&!C;@4PcD*1rwtuOzk8+kzN=WHF_|kIQGHWr)c#Ur)jwrHaRyzwPMlE z4eeC+ouXZ~C5PFP&`xxqVD+$xRS#noj2bO`n(qv{9aD4@%n}V1x~Y~d+DS`fDJU+% zOJtNgvp-=yi2w z96~1ycR1vdQ(xkujDR zGOg~T711VUi_Bm96@}UT#nbulkRc;4m^c&`oX?faEFW2NBN%xVuY55h-h)Nh3zcNFVhx}u6#H)| zmXCh=9UAv{?24*m3}Sck8N)-2;W7GtRP~))MDPq}qM5%;*;fFg|3~Tn5l(V*i=|); zD~RK6r?s7Yx)|Lh{c_CymHz)yX+?uOpEi5&vT2#0fto+Ux*bC!9?^;Lps|mjv7bVB z9Yte5i&i{}R(t`ic$ApHVrU>O?c{nfut(7XNn>0=Y=Pke{5NAe$=FUZu49bpIAc0) z(&bggCGvedhks5mE=wL1|KPieH9tm=44W(V>`|;>$Tm%kZ3XAJ?S!i?#v8i|D(>M) zrA2LxaB{veUUpGN`81-zKqC!xXtaCC&8&48!R zDQ+K_{Vu%l1iJAs_%f|8-^p*TrgqWBpN2m~-dLaJ#6P!^w}-fX4LC?$4+EU*57lO% z+5xCG1J!2e-C?LU1J!11ZS-&^)5C4_Y&)ONr*{UgNN*3nPH!K`>FuNc$KD>Gw+HC$ z1N8O)z1>f55765K^!580W?DCU5V*q;vmUIu@!(4$wt-$^L@vLQ=6 zWAWQ=%CF}0KJa-j*ZY7kL0OBJ48KTh{0UmhO6U7BBs43X;T-9Fni_wObc($= z4i}#=x%jB51rH;gPr*A+A)QZUq_YzW9AR8X;gJJizDe28i&-7n!@bybR!$h>AtgsO z&@RY*boK}I<``pq@ihB+1Rg1)SMSWRpMQl<(0N$5FH#@tYw(K)i^g6>c;zcxAL6^O za{U_DgJ9dBhVYJ1W5%S$=b*++h8nlh>lxb;-b23>SOzQyRsbu3RlsU^XARf0xUPl! z&jmK{c_Xli-P@ZP`mZ_vxQmID<$Q_0oCb6)PNxK_hcH9S+xeI4J`&+gS5xHbY!lr?kp0e`(MQKy(IP4VZsipQeo^{AMYz3|J1VnEisjn({T& zeHL&wa1Os&Oa15a{d!;nuo2hHuj?62XT2lRj9{vh=}49ozJ0AB~b0X#bU4mjg>IOBGt=XUJz z3areEF^Ks(R@bON08#cu3UJpm9y=Y-lC&Zo7p%6{t_eT?fk zkOI~rht~kt0@nf8Q+5L&p36FMYTV_&D$h;FG|oceHeS`Fg+5{dB&{cA*gG3uwp00VxLeJ z`|CU_vwAExJo73(=rk*4D~NyYBr0<;*Q?00+6z@#muKGQGp#mrA7!=c482El zMRpE@2l1m0t6n|M{Ws~0)icYFI=y$#<@E07XYAcRJhT57J##79+oPzGja^&58H_b`+{g3Ubw{~f`qAEA}+;j4+weGEQ4j4t?|;zNTQ z#4|2}2i^E-Zel2`jKC4kGKT%8|9SwfC^h&HUXnS5;XR7}dWms~r!Oev0;A%1;7Fou zU(AeI{85>ci1a%c@2jR9syPXsvfJQ#uEO;-U|(hrmwqN#A0< z!2#C)la`Gc#BStu-|QnM<{zd1-v#qOhUPDb?gz8Sz$~)^M&tlP-vdM610zp>kte{$ z6U2S9-j~dg4&``YGjKqz2lkZdfjvcko}fQJhO_@je@^$nB!VFx*kh-8V2A$)9+>65 zvjU6^7#^7Ay^B9=c<(ajIt;A@b2orBqIZD75i$q<7QK5pGi%-rHulYa3T)+rCFzZ5 zDxw;I@Fp3ria(9{!y#xU^9Sj{A$o8Zm^=g~?}2VI>w65k9pXd^d<_2n6Py#I7ym{t zUP5;N2>qCMDf*!axEeG(4$fqjE0JI)bX2;7UY#^)_&aF$JLLITjt?!7tYgTtM0#F; zwqjSrBOvlhuZ>x*6IsqD;wtj&Q1aXaZjKqafsgknJ1_Gs<_p-7n%O_W%SG^Vg^F@s z!u_Ry;wWm#=uhs&ZSdx?uC~dzyot8FruuO!of=>4*m!1yIPA>)_XiP%zW27H7uKdZ(pQPan;SC;MyGFH)DpPQ$<@@Jnj z_10gZz#Hi;LpK}qgukV?o`ol#g(n_^Cyu}qoDNTq9;Zz7mW=<MKW!C#aavL~^eBRqYCr;ixagC8D3R=!G) zz6OQA4j9_VSb>lgljB6Lj!_$N3vjj_y>~v+d@;V4VFRBPIkH_%`8CvJ;N=*0?gi|e zM1I81iIzQL%7sLJL@p#A;m)ydlGo8ohF3o)T_k})a+BB6;yO6>T(0YtwLPlw9v$sx zz|VnS0DqeOh4vC~9C#V{^X!kcSAf3&CxHI~P6Gc;eY(OlQ9st%%D@YF*UD8a(M_De zX&b>u=z%UhM9_PPrS*^t(nEy4iB-2Kc^*;QIlww#J#e0?VIyAp2wwUK{#g$>98oRL z)Vv^Uytdl zMae30Fo$sg`9J|s1js+hm05x=Sqc#CXLjKs`=p8UteVIt@!I|s_&)Fh;NO75zz=~Z zfgb@s2A%?*27Utk6!>@G2=FuD=fE$3XMkscUjn}djsm{{o(KK|_$}}P@FMV^!0&+H z1IK_r0DlDj1iSvT1vmlx7jP2zZ{V-MET{Z)wvMI&I^YBRKmZ5=A)o~a z0}&t!v;r}p4QK~CfKDI|bOGH!55PNfv|gYO=m(Ot*T_1G?7b_2E04kl9<=o_JPwbN z0X5I#+p8!;vXFse%3@iucxAEBI^t0&iv`a=jHI)30-I0^|2HWw<59}UL`7GYqMc4K zyOEPrt+hYV)Z5`SL+V~dYbiOVwG&9(2_#Nr`7jc92#GsvO59;n;trdho-UHW{!u6$aeJNaD3fGsy^`&sV%>5(=GQ z<)L35`sJZt(jOxxC2=Uhf?YI7MthKDrEntcN$!~E3~iNygHmu%3J%DJ;+fZJiwHor zHo>r*CHMDWwU!!d>3uD|uci03^uCtfOGM3>N$1X@y=E&>TCkn51v1&G(MF9nYP3 zxM{^rD{fkGqp?>=v=@pBzCGYuttTn{t=94~C7Nn84;vVT3)MO$-Yuu>oAQRe!47?c zUO&q9FD#T*y=d^3;Ts_ftZo4?pY(zUo7G)DrhTgl{r~XLJDXP~t*|%(%DV z9q#5CS@DrLhq2;w1do&1zxq4HX?aF`-&nIYqM|4Cy~vb2Q-K42~FN-R}om-0)G{L=E?!4lHQCo-6mJpJws5}{*an;jYzNRl+74>01}*?D1TF%IbW`UD z?|hPe=fkN5Kr#2cVVE|qpp7f&bFIzJr@egID`Qu!_L!~q&}z^Bs#Px|KE@gtYmab> zqC8i0HLHU%GyERjbN~;N6)d!4l=n>y%<|48s3m^wZak^0ZP$U1LwHvb)gx8}riwHA zSLiKs>mZ{vR-I+d?wIKfTfaKaua5F7MMdf$zZ~z~$onvI6eRb<;1(mxz{r_kMrw0{ zFSk|0beTy=dlh=mU9C* zRM|0nHdcg=D9PJKxiRMyZ%HIW)>_t`RLg@=@u zFtoX$J--ZI9)f!fn^;Pu;q-Z=tO7lTjLIrdb{;9b`V(sWiQ+P8w~ThnXt#`Zjkg9} zKl>O@JO-bMA1og0X>(8N_!LikieCNS=atfp?8K~fj0wXt@TjRuNTv2V@8M4-P z9MZ?!vy)u&f3WInkop>IbyDBF22??dJkesbXe)cz#%te_ANE{}7Hfo-#e_6ZYKc+edy-kJg%5bRtBHrIwyaG*Gw3c% zg!OV?UD?J!Y*n$KQ9 z(bJ!-F0pIjv27Fn*peNCn|H)oTB7yk?)vHl3rCX!sgi*LfA4frZ0XM7)UK(}@}Y1? z#8(%{ciNpRrY}k@>J9p9``abs*Wl%oh-=LDPp>-?k5I{DdjmSw$P+b&8j!Ju)Cln- zY#~J{4`ty=q%eU7bv{lDzL_92(qm(&@KZ|DftxEv!-k38)tS!_R@+e>SF<==tkr{2V$jlpCtyMrg_ z&F+sHS`XuY{Jj(pW_s^cy_dHv%IFT-n&J}OyGF(?m8 z?CP$7yE>cBNEnZ;j*-CJ<%+pyDblvU<)w17TYd!^o;+x?bM|>Dq zhUgla9{v~Q->4u%ovYK&q_mr-TDM$K-Vmzv zv2nmtmFLuZM;1<{_od{dq3YRoeF0hAW5lM`**?Lj8!=Ey9h)pX&(?WFdkKdw%20D9 zcQcT0k!_`-W;`yQe%#bb193)q9t9e7JzEjJfa`$qC>4#XpO^82aaGpH$b-+!z*<3D zBPBDa^%~nE?kqk~;txth3s{OC{8TCR5D6-iSfXPCBThJFSW`;RY41Vh1q0}PyDEfn z+O!f)t6F;gaLq(lux&wGBIz4Ct0y$pSh&7167;or^Xi*@!)Nt)!xas_;9d+x)jQv_ zY}vA*#Nhazj<(O1ls;Y76sr%%^Yii((awZB&$E0mHr`%cRC2k$xiMJVR5cQl&v|(j z4PLJ|+~+@gtM>1kYc}(L`axgwLVr~u#!NI%J3F9iu%W}Yw^`g55M~SHa9>0UA~^-Q ziYC`1F{y-$fqNl37F7ys3f(#t3A~`RQz5s77HSmY1AN=Zx5{cLjuVWEhk>w(JAum0 zsA6SVu_X4nmc+SrTT8RwS5;EcTD@?oqj=HaToc>2{GuvT**v{)$QKRNczlk$e8-B- zNndAV@s8o)9gCH%9bJ0q;(!+KiG5bg>{~ zeIuqtd?Wu?ZmsUB{>E6$Tl>G_Q-^CJ&t8)7{T)22iPyz$kCXUYAGR<*&&oT5LmfH# z(I*8y(<2tAyj%*{L@Ij32eu5Q>EKRRHZPB#>k5~7SVTjSiVdw+*mq$=tJSyVlo|H2 z#8j7!hPuqSI?5OJ_a(~3(J9fzGxpbyj6CfsSv-8+s*&_xk}d7!{`#_H`Y$Pck$5=Y zj3&2lPajLAw9>wgg33m3`dRd(t}H_z$IKVgi|y9fD`g;+Il@>i1sonPBdbJ-*^oUK zP)$!u6vI_=SEfcOZz?WRIJo|EJnr!8*_h39c|C2$k)KBLfKdyboz0DTK)+{R6re88wxF<$l@Q@5P6 zU#Z6HWxO6W-YUjh2Y&oa#nhz6(BUp`RSycMPYv7SoQsXxk>QqRUvq`Sl~>m^^7NHK z6DLo{V@()1e{r4`@7G=w*X8$DTx4&_q6j`y9DE5JTyOidMa4oPT44?q=W%eoJW-#+ z!6xAqo$DFl-{#;MeDy+e{Du6&nEnah3P%{&DC1K;7^&ha#=j|WNT=C+*W#d&JPR1(=IdW8tRIYcl` zp&~-A!=eg$|1PQ+bH)x+udtghqgQw%3p`tbGivzeVmE6Q&w8OwgilfRDP+>BJA(zU znq*Z~8yBT=<|-iblT&?#-}WO%$)eGPD@yXpmXB>+F_J#n8;q6vYD;@(ZN0(PV6r!T zGNojDM|8NSJ2GTb!nhuQdnFx#9gpB>Ow(HEITe$?vA-=>1u+bl<$ zUJOplndQ;0_;s$8G-jG&C9^Y4W3DJ?G>AW9$ZahgTdgdMK?h@`;xY$CxoC5|Ix(6# zk%6wkg(VIq7h1O&BDhuWFs6xCc%U!%X4o5Ev%G@STpm_ghaej z;LRz>hD1!|Q72E-*>bSrgogD>V(r+Sdd4UbBWzG+wAILI8BYax3V$pi^WxKeSw?-D zFFUl_QL^wf|8*q&OtI;|-umNUpEY1&B&RNC$T?9VV?Oz7_#nXQ>));UOrJl8Mc>#p z5>wIqTwtn;}G3mYQI z@Y&~LdpUhZ+eOB;mmT0HADDyA@_jB^gr7wx83E!#JR}Je7sJC2uHq-ij81$;BQk1C zRVo>$cu^8A=;7Ef@rKqtRA|AaIPG}%~PhYH}_Nu%ta6JZ+zLiH6Of3JT2_7_rU;nt1<0mDtc7SyY@^zn%AQe>0(Jv7xSecKc^sfmZAhO*PWf)=W4UhGMRDH z_Y(SEtokk_6K7RTSFAB4vg5EbmW6Rm8(8MN=(?+&(-V)zZ@Xfz^O`Hvm=0@u)9=y} zGA`{+>G#Xnioo^=V{6RLSms&GVi`(t&QKbqpfSfOG_8k1eP?9p$2FNENAT@&c$rvZv2C22)xdecmB3BF`v9lR+n(d*CE&D4 z9N$=;>iePSx_kK;+tZwZsw#(O>BmrBs7H6->kXs zKVSPw`ow|r(<7tW?d$fZ()-r!hr3GP-7k>OQVMpivM6XuW<$oa$yE(X?o17aORz zR{#6=AKjXl(yu#pdn)z*_op~(DvW(?rPue+>srFBZJbA9a-JFS&i30h=?Z&B7qbCw zxg$dpmXkVa70U(bD0}-UE9DwgWn#nYC^N&^esdLy(4rXIpg*Ysj1rHHVqN_K{#{AX4XamxS*V(a|)68r^t{E0hU1JW!ZJHfX6tZF~227T% ztl*w3y{d&5%axE7*Cq;$wW&*&?OEO0eb$?XechoNr*rS#$??hMHEqMe@eS33#a)x< z6eYLcynOxbo8rZu+M=Ofb|gm6+4%ioMq6hC8*y8qqvznGW?C zsU;q8IRi45D4OQeLlI(BhX9?rL4v92w{A=%HokQ_J@ev3&*BcRw_|b7gdjh@;q7Oi z{q_yMQ=^ddD!keW{0d#zE;lNwW#ompy>YKw|tW{ZRrs=APp3RQktL z=@a}Fj!6CC52@5C+)qtQ&nmtE7uvbtqR=++y0|bysb|zZVpoMP^K<o4Ubljfr8yH#J9>m>W5^tH`m~*3K!{?z^U5 zS@Pu zP{7i*T4LFwdr$pV@!zQ@EgfqYu4}M;>~&iAfK1S=Sx9%kF0Z}5 zcQu0%VE2;Zq9W1ZSIR_E=2bp!x&Y=?DyU_Y%8BF8S*2y%NDhb~UBWz~;j@m~9LHH! z*X`m%r(n%io7Ve{n}*a4@k$*lYXNZI}KjrM%sQEvx|l{T({Js*3xS>3>BYMRXTbi zL(R;MNyQ&QML!&O@O7!^7Z&vAgblJR$mEql%@q|<^LZ*YP10i&5t-*2q-}(>jY3+N z?MZH)16~4fFdfv=2s`mDE~+>*G9hZT1r&>jc`}y$gyxd>BMw2ULZ(tCnJJQiMhRBO znT{HC&&-hS=v+DItBDQx-{xuaIkp9RqfNz^Ekl>TxbxCWcM1=9+9uf~Qk>42;tGPj2K|z+ua-Bdgb1frsTcT@YP2DZE z&b+;Qm!}p@7S^@@#ioLakLqBNi z?-=N)@>Q3+-0tAO%D#?e{Y}ir3I~7C-q$f0t@hQF=jRs&`zAOv`6dGg}pD#wHLg|L~gKi~ZtMlm>^}*Ds#>`P6kqzJ(Vr)!u~HbZ25|PtCSn z+Ev`Y@3!{{-Z=SRe}F!h&x@^QyExCY&P^Pd8>f_MpE#Jgo^d9&N_ftSuBLjl@aj#& z&athl|Gnqwck0*Cqa#24sTLKpCH*3k*8UgzH9x|d?bkeI`FhySIw1d-2&)&|XQITX zMOY_fJXhtt>$W@dE@MO=*?&jg9sAX&yn4r}r!*FdPu;GaOv`ouc&?kCb)))D zi++kKKe+1aP;lzjymw9gF!9K$^y8_YXxrh*ziLkYKJNV**HOJmlKb+FrubP=U^)!w+mNkHu=~up-KkLhx zo_4k$Swkx5l9t8aetln#O$$cOk5g;+hbtV8im>0h-g@)Rw*n&#$<=*#^{z=aG$hyb z-qp7{*)aXc7ryX_09w@QS0Qw5W;eBIl;&yStirRR5k)d%#L@_6jXTlD)@-stbd>s5 zjJVvXRm4nx?MX>MC#kGbxu~utO=~xM{QQi)rB_C=RsQgy$m*|_{6T7w3?uzP8P!|) zgu=;;!D|a*885ZQ5EC~gmg6ahq#z`Ii-p~oiCvLuwu;b8(?wZDfr=n(lN*T}-Ds73 zQQa^@Cc-`6J4?>ZJ(F!EuS=okrlw|r*QeBPnrljGn$@55Pb@5;i`a{*x5LwJvRzGz z&67oQ%43e!iqq?emwp*FNR}9awJ|&Oa_;&oU4)9DJzsgT5bVvW7?>O6UG|){QWls6iPLj z0($+?Cpw20Bmy;Mo@g}G*_d3Nc*{GQ6RFUbwB&TU?D9h$TL&74MhcvTP3*pjM;f|A z-kn=wi$?nDZ_Zo)b4DQh5thCjpE zv)o9HzvAXkfYdn5!?G}7MaoTXBFQf^f06ZS1Do@R&t9)Deoryd_O7 z3sVc1FIX@=Hp-m4u*};UY3XPfSkpJ_?_U^bnN9}oDDsB78zS*|pxjsFEa+S4A01sf zoT%v^%yT&N1D-%U9;xqc@je(BYH!HPHx>}C6irvhp8>_2C7k?ba;IHH&z>WTS?-jW znBB}BD}+a6qgf$*BAhB$S^Sj^XZc*k$18zzTl{@Ysfi7+=F8Mt8%Q73NTE00T-D|nWY5&;!3eEm!FiLRiK{-gx%BPt&bK@3qP@QJ&JU!{8*2Pq; z$?jP*J=HUDmZZg3nl?tI#q&x6L)^Q#83)w*#B)+A)88k#kq$Ty1}mITd%t6 z*5pKq_(0q)>M|cIgMY>wzSE-WykEIf#GJ# zN|wc!@*bs#lHCGwo$^>35(OO_RRiIGx#zeC41*`=%~fH51z)VZF3nk zvgD$1#kktm42NcJ;G;VD=%?^e4;-+Z#VJ!?z5ySZPjrYz?J$Ed40b}XNCFm{P=ghA z7{Zjz*cNg%TroF0U>7O|YRudAe3I@6tZQ8V`V<_L5 z?DJFw+B?@=F|p{XH60ymu3Gf#>Y>r$Mqec23xq<~ja+um=1m{DaE`zvqa zx(I0~G%;<*M-&U#t+l70)-Jl-HalxQ#k*IQU{N(&K-2V2Z46)rdq6Xwe+eL$_j4%vR7|AS4j{vzF< zknU78MXNX66&!8pY*oD~Z5rd;({aQnN^v706>zZw`_Mq)w^kZa#WyY&)eEN%Tc+T!tI5+FW#wrI}s{v=<8{(XdVv6S{RIADMbCx zQ@&yt>qLj zDW`SqNmag1m9LX>deu7nF3t@561}RVSK{mDcI1pCYdx(aSD&dL)T{l3dc&NbCRpBJ zwio2=nF8&P@Q#c2bn;u1eaUK9wJUfiux(r5PpNOjzVa2Oy&C%gd$gv^lXjjQ(;`Vy zKL>d3(4oyd_KnmxWNcFB?|CxJ>1)!~CQe9`a(N?}O_gs}<(s7(J(`+5%f{)`$V;W7 zh2*2EHIq5{vCyM5LvKrR?5qcRgZoYSxuJKY_fy&hSt&~I)z+s!bGvHe721$EL?sr{ ztp5#@EM!+%B@NCMRXYr9&o=m}-jN)k)kkl?J^dM4Yo49b{=|p^7{zgE%^FcmNr{*dzy zjMY$=HkR16rl)7ku0%LG67_ia6W(95?%I3SufONobv1oW=j^yVxioqCj&qv&80>7C zddH}@O4VCLy;aof8nr7+8%at+9=cY~RAyCwVQx*?21NQ6&R(O*=@-VyD=v$lOuND{ z3D!1FBPm>VC0GmP3$?s!uT8(EpG=+7Q&Lwwbv3KH+M#KtE_3#yj$DvhcofgYN}@p! zR5AgZIj_A|%S*pDt*2A3-5~XqQ{M&D=i}r>C~x)640NmdeAFk2t1}Fs*i1rl;X#r# zOB)i;l>~qpP{uJ{cr+q*iY@w7*aD{{XoV@%hWtNYKiJ+rc>SIo6~5N0s#agcjy>;u z^S`!tPItEd>zh-5sP7EbY=&Rta{jNj#w5Zj9{d& zgG}3{U-^_8N%4~4S4x@S!w}0(=qmdG;FhX{SDgdXrq$E4Xmxc|dS>=@dTzHe-KBr7 z+1=XhSOdGVoOY{!CUvn#Of(Z(P;1|u{>5hf*lV}&n;^gW)Eob%lHUY3Yc0l4;7qdH zwLNG-J9AP~2byhUr8(;=n2iQkpL%(kyO zLleME=(+c7-mIS#?WX7a!qB}L>CDxa5_A-gRFam&znA=ia-*Kjo1aO4#Qyg5N2n_? zd!DYr6Dw>xY&Q!hSdwn;v_(|pxC7ZJUMojaDmoc{fs{$)Sp0(PC5MqCnl_lv$eC7S zwheqUgS!z?&&XjR{4~Z2^vYljD3_i5*aGY*)ebI@v72vNv@9h1EI>Y%I3a8yex0V&@y0gq%XWR;X`=Ln+oftxd&d;TZxgEq%Ur0!qk`UQ~5mPq7 z!_}aWhoF&c$d}M2v~k93WGkeR#uno$XU)hKjurxjY@o8@Z3e=Jv}Cz;ibCgY1l{_qq3aEnR3^b`& z(MCyisExFQ`A`zwys)#plWHfguRNw`*SVJ|=i$?2L&Aq*wZ(MF(Z{yb;iPim$Q248b+WvxrMJBIt$^!2tj)Op&1)f-xu zoIkj5@cbpMnVX@Wt+$+W&MjMetSj+CpBB@;0+uCWz6k05f~Dn01kWRa=NZCx=w5}d z9>Lcv1!{qyRBmMXu*|x-QhjBias*UH6d~kTKqE|9Z|ZmnR`POpRjaW{Sx6^~cal0O zxy$w3mlK_v;z@&Br}%BPBC%+#74T#wn{{zu)JZf}E)=3HsZhb{ze$ORxt-*eii&HS z!nK~T!=0};RMqA;mzHhb)trpg)Wnj_)-|@Y-{Wa!oC+dd1kz}xmv(UVmo7U#!^7i)SQj>8#Qdd@o{MKvx^=FXZM&@;y*r>UTn{_?r zh4#(4rJ_s+!Y>E)9JFJRMx+a0&S=cy@8kOEA@U2eM~%m|MTWi=^j@)v<9EJ7S7I`8&e54mR4_Y*zqk zGh3XSG2?@!A>io8DABfva%9C%RpCTc%F2+jZ`>pHkD&*j%%B}Kb*N^eT+QE5#u|tC zd7?bebS$G04|u&(89zSK|M6abq@>E}D6XyZHk~!Sd`Vkzizn>MbClKu%j*2CLE?9d zl0BET#9Hn4JbQV$r>>zooR}E=LBy3GtkVmtD+))e8-|<#aj|cW!V8eg%dx8=02-$&Rk)zC8;v96uTWGA4lY)C9@jV?+wG$a;9TNfr8 zmXCLJjSI*;aZKAt+)!p8nfPGt>_Y`~*;lvzBRBTyGwJ(@81W13yZj<-yADor@mFGl z4g~2ny@R=rgBf-?%B+!2n=~+IoodchIi|6=8P}4{nk&*Lk;m$Y+}l<8*2op%uE_c0 zk+D4`_I;7gbGpJ;M0O?jj77%ZrA_sp+jw*TOWrqEt?K;N)3WW*?iDNIGfCQ^w$<=gCScyI8$oIz8}Rpqw#B@;x_ zSg4l2Mv%0cGH>wTVsaeOkEi$Uo&L-_V(~?Lr>85w^X+ec=NJ0Z?Xh;Pe(~Z1W3l$P z(~lm`esJXUsF^ul8#dp>i@E%j?U$LRq54(H+{)fIw|@b%e{%kcoSGEnDo#urYKj=4 z>S;v%EjM~CMZt1~=1SFfyZZafa6B9~MxaK)fZkz_gh5UJ`!#2sb?&Df-SKUZ_(nr!E_w$e)qsqD=bvdI<&`7F9$QobaSUv`Pg_GMWV_Hq@Q zTWx-p?acCh16O&zSkBzes=Ab`Omm$`JWZZYS$7f*T>F`66BQEd$)hLIQ(3;Q*AkU3Hj=l0 z|B~;oIN&^>ZPK=-KOWT@($7o1Bevh_4cZ;>_ZX)Z*uYMuEf4+`o$Vx(m~DefN8|Js zh|?>%U1WNJU{0d46@z^yA64-h@%zFo_o=jnQI5K+k`+GX>S@|XTL%2~z0K93szAkP zckYMZR+g7k7MCul3ubPlSCh8ox>uLznyk7h>W)Khp#D3z2JPUZJln{^JrPt2{O@twNwyst^M$aN3H+w=H^2ml8+zykYwIXa_+pBcQH!D zs9EKcG|0&B$Cp*eywbWES2qvykn~%^?<#5&PukSMk7hC#4rS!W?v5SPI zq?f9PFBwFXbbKTOP)Qm-Zs?*Y7aOc&W5l2%L)j#qD$h`tuKa1e*1H~?H)6XUnftRI zCY|sS~ z>yBOWVE%)b%>Q-X8Gqf<*V4z&H)?(S`cvu6Tjj^c*0I2*lM8R7_2sl)NYEsw{oIX} zMtZNraVpK82n$JXo@TLmv(%~et^4MAx98t}UW3Tx>9uD1b>>==W)HopR$0E58iA*! z#&53sCY6Gz^|m9VS-%s>ku`4>r zQ}&%3`{LQ)Klk#^WXpe{P(k*za{<2^e4}M_0?Bpw3D{gx&!U# zU_OGWq|bkcW|su4K0m>d2h&V;MAxSOOkHwX1U@AFowoXGo)wWjv0|R{kfjw(qah91 zFwzSRP1&rm&jAnhg7x=LB=eKkZ20~y+E>>9_V8itZi)G7voFlHYv0sg0!x`ZB-72x z`dy~Ws}2>Zz_&NDKHJoEfw$k;+LX^CXD<2i-z40J4fTr+H9{b#1?$R1>75}yM;z&* zKzDO#u&L2s?sm9c!NBUJrx!e3ULUAvjBr3Kr{`)~|A@YM^RCm&PJL?gE_7fm7T{$~ zc3!oU&$bMIfD`;sGkI-~;GfH>V0n0umRwtf3$p721+l9k!Jb>kg%@t`-^@99sfKgMVH-bd{03(TGx z@T4>J%+8)nzBlO!-y2gWiA1W zWz|`ezVJj>z4pm}tEj5tr6fA*oUdTJ<;?9a+b&BU%_N4?mcO1r2oy=^E)9hq{ z&N$P@*nVNS!xHQk_f}>xVXl%+)}fZh)G1M9%n`{6G1ju`oXg*w=xm*68Z3$QjNQ0s!tZO07VSE_NXvH@3>MeAwU&WZ-Br8R zZ}`lzuE_-p7Bz>*JL|NS@x5bF-mQ?Nr|j;{TL$H1zd{@O>#NqN=Y@ghkuxk2yKqiq zG`l^;BzShS8H~-45q$BpxHGntmx2yafRYqzokAtw8#XjdX}uD5A6MfjSRZUsrBs2B zr`qw|WD_5Pp;lZ^-x#dr9HN*F1&H@1n^a3Q-PkhxUA7F{_m1)3>aAN>11GiB=>uv@ zbnYf%?PJR}E#v>>rnPG~35=3#q}w9!Og$R3k?`UY8~(jp{CmYHZ2YsWtkj^NrC*arz~TT>2_IZ)LA>i5XZe;=2MgSXrjT2=2?dXx8uRc%~X%))I)Y zUjniu$&EoXSK}cQS0$k);+*@I0Bve%a?|onJ|BOQOLOl#y1F`m%Y0i_Y#vy#Vqo)% zExz3Q>7l;8eM9OG;|!X2SOPwba>>Vmg<~OyCgeUb7$7Q-5ozvTr!&?`| zT-&$hP4~A%Bg_}`>;>towPe^|9gj6TF4jlO79}q09>@3_ClgJg0eW$HO}?Ec>RFt~ zl8$8O``}sQL_?qW*Edlhxhoao^S&3`EFXl!jlJ2v3?GFkF@6`4-^rm&GKXUa!0BrK zv}H7v%-|&eAj+ThHhIa$+0&Oz2isR)xoBW@Z%s!_xYb))>Mx%@`|-ygf6R5(m_Ht@ zE9@x_53W)N8m+x;OSiX$Z5Ul$&DFj_hr_;gZAofnYRl>>O6wzwdYc6w_Swtz+rdX4 zF*NXj6jX^tc7# z4<7I_sA32T5A!m{2gMW&%JRCT@ml+qBx~Hz9{F62Oa!%;qnVhJLd=+T^Cxv<HgMXZf!erteGS=10$4e&r;*Aeu$iU)4saSlgJ>ao%`I zRd8%wk8I=V3`HZJ(!%=kk%7|u{qMGWf}OS6z;wFmn#!de<&7m%jbq`C#ff^wJ)Lo% z*I(#lOUME&?^H!aU1zx7<=pZsj9Oy$3%ZYdra{6LOKcyvX9J7AU#)Ge{S;tMVEUQHxfQYdv~5$ZyBhH$m8Hh|&&9J2TIV7D_&e zdF47`X`hUnTve^!U;$sDjMPzR%H0$;i+Bk`87LHWgnLp=I$9s;&=JkvzcNwV9*jh) zO2fT7FTH%{WMWxYjTCrF$|GLKg_kxDuI`z1CE~Gxq3%RMRiw#ouf}@_cXar?zCxGV z{>$p!o7P-ZuzHofD%4r0%KdKM_@w<@^IW*KeY!u8w_5*Eeli$|m!{w08i;y*wH4&X zY53a4KH4DfhBc*h-d1h%tWZO2MUJy+c$QCM?bVi5LgN5WGl+4c3Svx%rc&WB2dB&C zaUfWpEJ(<1GgT^K7H-&EB94uuA6S*BjcaiVgw^F;GLqScL4g3W7ABl6N2p3RI)MVd zk!Yxt)^HVmujeWrkwish6|$MDkkJSEl4=c1RwPf`&I`kfssz~8`>~IGY|mZUoxLBu zo&wq3y9V8-Rc1E${(+BcQnF^y3K#E%iRjjUEsyf(|}P6O=}{ zioTJczVt7tzKw%@w#_N86KPQ^!lGZ4*l;3BP`&DmEty7EUYPX?AyZ#a8%_Uy(IU+| zS+MuQhWJQxORA?~&+gL6iAYaRBoK`Tt{db(Pf9OIU2wr!%L4t;+B_#4e+F9CZoA+! zL$S8l&~Sew9O*yx@}GyFlc-@Y)Y<~IdWnZE%%1Q)FJm_@Iy!FVL@^j~zGWAnT-^*^ z*ih~zJTGC-KE;l4?u`9XHI$4PS_e+(?TYYxnWFim?H&%x79Zcs>{d>W5!si=`2VLt{+t1d2r0b`CU0~PiJgY{25Koz> zuPH0IKvVl8M2pPx?iUD#7Z_G>AY%n(uGga2&cSs+VbCE=d>=ghMd54VRNnV)F!8Uf z8=u_3vgj2wN@3==g@z0&U(~_x3X#)7BY62MZcMvs-ZWSxH>n%r94Uz~7(Ll1K8?KH z>{k@2U)HM|LqWAcJ2$iwT1ud^o2#gzUakXNhYS-e>oZsg{^FFFbM(`kH?bGWb(6pB zKCtZYpyQJ5&a#43*nI|5oM->X4>}6;Tkj}b7&EQ$WNWH2SdnTxqc!$~%2O4=%2af) z$gsxZx%`5eSqnZ)2YUrx&puQL-AKMsZk$r>M-oSEP{!;mo-jN_Yx%#9M^FbbuY?Eu70kf_C@C8 z`!H9TZMAZ3<{INFzwel17SK6e9D-8w0@pSNjLS@Dx%1&w}3=nn8Jp z+4X(1AU9;Fp2)gDGifwD)n>Y${!CV%=@`w)yn>TC+DG)3 zc;&>1IVDy<*u8Q2i07RCsq`}-a$)BWbJwj7);Bg+6c^Q& zwYD{fLlfh>PaPddqirkHTZ8LvPNxY$w)4?Xr^*p#_psvna&6_b-j!m645N&D+ zc+2aZc3lrQ)cXnxD+l{muh(vgvw#+d3z^2*Ux5k{6~Repc^0S7o5z_aVq`ge9-Yke zN)?+{bjtclvQX?cv#NCHWUUWdW!VGO=f-nntwfk!u3}tr4?{Fch1o^H2(wFgK~A6& zi!4kp*A}i3u404bIZ;gVoERJlFv#2~$hC{Be4h{@faygiWlqITWX^3t7>re9c^74p z)6T1TN=^&^_>EW8oV&PH&asK!JAB)M`&u~1rgibTHCNm?xPSbEb2~K$}+1aLVD&J~C_NMB|m3f8COmzR+_kA71%f z$hUIIy7aH~nRUC;|M6NZ$k9AMO@A#I)1FIfyVl`RwA1rm{Uq_BcATMmEp9T^WHt_J z=3%Q@Ux#vwB(b*w0+dP^;3kZd_=zPdMB*e?NAO#jGN&!9q+Q$%$pkCmDhf~(obW<5 z3+BAG!8~EN7GA4SF+Y*`W>p7AU8w`$pmR=0T)9}hU4rBa^Pqjp4Kt$R68U>(&9-f8 z>RX#Coz6S%xN~YMamZP?z|kCwHMd5ipVyA2o8ET$MHgLO-)NJ=IkmjS9Ov|VfyMf+kEgV$^lQu=vS*Mr zYfcL*^Ny&>T2pKKC2>YMmq#+5@MhG=?c(Q%gDYuqvOFgU!C~4rHo#@CiMV!wW?mpM3RF)4C|RMKP=6}9He2{)@K~RQ$V?KrjqbwF)S@Bx-w&{ zWHRkBzm?rD)-P(z%Ehs=Iw8E=U>IXpU$PG<&t@bhy)Lf+NdA{q@;V>mFg3Z8nc2pU zB^?U^%_aw{{j>S$!4%DiPa_sLKoql+-Gk>@Se`fQHTRS#=@hQY9!NHCekv#YN(4rE zqUJ#xvXGx|I}f-Luyb~bovXo=kjBAkyF~iXbh2`fR5G`)Gbv-+u=ul&af3rytV&k# zVHP&1&-%^u0)Qz}NK`qdK?pWad`wJ!uc5LqqMWUWk zZ^Y}<2D*|XPN%PHL8xGI-Snar3knvF?QysV*I%>v(_eC}S(CrIKim~>uJ#kpb!zDs zI57L7@{rH7M*psR>)L9oK>35L@^iJ{=<@(d700-E~$&aw888y(L?VQ zSAGjOKDmK)31dj`qf~DGKjPj5K(ea38?X1OyQ-J!y{oJDuIj3;>aO0Z_pN4nx~99P zXP;pfW(NisKmlPG7TH9CKm-+n5&`o`G%*?#P>BLA@Wq%-L{wr-f|9sJgN7XjbZWle z@7(*A>gpNMnExNGdDW-hcF#Tc?B`rCpK|+jm}gA*EeEl~DpPBt9MoA3>O^ZE-h;o2 zpW-;b5TYUqR+nEUK*NKM6-%OQ1!{RDkyd`%ve!XHacF@Sy>hA?uK`C zeA|rvCHK`OzibbjvVA(5SI$Ct7qB(klQ9S<%O%z<73i>i zr1w6@k3pQUD453z;DX9$N^sGKZxJEuIzYIaH;s0vi8zz0W*?3NxH5v{ghjY3O*$wF zDA$QP^coiJHiV4wu`T1RgWC?TE?-@~ZEJ6|tGm9Yy18l-mUQQ6qCGGX7+AG+sG)52 zp_L2a=F-a9-EUjDmk9|gzfejd9mtQ05~PN>zAsniVWFnZD||5ZIc-)w(RFI1&3oObyUG#|Je zJw9)h{W^>fQ6A;c%Jq>&tSM@^+wf*_r&^}Kl-5CFVMdPCTS58z7*u2GhuX?hAO;33 zyO~~U+Q*EV(=MjH+X~jh@PS`ulOf_5<~lVLQ6?Q~GbWJc0u@*kn|4Dx9CWRQ@jRN+ zc2t~k=f}_V<(@NYd}n^#EWSIODBiTSeErD9!DOWL%<{&r<}YR5ivMMNB@^+?NVf9t zqKz4h7kkZ^Z^w9tJioN&p+M>mkvfNz4``{>Wk(K6fPz)x-5Z5EYk&e(GFt;xw-zv{ z!%%^#(WsPoN275@NIA&G82O zH#52;-D&!YTk6~5BVDQKl9}2@=`1$>MMTmWIuQ^wgUtIF2Yew zjpfQAlePA~A-koWvQ)jMjz>Q|r7QjOd}J3UK~SdDYf-U>;VuwWK|Jz#t+K`Sa{a$u ze&KBoJU|WMtdYsdk+U-UGJ99Qk@@1@^Y-GaaqUoQI5h-nusri!c=`X|z4B_@0gRih zw-V%)qBm0rE=8ePMLtaN_KfxAxb;PTQfgZYlaNws+aQ02aAi&h6QfhQ9W#9ZQ9Orw zoA?9BwBcC0kazobns@m7aU((8otpy{XZe{c&m&ZTj3473I00JM9|v8}Zd=bX_`#$t7-TI!@^^C-n_oa7pM1#3iiU>XfuE75Zq z7s=R3Wa6(L`HN)Ck}9q0+F3|>jxWUDCukHByF6l_#&lQaz|IUE{;`xk) zE8V%q!9)S_blsJM8qI{AOWYc;sKi=aiWDkrsSec`xM%>5sK}LSo=f?ue6-Xmn(>!% zHWFLyE^JBaipGrO?MtSDg`$hj-;#JgHX%;eM4N`DcJJnX#6V5gzPGlwV@u+Ud3vdT ze0C@cgdn3i0xdP{9Y98N5$4lpzVc%nYfEvMC)t6iU^~3N z@pyZ8>*Tia3(iefjU;+2>&jx)BQJLKB4;oDRB130>KYCejl|8GaC7zMHTO)dSm{Hs zyt$#hCmC)Wj5X}vk$ZZ|-#FFOTUs7(XfirGlbgG{s>AK}+ol;+Tm>$;$Q9ck@B`+g01@ISZVNQ1KPGw!-i ziw)=Vtu+xhxh7oCKmIdWW6pcG+1KSizdaBBG5h&p4QDsp1F}{nh;6=71UkgpP;ic4 z!C%jV^Su=OH8)(=s)D~{!^gNou|6LoFwjBRzCYKhI{#Jse7+CYD&c-_z`$a$&X={S z&VPaDW348!R^NuTI)ZxlZ&+)!U}Hz^u>4*-vPV2z$%6OQUMM{H_q#X!Bs(}&?}(XG#%I=6`uy!ZL(P-BXCt{UEX<5&Dkn-i z$2SbEIw#~SX&YEsu4Io<_NjsH?t#E^GN-#a&{!MjoZU0g*_~M!ibk47ds~OQtHRAS zdo1zuO6B78^dcx~NIxsU{ICGrM9+{4-p(0Ce#6ub#=GYl(mFb%&(l7%v4U6whzuFON+`I0^#0<*x*xbl|6y#+WPY5B6H4% zJm2xm+1c2J>3Dx4+}v5>^ZGU}o|{=1jYb-Wd)vJOMc$%ttSK5SwK2=Js4)1N8?)w7 z8~&n(Q;Pje;BfkT{ASK*#F0|tWmFd*Mf@SPkdTfwyn3h^bfKXnGWya_L1CERuQe3piCg141D+d2H@bmFp zm4r+uX;h{-j3XDURVbvAR#c({cc*vahxv)FwX$J3TtxHe6fYTs=2F*0Ev#MXTLK35rt9YT*H;APn$;7jdxR)T0*-UTRL{h02*i9Y_hpsAa8BD`xM*GIc zm3$h9d>R+|gq_B4LJWp4o#%85MmzycGl-Ibkq*1nEjj`%MJrz<8U9M-6I*7GC5w#R zRJ8_%jgsn;m8Z>hM(6fUPVSlQ%zYs{O%YT+5D$0N7Hj+GVUazeYsJTcsKM)5dv<#E zP&Te)&gyx{oc2`>bnJU%Lxl?WN|T;9ZS@4$m zN&^?cBuq{xSe=TOcXIZ^!k9Z{_TbsX36(gJ&T_T7SD*+~6ajxiDGv0G36n$D$OfZ{ z=r`6X^g{z!KfK~}H80%*pBjL4-#yvcEtsZsw$0|JTW zrIacXiBY#2Omy|3Non;&?v;#LE7Izo?uj$b$o&E?x~j4M(z>=FJoTXW z=YW@sy^jNrEE)2fuN}Vv9g@qj6LA8%xVIP1X~AC?ejNinmpVJp>0)OGf7-zZ>{vca zZe3-H;4Z@5lmppu!*hr}HN*sxD3t5*De za7Y2U53F&0KIqxlOevu6{{qj)=)0iFZuQd1HQ@M-3uw>ri)mh=Spz(0zl9W_(tyA- zqyP!5LNH$i0%I2vsJVziRm!i78Zq^S3I)R-oQY;I{Wg4DXc8F4A21{s!>bdl z2XXH@!Fmu_uLsuiioeh=5}TzWi;qaH_cf(wx;nxgwZ;CT=Jxbc7d)La^H>go!9 z)PjR9uM!=baA48c;+!vfn>znFeSQpXpYzedD-M4T&d1$ez!7wel|KtQPI>;p!ft`n zC&@sXZY(e2+DS(&V5*FgLHaz61)Ku%R>=a!A17Ga2z7Gxv(%GD75RrsPDflF-xzTV z3r#av%xGMv%ts9PQXBEczy*-GhIvci6&d>%cZ1c%&gKU$nXXu_E%T9=ezu!UK*D!6 zQ^Kdy-zu(LoIQQ>61MS2wwzaMEc!ML0F=sO$dDb6>U3x8hOi{J;s$f7yM$*j(zlFAxs;jvxPL z#KFdp!r2bozssT(om=PdJSS4c#AD7&BXTO#&eP1tMbQjk4LH&}{Rk+qQD%+nNu9?; zIqO%e&Y#K6s^XumpW2!pov^>{ z`BLlD;N&@jlV55zvuiG&JCyC}%Jkabe)wE+dNlXl>CsO)Pz=UN(Egwp8$T7d$MsrGkeE_mIY4_FfEL*ejj|yU%XH z+-YgE{M-qH)GSowI(5e(p?XsD5U3tHB4Em^K%UlWdlgjbXn|J&+0s}v9Uy#l0;vI8 zH3HUyqw>qC&HR)nO3ayje*)Uv(8Z0OH#TwDP6eAv#twvhZTpAZ9tCk~Pwff&BBzdk zaEvpQKii_8ct<4W@+Q#6jYlGJO-pcM(0#4tnDHON7aJ8#y@Z33dw^5EDfm$f4lUt7 zM7|MDEkRiisGl;vBll@i_xWpe9|h-q6#OXR;4VGT>%N0I-GrV(4=I14PXBeLPbZ2v z0HA zVy*upsDd9AI1__Lbz|HV_YGO-kxJCA@$&EzwR@dBw8yJZHKu z&zT;L`-%=8OpT}d!d-)>Zaa6!*klO+gJT;ydU}(qdK=E&xx7DpHFn_~|4?%!(8-A!X3s)et=Ib2p=-ilr&TXq)p+fH@Px0)x)J2g+QS@Vba#yn{_=Nowz zqMy8Me$qUOe&Y6e9HTli=5gE!1?dtxk>8onUS5KRS9ZFDo7;9`g3@BRG~uYiQe0s* zvg)iIRiQ|tFFs3jt(2f%eB&x)dMq=rxE>cUvGf*O+*udIK@E|4ViBEcyfC4oOH90y zDlJqi8kC~;wj`5z2k<= zY3a7q_zZt*O0R4j-w~(}Cxek>qBYcr-BROSHI213Wu>8YE4rq;L*B&n)aup8zRRo{ z^P(%GGn;zHyE|)|>S{_$8`iCeuNtK4j(tt~%DjsK9(^i( z`CHH_rlzO8v$LkmS6i0qGA_8IYxQtjd~U~6vqO=dSZk;SiS+ZElB=>Sew3Te7%%NV zRM(zB$D~AC1JG|6qv`qS+|hdU!OZ@2kVmf9BX@||^wsLJVxC^(# z0U07y6-YxaH^VvlQ)xVPB%RK-L^>*y>o2+Fyz?%pKBerudo%CKwzZvld-h$KFV6S_ zT-Ws&(Zk|rWZxoKdq2kp283f>pKbmL)-~Z=*H4}p4tuN~orV`db?AA6a&OIkwIS`0 zS%FB_bm!zlIeMs~BVZl)IhkdxRI8ZCVm~BxOz=a$v2rMeU^6L)BCR}jRt{<34daw* zn@JI}KwTt%o0xhU*p=CFD;PF4Us=2*_p~vToSaM|5O$+itiiuUPx{5PSFSvJF)OB4*4Y=D+?zDPbSPwJsmUTiom3k82Y4^B?2;IFyiVp%BoOE!GWJYP64 z;nc6jUH7MDq0WERKA-Oc?M~p#o|#+r{FmM5i)Eqi^8(>m3k~2i*F!>&7=|_91wN*N zoEmqCS~!uWh~*g1Z{g=-OuJbqAb_LtVJ+)>!gpdIb>8w!Jo6|@MZHx*gR1uFG@T89e!32q&blnLFQ0xHC7Bh$1+1^+e3B$ zXXx;txgeuCilfov%5p1mITpdy;ybH)$oW{k!g&b-!(7WMua|y>R+*7@sMSiTZpYmz zZP;q6+*Ya!XMkE4a?`DPS;IhJz(V`yF7NFu6}Lg)j5C(vId=AZDxUj8ARNM z&f12RfE7&_qhNoG*o56gc>YRspZ}_TKCmx#mO4LRtgu(&jbdl1`#-PG$E0~T3nyVr z4IVttUiPL84AuessEF%GxJWF3Dmd@2;IFyia(@MX zDGwgd=MxY2x$Z-bq|SfUeZFuc!pV`=IOmI{uFii>ozJU{AIW=$)qDPvyr+iKmQe7c zZn$_Z75qgFM})_`&&%B22=C*?rm})h1%Jqf_vXRBWW#&%;J4ZEE(?Bq481}h(Qx8n z!gYV=x!uvc4qQpqc+=4QDU8v-6*xwJ! zwL&X&-~}b;0-X!66f31lfdx>i%M;BjhF6%s!te^qo5(u386c4k_h^BcqO;%D+h|4*vcJu zAoKi+V>f52+gd_8xMKXb5$AeU^UU0FHUItYc__Nph7Y*m=mKJ$A92Hr&eCwdH)YKm z=ih75QQS*9(p2EgtLwTU>pIdw(N6n*!+G#EHhd%x?mU0Og3I$QdX0NYuP1x{ly%*b z=TGOs7wzY#2?rhe!IvHa9dOZ2;Vh54XI>HZl+|0ZZ)*L99fl`g#fAN9am8cP<`0z zadkbeu9ti)E9T6$k44)3$xf_jRIEk5)tyYmqM?7I(if#R^yJ}K!y_t3#)N{oYn*@B z7|fdQJ@Ty^)~&nYUydC6diK9IXTSODzb#`Ilt&K#F#TBixaYn~ zjBA7sB(z-MzFijyzoOp@{Awi*IA6gZ!@MYXl5l8fqu>u0p%Qq(bEP#aI%m*n!V#uv z7J5#(GtpJMLsNmi^oG8&Wm5=O`O>Fd zySVG-y@M6lE^hh<{Ua;4@A*1+qFX%`iOmjmtw`5qe{({T8g%}2e& zKcY35mn3_3U|m2?nU7*!)FXOxfi(jKRqc+&W5p5aZ)Z1XM#DO_z2^lHs!k9573%@y zNWF+nHkCHTvN5Jp#8n(i8HN$dz+vhBN_Ki5FjakCPj<_etdU*3YR|~Xo~ssfkNj+I zcujvW*uQ3Y?!pT*N7uZT8QgvSwr$t%9$c*NT{H5~$eP~z7uJy8^teoPO%nR!_zwtO zA{s`z)UhiCC;wCM-aI(*rQpdtIPtFFJ$Z1-R|W6NgL6Ix9er3(7UNz3T`uz%7wXjsK0vDDvpS>Sk zjck!?j{7rlyHsqWC2SGfX^<_pdhW%CY*Eok2uqaS9OgDqfVT5q!&IB}aRrBLW>^!zu z)7H|Ur8X%~Q4}SxnvsZW2CouHO1R%UVa*^Z!D~?zBp}Y$^x#m0>$)lHI#Ps4V0FLg zJUAtwf~N_`N+-wob8y-=ct18;G@%!^LlbV#kd@a)Wr(?MoIdWQpz1;B8HxcW9%RX6 z8$gWAm!HbU<&0eTcGEa`+y5~hZ5o*ET0Gc1RWY)-XKdpY+j@siy=V=^`^b4b@gb(g-rKMvR+G)?}^5ez_@(g-c2~zaN<$H zdn`Dj+21q&R>K+1zS4C*SEf2Y#`6_N^j2WyL_G<^_8Js$M4b%eAg-X7kUJs6>LtY7 z3B?&1YlI9{;wdJX?H+*Gy`qRe$qJE;Tb`l+jdi<^sV{5=Q{*`vpNsHO8?%tpvMicu zYE(%AI5L}v8$K&rl~8vtB4&iBL~NE!v&Th;tTR!20U?)82$vQQvg%9}8B<575jveM z!ebq3{1vMn$Qos=GzZ(xeLI_b761OsD9gQ?F+QBxk;&}fCzCq^32jF1c*eM8r&=#w zuh2giiqG4F{ZjNgGWH0^#)=}x{(yp)g1x<6=3l{kH9P?LWpW<{@6qrQz_0X@Gb?zP zhT|{eR4?aW!DAL2xn-vcXC@pg5s2se;O%feEh2S(w{^b2$(hypgZlh1;0L|r%L@fLvGP)o5(D?HtjduvX1Bk{Q zmHC9Xmvj-rf%Jm){DRC+F92N6H(T^#u9o?c$gfQ=c$&EyohRcAXVQDT3;C1!KC9(E zg!4X7l?a#fX%Pz?xk7KxJ%D)&D>$UoUs&^2z!jWWo?B0%CZrNf^?H}Ap$fhJuSU3! zSwl2RRn}0YEPkuYgvuIH*??+|v&VmtP#WEW~IRu z75|>>=FM4SWc_v5edWlppJu+=l5H{iGnrTVv;D8!_=JUl{}xOR2xbz%`vd zqTXlL&P+2iu&&J47Mag|%D3<@Z0KpU`xd^puvO9oqfH%UMdr+W#9TOb495R>Ca3nc zxcscsh-u2|zmXXj1jfMokbvdDsjVt_ZyuboPr-Zg;N*P@-etqb;FY0FB%IoY%1B)L z+;01Pz7KhvI)Cs4=g0HTC+}0wjS>z@9XV(YxY18>V%$a1oO6B6Qogp<}>sKb-bDLbormSy+`U*r^P*tN!#-y%B zI#e*%2fw7jda z;mCzyAa0*h=0HspAP+_{E`k zV&$t#umTG9_GtJr6s*rLpkRU1Z|SCZU{{~t>84=Ox)sGw*yr=P)=Go6j`Q`?ofYc3 zZpyw6D@e3;b-(F6IJI>JPZO@Rb?*b1zmYtup17s)v3+rb_FKj<9AS66RyJDyt02q_WCdZJUn8 zgCr<+{Zh7E_fmpd#xce1W+rOv#pfofp+O^O*=5Jx7#xbt*4NL*3aHBQSOwNKG#fu? zZm>y8%lB^yZ>4J#>nw(Y4X1Qd@T3KYbo-V_H^QkWe8`^ZjNE5L-RGFP4|!-tJS_^I zBpgzYo~{gLbgxrUFhIxFfXlI^(@&fU-pn&LyOK*B4dWrtW?+9i=EI#WL>S%Kn}K&a z1X-%NS?2>$FKEE|1NcpKk&ofHSvcbe-Xo1~s!#kR3Kr)9VV05Dcljl@Mt+8nWS;1< z+kBUq&NhK}ywc2bnXSlknI*@{ijExFkXcw=-rN`IAK8(PgwwmHI)=I$efVMB%=~O+ z$8an;x^1exbJgCd6D19G*G@m)JKjIp-w+Pf_{++olbgo+*N?ZuqgFokc;8t6RCg%c zSW{9`9vxqs8rU@5Y364Tsk!6oR&&>5%_(RAbEn~?fmxYTWE`14h9)!Wd9Srbb<1XF z3Z2fMSPfKd+#EQ8sR+w7wc)7Jj@uAcp8bvfPpi!C!pS>IuHF zkr0!;+9i#^;@R$u72B~kHi3NywQ}zdTInhO)jON4=Pn_^>bjP?SZhr~VybiHJ;yyi zgEQo=PbAh(b)tYYP#@`UiVyT-6Qi=?qUvxej1+@#Mdmxl-YZJ~_lp{bH;zu9GTKOr zZv`X!OJFDDxyr&$0S9v&?3Tt%tE3e4=Y_;~^kvJlNU_AuYAO$fy@03_lj3RNGB1Ue zE3F$^HT5n(BQ!P5Z6pIF^10IvA6AWC4;AkPy)sTN+6t+aOR2O;N!F=-US@gV`}cUuuu?pSn6Me;>!Q5fPxpZ3lMdEg8X`v z=$p%)s#dpHHRNitez$!---o)ZI)Bix zvpw_PlYJAN_oVKs&W{qVtrk2N-7r68&0~T0Ogn*`#sB*$6s9B2*^h=&TRBDPR_YXP z5J%z_I_$gZfrr58N8JX!t_Rjey$WTFkrTkg#~z0+PpI)@+W3QGMrC{T){ECfXy{i( zXZm)n$^L706nmak7r8y6iQ%Rq(+tm_x6Zf#``6q)vTnHXw6l%F_`dC!>zgm zm{L}#gYis--TpkRQ_EHGh>i7^y{*u4J3Z%GSTC@;H4kyH?&h$T!%aEI6kjF#U=$7e zfXO$gHo#T`7zTGamnd%`nt&+D%|K1ZT}!a?r%-kKuLvxIg12S+CUQ65^d2>GjD(u( z&zG!=F^1_f4tm!2anUp2)MVBDJ2hsjV0gVE>ya$X?@j0~V+zi7r{Fz# zaIQNA@5+O7eJOaihBtx3{juDC3ipRTwF?J~SHXFI1@E!o@OS^QtY5;ZJL3oYd_Gs5 z-({V@Ls;O>a6|w_*u!`f6O>p)rjjYG zJszlrQv@q)X2T+AcT}AQ3uyOTN*Q2+%JvT zxnZXIhOG+<)55Hjv4lSq#6}ucO43tIM_Mx#PLve&zSsDR<#NB6kJMCSer%=kteavt0-l|CKSgi;UMTzxeW&$oRO8i< zx@kF1?f#4-3!BZq*__RNXW@qnxuEGkqoAodylagUnJIWzT^WK` zV}+r$s~;cFd;^6Ym5!j&3b+eJsBX+FT2G`dh~0VN{Tuzk56p_i+`oSIyT-c3V=rA| ztSvHb*?~5~kI&~GJNz==1?%Lquu}%1MF98ISPS+H7$iAcyI1iHr-2MQQQ(!h8yWBh zuG$Y(&V#NfOtZTN_hTfU&bB5wqY-D2in*^Ex6R|OU)+9xeMG61AZNj9=%cb=QB=xd zjM@9}vaL@D<2tglCp*?2+j!~Lt(R_$wU4do-gzYVVt4Pt?Ce5sckabo*Ui+WGN-1e zF5Edfy7R)R^r@Lt-ORdM@2lD}ao570JqveDY^k~r;}1eYU10{WK+dwpueDZZed`27 z#~JCCI8;&9loVrBr5F|0C?yYrqiQ==wWh08`30mf|7SVd4dZxv@}>`-YM!}cN99~# zbj&y}H*NfF7F{W4d==o7(w7q1v?zBLP9;6=Spt*(hiK1fc7aT!0wxGJ!_IcARQ zv0zNjzBNn7q~5hu-dZ|wffmZdZc-%4gdu4#Yy97Xw;;2eZ}Xv@Y#D2Me8=B{9^70j zO`iSMvkS6wwKNoOu17rw*g<73@Kh#CL#5nVO*U#h75Ih1jG4MYjYY0_YmLaU3tM;q zr@nOqW1EcsN*}r`_x8(-ORpP9WT*e^(jjP{S3iB{olhIr4PW#Z6IeB@on+@AAMHwD ztrB|CCdlzMs8-fkE9g(AK>JSVK;@#^s=yBVf)2m?2{n8di1!bXbP@cwwt0SBBK2` zGq_?>aJ+!Cxbxo}AdogflUS=03GNf;i`rZEVD|?rz>C$as$Jj-N49tsJiho)s1%arxL+LELPt=F=-S{PIT9G#Q;e4cZ}BgO6$rZsp+~*&!-Ph zOy+()IdS;YnHziJ-Zc%eis9a_=wM}JGP&!XOy-_l$;n9NV6>}uxFXiD#vAXsQT96f zB3&R56Fm(ftplP7uugvt)5f3o5}cY|;)ECv{lt zG20@9N>`b(u)2Z71P$&g;JO1J6QTMfZb+vMB(3yXvK=nckWSYKscIo<{YPs{_k*#x zL8Y0SJY}qz8%WnzmdC>@Mn}h2Ob-t27#uu!u&8#`sssC0Ost-ZuG$x9=o)P7>gj3= zb(9nrm-Htqy8E-qSYS(Eyy-&&&EdsN|6GZ$G&2&LNrnVp;CDA+b#^!r%L2ZjMZ1GQ zx5HRiiQD72TneNg^w)xCs66@>pox2qmt%cd+xD=l3D-KE4~$YOv&)J^vss)(pj|vC z=pUI-q)6U_RKq(;|oz5MVueqaSNtxS^{IU^?{tEpKE1vxRCe{rB z2e3@cHyB7({LB}wrSm`wL{Ev6Df{o&TG z5?@1IWMpOiik=7GmX;Raz|lRsHfQ={iN4mx*1l{}viBWaUFgNa4qE2|OTB8BZAy@W z&W+lHaS-6FEM=3BiK$h^0z4L1G}^6N6w6{>Y8XR|$eG;qgSJde7<|YHu&NR}upo!w ziy|$(<9%n1%p_xxL}j_xS5r}5Tj?kBXQT7$N^6^IVu6WdtgoxBrpZ@qRFrqkzx9;U z6jc~E?AdvE{Xh+5wot}bFy2Vf>8qu&_AKt|1d`mZad(R`XZaG(2Yrzo+&ych-Ql*xO<+HgcGeY230H?RPdui zMTdSW_$ZECd1a({^2=NuPdp(j!^m!W<&{mjM=B zq!ExoKWLHqU3aNz{{%Mb($b&3)_s@+iwAJ@h1Q`n;RS=$)}c)JZ(|)&A>>$S9a>{i zjLq)eZ|=)~eeyAB%#U|(fpxf9-W_|MsIeI6vx>1GgA6l?k`r?VW2thiM<2zY&m{&O zTD9hhO>NOz2Cw#JccJ-c`rtt`eDI*^n!ocyq6IRu2a&B2Gl2K$!25V%e@uFd%%6e# z4MOp;cX}=8VN_6xr`4@?+mE9Csg8ZFt2Lb^=U$XfmK|#`RkfuT$712FG~0Wn{;mQ9 z*DElVfMBm*Fe|p_R5f|r^+hd1R_Be$6?KqVV{!$Twbhw6Ww%VAHU>)w>XWTbAyzI; zk+e!cJt_!UCSB)g1Ho>MsD263=-Q}F`yy+%95}FLZN!I)PUm~>`QmUa7G7hVv1Sdv z-1zY9tvB9y>&ic&x8=o^{670|#wbk;{QE%S(t9t(|K%&_1X9mT%e=HJnuoUj=b)3I z=ZLl93+SXkAJG08VBE6mNjR!ht`sYldvuox8PRTc1U2aA@6y@gKdqrKn@iQR(lE^K6P>)3?7ZaEXQmqVi+;Y z4=-@Ax~rE84oD9H<^f{Tw9o<5%_Xl-{sNy|I{oV}jm@+nNjMfpmZ?+xd9NNP@=kmhQUi~zPRQT|R zFI(KjoZ4q zZWhp_wh0^(bWD7$7r6N{1CF2u;NR^?WoWxdT5i(nlJS*beBAd^mDTGlxpA>7ho%-p zM-?ZLS`*zXDw>IgqPC;Oj$r}=E=R26aiPLco!&3V_@-&dUyx|ISBREQnOnh%n&m4p z7Ix4T5|f-1>@+*R!2;YksQ4{MO`oVWqUIBf$o3nlQ7oNOsQ7s^3M~(sy$M@q*s+;= zs2lXSbOSAAo!N9WdzvW-VTMsyoKw3)g8 zJ9{0R$YutUQT7e{^x_~Ry!IGZvAjmEQ%B2b? zgD4Z`=CM=f;zg%H{{=}0CQtWuui7y(xpyuWLnG%?PdzmdncX+@322odlDj5$&U9FP zmUKfUVuc#RDo{9gce~ocN`Xq?_6RI%1hA!=W&U%&XthO%4@b4>FEs^cbvy0=!rL|F z(?KP>Un21ks=xLFV5d@JOk64GP88_xsUPlHzqu*3m@*c@qn}UDzvZ*W>FLzKKq|AP zJBHmZXQ$Bnyh)6o_kY)@eK3}6Ova!a!TTq5&psHV965*_b%@NCYW3V{ja;v7C$L<| zyB&_EVlPO(;Er}y=7uT-MPmTX$XiGl9|nH!$455DMRFEXHN433(_h{pU#u!o#pB&M z8m#0Lce0De*C0c~tT^(S!&e=C`;pwojMV7Lm7|MH(0JtVx6eOt-UW-J=~Q|&_dM+f zj+GHuAE=*Fnt!jv*ej4JrrCGF$WQJ+hOLL_ffI|O4pHbs<~s(DJdBO?)QcT^l0M|p z1!%YV8NF}iR4{N8(iZgy{2|L!Z#k$P<6igkM=X5tP}^r9X_ z%hq__uyCh05qI8QuNMapCkIB%z_xQv>NJ)m=J=T{g?0fPl^$e}4oq>OxCNkuaW!tT z*rZ*_O!}*WyNPPQGH{qfrb>V4LS|AY8;h`HuTNabD0~opuiVDUrMyBQj!StC_n<2o zn|O##%jl1|lclqW%9PJ@C#&r?XdUJGlhxMd^wltPU*i0YKt7&^`J40H zYR#VxZaTB01*QXV%g1IW?h1AspEA=fEuS)#8z`K>m#WWZbTldf+a6%N8#B|3JJ9{d z7HuuEX?j8aUZFb~79{LOD&#H!sdf}bv#F{1gL55yvF@Jw>gw_Ewk>N`?b<%Pdd1}A zsv}2=Tehwq**4t~>YnJ>a9YoX3j$5avDWT^!Or?0(?_mgZKX`#nr0K??C1m8;LccZj>Msdxf`NIE!S>t z^68=0Aig!8$~7GXg*Aaq(HYMyj}lL}P-|T1kY|y7_P9J#LAaXj=#RBry%PRW%axcK z$nKd7b|(j#lOuy&k*?yR(olK2sk^ha^30V_{^=eh2@2YtyEC;aQ9T?_4n`X*lg&4q z70vNhy#|3N6RYoEKt%(N-&q^84q8r{KTFeA74cAavbyRuyE0~*F}n6A-TAT%pz%7D zW3VJ}gKkJCa6DHUS9J`uSN6qY$?EbVU#PyKu|BZF><6iQJ9}?=LuX@CI#Aahuj@_q zglpT2{YHJo#GwygdWj+$bMX92KXTzhV^f2s8`c>5kQkvQvezqrqskD!OC1jKjeTS; zdbQ#AWxSORo_=rMN_Q^H5^trHds2-5>%xLn;3@NrYQKz`qCnUB1#({T_9=Tb=<$HR zqw=@T3&!8bHNohrK?M(BbUluTM=RdW=n66`9Ue>>W_fE=OpnnAG_cb;R|(o+Hed}X zF3r#>eLBqcBVD+2D3>=$W(^g0#tP6K&b^h!%h9n|U3Wa(Q(5k-^tJXi6z6_8Y>aO? zGFIHZck}l~{w=&CP}|0oejmPkSpC6$ohv}V6-f3%8*~2pO?-I< zADrsNi{oy*e@eb!?3hNi{dg%~tdedJ*iH;`(@n)p8io*=;B9s2p(BR{VPRp7%$rNd zw=m90;kN{iL)vpE0VeF-rd)SQg_b@Ok%<~@Qq1VydT7CA%r6Yxa?d@t3@sSl3&Z?2 zypa3eLT_eaA@d6V=^I~v#RV5!F_p_(DwMTt!Q7$3lXm%)$owQEknk z3qG33e7I+-vnpcL2%omN?N2e@7RP5&AiWC^P>>7$=Df0;wtUy~oAAntJ#3B9IDnCz{RvdbN8l)r|flV}CuzPcLGRgF?ToGl2zksQt3e8UItlJegniMC59Z zHtN0Y*LN)$a6awY6l}uW@pye0?{c15XFP@0JzX7A;G`MiMDwNsjQpnYHreAv z@gv6zJ|j9b$IJ0Fg9Mz&tur3W8>`2#bQ;kGVaY5id-Dh+{)p##>wRP7lrfh#AW1;d z1#om7YBI=T5iZ(b`(u^8*Pw#5@_lfYje!W&+k~AOlA8U z#Fh-l2lm{wd(X{#q4r|-p#3}pTy!E&?Jq5C6qrQ?s-S}nJ>ia1mKw6l*rSd)Aaua`kc4(fS`_Z~$m&WvyC~ZH#N36a z40+F7$bARI-M?^_Z+PqZv#Sqp8yMJjcy&uE77WHxE&3Q3IQ5!MbWpH|#(%H9Y-``} zfp=}+{;mVV>+1XF2fsHs-y00}%9p-+;1C%B=I5~jT0Bu_zrq66?Z_gHGPettwh+V~ zWUt$63*>oZAwX>l<4X!3sC!gQo1h*xK|O4uVp=Sxam}z;ShWPBWAQh8dRfE7RdoVS zuNVCl7$u)E8dfYer;}&y@0i{>Zd@kz)~36kG#)zZt#3UmbNko;+`I?Y_OBalW7Cn$ zOS!L`hfkZ4J_;&Rn$<={cuk-A5;!UKGJ#7+X$5~n!&N3V&*!jkK7Ypf0+;g@{0$A4 zopU7<;~6=x3wZn~yMCH}x&9U8EmETpxcL$2xl28)PORZKd05%qTzOa-WT67&cvxL= zS!4ZWztmZ}cRtN5UC9rT{NSL|aiJi&$sq`f7`!l{R0f}yPU|p45E36q1Ik1oi!73` zg;Qe1ZxsS7m$y}3SSsvP-1*M6;%I;lu2W6v%x1`r8OGUc+CYx+6<6^6@6CJ+X~rMH zk@!Of%rxQ>Nk=0qh!ShA>Ewzy8#gH~$kb!@Ol;8J0rpJ94!1xix6EKBsCr#TE#Ws6 zX>C%OpH0w(xeS;Gj_q;5hMD!jL^Yk(F4>BTDR5-6%P?rT5)JK)=KZDB<$h)bFj65y zEpA#ne(J{X#MsbXA zndyWqM@j%vR#8pO>I{;XSTmMNoRpmy8t$JKHCK7b?LWi#+AuEeX);JioR<{$8Q z@tUz^NQ?O{KFw{#UZhyCsX5p%@h);NBFq zdR=ift&q70u~h1JNI^%wZS)7!(SB1B`i@PPm3y0_y&)&Ue&Q_j=`EFi#I=I#MC{4; z3()VJwN|u-?$jbViItXX%I)P=lB2}sqGmL>#md~snCHTD|Dd(g-Ayv5h-7n4neolJ zhL&`b$Ylk8)eYyq0gx>`{{sPCv$Q027{N)F zIo%xry{f%f)%hzr-!DMtmdZa={1#98cz~$k%YKc1laE)z#yv-m!#z9m&r)OWmPv7nCzGjc6Da$%zR&M zMe9hqW~%4GL&5nDD`WYdv(DPJWlp8%mqf#>y~*S|Grv6REN19)6`9`<%Co!A6=aqb zq_1eFxg%h7B-3`vDSw8O1?+e?y5QaD5qx%unzVd4sTFwdlC$VW4~q&#El>6LbyCt! zL~lxVNPgNaCof)Lvf5ITQ`HM5s~5a0u!2*lN&Kj_E(=n3-20{pnK?XrX$0ZK^$T>F zp?R4M8E$$eIdU)X0b(=ErQTlZB`k?DLU(q+Vxwo4;HgD?H%v61?jBX0(HAU zSJ6$}gxIJln6fU5>Bbjy6%$?e!?1c3AEJwXd$q-^4@))Qcg+NDl)eF#jy6u8KX1(3 zICuJHM2rcV5Ke}a9pH_cV~vYZvYb5VNqWRz?Ya`u2fN`75Yd1a>VfK49V}| zkKF6#q>~)U!U{!7z@n8Lsd&GaaI_*L3Vuvyb-*#0#`;iXLaf2W{;XpfE#sR&mzb(&ZSx^#0Hb>5&A&& z09XWeYNMN^PU;WYq)*k!8_{!~c;cLM&apP>)W_+IR;;+_xv7gTn#z6M%Kx*D_Bc>k zVxCFL#kk(WN)yP%y%t~9&Nk=W-E5SuG$$M%krexCKp6J98pO$>C!#(HN~PY~=jg3` zb=F9$a#Y%RR+^vcxDOrm=c%%b z#Emx^aG>RGHICrl@f)dkSR-li++a~afww^W*PWqhccZkb;7fB9Mfg`$jX3TiChQgC zRjI0xaXIa(31z!#4kUyliH1c97zo~f$yl@l>Gt$B*SH6C%{3g-e8xSd%zTFP6M)3q zh56}lY`g;HNp}@;M&%Z8OU!jk+OY;pNjnCuRr?2P<@zuTcj7O#(vZgxIl#;&7W+9( ziL43*ruQphhhREZJ%ydM^$ho+0q;UBpveBoOeb^M0dz^b-}HZTbnd`tJZ2?0NM06(2hR$PHbpeNbEkE0P- z=qRB>LM?sNRWritg{oeRqf*uLWxkWk!@LYidMN37@SXPHPhNo&HQWDnnG&3HE-kFU zVaNMA&;YP z?44p$%WkXU`)(4RM=kOyU^3)nju%)c1w^!zW|Tpq_{7Po%g7g0br~c(Fh^=ZLA72W z%FLC5B?*-SImq#&&sCS1rJv8MGrJ;lryi*>1`jv$_$eh`0fC&uksHNob`fw%B7GN>rH9o{^Sc(80+&aU&SnV#` zAU<%G_J>7TZ3U%a^8+!lLDf;N+?aF+?gpl#zI`K+oD~tK3d#jg2;d<6|{+ zhgX_GtH>1!)dVDtRi2clayU%$&aY zBI%VKYmQVD8H3}-AE|8xb4a2xYqPT*2eS8cPn>Z^?$d8Om$Qcr=*&y7gPPAk; zdw<64J3Jq&RI>SloL?_WN3aT?gPIp0FwOmD8HzD9rqWeb@8Wf z;=>4_6%s-^KD2HX5aJ*>ET-hYxnPiNC&6NYd+y=*UeCUULI$?x6bv8VhrSj}oMxp) zFW9Mw3aB!5##h?$X0Jxu735IK1pW~bQ`)h0C; zNm670LqW`)9K^8=$7yidYqpEo(!( zD%t!iXWQi+zg1~SV?5kiv3L8mPNm12st%Fd^uPW&XIrX5gbKLF2v$!F2h8@!@zbSR zB;$0{8RT3Jy5>^*Se<3#tPsa%fsw6pl_O)e2t=&USPVUcdC?(nama4loPm&#X;BmHil-DoV zhd-X!KOYChy8x%eRq*aSI6C%fc+`QLPs{lOa-YOIaKJ1g`_X(3Yj(i#cNU~`76_Aq zCF)+0?kJ9|NJ_{z8_uC5;X0&XqHBvKvXuFxz>e%d6B9GA}+` zYB40K?nDI}r&}w9DM!l|Y+z9+z2+#eHtO^}EsziexmpGNI-JMo@hBvZw9s+;kR`%%0?c}8QjBzp&_?=V=VHS|ZK5ybDu*c>Zi=-x zNjXelQL!RH@O$5TXKF5P)x>nS-fUJjC0bY$^B%koGgS`>Z9Zhl6KzE~3`IxK9KZm1 z(13Cji7KQ6*5ZX80Lp+`An;__tVy7pd!)cOr{)53K(bkR;nFY~!)Illq@3Q3+ao^| zXOa2z>KIv2JDN{OnMy?H{MQpvrc+A9jM!yK)2byhSxe+)f9?@P!|k25w3EU?mA1nK zGfSdCPW=$Vg)%l)?zz1ZkD&Eji*D$ZCYq`NAez+PX$hbLR<%cFmn6)dpae;$(Aq^v+wII^;fLNNFxTe!JB#MD zq3+#1PJ#GvJVaW5doyt%_QOzdA@su_n&3wwzN*w0;;RJsLWc}k?(XCOmQGnQ zq8>$;$m{`K!Vv&mI#D8;W0v}@;zcS-l%L*Q5GB%Gs+OcXzv{}{&T^|i^Gi<3Hc_Z( zPPY29leR^Uc)uak_V;fdpH5gvXUwGm@#2yeiFu`08qxpFa~r!!q}K{!qG6G zWbf8lr!v54brl4buI7F_xu>w7(_dM8I^AjQ`lOF5x!=zA?cBr3SeLc-bjs$=w>EyV zj`o;Y9ccbBegW0vVM?&7|AzRo>)Z>x zLOPD)ur()bTrDsXhk%iO(aY)5qJRih05eroY<@d!17X1)iWQW(#122-HXzX=KUzY))| zBvpqksjPTTor-JO@tiu!sy+WWcZ2VJbN?~-_g|ebQgfI4-ZA&@b6@!S_G>ebKMu|j zFp`Y5}6{IcKm18jd4#XsYSP(~^)bd(8Z(uH<_1AL=`w5c-(~-O&H_W#LPdK->Y# zCp%*)8~Rybv@qJ^V6=e1meSMm(H<_4{K(+)(Vi2P2nG@JG1ljP0PRlKv}SWZxK@>q zSv8RN>aphe9gwNM>`uYliS`Fl#Y^8GY_#M1L|^U)*`xoq<$o?Pe%=1(evmjMIu-{_ zQ{{h-atV0=5K`L0FDGz2GfYV5sxol7X@XP2POcX{iQ`$BVq;e9MOP!3o+YklwG~!@ z@A(m~GsuvmWOPNDi)0t?>c{DOP|yUHUf_Cd@GdLSC}#y0aYM8BF)L7+!kP#di|LxU;~=dQf$ zLFq@36Wh-yGec+pxN{}H&{9{|!q1is8@AwMygd=U7F*WwpRt4c_8sI0v(ag+GuY3n z3|aE}4YVK1;Z0hlbiDynPUvtVx%h#rx{)z|0tf?&hW6~Lxn=dH+)KvguXV&1a$klU zNuII-BaJ(GT?HyeoO2%c;3+Cl1k(*;WvxX7PAaAZsL5qYKm^bz_H3y`vaGHrLO9jV zh!O`McTq$ZA6}{RthPvdV@Y*!b+Easp!{BE9|Np=euEMY<&McG7DDW@!ZPp7vZ~VMsgX91LldTHZZ{*@?)zQ(Z>xA!w}$ z5S7rt7H^FLW6N&^^P%ZR5@)C~z$E?}#}(Y87bDEee{Dx9`gmTeeEOsdh7O4AEON)n z+1C0{sHCL0sw5ieh&MMy+d7(kRYldIP_Sk7_~NF~uK3hWW4X4{RHF5U*%&Tw zj|_A+mozs3DP_SLLCRo%w6EA-+}ATS4a$Y7V$2KGR66@;csYSymv`Tx8!81}-S5x9 z{4v~F4EmwiF2Rw^tCDmS9pgSW2wp`K$X@#VM{c{MzyFL&F7X@hU;M!j7T5jJM>!*L z%m{Y?a%I{T_^#YD!i=GIZP2LXfG(8zss>-o*ly7C(IBvEz+ss%l8VY`((s3@x(4haYuDt}H+*j0mabK&4p(L7%Y3D=_|VLjwJo)^ zE%+GoY=)JNdb?{@jhppN(^J#yhokK^?NRxMGt&;bn8eJKAdg#flLFqZ2PA8SrjCL4 z_u@lZ@Cglw6!u16y=R5de8WETtn?pca^D91kY6qUKM@3mRycd8oXEfxeuX}oSbr(- z4;3~|0V_QMD+QEU`&^ys8=bcgW5+h(tg5;W@l(4_2<`8J?OrgMe1uKpq3?l(Ew!y( zwN>Gknssw?>uOrUm9??9nk@^>H8surv{YBO;A6~>jW$F=1 zd9r&xem7~CkN5wXv=jWERM(BprGYS&|OeSpasHmvqh(oOx%0(C;ScWafdV|1C-9 z`<(a`i(gXMR?tvZ@H}8j~m+-vRxCKY_ z05u_f`1|oUyjzy}{fn;Ow?f9p%?I@Lx61WjG(mUz{{72b|0UyD`JJ6kUX$xTqp#l~ z*MG_QEBpEA%v_9g+8Y%y`Ux{-I@_|9^>JXb0Ee{i~$Td)m_A zbODQ#1+AT~&IT_|;Wr`&RFo4FA=Ic$g#6y&<<^gV4F6c)@ILE3hrKoCA~diHyiXCdP`{^? z-V6+-3#L_9$iM#C{{6;^C!WZCb$`FH|JnA>1P=y3gWbM7Uj=2~g`5x6(pqCFurM4s zj6hu-%(aj|Q3pTgHMqsIa<3Vo;p1XbFC(k`rZfqQz`S$G#eCD0F?!LV1X3fMzq{g49GVZ+H zKKHKMafjUJcn4lp_%zIf%x%aYxleA+YjdA7{!|{ytCxRT*M!i;M5rcW?Bx5Y2mK-6 zPu+so-HSQ=IOeb%{&5CJw53=;lWu}%AlW1MGZL6iAdmhzGyANX$7c^7H14lf(_4M) zb$JTr^y8S*-}Wg*@)Qi;Kf$U9Jndc(3Lbz*Jp<~gHts+6Iv&MmtoIxNC0~ta)W|$R z)5AQM=y_I@7m5TUMw#_)y!gBJOXuGsh7BM&k@io2`l)H;}X7Ce6a@oxg7zc3T# zKY{Z84ASd+;O+Z`zdOGHCcohv{)Ts30Cx+4yH(lTEucn5nzaT8s#*Y5-FKfNUmk_c zH8v_5<`MT&eCcm-FPqyH#NzV!vVjL^YT-PAIl1ph9_4hk?rg zXgFlOGyNaBR5mKD?&w#=tpn|!F@42F$t{;{*nHLYzJsk(r>4iYPKArBNLe-g`)gCF z-oVJAZKD(WubLm+y^xHpIHmtR7%#@$YV8@s)6Sn2jNPSmZZEagueQNVm zxP5BNQ0^O;z6d2tX|N;I5Du0eY#f;HORgSlR#MA(Y6qUm&0zxg(B`L1z+d=QAy0;M zu&R@TtO{a2g)J+-F}!)Iy<=)i%6b7~g!HrhGr{J;)ycm3fyRTS!Ei&U1MfjP!g%*# zrM!Wal0=T3UL|_}aYxjEE_0QPnXVRibHZZC~BUt}6qhyDp#K`~J~QgXhf*?VRmu9p5@0o|;+NrKDEhhU|Q7 z?rou!tzH6keZ|#_R zY;-tWnOL>0e`MEOY-V9{D@JiuVBnOu&Bf-k8~T)F>{>Z96~^1PcFpb_nmKQ9)9Cy6 z&R@O@O}GuuTg>gof159ZROX-w|_fkaxtXCKKP9o6I|7313{=hs66jF!CpM!5&lflF=$t`C`I@llZ9UyMDUxoyiH_KuW z;`JGQiBu|qkGWwWUKAgYf3PwyF?Sk2ftFqYUNK(q6lj!6 z1p7fFd4D|`>+X)>^Lc$VclLyf!aYm=!F$|oX3bXb0FdE_?^F1qbbe9V2{PJgNaA7JlSX4d$c+_CK>_fs1AuNJSr3)jwm0@vMv z>-N9N>+ZOIamajb_S@L9$a6Wa`wuT#!y+S(;T2giSR0JW4gyNl@%`C3xCmolETCB8 zdn3>V{FmRf@22D}x0vUB<}=Ylhva_ia6hzam3dk2ez@^%OKxo90lcx7^D+?vdZL%( zuF0GBnZLqqqcD{X&k?-okG&1BmH4LlbY+nfD-O9#%JdsEa%Hg5>4aJuz&AI1#JKNj&zdW2?Erz1qYvX}v!Y~riKzwa?l-Jya zYyJh-OeohZxaL&hSgyrI-Ox`aW}2xH%#`t;L@QoH7Au9d%?j3mWpf)=22$8YyTMnH zGmKn?uK`5>Q-PHm#gGq6u#)L?IFNLgh!Xs{lYwwLoovh{e3;rPPm2!qRc#nr5mUB- z-^v`GnCZC&NPLX>IPBBiHj%T5DoHR|1+t^Y?X_-J z(T;2&91id>dRqMcmL9`;6<>}tu5OITf4#n@Zo}wm_W7E-45PaVi|Uo{if;9FZCdi* zr0kM+z#9N7CX*n>Y_@mXM9wDuW)syUkX*dj9oaX6T1V(IKCNE*h8Rq$*g!v1Q}Xq?yEi^5Zfi6ej7Isdv)agpLRq8QepQ?Ij&H$OIwktl2eg$KzY;T>=bOd~ z#}YT9;y|uohwOnw(0N<{U4aFA)`kTNh-$vMJ8w1nx+*o@vYc(rO|8bd(z+^-7H?`2 zec6b+{pM&{DAZV%j)+KBQPm;gS5Lx+!_OB3@t6kB;xJ zb(Q-)(F``bdna6(@>JJ)%Y!a4xz(k)qRBwQhXpgr{kY=waL5hHmkM~Ct1vPbudJ*DMTBNO0J$XC2i z`60ZiEeJMzt&Ld4VQIF1u7aaX)W{=>IspPxB}==BdMI6HuI z$z&+h2gA>C9nx}}I7%?PDF?siDtKp1 z60~9xr1M~aw&J@z8xofSIv6d*U zu58ZqG1?NPH6-6G98ZciyFrY?)*Xi?qh7PrKqdDOR$9s#Qk7I=+`T=Qq;s&{@Lb@4 zucJLo4Vh- zF2dtgmX3~#E7TVBIt-L@J!HB_OfrTq6c2VVCdRQCKt&yJRIih3eKBgvsH|>|gFYDv zF`zrLciZ090|!24Pj5ebIB~}vubNhD4Bqpo_6qDoP}vF|f~Nlrnrc=h*UwAEV~aVd zGWCsK%Nfq#r+Cjjq**=}_1wuDH~J`IZh^xyL`$to(c;#0WHKE!w797&erxinl?5}s zpWL<&HN4=AG!2WquI5jHpQ+qrKXNM`mRJf295B_zVn)P z3TfN4Q#rI+28)Eb-mT7*2{+8(Ua;6Y15gS2tAhQ-Y&K2>ybvC1_}4jSAuCLIJ)Hg4 z*R9FO%=b+}iTCHs=iRbj^V+)8vL-UCZl2#fpSBv{BXk}+q5@i3Fy?zICTnk7M-F2quW#FyDU%4q`V;nR-jO z8|u?OUrUYKQ&C;s+|Zkv|90k&*1)XwmX-No+N+vVJr45usj0*SbE9t;=hVMyhnzT{ zDQ=94v(k{$S>X*9D_laH@7!WI-#PUZxCZCQIX$>v+6$WX^i~z z{QINBgwS`GxWV#(y|WHr53#{l#i#1~+GA3y@;HwvJ?rcj1(vF@{~9YM33mF zF7xgs{yBxWmc_A%d~g$yADI~0k{I8N6XQD#jE~pIL4M1>0_|13E>XW38}&O4)Q@Lk zPvA@|FtOoj*_-HzJmV(6WYateAwcbMLV)Pc`^9Nsc0YrvFy{gOk!RtiowC##&qCLT z)7>Ho^JbR@1hsM#5R_*>gR}n}Km9MyzBnqVeb0dko(3ui*dB4|LsT}RT{|#v!SD*~ z@}mGWLBEpwAAq2}lZK(gx|R9vl}O66(8ANj(ZUaa7IJOW@N#*%)R^H1=f@0x4a|^8 zdJMI8Ai>I9!#5b_QjU3OZAwCGc|?sHq;OwM9pBJpXv*p51t5c(`+UgYyXxz%Z%Qtk zfS;Lsl1(RSqrQ(ko4Dr0w9-Ix-2OOAA@#?T0J{Bu)N1*&W*18uyi3{V<$-W+0n5rX;m3WF~h z%>OUBT`Ig^z^xhHGrFg2x5()J7TeQZplmNmxWC{IoZ&vB{r8mPt_?EU-;Mi_(f(Uz zkWW(|!5E3qMskcqFh=AXntS2^|KH*NbIT3?<&6D|@{(&p&MgdORQ4z|(TxA88J3f? zoQHuHQ+Z4kDHe8L5EyW#*d#=P0mLfE>#dU4xQ#8bvuvKA<^?Qseq?g$gew*T0~ZDe z6lK~51Z=)9yNnkH2a5A6!2vNlE~eEMNSWBc4YbNwUk1URl#>GxgCw}i^BzeQoB80w z&w&oi&PNBPm7}ih5*@gaTm&T-gM z2oBOh6NGYj_G6bO-azfSapfqz0-uB~mUdk%Im`Nqb5#i+HZ?15tZ+p3n9>Xkic>!3 zIl7Tm#=2l0Ninl7B&lXlIZ3g=$SP1TLGJu^4)2FSy$n2IP#MO#UdC!|lj0LsL@bFK zy(Xr!I)cmt(ybIdE8~j!N-g-BU6EF2N|TksCikUK#i^kOcdXG5Y*ce=o;{$i+411e zjfYka)OK8Xb+Y%iO}X5r+j^5%U)fPRu=3DNnUVfzw0|Viy)`^g(;pA!;$Bpr4aWOx z2EtoQJGb6@&CG1KcyaX4SAT75=lJ^eKsHvJ8reB8uyZ6;8_NXS*N;ER-}5}VR9i6W zO>~4p9SLtV*p`CF70S)CAGwfcjc0l5lzn!Ov~d-4+rm}Mb3L+Pr>MECG|X@zMPLVz zC;J8|4Une~cHgY68g)vAfT!{xq`+Pb#Q>)K1-e!H}N-R8Es+7jPqkIehHd;9v<*7e)F`H^SU q#J-V{eG{uxb(a?Dy*6`K=Gxwfwo6r=AG8i_@9x<))XH|~(SHDpkF~l0 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf b/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..369b89d261b2d6d186e46b49a5b1959d9e95b5d4 GIT binary patch literal 169840 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

gCoBO)k~h`rp42vL}SG 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 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf b/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1926c804b95bcd44835689b0ddf1ac10d0b7a805 GIT binary patch literal 114828 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 aV?G>`5QswYyYuzw_`-R@-wqEc%Krr6ZWs;# literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/Jura-Light.ttf b/.claude/skills/canvas-design/canvas-fonts/Jura-Light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..dffbb3397409ebc91d53f4c4b29b7988c26a49f6 GIT binary patch literal 154308 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 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/Jura-Medium.ttf b/.claude/skills/canvas-design/canvas-fonts/Jura-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4bf91a33951b960e4d579eb2e57cce624e4aec0a GIT binary patch literal 154488 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 Ig)=YxKM8mxz5oCK literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/Jura-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/Jura-OFL.txt new file mode 100644 index 0000000..64ad4c6 --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/Jura-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2019 The Jura Project Authors (https://github.com/ossobuffo/jura) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt new file mode 100644 index 0000000..8c531fa --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2012 The Libre Baskerville Project Authors (https://github.com/impallari/Libre-Baskerville) with Reserved Font Name Libre Baskerville. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c1abc2645f623b8ab8d71724df32746b1aa627aa GIT binary patch literal 147584 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 z znd?*B%S=8^O`V(R`0^}MlV&E>PdcXf$;9bna_D4QG}msI_Hn&#{AZX{{f&E}Y3V}a ze%|E#qHzbAwg;O~kK@)Q2Aj~8rj&bh>*Rf=hW8mCzj2ot?AJbOx^}DSCiH1jlc$aQ zH@Ch;beH=naGCoR@O$nD!N-mJUDMuoP0Tw?Zg<*lgZmqw{wDqm6TiRlUu^2L#Dp#} zJ_W{oweERYV0?DFxgk=1?S7bAdE7VS-tFREQTeJH8dGkKo6_$!?Rvx1=Ux-@ZG->N ztq>pRP&Li?d|={#Wa|I1!5^8lAKU&0zhc_E&G=WCJhvJD5w2a-b_C!2Njcel7x+no zFV&&$8%_PU=sevuCjJ(K511TwXt&DJIjbDwzub(`3R8#6ZMP|L1))luMZKG{O3`=T zHsu7d3+JNx&f8AtF{GN?a?-htMc;X=?=l&RufFp(m%Am#ayx^*^LDV%cixT^`p(<) z%$>KhI01b^Eap7(X>lj#o3Dy{IN^K~m%j7XFZ7+a>$!#E3r<1xowwV~owvI<%dF-$ zOnv9=XXu?Y5!L9OM04AKzVr4sv`G@taN^Eev{Jb97Ht#myhW>|0F#PN$7GpibUD(| z`Br|3Ucdl(1f76*ep8WOQc!lj(-8&3|h;qO0@Y znOOPvO)L3d8+vCxYjtF?!BqxVYAp6>tgeM_^=+^L3T_DnYbtC36<)@-Seo*>7|QDp zRW;&ECw*h`c~H*)bWk$+-f^}bb?%VR_Z?qDKKAXrPhm@VUa#e~i_zk{s10D&+0g!D z|ATpm+gEIJ58UwIn%mF^xa}`SiXF5{a%YB~g9jP+6N(#e(bu^`zjc@%;BIkvFN#}T zhVpG1no@iPrd!?Kv^rH&v*=^)an2!)xzpYBbRs%nlKU|er&q{fPT?<^lIz?gvgWx48dXbG=)eD;t<)Zf!0) zjalGsXlA+py_wn|e6l-W3f!lf(e8$3n0uHz|GzMq?!TJ8?mEK-x%EsB_vuU*cL&F` zb)U|(aR2uv!fl&S_vwuLbU)Wg*Kyz!^OqhwwFm$5?5Z*5fUBXgeSdZ}G<)3ZTzilu zXK5KIn;ZO`!6_Oe3pM`9;2&^FZnM@g#~PexaFNE`3!`H`Y48)qKi{~u-m^qAQ{xPc zU7L(M&0zgKr<9`%-ezz+gRe4pzQOw5IH|@N_l*X>Y4Du}-(m0og9{A)%HVf3R&mC? z+~CU$en?~SfpLFq@J9yQ?HXa+mul?3+~7*%v&CS)!7B`&23F{N)t{GQSYNd;>#Npg zeHCxkSKYXYFkRnv#QG|U^%Y<0n)Ow-SzqOu_0=G=z8Y?3wh3ltn<1`Xwwi5LSqsc6 z>lP#FZ#R;rDyzb*vMS9gt46P~#GhuB z70f)Dhn6q%2J^gLYsInBxKMF z>#a4Uc?L5QM6^^lp@Yjm4v>dlcU@}MUCYh7>khN-y3ee;9yIH&hs?U`3A656 zW7b{k%)09pv+jD;th;ubb=Q}yyN1d==vPjbKk9XtJfPQI-0;P^OID#*C+JPVI#q}v zKrWyuL(`qsj@I|Nbz;OG#FoO)n^MhW>X49p_PlM}tvWRVP`k3p4}y zQwtH;+tab$qy!Y}SvPpd-^*TM8}=E)@w;EYt%=R%y>X>}qZ6a`+Zu0}8hh&P_?;j= zf8qix0A>MG9eXmi22I_%Cc^;DTbY3N>q}1d8-1G6?=lY>yxrhg2Cp`Fv%!-Me$wF4 z20sect<(S45cp39y{=H`RO_4gAJHo$8GuNR+&W%`)6Gda0P5i+{B%Nk6SN0KJ3||ulfWv_p9~X zN3d1x)N48Qs2OR=UagBhIo*#o8`CgM%eY{2(4cpD?VVl^F~hV@Ed8X*k=#A?D&x0J zZDZedyV{O>huVSrHT4=bdR@IvUEWY{;C@rRi5u-#a+8c6y(!|*5*~&&aeuUwBa}zJ z0?*urzWE%?WcVxJF1D)G)^#k?0h+9pTSclaztA=)61obO*vGuLG#Hys;+xT982k@5l zv)XC>Ogk^Oz9MYDT4hzL7p$+rqp;Z>ih2 z)a`5P_BCy}*g8NNhp0s{Pm8JHrKV*^xB)}gY#ZS_fVT+QN&7<7qqOTW;7MQ;A)Beo z%apg3=T~U2uG3+Bs<}_%VrqYhRYRJ$Nb?qH-XhmZ^&&d?c$vE@wi5md z@CEtqA>VRx`hik)p1KrWt4FP4lC%|0EB2FPB{@a_pmN0@S`1P{8`8A2U*_)p6dLq z8>|PkuZ0Y=p0Q2@+;&WBk8SI4YVEYh#5rPcy?WR&t>3u4)XwD(>$u$;q&B@`QdAjS zzXy+D#{iyY&?h|_BC#31OxK8L^h4#!3-wNB! z4X)o>`-uG;z3?G{K~|OZYyEL^QW)x~>u1}S9FJO$S$b`y?}I&R>G{;SZ5vz_xzXE_&uTtvlxQ+ClhN*gb50iL0(>^#~oX zUefakxxImVi=C78K0fv+Q#;(hlH<$PtJbS_xbZt=F#Xr?$4ES4J#WG)ai6KxaF1!V zUSl@+{k7G^++_VD5Xp>0;KA4qO&A(!5D?(x@`k?pi5zzXe664U@2+0Q&3K^7gce!z9YV5dEd%8xcRLzjCo-!ZaB zov}Sks2Qg~nWx&;p*p@L=ifEQQ7`Dk;gsXZHcf%Gd>+W5eyyDzt_Xw$Y&fIFjz^t; zvvVXbBRg~)n^&l@}>vF7<6q;bZF*%jc02w2n{}VHnONo4PPk;1NpUaFM#f-& zW^HwP@oj50F*Z=&{npdO3%1_2*6Q*CKWmlsAY-@Ndf3`Z%HOPatj*S1T*s`{qN(+r ziPy|}#d^*D~;B!&iskr`kEMo;1{{?Rn-$ zax+rWlya0?yq#GSN;txdpko?3hI5^efKQ;N4eh#8?7BGoOlgeBaZ}1Mhkk4G)3t$f z?0Woe;uzYt+aJhZ*8>T%PtRkxz9Y?Nc9?E!{huCDxb=wBAM5FPy#jmqi+11_USP?ie#{9ZkzQ% zZR~IABm#cL#2BW->aT<7>w2pdXRJRWPB~JHoN+x}j~_mSGQQHj_`^-sTXy>$&a(Z> zk##ne>YACg34HdO#r$9$)U~wM(c(JpK0v75|9Yg}(kbY_{dNzUEFI+3PM2G|lGH)O zecNs|sVl5?c67VfG_Be5wUbE$%PIG-v*WQ^iAyik*0oMP8pKl zT1rD|@$O1Yy&iCAJ7pu ztRbBmu?~lWkHX2U4e8}d+F+!TroUQ_J_w~7=|bF}aN9MoeU37^hSzIL)^q7U?I&Dy z?bSI#$4cx4D5L*_TK)9k-QUu~VsZKNNGS-IobS(mT)^UDa`L#KnO?#mN=Qo8t z6#I8J=?#Um6LU=4yQ8fG($j!F# zWj12uYugUJ*nFlrtd?@?+;x0n&*TmBBcA=vU?izi#w$*n4VRx9pA@y@XT9*(P{M!0 z{02oG4AheO-Ig8S6Y9{JX?MV_smk=f<^M~LQl_zIp>^y$>?4J98XalA*tNgb?auC8 z68}Du!ilurDec3)RzK07v+GRu@$%U58pJ8|FfoE1z5+3kQ|L*ekS}3NIG3Ky|HsVb z-(VK-4=0N_lfFnS<%Dn<_vKyAF6!0d2I%HyzMj2J+-v?JVYPUeoxR66xz=CiJ}1_4 z>p_|Gt?m}~SNW=#uXo>Pm-s{R5vSGqOW1Gt7WR9whx-A35pA52{ z8xQpVGK|zW9O%0Z*ioIxT?QAJeb{OC?FH-w1#T=@%o+GHb2q`2@@jn_0k;w8+XwDq zkJj8Xz<-hGe?-uC3+S5#o^@^$@Uz>rQQsWEtpVG)Bf!2HfO`ShtF`X|_=Ye4%{Tvi z?Qg#CH(&K1*I)7LFZlU(pYQbfM&JHEKayQr^G!bA49(0&9~-(FU{+|Gl$Cj z(3*=cvOSnE=&cbr91{lJMS)vl!pwK#Ue;JKdN&OX&1T${kpS+@nQ}A!UqkQS_P|K! zG6kH9kH4WJG|pDEuq%}@I)xKrJ-2~)s_%C1EY7E z=YbbsB=lPfUIYb8L&Fj(UWQv!avZdL1@5ac5}LjNd?Q9e+vvzZ-?xJA#Ym|9KE6-a zXVFdA;eHsb>Ai`e_$JW&TJ|Dezyv|}W#El`r5+@i_!X=bg&sD)| z3&D%|KM)1CEd?)=%fKt-3gPBPkSn>{_iAnhiGlyF2g83N0uH)!#%S|7R;LEjOZu;QF-Y@;&b#fhPH_DCRt^99D6r8#Pypvmrqxhee zw?!~~`#u=H1#^c7csKtb;^GF6Z@}Nn@4-LFpTNJMU*Uq2tHFmQ|I5tH9LMRI6Wq?x z6t1?|apecr_ir?Yvm1lMRRlOvMS`QyYl(o*TXBzY8`TCJi%x<5hnRS73QkZ7;LfTu zxEuFvgu?smHgdy88n~Cr0B0)x8w2jo2M<#txSMyB8U-G&#)J8HCvM>7z6@}oDrAqe zNX=!B7p|vt_+GRz`|t7GO7SFay$c_!ceHWqz4*>%FTRV}i|=gq;=7o=_>N{TKEdq8 zcQkwP31%<86EfmODA|Q%&@w_x2yL{CXaw&^fwhciWMqUivY@q@qna3r(Ar3Z)j;>MlQ5r2AhNI(R|*~@Ogsa^8~}^k%rGB4WCDvc`VZK zd8Fa+aKqu@hQq@Rhll@d4!5~F#&C6v;p(P_tNE`PxVov~>ZXRPn;WifZn(O+;cAcJ zYLDS+kKt;M;cAcJYLDS+kKyXJhO65eu8uNX9c8#W%5ZfPskyp|;p$Ms)uD!~Lk(Al z8mJXafY|!3~$F7-fsN2xcYMLlXe^4 z?reCwo#E|vhPT@p-VQdr9c*|z*zmT?@V3kFw#)Fg%kZ|#@U{!yet~*#Bg$m;p7m*$?Xj% zw>O;J%5ZWk!^y1-CpR{n+}Ln(7@S;$q?n?nz@^2i823~)6U9VY8G*3tJ#FkQF92Li$nCn|khb~4sbT!hU8)qzjeNH0BmeA9hgo=c#6H04MW`b>e z3BH8337(Ee5_}!M!tLw0qho2uIUR>%GCF3&-x0r{V@8KqC$>ow_a1qj)|i_0^>*-z zfNB4oF@Ers?Z>v=+x9cel(uKL?a?+Wrt0*j)uLA81E$4IEvD5O-9p>6{j6)>=s&ym zrCvT=)3%=_WOf`5_I1qY+PCdz(RV~oiXI&u5_K}_NYsF+wB~!8CpK>pc_8vT%!bH` z5$`npx#>r?Y2pi85HcVn3KJUqrv|>zdCvgf+j#m1z0UU*6M6a2>&-L0UBxhe{oVJg z(X3qm|9Z#T$;wjySKa^qrltSij(h9OyO#c+JNtgR|MR!4+S}s(kKVUVebdtaucvQe zv){D>x2~P(ZHs^5JHz`{)ZcpJ>W8Gxa^AW0fB4zAm7V#mD{vo~a~qj?zJGfoDW<86a!O%6YLTNv2N5duhL5 z?*lkH62Ah6*lDQ&jsVAi-vP@yEZIet5^w=QfCmT$Lapy*Q)`cm0Ga`jKs3+>hymIH z?Eo*((b~hVgk&d30WQD;Gy=kbWSofVsdtU;$7HECLn-7XeFwi-Bdpa(eZ0 z;0oMV12+IS0yhJ<0`~&<0S^JIfro)dfyaQSfoFi7z%Jl@K<^=c2z&&53LGNu8sG?U z4A8sT7Ng0YA0u##5je&O9AgBIF#^XJfrE^|K}O&pBXE!rILHX_)qwRQqfp5xR5A*c zj6x-&P{}B0od-@qKVA;JXYC{9^Uz#4G#3udh3oj_@(*O1WWP=UF2Dmc0>Xi2 zKqSx{hyq#yt=K83gjAo~9Jaz#v5jYQ+1T04b{&L`1_J^MX)&eg8 zoN9=Tz$V}&U<R_^^@Cht z{VE@Tk{$#e0#*SJ1L)t#$AKq+r+_uqN%<`HTHtwcJ0p8LBYV4i+xl6)3%m!s4}1uG z1bhyB0qmw6bSmUmz&F76zz@KWz)!$0z^_0RPz@XgINRbayfHGYT>eQO{{l_|7P?0Y zXk`7MLV?CWIM5V`03v~C>qpfBfCE%3pbZcUbRaAqNB}wm-GF2u1@HlBKrf&-kO448 zDwF>X%L1~293USUj1Jc@;2dB$Faj6_K!@sF!V7>2zP=5{7UjyaWK>0OLehrjg1LfC1 z`Lm(?*--u=DE| z^$65@1Zq73wH|?5k3g+Qpw=T$>k+8+2-JE6YCQs_Rzay%P-+#FS_P$6L8(DyXUos;YvjxPuiq44gn;tPz@Kp+I9G9B2yg4|Y(_ zVJN2t%Bg{JYM`7ND5nO>sey88pqv^grv}QYfpTh~oEj*n2Fj^{a%!NQ8Yrg*%Bg{J zjxy?1jNoBL@UU3(Z{(LA#r=%penxRWqqv_@+|MXp$0%O+KgzHD$gd;FuOrB>Bgn5K z$gd;FuOrB>Bgijy;YASgD+u`&g#6+^5P%+51tVX<$X77(6^wiZBVWPDS1|GwjC=(n zU%|*%F!B|QdjQ(Cme=noIm(kzL=ZyQwDxjVUsHXzzsepQZfqMA&VW1Vz z28abZFr&r;2|#C{8;}g706riM=mqo!GJt-_w@hS77LX0(0QtaRsOns1(E?xsa2_xT zD74CvFGrCtN0Bc_kuOJ)FGrCtN0Bc_kuOJ)FGrCtN0Bc_kuOJ)FGr!y3aGQf%=B+E zUw_I>{{f{}Q&PFn+m2v{k6_M^V4V=bexJT^HG&;LW8p(;clzB)m6yq zDr9vPvbqXcU4<68w05%++09C1H!G3dtVDK;aG)6w2{Z?yfR;cjPU>4*AHY4W;GSr> zCmQaFhI{nBJf~Ug7RLZ>0lp<=_HWAU-xRJo1Xmq`s}8|chv2G1aMdBW>JVIY2(CH= zR~>?@4#8E2;HpD#l?Se>gsUpys!F)360WL*t198D3b?8QuBw2mD&VRLxT*rKs)Va5 z;i^iwsuHfMgsUpys!F)360WL*t198DO1P>LuBwEqYUGvl-qpahz;(d&z;4361ik{k z0nn>~YbxQIO1P#HuBn7;D&d++xTX@Wsf24ha7_gqQVoYx!y(mhNHrW%4Tn_2A=Oat zVW{^o)O#4}Jq-08hI%WZ#A+z98v2pw7XE+Cy$O6&)!qMp@11?JPG%;PeVb$^`!-pC zgk(VWJ#2!afE5vOL9DG>tJud{+o!wTo>p76tyPPPOa0kuU8kOQ2+1w0^+)mQmL zPr%yaNaZ9_If+zGB9)U!%i4gX$;Pep;zZ=)4& z(~8|_#U8X`4_dJYt=NNB>_NwcX6!;UcA*)&(2QMZ#x68tmmG&4q#q8_4+rUogY?5e z`r#n`aFBjDNIx8;9}dzF2kD31)Ot6y=%*H8Y7wRuVQLYk7GY{3Mhbb167qqN$TptM zJPa@c8^{C>kOQ2+1w0^+RS5ZDFV^J)@F8GCK*l|ve0x6G_H1U+vdOn+lWor?*PhL3 z{Mjn|IGIJuW)3Y|H396GY5{gmanDl5puJ8Atq(*gSF0R41;emX!u9iX53v0jJir^EEqVfyJX z{d5@V^dp^qq|=Xd`jJjQ(&?Aa4D-w|^N=4QBUZj(DLI!LoB~5IoYezZ%Hvqd<5SvnjWI2hxn$yEAx=zcahkIsyOjLoHcL}=MFKKZgvPOG_-8!!+d1OLLvGeF4 zoccXh>Ld0~>|#Gbzs9&t)Au3lWgi72bt0?J5gT)d81?>VvGGUr_jC03bM*If^!Ic0 z_jC03bM)DM`fNXawx2%RPoM3l&-T-2`{}d&^x1y;Y(IUrpFZ19%l-vF-h>}-!jCuM z$D8ouO{D%Wr2a3Y{x78dFQoo2r2a2_K?q+E!WV?_1tEMv2wxDw>K(x99l+`x!0H{q z>K(x99fM$f>cBV@;Ej5 zm^=5--$yCEkJ2A7=cW$52*Y25;V;7Q7h(8|F#JUr{vr&25r)4A!(W8qFT(JrVffQZ zAuEXMKqF`Y0WcPf16`mSj0Zt52}}l4z*I0D%mQ=405Tm~)&>%e;O zMQ}Cv61WCj3$6z@uyX81a1+1Z4895e8+-?R5BwDT4BQTW34R6c0(XOZ!F@pNz z8N32s1+RgBg17Nc?|^OKJ+K434|ajQtYZ2Adi78m?}HzKpMpogAHb7%x2M3L!871luo=9? z_r49@0o%Y1up8_F>>nY13K2hrh@V2lPa)!`5K+oOVyEN8PREIzjuSf_Cw4kc>~x&i z>A2=1H+S~XC)yIQ6r2l|0ikE>`20#BtmIuo|Et{%em!(V`wjRlzYEK`iQgXvkAO$P z<7n6u=;xof=Sj*u1)gK%@fR`=&-3#IehLd~Bc?e;&p)cIA3CXBMJ*meCm-k2C(zG7 zG4^-`3v8yuON`8f&0mboUrdP;d`k2X{iKgi`uL=8#3x_mlP~hg7vrB4$$O^rwwLem zPH6F-@gISof=84l)_qi~Px3yTr@)`VGvHaU8GNjCuo^?f+gR{6xp^#iC>ol3cH9)=_Yl9R3*#fN1F|5rotj#g3%`vRa zF|15KUTBaE%^(??L8S`#K{cr3vqsPY0$?l{2Nc=AW zW0Cr?Nc~u(ek@Wy7O5YL^dT1MLo8B17O5YL)Q?5#$0GG(k@~Sn{aB=aEK)xfsUM5f zk45UoBK2dD`msp;c+vr~Oao+@2FNlEkYySm%QQfiX@D%#09mF1vP=VHnFh!*4JdyF zo4HS{1l>X#Ugqa3;8pM%_$Szl_tfVm_G7K~W3BdMt@dNB_F=8|VXgKlC%`E%M5dXY zQdp~fSgU zSgWJz14Eyv4}wh~jK=BX^U?BxyNIYiAfo<2n*-*8KCl>^Jv4~s4x+h(Xzn1II|$o8 zLWhKw^t0Y>%h1Qv_&#(f8-2(|AF}x-p>0A}_r-Pf6?|oK>G(+GGnJmkv#0UwX=f~L zjn(ALC8*~Xr1%%?%?H?)F!lR@`U$@-qB7oagieIvei-hD;eHtIhv9x0?uX%i819GR zei-hD;eHtIhv9x0?uX%i819GRei-hD;dvOIhv9h`o`>Oi7@mjWc^ICD;dvOIhv9h` zo`>Oi7@mjWc^ICD;rYk#{9||?hUZ~;9){;(cpir5VR#;f=V5prhUZ~;9){;(cpir5 zVR#;f=Y#Nk5S|ah^Feq%2+s%M`5-(Wgy)0sd=Q=w!t+6RJ_ygl@H`C1!*Dzd$HQ4$2Y<8O>le@96tibkHGOGaQp}yKLW>(!0{t+{0JOB0>_WQ@gs2j z2tDx(9N!GbH^cGGaC|cy-weN>#v4D4H+~v#{50P9X}s~%u776J{M}z1#yz zH&?p3(oK(l0)sz+!Jok3PhjvTF!&P~{0Y|oW32yi?mDdf8Ncx~cm_NR{)#8q3|?Ub zybxP>5?go@TX+&%coJK95?go@8+H;Kb`l$Q5*v0B8+MYu3DGwp8%DlikV2 z@nPinFp?6vrbF5UFcF*urhr*sHkbqEfcR|a=w;6E4PKj-2<`|zKA_|HE4XCMBv5C7SR|2&`djd{|Cif>r2G~!3c zGiocvmj>iFZp4Q_q)f-3wli`|!>3Nbr*^a7zXreBtv$=nzcSj}3|`^gTd%PP{0-LV znqsv~sk?=%Vl29uxPJhPauoRpn<(0U98bQH706D?oFpq&PTSIGTN-Ukqit!l$3c72 zXio<1$)G(Mv?qi1WYC@r+EX5F%OG{OP*)?lO!2e_lx0X|8B$qBeFpi)aQu@=d@_ko zCdEH7ihJZ=8`)DX%8J&AI$8M+YrI_SY8F?s;#bA2seZS(Go8Q4!VmqN&tuH!k1}H? z%n*^)M|_8ftaJt#Dg7=McM$m;MPdyw*38>~_W6C8iNITg@D?GwMF?*Z!dry!79qSv2yYR>TZHfy zA-qKhZxO;TZHfyA-qKhZxO;< zgzy$2yhR9a5yD%9@D?GwMF@*@5Q}sWZxO;TZHfyAuN9g%OAq>hp_x1EPn{gAHwp7{>?b;UsyBV@&@*S5I6)rBL8<3 zguw}L3Jj4CWVajEY$w)iC)R8y)@&!%Oymi7V$DXb%AhB)XgjcIJFsXwuxLB5XgjcI zJBWPt68Y>U^4Uw|vzN$6%tRc=%ALf@oy5wW#LAt-%AJG>2e5P}uyiM|bSJQMC$MxU zuymu3QIbz`&@G=Bcl5_kb?~DR$Eo!I`m_=qpO22uN5|)*vA|^PRxfs|0lU?U z-D<#Ybz-+Vv0G~b=ZkI>_i>PL$E(Wk@c(?PWVB&9<UQnWzqIRUkvIY64zkt{Vrw3feU!$TDLaTN_i9`C>}Bu@@$c0{8SfEg zyhoJr9#O`7L>cc9WxPig{v#rd_lPv!Bhq+}NaH;sjrWK!wi97&C&JiHgt46nV>=PX zb|Q@JL>SwNFt!t6Y$w9lPK2?Y2xB`f+fLqLmpTv32MfR=K#p8pI`kfShxf=kyr(V) zUjP?^Rm@Ud#OJHQ#b6D%6s!YRg7x4ka5cCFTn|ReyKQF8%v(I`ZSW4@bP9C`*bVl8 zz2HM|2=s%);20P{!frf8E)X6g4-|kBPysu=pbGdwEnuFXnaHr#3fchk{mev$wK1S; z=n3@ydG!Bz^#6JE|9SNPd365~bpH`_{}FWm5p@3%bpH`;1?;^V_I`zX#ThsoVb_E5 z1emw9hdE>B5%4H@j&pMULJvRB&lmU^?OE2P%_ou#922EJqVY!z@-mZlM;bX zZulf(n0)w@51-zIPrKmL2ekI@)OH(u`WH1g3ZKMDJbS5$;Qd?h>23JrMCY^N)1D}w z`r%VQe9Gp%yed1JHDCZ{U;~-J0djy7xPS-b4c$q8@lH6n2M+FmgL~lM9yquM4(_29 z$Kc>zIJg%M?uCPU;ox34xDyWUgo8Wb;7&NW6Atc#gFE5iPB^#|4(^15JK^9?IJgsO zypPW~N^b8cxxJ(0_KuRy7YwBfQ=SuQ$T$jqrLSyxvF;{*GDuz3}^9a%%UIQ@fX(+P&n|?#0SG zvGPu=yb~+$WChYmdV9099Cr+zR)59cck%Pr{1iQZ4?lkg1Ou>^aTYwuXHNmLI(Py% zp1_SKaI1eCdV!SzFQ{9<%ivY;8h8_I1#i)wx4}DL8`uGMgFRp`_z)Zd{opV-2Es%C zz{Av_V-K)8;05(Gh=8G?7g!zef@T|fko?_)l9ieK%mUdU2e@FJn;cUv8)%c-ndG>X*?JIa1p=oywJwX2P0rHQplYe}j z{3CD0MN@_LZQ}2T!6V>NAhhvGK7R^4H?$d>@G3T8GdAH>v~(9*x*OYY5G_3@wN&Ii zj>D>VVaiUJvY#H=DW9Y_X=*DB{#$)KlW9Y&$T6l~W9>ek-Ll=&r3&+rfW9o0f zJ>YlXey|ZdKAVEC0Okqc{k!n~U3mX4ynh$oZ-n<7;r&Kr{Vn5aQ)=$Iv zr{Vn5aQxBm*a{|dMN3b+3XpPz!yFT>}j;PcBcQa=k$#7ie(;%{M`u#n%P zr~gO~574tmv2Hfv$qXd^CnWj|(tK4)v5Tin=kE*9urGiM!76YOSPd=)Yk;nedhJB5 zV&5tv)>Axn5IKr0#7QE+W6@YnjNCqEj6I*+>=ss^*s*e(l}bwPAa*<^BTjJ+-Is}n zuTyNad7%e@DmWo*NAWu8W`RAW+9JmdCx=ks>Z~ou2&igpyz~jnI z)an0^b>4f4**^duf_*@oDs~8b&iQ|OYd2%P-DIwIleyZhvI16h0}rua0g-tjC<4Wx z3{-+Dtf&w8K@F${jqsxhG=l)>09~L5^nwXsBA5)OfT`eX;AU_O_y)KYd=GYiAN&aX z6g;5Z#wh7FSbZDwW+&A@08aB`-s}YPW+#|8JHfo!33W505gYupgLIGyvOqS-0WLZ2 z458Df(CJg?^eJ@u6gqth-5f+W2k|{0;(I>C=X{7?`4GSIA=$K#$)ZL z!^oFmUQ8B76F!E`VS%moX;3a}Ea0vCg|;8JiI zxE!nljMd0Y93eAtMEMf923!lS2RFb*osmaib=53$A`VvRk-8oNIC`0_^d>uZdnZU(o2Z-86DTRiJ+@DA7pc7WYr4`7E7 zvA`~3fnCG`yNCsL5ew`h4%ma99z{=&qNhjE)1&C=QS|gEdU{mq>DlPq60j7U3zh*f zHeAQ&R|0ZvL~2K*54~&XF?#ATdg?L!=sx`DA^hke{OBS4=pnqzF?#JWdhIcM>JEJB z34H1f?FD}RFL^o(oINeAAQq4Q-%o#w%!tS^eJE$2r7axsNfy5D82)z~{&z2t)ysAK(YYYPrKAro_*kz|WnKIo#B{^+@#0cZl52uX*kO&wC!fdIvoH zrIf(^LqEcw{t{pMHgy*{nFH|fPW~g!V1S{4yeNso+Kh`y)9yfKUOLiTb+xo&KhThYO-=-^g# za4R~v6&>7)4sIph-%7l{Rb2xv1?#|-U_H1BTn(-P*Ml30p})pjnVZ2a;2Ypp@CzBU zpCo2Ksfx((W$-F^4ZI1qg15N;ZSW4*26lkmU=QGwQuK5ydb$-o-HM)WMNhY)r(22F zPpYRu1Pmcn4cK6r9i)RykOi_q4sgNnv&rT!0ZYNTU>R7!7;hb)UkP;GJuI1f*U*#b z?vup92Z)2k8M{xS!ylr<`_bY3=<%>^ZDgZpDP}~#tq6AhtpT;* z|GP->OslGnjPE=g?XOHwvfq`zT|x@ z*js#4vX}XQQ^!BgdZ9d4A%moX;3a}Ea0vCg|;8JiIxE!nl>%kYn)!<9u8gMPR9^Am(9e#q*&H%CH z0I}r&vE=}<okX1x8)(dgoD_~hsD$LZZ^AJxdFE`VDOq7 z8y%{#ZnvkRtg0aLr}k=FW=-UHMNw6aanEH&pQ*e~`|s0R#++52=J&fiE^o!9^UrY= zxqTehF)MW1WYHFlp^85Dc->1t4IS&86Seq<{3U;O>>JgW(Aw${4dz5X+_lcn) zDLf6^e!}ouLprQ#RDLmYlW*RV$BQyFqd}cjD1I?p)LBdAS!snTmCBsLV4V^#rdTY|dzD0S)ohNJUK%VcD^-9ylU+oix%CncGZvjVm)HGJKj@u3TJAH>qEIhgX7mr)%TO6 zp6HEgHJR;ECZkC;yk${;jydHyS&BG&*vRuA;(8Br{neb7(X9MW&{^yE*)1l!(p02r zCQh%^472pUsZ*>5>n)jSnmsF>*Yns-98{>5&gMDAv&}|~hhce!&0;VZN({1FR7L&z z$XiA$y);->Utd$h%XpgWn``Q7>Z&TKk=NnK!3O2#xU;RLF(c%02GmqTBg!F4U9T7{;$W1ZyV{gUzkMGai)HrWR zFm0-;DQBsg-Kxzhlz$nbf5CWBK)id;q-drMip^{_+pHUi#w?je%Nll^rkgXPidP9u zrVW$2#=-bNYfEE&wZGC^QC?D9nCEsma~#>(D2unfN9*h{c1pGIwwJrTjhfe6;dY=X zodJjV3kQ+Q%kKHpQcmgib}uR=HOd)qq?P)Lv(gIuz%r&Im4HA`nIN~>u^VO4XRTshIK=@q#EB?sv43pZ%drmj;U(>Pt%$r9DtTreREtucWTDj*1qQ zdmL%j{JMaUzXSW_Z!d4nb-TeRY# z{AAIR30F=T*Hp1`!Q2Vm*##xD=g)S0^YNCt(zAmNK`CqX^`@pA&9`z%a8ZHL)U>E~ z%z61aoP&~K&kiT`XTrWd^ zHR0!wrZ^MY@GbhHne&}zD(3{xwy0K3Lzi8?3P+uEWj)28&!49@Hx+tSn8Q&&@31j`*tv(}sr&z&RWCAlnQ3Ef2y zGTS`_ei2O_!Zb{$lf};Gq;)1%i+GXk`BZX_w;v(%C zyD~2;GbZhpoM1z)+mY#U=jTr!8(7#H*?4AI4|S)=(IWhJ5~s__nFW>C{*bHM%rQ>4 z@?tZK#jrkuU8FY6Y+GYjwKR5@YU*lSt#Jijws>}?6?U7Jr>i(;)0{$`-Swl~BK)~= z`Dph9|AQ}r@f9u2-U>w--`zECY-e+@CD>3~(d2Dn!EIT&%i(flSqpXEw|maNBLV4s>>?t3In1e7U0)Js{@oW(>cN_^3=79~|dW4Hy;7fn_B^_Rhvy zE6eFB%zr$n!Hk<%Lg`BL9AAaQQ3b5lk~+0B;PJ*olt61IjqnR%N@fz(XurxSvQ_2Y zu(a>0o^RanTxX5fv*yQF{%+aI2d?a1tG&?k!P%=8-f`KT559bA?$YyrfAzIbtgaAx zs@G50%<`zsoX<~`DO&F;8}%+#E%-T;s-&lBW~*XeO_gI2St3faT5Zb}o2_Iv z?X#~`?Dk4KqYkA?sj4U|DRxviaw;57uOkDm?`RL`;aI$77TP4dN}_H4@wN-^S=+sK ze6(#>eZ#W#Ez>R6MVoiUZ_nfO-j2)fSytf_4ZQb99Y6iGXy7@&y>gVc`Bba$2TC`i zGWsOm<`T6d>H3?|>wd;gT*qG=RWC^O7x8C{Xbicj7DE-!7UK%`2FJz~QQ3<4S(k0O zdbyM>GB-TOdof#-6~Xf=@DOg~%gD`!cd=PE;BAbWYTTe$?W$t4DjZH6C(LLxQI&=| zUu9WIUaoZDnKp~bsI;gpX;?TFE9U-G-gr7XU{BP_;TsI4KJOW5v}T+(X=z1Ib%Dp@ zOwZ0U{P&c(?~GtodF27>oaNGq&#zjum_`s_U`D29vVhq8g2w9()jn7?yMVt_VFmxr$O$ zkXzv?=QbCSfpvIfAY%d|0^$G{k((Uw_yTP*23UU1&(`&xmEh#RjEv(@o`3^rmCLIss zY!3)AiMT2%Jw4WSB17p!Vse~#j_@NfDMqeEtk*fd{cT;CSg2Q|--t?53ilOtts}Cn zgbgFXT3wHz>Su z(yXoL;B}L-0(l63gM`GugD|PKMpK#^YT9etyyYHOMml5WYOUI)heyfHK2um^N@mnH z^|~mRq!bWKY7BH%lwk%fSsH|wBLbe5RK5*$r?lLn5)i|;Xy0pQtZ9^grYjP>)Xp|s znshxq#!LM=9Lh8NbL4X{C=H19KAuyr%n8m^>{bzN$*E$Kh~RIvq|pRa&QtK@>5IR|J`2#FRXWibgUXeY~X_ zr!A=Pddud|OdT#ERBfWoYpq+zm`d9m*_jupjvTITD@Yk0MMHKmfZc* z_Hf_XFjScGJ=wAEXUuS)LHJbtdzw^o3w+OUJ|C_vscj%vw~nff(zY_?ouuorXIl*A z;@P6S{LVz1<#&$qoC@XrkOj@Md zReSnKvNP9jPg|~}r6rS{k*?9YTp>agCPn(>3gMH3${C)*WV*#{S@mxoW}UM%nA_Vu zc1$OJs-fOp<g<+tzrVmew!Oa9)qc)ZJ+%|Y zi{ZlZ^U7!R<}}om8tSaRmNw6rY31jwJ2ki5?`T~b~I(A7{Np>mL5I#MG zUiRRDT9i)Z<)FL4qnWilHQn4^tXVSKN;K7GjAk3BkOi}4T5ROS)J&UtLzbGRq}_rO z%e16tt|7K7ot>eIoFj5FNM9BE)k;1^SwUD#z8RKHQH%!T*FW`XpXEU$SQMqRqouK~ zmikxwvDsB_2mixxi~OXgQzXPD6cOkO@=sji)!a=c|?JaVwIr>b1&KqgpJ7@@Gt6vRC`T%uRN*eGC`v3c-@u zX0(}&8(3vywWV3th|FX(am8@XzMPSq?%7N$2rWc1K*XiuR{Ms}eecp>PJNvavx_{i zaE>j~F}8`EiuT7g+SC^UH)O7l` zEMG?R;win;OJ>e5^LoAWr)irVx#QY5`Lvv-rbuH`GuipScAZt^Zmru@&{nNFssnjM zPUGY_Hv>LZE6mU_7-Q;!>u9QRH34F55JLV>OkGr}bE>?)O2604AxL@qHqa;7Yf_T9}`Y`-!iIF;;;%!QdqESpFy zTNJy^Vi&2fXzGSulXkgmwk8~LG}iMoYH{WSbg8F7?JAkF9mP&2=XzD6v%5R;%a~bA z^IB^cOiRw@{z}e$B(wLKu|0W?$m_1o*2ueo&fJ)1yV-C%o^65j*hiGp%9r&K^Oxmh z66+0qNOW->ZER4M2bT?RqiWM^s`jaE#ilAN(`azDGDlTvW%N~6T3p~^eCy0fx0{U| z+|?jcf5JnE$siek#dJIBB$6BNaG7h)TG-}xXFA-uwGGlSjFiCI$R{23ZMpeHg-iOh zAIoTemP7?=YkHIKALcDb5pxo)KZ>b)8eZ*&mK(}kz|>$pjxJps)JQs)jnTU+d7LY*O`wk z(px67CyQnO9#vP!h%6ehNV}w$5%!8QM4^5a=MleGL|*#6oCJP`dqvbJ%aCy~kBAz{ z>HKTB4oS6LmrFika)Dusb6Q<=p5X8H(!l}3Id zjSLO;!Jrw}C^oVVX*QXHj`f(uqO44h_0zbq`ZP;@ZI!pIl<~PMi+MDqSMALh)>ko0 zB0?9Dp_h3Z=2<>N-*sKwm6Dgi^|Y9SE609HPnK1F@w#}DhAd9+g4$2*RWWy>_soFm zP3@T^P6u?!$sA_}oX&vLLP8cKl%`tJRda^r40%Jr?#!6f8XM~CYHNfW_R4X263clB zSk^GfjbJ(6I)DV3wnB(vnEt6$pL1c(|9QsH#0iNl<@4vCk?&(`I|7yPy|trT5?(Nd z@r6N*H3LddunV3U6uV({Mw-oFu~|ekkuJ_CPMsS(3p{qJcU7ytd0GKVN#o!t5$y;`z^^Tzy10M3oU1@pZ%LO zRq}TnK2}LFtfNI;Xu-L`C03)RI9(2dEl07f=4i+adrrn`i;0OwX0^<8Bwd7e=7MrcF>c1SQ|uCg|Gaf8Sm%pwbAvsBur+(zFbl&6S;7G}q#?8k%p7 z#<%~DcheR(b=Fo?W;os1MY$cSYPvi*Rv5`dJ+eiD!rDtIW9{=sSaMzegvZf);;`DJ z_k_NtCaJeXR!uK+M7<%kw`5Njr1W$XWrTi{RWmlxi&K=v!3FGG*VIhH4~^M;&9*v2 zs)4fHn5Bt?TDsk8z@sk5&RI$JW;Ez zUPbf13E)>T_NrIOY`M5@Hh5R?L)Q-KDB>vn zx}Po)*K29OdTE=uE^HI4Bt=#%IR?|q2+a~@%!aDmqzH*s6kECajihI%KR^0+mZ5&} zx)^^Mt&5)(ZVh_IO1V<5IOEM~GGmpr;!Jo>>Mv}lUjOpzqt6;D5VDV7Z;D-)^Zb0qd6tdmZ+axf2Ds{-T2sdl_kE5drQY9$pMykvMOARxAK(sV5=LJ=c>G) za#j)}h|`so%!ukSxzi!|Y%z0`dY&0Zdn#h1iYO!Cv&c=Iz97cb+}y0{bVu$?`&#ut z5-ZLf+nQsq_7v$6hNz=bs&oe1aJUxIAI#8;yhwDqU96R}Ew`)8x!Ul)l*H3YKkH&~ zNNHk{JV}#eP$Z)a!O$sFV)c<;RI+qa$EHMu?(4WO##1l-a7_|7YO{1%R?=_RCiR;m zo9p^`PCbwM7b~?vKdYZijH@@q2c)ESn5J0CD7)G)r_$>q8j{26M4-dqi+DJBp!S1U zW!GMmG%C|BN$B+HU)*qWd@Kf^8B?ljr6<9v3%+Ni^t1e2)UirNaTb%+WU+2Q+3hyX zWMS4Qxx=kiIX7Qz7NTZSTliloY$57lL5+-KhF9M)GfCPhO^DADN$dQ#j>ylFnxX!H zs>^sYkD9iLS;4kIQ&k?Th1FSP09cu4TrMUaSOR0yBM7@5amrA-+TqC4$NVDEBBD)w zwQq-Hs2(XZBy%FtdwipzJC_haj_iYt);BByD zI_v8kx#g9}+auRF1Xxl%Ovs&b(Ssh8i8ySypk+4KEfg~*=$Fc7oI9p6P@0z;a20iT zekn!X^vW=4ANS4e$j^5c=8O;Cnj-ESMAt}}GnbYu2VqrWauEFL7IR+RU7ZbOI=@sS z3qTn0u1>dG3?f45E}Y6*CLz%_>GfB%v`+ETpH6 z$_k_;^UhV2FllDf21ON2S)Wu8ixw-lG-!AF1rxF@*5bPI9HBd6kz;fgPa1_t-LsBa% zmFx9Z)+!cehb?Ad>e84XA7<)obg^}XnAowB>urt|)>pF9;L+|O`xv`rX^^!a_{GYy zQszE&8!2qhXf{%2;NlBO9W&>}O#DxN5)(z16p;FdjvEtp{+f=+kS-5>IVi6;&?6(! zn|k}PCt>yr{x&-I_S@Ke8FP#AGT4D^-hCdGY2vzEgU~qAhA>Qy-^=swSAVViPPawB zlUYnr2j&aoWu%>{)1NP|i(HE68?n!T>pX*9QqrEq_bnv#SG{t(-d`O`n$2!Yvv0uT zXJu+OUUHut2cW~zF?ku2Cw6=K3MD8zcGJt<~Kgs^s?Q&{_NpO}4 zi*!s`NkP6C!;Amq)QITMs6sQxCP$G%p9O@MNnRj4bKbn9o*mJ*Q#)34oSo?1dHi`> za`!$I?IFV>%oj&luRfr?9+hl&io`AK7D2RPMX#YVzwI1Oqs-o3U&s8 zwiRL>oGrF$vNh#Cv%D`Ooq5+!y_4+}|8KrJ*gK-yirvCQ!TL|DJ+qFn$}eRprdUfo zMj6x5CQ?^UUqudaT5g3%TNz~1(vuun%0BN5$QfAwa0)nNUel6h?eb@pWW}`H(~#?Q zTgpvieGYF0{i3B>aSMr-(q+P*B}bxS8C7C#t14Ck3u-c$*C&UpiE2; zy)#)7oo>tU_P6WHghaOFrkhe*s-|_1Ign`K-F@AC|444!?_o1`<%H2iyBd^x9?N4A zd8W=yKQ2g9P3uL(r{J4KI>KflL5=g03)98aJd07Fdkd|v){AQ_p#C@I6Gah&`Ia-5 zH_U-1OzG9ukk`x=wt<1Mj5O7xoi@7v^Q!zmX(+D`ngdRf62|xStu`{sv`4n(Ms^y- zV1B>u8xMc-s5Uow+^mnMUpu`{`+lTTj!=?E*ry+smRLwkM3+C4miDNsuM$Zf59?AD z86v&R5%txP(dAHqki1?-TJ%?ieGxrkSRt9V>hWB5gAk4DLN2wKG!c`VWlSEY4_lnb zh)9=O%5SRmmNS%7SpebSEAXJuOUN_V&hkXlXtGmd3!r6Gp*#dPT@&}pzPL82 z4x+Cqk5~N&@0v17z#rVhDB%*?RjXY7cx{1ZjrUiTqFObps%=Q=4}D#Wm{UXwOeq#J zh~*xGl_?=HQLNpNT0Bv5X)ql%$aUm0LKMq3oFhlFQRb)io>$$uVBVyZ>Bi&^?2c4v z7oYygSHB(~;A&r%1NGCx`j9=ZdM}uyJWaVsZ zyV@Sj{v{9c+y6byU1qIZPXIXG`CXIF%=t^BGqYu$bLN(RCjMW06FFY7ukl*Ogigh) zGz4qqN&uo>#Y+QO>K9!L;C87>aiPoW_Ofcysgk}RlPTAViWLF+3LK{x0*V2TK9!fN zzP;q9R|bRYe|q-WKV2UTUis4{OEyfIvO)jXkUsvhA1>QSq-XJ>N{!0cgmf#SEk6}m3SMEsJD*Z#-!)UGV-~-`g8TR$Q`qZ=Zf}=d1hTM zO*~hZi(pNntreWkGP>LoWh&K-(c2o6FMXV$b`#6$eSAEnZ9j{(%}}Ru{>*4RFkTv$ z*?`(BWp-4(j`LF4eVo*`>B-L>)gS=iq$zEpoMbxOoo_?Co98LF=X`01&7NCR!Jj9w+P6M0WsZl z=EfAw6_y?*1$Wxu=f$7?*^n$G8L_{R7z z_AR+Fx5`$ez2K`@{lv9b|Ni`?b5Fhe;GLJiUbU-&8I28P zr3G2c{F>z6K@n?~6Ig0^PgQKE75QRWbqliy+DhzWrG`@}r={xGqXkDT!*JT~Qxspb zzu8;P_Z3zlOE& zJ8505db(%P9g!JWrrBR@h-l?rX%mDr1h1b-u}kFr!MoX;{kXRnCyL_4JxMmc*u zy`Re2St**2rtOTn%A(;1^34?0J+@WWRm%MvAZ`hx+)BI={Fl0RetWfmj=D{b*j?VTGv(I zCDut4=DS^D(>p8p&7zKKZKiNXv6Zi4QPXJa&ZBP16Ln8w%r4WyDhH3n7MZVH=Jom( zB=6ci`zKfSCVW>@V`fgHL5uFzZI}`{+}s-9tUK=FZ_Ql*d8!xx^77R`>0`AXNv&o= z3o(*Wv>#H}0yOBq_0bGNFB2OOS&;~f%!=5JD92^Rv*QD7PO^v&-AUEyr9|#q?w=l3 zEcn?T$M_{pY=0oJ;T85mbuog~Qy9$7Cf0to=2kfn5bDHQMeT>f^fJ67C$$VRWR}`69~m|jU#w`URb4HNw%mVKJUgE7W&cop4MQ}+oT_p=k-qAVZKoTB zKVoWytwS*espiX;-8AVtzl)Pd=*G(KE@zBGs~m01#;>{DnM|YR97bw6f&bEpl&nQ1 zNcWFA1DdIFTAC`7eYSMX!rReT~XA^etHh*Zkxs zF~K=I%4Ies(a$;;zVgtu9seadT*z%4;~H^xNw+dfIikz0M=@B4U&Q#%M1SAFjvtF@ z9qE3fX2wd3-GyQirdOWQU=h1`E5$HJ&I(l@lX^#cigv?ie@t-vr$2#>M?~XR zP9jLuD5)CAxwL1zs!W+Qepb({wm?H&wXdSAAm8K8$>yzC-EzpKZ)sx~scy05 zrqxdL71dN1x$<54woI2}h9P*x59Tkv?eg)bt!LkPnSQ>?Wp{FflCYx&u}a6w>b2X0 zX?O|FoWYL8(qlg6@vK%8FHeN77Ih6q(7b|-n6Aajas&M-W_9%4?PalIVz*q9wkOI3 zKjQ=Gg!HISaplRa8yv~tlxNNuSlB6(gP-PHR;<}xII;e@6x9(+_gE86XnGg zpE}NyYkn=+P>9W&_?zuB7R;Nf`x4|N#&R!X*({73ZThHR$}e$U#&4oL+JRj4@tdY1 z&NPwFNj^bB|9+7plHbEltG9VV(g{WKdEF`BqtA9Gc;i=El?Q`qS*l17I}>Tu8t7uT zi&H;X_Ny693hRCC_NeI;z97E$HcB0DQc003)%1fuQi}#Z`(q)HTTxn@>S|c?&qSij zRUr4JGMq^@m7}w&-I;JS6XgC>%;jjLS`#&z>Se7jMUCc}SoMawNaquJ*QxV^_q4Ss zTY~m%)o2mt8)#%e#f(WS;*&9m%%GcOP+_njL#s6^Ljn;7Y+^Wv;ADC&dccI9bWhwO z;*h8?N8aJ)Wqnq_7~@%_43K@4%=LM@6ZuIEk+1(vMR~C@qO=VI#$8 z5*L*ek*Jqmv{p=L3=?rfZEkLMrrX`NU}IFskxy>ELA!KRF-I=$TT)n*pW9a7q5WDY zts^=Do{NuaQmzl$bJ;-FNYY-&SR61^i}d6$(ksT6(NIk&H+g@SA&QM4Sw>pK1T1>O7l{35R<6E1~^3~6n(|*=PV@sB;#tY7j%1sX?-llybHPTGk?j_CR6a-4McTmR`HOMP zDks;WNjVs;gSZ~OSJ+W;U2jjSErw;qWIM$Qn1FIuFs(j|ory&%p-+@%U5Rl7BV2+a z^jai9VO?}wTS6>Jw9L*tarTG!-EaY_S}9Ho8$0}NEUC>T2P4s^oatUBmFU%g5+J|o zaQdA!(G_h{15r_Z`q2>En=hE>jqVqd30J2~y1E_36*cKO<~iS9Hu3gFKQEfpThnvd z)WD4DB2QM8B`~|Or+3V`?YCDhX}@Zj&z9j@G)c9tzJ5%3bL3E7>%6g(F6@MaZw3~& zET2B(Y`>c4@T|W)VnLJ~w4fMrh&(EkwqOg5Am&gsCWeVXqynan6KG0>QsELSLcCI^ zRJq$ojtEkh{EN7Y9F@UpuQ66l8`sj3oiY#hS^fo-7XR^to&3APHI=H^ai`h&9foHV%osQ7ShbftwJKK%FLE7=_CDA!1H*-wM*Rw|}FZ4@2D^F1ZJqC?gmsG83&Zuu0*B zQU#eYU$lY9fr-)^gzTaYOQ?U;V_C#PIy?^=QbmqHc%FEUfQ-v1If7w26xNlbEBV~5 z8QQEk1Cd8URmRt)oUoOuQG$uAlS^)wML8+k6=kC0Qzis^M6;q<6EjMd+%PzyA5STF zBYMk=3v*?HPVU$9sXlSWMl9H%acq5!Zd0eBsgZ`(c**6N_4RFiO)5Y;WQy1yS($efKWSuB$7xVQT zn7&3)#zJC8n%qytSTR~Pu{1yVviACa-EqNxO|Ur9Ybw-56}9OZwsY29cwvSsqpnn~ zD6LJ;vTMrUe|dMu^=nk?jCsxso6l#>&Y3$Sa^#{b)~)?$=`v@A#pkm-+)D-T^!f@b z@DVZ>qm}dc$x7mAJ6g!ao)rv=9ZDIQX$D(5iJD=}N>8`PPoQEWUK=~pTNnxZ#le#T z93mE5ke1vKeXCXK6}g^?F|pXA;EC=`DDUb^ZmjylC#7+X5JBW}wXfrc$xZ&@ zwMngAaBWAS6iaZL5X8jMTJKlurBByeFUC7a1#LXRe0s_pcU*E}eZMTjoSie(?#VKR zf(>!$W~=CG{N9Ar)0JmOy0lrJbr-#+*)Kfl~3N<<5C04RyQ(12$PjC{OL0!2g9@&(YUQvIHQ>`N(c_Wehj&^lQXJwjpZlp(j zq^d5vFxTfZRn(qdt6ed^!{GO`@4Jegrl!%g ztQa?$WR_44(Bfwmvw_?1Ef*)Yv3HwYBTBQ{ESv$Gx5daa#rEiqAhv=46C{oqkO#K0 z2kN#PZ#Cy64DNZ0&$*&4qq?rB+L2Sx8JIJtu(Iz~`?tTRS|=?|HMnbE`d*-~DJws> zw0y>fzKfsu_FUOU(HnncDHd&{M^Etv(G=@Kk9|y!70Vu*Dte45gOnbVdF7fQw?Jw=er+*OZFP~u6an{P+$=5b2aDx*$m^+s1{{*k{?2KYGlb{w``2@F&ELxFA z8|U$xVz^~^0l~0rv3X6be$8Hi0)L+8?}?{w|v`w$-?S}QcrG!tERo+CA!morcNrSLvLTd zIzQiCkh5U=={H1&(n_qDV(5UOogzA}DamBs7+tdI+epOMWzpt;bxIOC^ z*EGAljge4UYisEXFEuStXH6)&?1G})@>+OJ`8h&Ro5WV3}U#hsrCHAcx72(apm5ky0)61XEioQo@#E&(r)oqu^S`H>GnrXKHc8ybY}T{ zc~d7xKH)rgx6kM98Gjubq1RO~zaXlKGDeDC7n;a*p^2R6HOvQ(xVKDF2>Zxb6K689$RQ^9#FR6u-}p-*}&@&ZMf*gF)FWsMwKz_Rf8#zMxj z<_j3XcvB9LDX*-TLgwWW*gt)Rv(C2m_9W#J0`D>6rsC>k*4*o30(~(_-gD9_T6*U; zMYlJVc6Dgx*Arq@7bl7SN3ID|d#mNvrZI~WEo7!3DxCpZnCh>zsAR=i(rwD@;EbjU z&2D4M9K(jptPF$AK4RFwE4}n%&g5wZZ2|6N!M51eR9=SRcXKclgE)QUKqfS1-aVc` zk}oieqij>97Oz+vnoqldHST<5tvw= zXFG7fsQoKA=LzHK=IrX3 z&y1GgndRyj!E_}X4WO;@?`l$8qSw1qu3MCS)FmOCLS=GrBC-()i4CzGPGrYoJ3o`e zl-SwC6Ig%caIv<`ky9=+l1#@qW0K-MDqe$>mN*z+z4`C2#l;oc5{?P14ne9O_2v$> zM2Ic&R7d1~A-Mxab%Us3t9rNc9dtB9$q(idp(yGte6Lq_QihUIX|Rg-!{`Z6vE<9r znw6L4$w|v`nAN-0EWbaap{jUJ-&8l2xQ-lhomPYmZCAdo&l_aamlue|bcOsQw!G+n zo1=e6-(FBkJ&2hMR7jDN3_cROn1_`nmJL)g*Da>9Sbw9MlS*JPq6NgFym(o5O4L>T}5rfESMu@WAMTp_Kd(NH!BeZqx9?6=ykIpe+?hY>jhe!A$DEl z)L-HQvvxB6IkFb>0rGif?Zn*JeJR%sp7?d~yjc0f^N#DE5AhydK9AMUtPTD%`FZi{ zhMbF%uL}(k?eS@cFA}=M8?$(mjg^(Ln_gr<7H?lwtli8j{2|dkttfU~Z(qE8?74ou zynOPd^2yA}iYF(@E>Snv1<7@bwbiVBB4h?Xn`z^>;Aa60z2NbJOkQ�z)ysRm52u_=bxDw~N>WR3OAMo!!eW3W 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


bLK6UbGf164(O*`MkUT* z zco~l+2VG+^B>m{F?;@xQ$PgnWeHjq*!i>MUGJ!&-{5{|(Si;@+J+ELZ}KTC<3zI@61|z?M)8Xd+z_eckj<{*0ZKQ^UO14&8(Rvq!6Mu zhDV5=xp_VA&bf1_5ULA^>N#lOkcx3#Y6&qYNr*L*dkz_vJu73)YeK}W5h6T%;E=Xy z%cqYSAcXvuSjG<-nl)PBYvUfpHFQeR z+{x~jLi~Y$(i2I=`7;U@t$a0y%nbs&OG{>!Pip?_Kq1oZ z6r%p^rDX-BQ-fD6!+$vbLpDn9vX?!#b1S6RD{65S)?9JD2obl4Abl6`^JrhV|9t6Z zA%Yrv@3?q4s6iD!I#os~juRBvSYP)(GVtB$E32Y;r~o&J$}yjSI@opXYViG)agDw7WcG;!d(t7HzPq ziEV}9HjdKO{9G@~xFRDt*trfM7rmfkL4xRj*-6}pxk%iGxl%ld`IPuO=JVn+%?pG_^W=4y$zDqqEXL%xBz zNp8Y?TfT$&p4@`@k^C3t=kg28FOi6pN8}OA)A9`F@A4ex1$hzkk_r}5RZ}%EYpDp# zXcdhaui`Q5Dsrb9sK%IWRa?w7m4?|~wa4tJI%0OFj!KoKvM}>h56u2*0OlYy6mz)B z$DE?3U|z4vF>g>eU@lTiFqf%in7681F~3vaVg9U6V*a7d3u$>Qbj!-LCYTboDBq?a z2I#VtRyHN6aL+=qdt3Q}JP41KW93?Tgu$n*sY7~b2gC`r-=WcF^^HR-=+7P663x}q z4($;U>RyKq5(#RaLkD9&)uBT~7uDLKLq)hUdPrK;#7OzEV_#h~mg^ikJb*!=+FHm?q^{;74GrZ~4lSC>UY9s}4 zc6qu!Zt}%!_|tjH7ZWgb+Ba~o`AEV}r<*0NF?2aHN&0`3P*u536m#LYfE4`F90)zd zq}dmiOa-SEs7VJsp{+@bBRIO>+JE-8vKRD0DDS zbawsuu3`7C57@$g+r}*y3BmOlf)o+ED_VNok-5K%x0O=)VymA zZT@d1IK?UNS!h5TLh0JnmaD&n%AvI$wsq6F>I!n!CFIu~UB|S3mZ4#~<^^i-0Hinr z+a!_f#+XdnLPS!k&x_Z^7V)L{P8=0yX$-5&SlLvj$!@Zb94;rwVmVLVBJY-u$-hgl zx>nt-zEwxm8B18<)-~33R)Mv_`rR|obFF8x=X%dgo>iU)J?lI#d*1eZ?Ahr#;5p$r z7vu@56%-rPAgE=~^q{wb{uT69(Dy;dgMJV0AN)k{pCQ#kqC>Jn287%m@?gl5Auon( z3i&W(d&svTM?!uL@rHH?%?W)h^tsU2Lw~H+sM_ReWz`l`do8Sa*vzmm!@dhU8g{n& z#Oi;mezf}8a2Z}Bync9#@XYY6@c!YW!VAK$55Fn=_VB-jzYzXT_-EmJ!VlGGUgM@3 zx79dSvvbXrHNUTwSL>ZxAJ^JhJGu7FwQsNeQ0;ZKU#{(~b5))EIz@Hn)LB|*TSViC zl!z`7y&{H2jE^Xam=m!y;@*gL5wAsj5V14jK*WiNbCI6N+L5Co{}t6UYDm<$sOeEV zqnk&sj(#Zmspt*S??itR{dJ6txjLp#%gE1##&c_DD){dD87CCWAVQw^h{Wg zup;5Ugf$7zC%m5UVZ!!=eF>EbrxX6HTdi(%-K4s$>b9?&UH68%3+t|^`&qpa^(NGt zQEyJYrSQiB@9G#Q4N!iD`*l6MH2NPs~p&Ph6Pz zM&gzRaSa+ZXxm_PgUJn^Zm^-jI}J`H6(zlw^jXrLq(e!klm2Wtq2YZEpJ=$g;TsLN zH2kvRw+#mhlarELCwEEimpmqUdh)#FWyyCYZ%f{lT+t}I(W8w{HSXAW zLE{yT?`yoK@lTDqeW7S)-Bq% z$Zj#9#po6VElOKF+Tz(3ueSJS%X%$~TYl2=d@I#zXsa=;?rOEWb$IK%);G64cvZ`* z(yr=uRiCSNwMlNXpv{Ul_qUC1Tfc3Kw&iW-w_VzHRogGy?rHl&+oLI0r}RmAAm#Ct zQ>mR(A5W{6HYV+<^vLvU)3;=#Wpv6|oUt`yN5*#*y!>;qY?(Np1+rn+KAin)wl^m%r%%rCoC!I_IWOhBmGiHh zuX4W6IiB--u9Z71_n&zwc{k>LlJ{lao*vD5Eb6hRXY-!pn`@h`( z(tzLrc?0?n7&c(hfaL@38CY{*%)pTYA0PPJpy7j_98`Ht|7-5Q=EC5D!7~PL7<^{1 zcSzWf=poaGY#tgtw0P+I!#WK6dU%`RvxomV;+he!j;u9u#>jt;N*Gl*>ZQ@~qi2ua zH2TD~ZLghs?e;N=W2TPTFy_tcYFsz&x{cRuzV6epEyvCsyKP+Eag)ZqG;Y(l5668r zZuj_z@%6{I7@skI;rNx~?;rof_`Tx~jXyR1LVj?5o&0+F&GSq0Kb}y3!qf?`Pk492 zM-w9^mQUO=srIC6C#{+Ed%?VdT?OA494q*(;L_xFlNU{1KKahcd!{s>^3c>;Q~OU{ zKJ~}KsKT2HzbUMk)^S?awBggnPJ3?JPt*HNzjgXE(@z%-FIrmk<&2gyhRs-C98_GR zxMgv9@%-Yy7jGzjv-rK@Pl~@R{=WERvA3jFNt=@EOSYB#;`^5dm&TX2Egf7swsczQ zywb-?-@m^8^>eOYeEr|bg3CIT^(-4vHnFUzth{V~+48b`%RVaGQTBb=iLyUt%9%B1 zX3QKt^QoDq%B}L)@&@It%BPplDSxDVUHOOQhsw{-sxd2R)>X5X%vv?;!P(KX@1DKk zhORd}JtuX}b926#b8yb7IhW=}%^f=Txp|%E70sJJZ|S^M^S0lZbmQzBKb+rqe);_E zH+8$I{HB)|)LIa`puvJ>3vO7jaKWt$?pW}^g2xv;v*4u#8yEb#P%eyF*l1ywh5Z(e zTR3mw?F-i|+_Z4V!u^YyF6zH%?4q(opDeDm_}ay#i#IGjb#u(k!*3pY^VTJkmlQ9V zy=1|X)l2SQ^4O9MOWs`a-jYw2e7)qmC5M&{Tw1jBv87)w{e4-DWlfiLTUM}a&a#!u zo?W(U*~MF`-O}}zp|?!A<)&Niz2%)-DsDM>%f(w;-a7KuwYPq^Tr6+2e8Td3mTz3X zefg2wYTXulTc_KuyKVJtpWXKTZGWz4wPMtYdspmVSz~49%CRf2U%6!E%9Z!5d}QU5 zE1zHa>dLoPzQ1zY%CA=LTlwS4<12q%d2v;PRb{KTuG(>Xefm88G^(EfqV%ZNTs@)s z8GbX*ZNZF_YtZj@6br<9*`DXBJLvhI;7REXo`H7Cqw*wuU|pVL+N)9Ygm0^VsZZ2* zJYR%c5msHRk=5L4XWeV9vHotoZEf}>cp7;+d2&4CJQF=LJhMFBpva*5K`nyX)>~X} zS>m$9#}fZYs+|;-l#rB|l$_KwDJ3aAsZ&yJ(%_`>r1eQJCcT!lF={4R$0rvw+1l*r$v-bBp7EJRpr=n^^teX6$djbb z!5aAzIrvO|B@fD&zltpWT`D^Lu^v-H`iyzy1Z4``m+y2?gw55NY^+>KXNl+N0i7zgo%ad$kw+*s3;KVd_Qo zfqFr0QZK2OtvXgstG0TLXJIMgnf*u-jj1)A82{!m)*i}J-gROuzECBj`8NJ>NEA0`rL|BA6rwz8{!LQM!sQQVSIPx?Vjg%hfmP3AIM8RsRqXv;|?z-smUaI8mPweiO#)ZFqL=$@5?z(TEXx z3FGD|%<9ar!Wor6Anp?Piu=TRu|VdCkHtn>jnBkK;#2Xt_(~iW`^0{6P+HM{aP6gx!&@wKQYc8G?| z6(x(^BArorQ}Hcr(jk!{j-lb-iLT;To@GvptC>COCeDalah~U%bK)8qA_nrr-b-8( zgJiJiD=vy2GE@wa)x~gGli7sYVzi79qhuX%t&9|7n0Fc{V@1A95aVUMj1v=?Wt<~Z z#bnt)+#plLe3>a0%T8hmvz0f?&SIJDCYH-AajWbuZjo1u)v}kkUG@~KWDoHqvsG*4 zXmPjfC)Ua_;&C}jJRz?Y&&Yi7f}A2=6tBr*@jCNZ|BxjzS6nY!iihM7W;y;T?vedz zd4CgK#4lo)ticoA&tjfT7q>AFb_ex8NBm)xTQjX`R*^NsnrszYWmbt*XtlRGSe>kH z*40)QYEY)t-Rf#}v^vX0axqUUb7{HP$S37G`4mqtkISd!Z9K``!>rgWIa}Vq4B7%( z_?zVtxl}G=_UvAHpL~Fsvj^ov@^8$VJ;H3+GxAw^MxK?wG1v7cEvHmUS<0hARHTYh zG0btr(wf$zPe@P=Ra4cB{z0hb@|;Sdmq=EPRAW`2*0zZXRY593#mnbZ3;DciDc7r3 z@&(mezNoH}x2j-yR85t~R3T4We=w_eLEa=U%9m6d`Lb#&H>ec(ib|EQsxLxdMt-FR%bjY7 z{8|l_->6}7ml`g2s}XXK8Y%axQF5OeEx%RQ%J0+|xnEr;zgJ`B0X0tED9_6u)OcB; z^5u_ef;^}u%0p_BtW*W^u$nB7s3~%zYA4@U+48uWCQqp8;_q^zcv_AZ&&mm+j`$bP zsGo@H;yrq`_nEu;fH~|BnUmVWOzbB5>$gRSc!zn~cbOA@i(apir}ZNulR4HF;(O6b z{J=~`1#<{Lik9Ml7$7~OpH!k)HWQ_?g_tTEifOWum@XTOBH2U~GMiQ=TZwXcm6#>l zh}n`kDcM@wF9(SSA)K2w< z`cmys+tqP(LcO6*GD1kSs#_se11r*EW|WpTOwMNx)5`79Z>StRac)_Wc(*9OyqGp& zwFu1`otGp^bFzjeiNQI8F-!YqjmGRhuwRnM7(B2)CJPhT3?1ATQwaL~aAIYinieGp zxr8IDTF5Vg*6rV2!~W7Wq>5{GCuWa{*&pwN!js)|aFUpvJ)~EX7@5;+Sd!>8WN>y8 zE!e-OS))pJ&tZ62GLKeIp_oH%ht zsn~7It&_|0CyEb>3a8{#9wift#71MjV$Ai%eA<|6jQOxJ?=2~tR4i7N7SEa?ZYi5x zRxB3HoK-qg%q!P6y2sUP1lp`)Oblo}`>fFJXmdv?VW;O;CFQ0~I|qz2plcXY&pzwk zR+|x+L6o(JvJU0XK)}7z?s3Lf0;b|liF(zRh71lq6?}Kl{-C0uaL-=PYo0Zp1)gkA zhV_y4sC6@K>ToLot$kUorsWw)pR$A5qE3X?@#%G&Yp* zQI4xlQ-@^M-=XX~g@)VVnQC%<*p$zQVubM$bN8FoX2SAUE15%=>OS?DiA%e0CcmMC z*GMo|J)0dY_4-IHc|HCvU@I9@`1x-mqBQ@^S`D^_SVOI0)@bWmYrK_jO<*2tj5W?0 zYmGn(qpXpH4>nu~!-ZZu$Yh0}J)<;>HGw=)oppjir09=*jA#Xi_p1lggX$smuzEy2 zs{W=PQ_rb))jx^lJ++0Ivs3D#`cqv}UPj!~QkJFHCK!7+wwf?5Y{tm21!KZij0mr? z+E{I^6e|^8!i)q2BeQ3qUr;ZL>Wt6c6t&bowNKPmKd2u>9Y#VIM1&P)MT`1YtQ9L- zSjkp0?cU`)u2iek?P|5UL*1$F;u+>1buaP0!03)~9kK2sw$qHLepP4GS@oOxo$(c` zDCz<+SLZpW1|z>(R&7Rr5wvDeRy1iP!()gkA3=VfgU5H(7I^$teG7M|)G4^TXtCx& zK2sTK=~`-+U6gb6sGku?eZ{&I|FOWQV>N|G&XnaE*m}Su@rJB#v`8`PG^-P6pIs+( zI31@FlklUT@U(X5+TwSSj5*OxTc!cLw8l1u_((;qWrcH-x&xb!Jj&l`Z?6mCs1&cfIC8b{H^W`WE9sO0WT5+Z44seM;gHN%x_6w_8i`C7z z1Tz+RnRU4fteOS-%n-5iC!Xa_sv=fIi&cp#WmT+9%~a)TmYU7l*c>%i%~Ln3`RXRM zKrJM$SjIam80DC;j60GEVk}clRaZ4sZALROW;~O?h^DE_mu{;<+*)tvt0t~ey>2AN zx*y|xU2fXct4&hY()Y$R_io-PO;$(mklBptbZOqo7_vK~NS}1{da;gAQh${bO1F!O z7ESk@_ByN*Cy5)=)N)6zj431jqq^<3UyOwZFkaB>xOyefZku%4HaD!F8xDLnA^7l^ zmOz@8K$@07nwCIooFw%LZfM7mR#=6|b{e zx}1@{w$n28)eh~?&YuX#Up13IUCXqbyW=N{RJ4RxQx(BhHtVE$Ru8ME)ywfy&%|l_ z&{8q$s@iX0z5?oQv-)CoxB8fNw>M^o03U;lkAcPq;o-Nx z@j*EtsV)vDx_5}7j~GfB_u?6;3!JBz7BN)UJhvs({fX{X-Zwp*rXOMjSJ9F`h53M5 zhk3tx67y#2t&+bWMW4nh8N)M?Zk@DV&yGx_U3FVA0@;7%GyK4~ftT`1{{NIL{G) zr;J2(m8f?`TJlqK@^TNLCA6)Cr)I)l}@;A&dV*SaXPfl!!Cs)0Mh(rFib=z~9}Ewh*>FzuFZD|P!6hnsFkbi1zGgu5A=0BaQY zx~~2pqO7Y#7f(Nt<{3elWZp5G$MrqJTokoE)kU-?5n8u3uM=j2sO7Y&O?5kJmEdO_ z?gvDYRiF5eirUui-rs_v?ex`Q5$Z|jnNPRx`>~6_@Aq8$;7{{-l5`t$g-@#i@%#An zwI6##P3sWx!lyb8ejq$^ch>dZ3JuMRk;&88C6ad?XBvLITxq|3{iW&ObbqD$8{m`U zWwH!t&vib1vNBgKCoPlC=<5dLre$}JXl~?9`>fkRjk^dCI|Qm#&3=CBu76U|VF(rJblr`+m1*b{Pi4lg8sB$YM@SJ&Ye+ zZ|~!(>z8i(s*@i_Uy+l3zcN}4)~ZM?b0@Q*+4pN zj9p7>64z(o$;T&kj(i8xUPfDE@mmC+Hv-*8J`9$5f78&s7@3S9{C%YVAlK&s`7&~F z`V`X#=r+AE@&>LPb^Gj-Wneo;K7Fz>R~;WRp`2=|WaOr07ec$ehBRrnbladZg)p*y z*!wp1BuMeLpWI46mxud}@Ei*Nf$frRpLvgx{500>u4#*}#n0Wya20rsv>Jn_p$F1l zqa&v5ef?NN@}hO>P3CZP-H8yHYLXbL3Xt)9(MsNr{Guth6!OxDcSY-o*6M1}Mt)74 zT|@`fo%+1O;4ZF{!4QxNt^NJi#fnsGW(PIWSy@VB9MzgR^>)0|+*s}L>Z0?H;Jpnh%VQ-fj}dw4;a}fu^WU2R0R*ynxXS)HZd5~Mc zGoqnnoF zt<{3^oKGDeM43+~jjp))#%w##EnD`5T>GmP^zSQZmse26D~NA}7zXOt@LrHjM0YEQ z6}%g~M^psy+87i-YrEzSe6+r{a?sdnFS>wK`Gog^(Iu@{Dd^WT=w?6fpDGIdLBD7# zS_CzQwsl79&8h%e-%qLnZ8ycS3y~K^OJ)Sp9CYEzy0&--JOZwA?)Cc@+FrXS18x5_ z^Yw3VJqkL4{=nxy9XbQ};`LnzVK)rS0e6B{APLk3i9ow)Xn!k!_7@Fwn!Y%iIJ6F{ z)6?h=`P%9|hEAsG z_Fc=9HYQc~oy=~SpZ8IdwtW*|(ryXnF+Y(?TGAtfnE44|)%IVkgNN}pX1J^&Ca`+@ z0`uCnS-G9aO6r}gR5#VD%*=8|u#($MM#*R-*jyB_Y91>-mT|1-Cb0foPi*DcJ5g+t z4P=sRD3fI)*_fQ5r{bJ!Dx0xF-9omc*0++aS@miy+lWtPTUNC{7w2V)_(G=2G?^|l z$YUn$Ogq_Lv^8t;omda9U^XRHc42+K8*9c_lfUh69b~p(7;m1A5bfniIZBR}*RmeG zQ;w0>iLY6)8!NuyJ%I5tpZ6;!n)d-F%PDfIEMy&yHxT4>StMu3Vphnzh~u(Eyd_KZ zz6m)~bY+gFQqE$%ywF+yoy%(LjdDKge>a)6VAhRkZ*FEy(5wmbzVi&;qRA6I#3dfy zOISU=RrF+~Sh5n|ixtG%`#Y*E7Vm52-Yvq%yIO>(^r}dh%=+FA~bF5cBkM<2@zs8Ha z!Sk~C5skh^Zji6AYvVOm>i;1Ii@EZ3aU*Z{Y?N;@Py7~Z_HVOx{*HWC{!?z&yEx?g z@&oxHYw;h6o5Th&MEuNr*f9Ao`LXT^%P+-9-f`F= zzY>dh17N3ED8H89$X#-`+#~nOeezrRo!l?KXIwvumiz}|2ZsDWybx<(CFL)1_;jGZYX)JWb38_nC%W7KtOtQx1rt9&&huj&;P3>%pERMx3I5exw?&=PFI=_ywZHwU8`ni;q6)PCL?I>5|Zh5At)REJchI?VezN7XU29{!Ww zne*Sz%F%B`GSeK*{B5j=W8{!P>t64&HM0;a)T(BM(YK%BO_<+&t5dAdx$9G`xYlC5 zDUr91JmN{(|FyhDa4YMntVM~d&FWPQ>sN7BJa1;zrLBHNylT~Brnow*7-PkF(TzUg z1M#7FP5guT^Ebrbd4uU)-dG7@zWQmaK4b1iyuq@Z-E=GIX;z6Ptnnv_apH*8kbOB@ zSb=M#*YKzf{Tj3MS^ctVIKX8@L;SnfzJ4ESBmLSPjB6V3*3rG< z9`TIG=RK+{akqF>uLy{T>0_S~4>IE&Dn2r+16MO=o@Hj`_3kAzFR#}N#G8RD1_5)p z!&&nj$(pBL3mwBc=vdZ4$D1|LiPj|E?w@Q;;SH)n-o2S_-o7ceN~}`rdfvd9$vZi- ztl8EL)*NfDHP5=yn$K+Sx4f-$J7clk)=j*9v5)ta_V8}kesREBU@f#3S&La~UJ{%& zp{!tbLCCD)!qmL1Jo}p6&bg*I*EHvvp|2^aIl1sDbJrcv7op-ICo+`zPOZ?FqGo+h!=ZcX?saq=M>w{DB=_Ode8F)7u62%bz%_ydb!rD->+AJ^f%Oc!2FRAiyaj z)5|Vp&VbiPQm1* z)EGE*R`HblvRN~V@@JKY479UYec;TZ{Fzg24hK7z07f(01rIT{)rVBcd|Il*XvaLy zP(&O&G$2?z!$wM4YF6+tH;*Z)x#>2yc}|}4+64{s=ONFDu!kdwJYSxiyyWH87Q_AvZ7gQhRceEMnkr6z~ zI61eD%zJbQ9&Mrv8|~^>aK4){s+>{M)I3{Bxu)6?WIGwo&eZo*Ri`+z%st_JRo5st z_Z{tUS=r9ji6<*PB;UzwzEf2v`gsqV=;vyZDTUwy!(4EITPE=2@R;MImE**n;3QvgSsgX(r=(>Xe<^7l?P5>O>k&M~q+ET9pG#W;Y3X58E=z?v zn(3M9ucJMxPxXfhE;RY5R@g?rQN&waHeWf8cyc<16gqqrI#spMl)fsQW|B)wZ(n_y zKRTO*Je%9p^!C9;w#FB^VxrdOc#2>!xY*X8;(WcAysV^jYC&*ufVYfxRsqUZ5}*XR zjzDuAsrj@$*D35=pWvNB&*>3V;@AFMCr^1!apXF_a-Cw!ORZ6Inf901Ij>$4P=k3* zOSeL00gPt051wgfWo8vYq@{KYDk>?SGSgG8>u-5Lpmv4{>Th=NEH{VLUthg-a+KFT zXqG<*wp=NEM-F+u96343>rrFYWjUDTl-(?+{?0P>ca~j$Z?KuZ!OwKH8{GPPgI#~; z`W=#d#bH?aOX67SJ5c%F$aY~JO%myv4Pnv{%G!!uV~gELZX0c514hxII&Ra!o) zta##Fqdplu+F_+tVtT>Exixzh%qW~RsiG>6YLhrcu*f4=yg^wS)E(tLdS{Q2&Ea`2_&@SEbqpW>vK;-r(3 z?HM&|;#|+De4j*99L}A7C8M1ab32EF_KtgdCxwnq%pIK=J39V5I{rI4InQz=l$92o zSKO2Gw2L^)4xZ@~j6H%%$;fh|u}4_kJJDo2(PTSpWIJrwBe#@{Y=;fTI=UOk^a(cG zVaFamrDWK{Caz9_*-bO|jsWeZn|nvVc00(uBT#z`k&tTn> zbZTLyQ~NR(zZnj{84h0=4xbqge;GdheDOQ!XE^+1`1ths^WFR8;7iBhH`9qf(@8JWNhdSg zGgmhpbKQm`)8X9d&@$RNDYkQBYVYKzy^~T$C&rErCmkLC9UcE2og8F2lF3RBW*FdW zI5K@LXqFRAmJ^LVo}Jy4!*17-|4|J(|XvoK0WR7h9W(^%DvlgIR4vJac^Jc-f2aA4N-c>%iS|`FTYQB zS{c`Wm4++5s{bCBhtH_Oe?}F4GOF;KQH8&ZD*R>SREgi^FI-nFpJRl-9kZ?6R@8~l zcc10tr^-F8s3Xr*6Q0cxK|S+l%*Z!dp58G-4Jx!rrvjzZQ_d?WD``_cIhctGeJQ^| z--VV>Ei2IXA(KmHm6>bdY~wz&aE^AL$#hDwCJG8UQ%QR$E;JFC_*0w;mg4l>DRxCn zOK}DgDOo8hXK?7u()@`g5h`I?d%G9p+A(Zm2?OXhdcQXr~%JYZJF-H7zAIrP}185{AgQ z8=KU$?BE%N#d^R$vtVLL@g&#yY{Cqm*%^K^%TMM) zR-cJ*ig-x(TX%5DtUSozxu&!XUp$}K{Mn6oTADqcCLeZw(wy;Q3aw^o(X5#S57qL} zMD-c7ipmR1i)=;+-ek+Oetg&4bc-#7=`Z>oOy~u1tv_KTRVVu%Qq$68U3cGw6A6! zVYKIJ=BY(fS`zrN+re~aJe=-45u`hkNKeVCW}cn`LS)p?k0$vON@k-YzIdF0R(fi7 zI1fY<3W`c@@H;xA({$%CAl(^lr8}dN^z?SsZD!iRP-+0359sWwC1?m&L9vE{i?Ogs?CS~gvs6vN)lO4coF<6EChruRKa-ip_6)W_(36>uZvTPh1m zG`JU2TG_5&?&O{9A(rf<4QI7vi+DSJUi>`PEna5TVx4$QJjlAiD%L6%@t?=ev|>&t zn!uXfaMl(3urAt-l~xuvtxd$S!TK5VRqJ8QN{e^G#3gGR=7-il@RMWdGw3>4OR@1< zyo~`p5&96b{+x7Y-EPcB^{InaCtT|*y#wYg^%dsV>NMu7thY$9mABD!oYgRQS$fyV z_q;DA#T?`38+8&11lc6?_2Ld2g_h>nlKC z*Mq0Q8t^c<7pw+j127VLFz5$*fbM|(6N$Wikk|$^2gyLYv%4{o-Fu1b*-K={ULqP& z{}MO{e&L>Y>z@FXx@=wE^{H~cQq?-poxfzac{pY2?0evT-KC!}pS<)Z=6#nAV$Skr zX&tN&_x0hvKHS&4guVZKI$XJDuS5Nh6PAmhdWj-j?n{_0L_%r8G)zA=>A$cWTg9J0 zgr7n}PJGDe-(uEw|4A&!FCc8y5J=u}Mg9T)?0irjjvb}qP?SvqWrOLbD5n5BN{jm# z*N#$iTq!%_=832DY%0OE^HcGZYy2DnD|sl6`c525XLRtf8O^;4g_VLx^$ z?OHYL7T5J{m-5H*x@-5cog?m_1MBo%{9`WlAk^K)Zk0>j;!=xTO8c8<{FPs3XToZU z#}|XC0Ti-#?2x!k)lY(&5I;u8j`@xy&~@w}~L`-|`6Qn^0Lgy^PY2?*Q4=Ng~p zqXJyru=RG>Y2&B0OEu*#N#DgMxRkbwGIllNL*vz7QE?alE7!Q+I8FAHaYcS{$Er}s zIl%6qc8%MAnVks{w>xe}+^2CL#cd9tHo11Mxs>0ZwtKNk2*0bJdiJugRYR-|aDCL_ z;QlxtwHwL~;kR4sy58wh{?t|k#J3}Esmq^DEpT1uAcLhw8h)zmGP@$jK)v`Kgr4>{`06jSZC;7Z(>17Y^;Gf?Ye|qhimy)EOV8L&W}k zdDz$^fv$GUu@!-Kb_l>c3s!F)WdEXe(GM=Zncl9{~Y`*kG&alzDvz^DL8UmwcRx1 z&u=%$b%i6x-$<7l>{9()O5547^ld=*pM_n0sAnr%QeAQuHp4 zzb!7M?cO$FUw7?Zb}7ok39-(l9&;(3t{v8&?t`xD-7e+l&mVRbuC#`ji(G1+zSqB) za{CHZ>{3%*YJy9RajD_9gklE8_^CdwU9L-YBhC&nX_&2Ds;NsQxm1EnMY)tetfp$3 zSo~o_U4P1@E)QYSwK>*dqc4Kr^nLUxmpbNB2ch;G*WE6q?RFTuPoqDIH*$#H>{5O^ zsOU{q{Jj?aV)V1dZY{AqYN-2N%5Qh)Wp*o!zoo9-g6KIhmC8Lf(54+U8F16aFmb=u=E~UfHuM&24fNQB6vyXZus?-hP zvzv{b&A~L6n&ieZ)}{QMj&$v&xzu1g|Ky{eOZ9N6?k?qb?S$V9Z68Iu>rl;ID%qv9 zzj{^t#kj7tyH40JHw}-EioE1f=UnO+-IwVnrN|Sm-Ct9Lu%8?v{ZyrEcfc2m9-~L@ z)pwCQeRfx(;+y(Ls*$wl@k!dR9&Oq`Jqp*q_^JL8qyMQ$k9hPiu3hBEHbrWFYKv_b z`F7;%KG(R(c8iHWdIS4cKZ*FwSl&NI_m8gq=?3IT=WU%1?dK&H4c23e$j5vXw4Z|q z?X)8A_NNwkz_!DmzZ8(9Qy#8#<6TZ8SGgf>aj8XwH*)qr6-CZ-UCVt`+~p%=dlc^4 zMHc(~MNW082`=TA=@{D%nGSbdU48M7!~C-HOUO`0cOwV+#tbojPW$-c3$VkV{fo?{ z?=fS6$Zjsx!KKoC{$h|&WNUpFiC)>i04nJUb_u>VF_wB{k6$9AeDx@Rs_DcQ8mWA- z_*+MRSUpCve=(XK4!ZH|cd6YjwZkX1h)-R+k6dcAPeRfDUefK=Vl!NSn|xA>c+I6=bg5@;f03aP zYkeX7B^@=`XBW^1_}f^wH;5)5&gg+y?B3oVi(jUGNg8UXj@{qFMLg=OW%1NY=gAd) ziBHo00-mF?x$6Sj>DD6ResHIsVg|4WJ2#}n7v=!#ZOn(6-IKDpG4(D{DdP+sr)LRe zjG=owrnU(-^y|hL*7Ux6+_1vGsc*`EzYoE zSBmyy&Uulq8#>X%mS|iPZC6cmqNDctz4Zp>3}cRU%tx^4VP-`ibWCk?wWgKF*i1L( zGx84X%MFJ^*}KCRI1Iglua6LeF~2uvCwAhHilN6EbEfqTHV@jaIuvIR>QH@6%n>$i z%<6jPR94qBs+c;D)eYy(jD3=xhn1_CQnfWWpR@>?HvZQd*R{rVt#Msz z?7QfBTiL~w(Qs30U3AQxNTTD+H1TJe_`8@Gx|kTc7=F6w*AezGoW9vpNj9JXg};L(X*as%$(?P6K7N7=eU_WKCa`$xAuA5#Be`0uGS|51kjx`y)%Gsitp&vDC+)@sZf^c=UWYf`Uk@>17G zrmp5w{>gm3WUr0Zle)$nX=Fama5BZGDPGnkDBd=Cd{mb> z`<1l)qo!p0nRu?TbXvCbuF-lf9@qSE-lk5s-lY?o*6E6MX14urX6AjJE)i^~ablhE zzs}6OuQQTaXTr8Moanw<`_wT!XYC`-vDVj^?M)uXs?E?LCSSp3W*+{aUiNB@hP}MSYYZHHK6SlPp+uDR`tzE@Mle>#%1>&NS(pe*=i-w>})C^sZWS;S#XIkkj!*ibTlWzR9GI16dpRJ5f zy;oDpR>sdf<7b4iA7N}3=`|#|$oN@gX`UAuo)>AJIrmq$PIC?Ci)@|^|BFm2Qw`6H zH7DvdQ>PZ|c-V=hIbUSVB_{qmO}g|o*jL)7aUE{##~7PZT3IPRGxqlw`nR%xbu z_0Cx-b4@%`jq7~F+f-w7kBR3V6ZU>nEAKIWdYDl67(cyD>b>>KpX_aT$TmFmHmUbE zVSAfU0}LmrCiPJ!h5^RxO+1PnK=z53`m0#6qLa9h-QoJHSaaAV^(6bE^jEPS5&ElG zYdHIP7kjewSFyIS7xZWG9lM^+vVTZ_73+}xDi*t9`6?E>VfiYSY^cAA#a>muipBm? zzKTT;&iAm`G0OL_*fq-cu-G-q_psPEx}5!)6WE=3JG(^rDi*s$`6?FsL-`&Sdqmgp zpTWM%r(`kvD_>xTDBr{4{4TzS#R*<~35!_y5*9l}-(wHu9DQysyG8Zx$ocw9SnL<& zOIXCqm$2kr`b${s_tg6rAJAXIk`J*{FasDq~!s4V~zJbMAzwAKdwBIb1#aX}XJmj=r_8W56FWSd1|r}c7fquixWn3Q{1X%v#ST|NdF$r;?u zl|EnU>n&gr;3-3oQP@E%nzd5pP$5xeXVfHY{v+OjD~0tp}r z)C8eG2_Y_W#hvwOK9C0(eT#!YkF$4!9e`1_j+axlh2SJMPWhGWSH+TLbLy(tV9c%N z1hy}vUMJmd=xxTnQk(3eK8o2=9>(=s{k<}A$+&W2KlBu1ZZ_tJ+Qg^spFE~-_`&%9 z*3gHHx!t%v!#UV`Y=OzygYd)GceMG4F=rVLI~f0bPYyqg4gHoezc%Kp#@uSmUB>*- zm=}#X$C%$>vgXgK@dRSzt71sKlX(wdwO$1l7g@^>VaK8QdDnXH@;=~opEzw>-d=bQ zAY<=ZpAGbvn)cr1+QiwE_W{?&=Vz;TGj>f#TX=Pen4fn$ce}k`nH$#R^*&M<{6Kxg z$unQ5o!IPFdpYwHon!AJr?DCzQf=T&5b65c4*jM2k`q*Rs2zm)ir&}5E>azSm)gaN zGVCMe{0!Y6hnl#8wG>QvJEUbodQ3>mg!GW|ZqCKfA(aWEPbM61lVxo* z_QXxE-}LcKAJbBOV05z86?fx4ZuZyeJ+&Lnep-9~tUf{C-a8w(b5`$|)q7?})Y=6V{J3`#y{gDu%$Y6(ex7rEz zc(6#Q%NyT2!5*-ectQxZTfOLAqBeQgsxP>1_byiZy(iT7-qWI*aecwN z5+5to2C&Kd0KQh@Yo+Te$O-=dHpg^0^&@;sY?l+me;wNI7d;|AUm8yQ@V1h;&{gvH zqxupbJHQ_J+v{EYU%D>AbqVM9tn_~4$mlpSI!aDHS9f`LA)#0#_`SN9I6pxy+c;O_ ztoN|`1N-yzQ3)u&G|0(;NxEJN#Zz89LI^{ zG;u@`2j3JSjuTEC`;oy)+*fWb(V8L zR(iKM`8bTrUXzbI$;VyZt@zr6ukFP31+saFl6?sI+>Zp-66XQR{Uyr%B_k`%{SHE% zhWlW(>C$s>8v?hSX9`sps;>m;PFWMb>o%eokauQe~OG$O9`U>m>d(a*& z`(Stu^yMqJmFV9}BgO6T@e6#U&{Ck|>T&NGG~g5(a0)Fug_gY+C_yyt6dHGmm>FSl z0*}DQSNQlD8K0n>DmYi>4qZDa_s5aV3xt0WyoApUTwllMn`rzd?|StXx%hxG_z-*q zKIOch&qV@hyhj@E(JBdABcVP;Ze}zrVxC=M?fer4E5Va69k))s68>eEPJmg4kA*4rd4xS1q{L z68RCXPr>ymxIRVNXG!}gT%Dm^d>o%fDqKGR9|C$#@+B;Nf_M#eJ9oCEe?>YckJ6h{Njmeyl(vUvjuxScTl zs>zkN(&oW?M&}Yq!I5M0tM?@L@Zvq{J)k-89@nP+IdVA?;P;40*GRzlzztVhBKlk% zVK{$8Q&oT7gC^`Z-tWDP#E=wu!tQ{ff8d@H_MV2DU-Z=<+HkBx=v?dZocVcw@KM-) zqiItHuX6p>b|F7Md5_s{jtw#nD2oac%E%ZQ@-s2Ke|cFTd)v+Sr={-15B0s_$#(hL z#Gu_b5QD8z7raL(ts`FB&G^&4@PpoAYN?+yrX2?~`uK;@B)i<){MzA6SmF*yH&70) zZ|@e{zxL-)uA9$>Sm5E`e?CpLwf*1SFSDtk?~swvWkbJjOr0}b7CRZCkx%an-sgaE z)9(6*PQnxVddQ3BP+I66veGsAIBrLD{ijABHCpqN9R?dymuL}%(H}Plc57k#qFr%* z-hUWE&$>E4zZ)@Veejp2NyC#%k`GA4Iu0w(F08ewv3`_pc|k-3hC^aIM-j>R9p;o_tzqhS0x zu|wH3?)?%q>Ab*5 zAm zZb$4gde4_KacCbOdB4?us{XW`OfGbL%Wp2wsr|_Gv zwTC|B-KFEUOXTv_2;M4<+rQAN+W2w%3;dC9yASi1jN#>^G3}B(M@qJ){bctf{@m+$ z?Np8b|6lEc9hW&3&LRKj7kXzquew~3THw!-__oWXqkT9Muxo+c0&Vik8Fyz)5*TA( zpXy7+DRa}J`g#?g8`n5ua$8$bJFvI)`EoS6!bo$Y&6n+_+j{+T(v327l^hzoea5_E z8>L-{!D*um9Z+wLqjukpk!JLv3oQXPj$H_XIm23*_UV0w5aS(9N@MKQfs^Y7h(ShD zwfyY@9z(Tft*QV1vvd3J_O^{rR(9JP=*yY!z)II{%rk+K3iN4Q|9^}hoVbj%tH%2u z-80k0tcTu{5=PyN2sk^-oSbD&!AfETpUjC>jp-?xaav#-PUB4F489EJXghP#Wj9Wi z%H_N}`}=o&Ig4>1J3|I@X53Krh>W0p=d?HWi;U%jtMQyfH9_bvsZZgQyb@-^=7_n> z^v)Ohi+_um4Gu^zLTw&3$}L?{Tq4Ji(b<&x`e( zYWS-72PbT86mN>n%>I2WwlX99sX2*Ie-CK!I~Vz7x~T%nzkjNZILcRfX{nqWo%OM(_`!9OE$K`Ri}lB;qTH(vznA^!|~y z(E97-(v+j*3`G5%7+s$F>{7m0M49TfKV7bplI@AvTlB^3&tIAnmZpqjDCMEp45y4G zr91|6EM=^}<4{06Q}|ny^$g4s{uX6E7gLwH#o2-j@VSt`Mfop*UP`G~r`%UE+Ps~T zuSwbKSt?!jp_Kjun2%HXp{D#J(SR2jUA)Ra7ESmE<{RijFxs#g^CSMjXvN2vTRELF zSbV|XgJ$eRe&3)I%4mgR1z|t5)(nMi9LCi8p}!V$l9uI^IE{3*p42v);z3vR%B}ul zV;I^({m~kOSxr{s3UVXr9Mto(Ii~#U_rwt$F&pvW;-lt;c_@e_Hb* zjpjuf%?mP`7i2Uq$Y@@W(Yzp|c|k_=5{>3HK=Xz(`Wb=#)inB7)97Cn{HKtDU={bqn>^y4c+4Vyw}{Sak7s zO5i;IFr$%{(Ma?WjWlf-rq)QyXrzTkhKokBChIGWbgPCY@#jR^2pIt#g}&A?`Wi+{ zrZrM)VVt9dTL0>ye?2+xm6KVa|4Iw%8!fDFv@jkmydECP(8W4N7h{YT)-_rfW3;e| z(ZZ%i3!4}%Y-+Tyh0(&6MhhDoEo^19uo*MPTK6cvoUK>*ug^-(s_pxCudx3)>#P2| z4egfb{Au>8{=2@y|4#ndzJKS8PM6&O#!glKIqN$NZ})b)Y3)*+e{ehZpZT`)FU$P5 ze_Fq`iC5*ezTf=kw4T#C`wD+gs~20%asKUE)oxY0Wm#)a)ql&l78TBaO^Y=x%A9|$ zONBK*$p2mQU(|d6eggi@!>j&VdzwAnY)q2@O``07<750cgB6XBH9FGh74x6d=->Vg zRpP4ps@|vO|5&}p>Xp`etVLP#ck5-dF*UpHvAQ4By*Xh~!nB0u31JCg@gKyc#V(EB z8u@JP;k7gLzs8R09YP=0ZlUF&qYe6nriF@--$HtYsGxg2k9h`pdXW8^9^T=h6~6K) z#yJ7>zZu7H0`UK6By-(=GnUc4+W&k!ld5y!0QI!3+Efj!J9dHKRmI}~FQ_rYQv&n!=Q&&hUtD`2emtQ-d>G45Bi zj@k6q+4Mh>r&I+j5C&?42oMFLK@5lmajcaN=81g>SVznI6l1OD!1Ih0)`J&8S7JLs zY$u5A1hJhUwiCp5g4j+F+X-SjL2M_8?SzQu=`RU11j(QgXbhTwW}rD}1KNUAkPb3H zN00?_K_2J{dV@ZoFX#^jfH4NM&{>l^yA+j1W>8A9SV{ zZ_86cTfX`oELO7Kcsp1P?f`dse-d|ryTQHSKJWl|9IOFPfVE&9^IcD|Qoy$*;A97! z?0}OU^vE^nk898yhwyX|!k93GJ~@Q`IE4N35S0TCb)MDdM+X#DXt zM9x?bk#Qg%Bmg}wY>%IgTswizK#%&ydQYRDzo5AxvcUVZoD8Od8H@#sK?x{j4|pAP zjFo?2fiO@TM1Uv|4Prnnhy&}8>QmkWl-XG%^&OJ>4oQ8-Ir#C^kR;F$B!fnvF=zss zf##qMXbVz7I>-PWK^Djbd7vlg4fOMPU(g>61cSg(FdU2kBf%&z8jJyB!8kA;7!V8MKs-nQbwPda7MTc=KvU2hq<~bA1~NbO zbOBvKH*mH0d)b|97RUxU-UBkvyH)lCy+Ci!2m8LD9~b}zf@{DiFdAG7#(=Tj_h~ua zN2foLGrS+kVo(A~!S%#jhRmKuJ1f!7O0=^Q?W{yQE78tMw6hZJtVBC2(auV=^EldB ziFQ_^ot0>3CE8huc2=UDm1t)r+F6NqoNMiFQ_^ot0>3CE8huc2=UD zm1t)r+F6Nqo<=)Qqn)SG&eLe;X|(e++8Kp*>Mxo{p`B4^XDzg|7TQ@0?W~1%))6j}T=g?rB#1(* zC?~YD678%+J1f!7O0=^Q?W{yQ_o1Ep(9V5m=RUM^AKJMO?c9fU?n68Gp`H8C%sOc1 zel)WZ&8$Q-E78nKH1i;uc@WJ!h-Mx{GY_Jf2hq%*(aa-g<`FdW2%32W%{+u=9zrt@ zp_zx!%tL7AAvE(4nt2G#JcMQ*LNgDdnFrC#V`ye2npufvR-&1eXy(so=FgloBN>wI;5Dhzsh8;x14x(WP(XfMP*g-Tb91Yu#hV4hg_M>6@(Xjn!*nTu@KN_|l z4LgH|?MK7*qhb5eFvj-a5I78uf@9z${n+oscMkjk&Vzr`Fun+6F#_>x*km+pG8(48 z5EG7ug`;8NXjnMyUpN{Tj)v)Zs~|M&C>nMY4Lgd49Yw>AqG3nTu%l?$el%=98nzz| z+mD9rN5l4`Vf)dr{b<;JG;BW_7LJDffQB7K!;Ye1N71mOXxL#i>@XU37!5m&h8;%3 z4x?eG(6HlZ*l{%MI2v{w4LgE{9YMp6pkYVQup?;L5j5-w8g>K?JA#HCLBo!qVMoxg zpU|*lXxK3{>=+t$3=KPlhMi*mg_fKVz)@!ez_^jtlJN(9H%|&kekVG}yDY#0VW2jM z08ttb*-SOS*PuPg(%fLpO{M;NO;`)n5ANl<4}1sqga41cH-V3;y8Hj<+(~A# zCzH&QeVc3q2-y`w;7$|4WDCM&^Zq} z=RxN@=$r?g+l|ic4#XR~(Yf8|+-`KvgU)S2=Qg2po6xyU=-eiBZWB7U37y-7&TT^H zHlcHy(78?M+$MBx6FT=OI=3Fp@uG8k(Yd|o++K8UFFNNz=RAz#2u5}_U2Xj32B)Q2|pp-p{gMITzxhgS5V6@4MLuVtJ55zOs_xqUFV59ap4 z+&-Aw2Xp&iZXb;8Bd)L#S6GQFti%;ota%pJJPm7}hBeQ^nrC6nvtZUXn6(XNZG&0c zVAeL6wGC!%gIU{P);5^64Q6eFRh_V^6IOM?s!mwd39C9`RVS?Kgi)O^suMV#39ri1hX2EZXO1mx@wMu+Kdn&@xRod#wQ4J^PxOFMxJqysDv4DrGc zFAV8~A)PR!6NYrckWLuV2}3$zNGA;Ggdv@x9)H|8wiSkWVTc!ocwvYahIGM@E*R2< zRqlczT`;5zb_~Fd0oXABI|g8f4m)(%p~DUxcIdD}haEcX&|!xTJ9OA_5O(y#j!)^w z_S28;rytu7Q})1=JuqbtOxa_)42EolAzNX{Rv5AshHQl)TVcpn7_t?HY=t3PVaOBM zTtD{JkA3xHU;WruKlas+ef48s{n%GO_SKJl^F zkPDi?G(b#(b?Lz$_Fz?duqr)Rl^(204_2iItI~s2>A|Y>U{!jsD)gn9<$O2zF}MfZ z3uo>FKLPiHpMjr)--3t0@4)ZD!(;!8e|sL^_7cABC4AdU@WBTkeDJ{sAAIn^2OoU! z!3Q6F@WBTkeDJ{sA9~?KFMQ~Q554fA7e4gDhhF&53mFT&!Zc`Xt6$8tdAD!qs97Yu|8U?j~3fbi|wGr zw$ozUX|e6pem=FIk2Svw-~8~{z3lNMrSVueKh}qL{t+j$CMJ184VXb3NCBz94jjM< zTp%4hjApC@kC26U6g&>1DLoV@9inuI(jikT=k4OWU7WXz^LBCGF3#J3;1XOA1&ac1!T^6m^PHTM;~qIqYZuJ)0p9p1|33!4xvGZ*y{j$$*3=!RhI4l zd8x>&pL~Y>VK}r7JOUmCkArySUNu}S9u{k6;*MB?0LU3N4&VfGhEY0*$KuPoc!%@6 zLu7gch8<-_{2uLjX79hwZ1^oab@S%fd)hwQ=4AJNRqdU~x%Y7Hy`0<2xp$z!!_2z> zP+V%G+-YlGOeLG0Qfc5M*5Hi%st#I6km zq}fYL%V#G(*8Txr1;%qD^7)=l4Ij+&D?SZ7i`)h^=A`mm#xdSfdGZm=R(z%hpXtG8 zdhnSZe5MDV>A`1u@R=TbrU#$t!Do8#nI3$m2cPM|XL|6N9(<+;pXtG8dhnSZe5MDV z>A`1u@R=TbrU!fTF81bKe5VKB>A`n;@SPrfrw8BZ!FPHT=hpCvRmOjM@Sh(1rw9M( z!GC)2pC0_D2mk58e|o-#t=^A>_bDDf!f}s+$HCudsb|2m;6?B%*bH6=Z-6aeD|i#U zMa1;gQO_`}IGL#DFswKXD-Od7=1g#IKR5!Itt}EjB1i(sAO+Y!Do6u%aI%q71N%0P z9VS|`894=F_DjKK;M?GG6!tNmn!$f*>w%%)kHNYDST_vohGCt2!baK?sp~ImZ?WIo z;2qwH{Vw=`-=+Rb)@{N5Zo&R;!TxT+{%*nkZo&TYoDy&X7f1*H|FG^&Soh}t<*XaR z77byGhOk9sgg_Vg0Bi?Fer^a`G=wc0!WIo-i-xd8L)fArY|#+5Xb4;M?_k{!_G<|H zHH7^d!hQ{5zlN}1L)fn&?AH+XYe)oHHyegA3dftJP0Y}dqf&NQm@LP@Vcq+%?tNJI zet>n41X$;Tbv{_!9_HgE|2oC=PYuQJ%^DsxqqyCI-4rSe_n|xmFd7c^!KL@#0+s*tm8MBs& z*s&2259+~ej+_hTf%#woSO^w@#b60o2F?Jhz?on*SVKmFegb{bV??04h(LD{f$pNt zebl*^8tkG5JJCTut>LFN{DIaufDSTGjv8*GhVSzE9-klL^LK!K#46Hz4{&dCBzi0N z_6ff2HLTuiSiRRcb64Qry3y#pob45k8YbR2?x+*&x$~s=G|nkyvy+<0SouS0@;Yo~ zz5@|4JvYw(1T~Q!ZGWI9o3JCFat%iHu_Z^aB}cF&N3bPFuq8*ZB|M`F9KZ=&ART0o z|IEb4W`S&w19Cw=@+X~G=nzEW`WsYE|?D% zfQ6s~ECEZwDd04)5}Xds0IR@ia28kt$UxxT`tff4csDspb(9$AC^61aVw|JII7f+b zjuPV>CB`{QjB}J2=O|vVA1~NXtaB7k*pDad#}oGB3H!-+j+nj=?gT#o{{emo?xH2{ z20Ud=Oyt93eoRdCF)`7{#6%wx6Malf^f58f$HYV*6BB(*O!P4ldj*MYMq)BTeHre& z40m28-{~jc=~wF>$mb&D6AVLWTrBU_jt6q&xe?3&&7cLef;P|&&@t^fQ?|iBQw~qB z7HV&rO3-N&b3TnHSKs3k2Ji&%2=R=Mc!n6B)|0*4ZPaW%HQPwd-bIH-q@JTge)Q%O z^kx`Ny~f$!hEu!Y)JL%UC3M4!Zg@E>Gh0q{ChqZZ?vc5>V~?NUtkQzWvu+u8R^mf6 zupbQ^L<9S|%BNgKvX{9vC%Vc>pIM$Efip;}CVL5=U}=ugcENl{Jo%1z@*VL!Tl*4q zlNMo^F~_%%#$n(GM*z>GFtTD|WW`v)BAHKm6pXBx7+EnfvSO@m(ZIg3pT8cF1G%Je z*NCM??@^=o(BlJK`ICVD4$#)}Y2r84-3Kl5LH6t?n`x(aXs35*rv(hlY*^(3+VjZz zb+CnJj^E@CWG_YDwL0=k_D*H*^poD(IJcCE)QI;v|MS$0(Qw(SWRjTMqWy$t(4WTc zK7;*zj#%e;tfJAs*~fiJf3a8DRcc3TtwRStq%=(144?x;=)gee8S#DipK***_iMDb!Kxr@rBq}#wuh>_#%0} zSBVR@k}G_B>@m(F^K_4q>5r!?FXyV*uUH=&-XT#(am|P5#%UN;bJv_dy?IlyO z536}K8H98>r%KI$isLf{qyqT_i32!+3&{U6>Ah!xY>)$TK@*q;W`Jg}oSfbYu$Jxf z!G+*b@NIAnxE6d5Tn}ylH-li#N4C%-;8E~6_#1czJPTd~uY%103&z|%wdxOZ_e{*) zGtrs@MC}7a?E^&Z14QiuMC}7a?E^&Z1GID>Ej>WgK0wqyK-4}!)ILDeK0wqyK-4}! z)ILDeK0;q{gudd4X$Vb?B|8uga)9z;Vh-dJE&*6h#VQr6pfLFl>_=)Xsly%1#Q9HR&w_hUJ14#A&l0ATA4XbLgB!rj;EU!{+{I}8-QdUI z9-!nYz=RDj zVFOIq024OAgbgs^6PU08CTxHS8(_i)n6LpRY=8+HV8RBNuz|7OZrHF9Hf)3q8)3sn zynP1VJ_B!`fw#{v9mS>{1D}C0beD`FI_whBNYVmg8TpC_38oC9f(+(cWH8?%gQy^b zs33!=AcLqN1AR|pWbYkD_TFJ+?;S?=-Vqrf6J&v$u??_q1MJ%X`!>M74X|$m?ArkQ zHo(4DVc!PW_a5WF88Gk#F_q(*z%(!&%ozK-Xa+5y6|{kNFq0WLv*``Z1@pjsuwZN( zY~2Q1x53tJuyq@3-3D8?!PafCbsKEm23tRZtvj$u@4?ocuyrSF-6<{|dyP!-Yh;RF zBUAhuW5M0x3T)0@cza`In-8&Feb}x-WxMWIE4n<14SNzBwg(&b5&rN=7%qLl1ImuQ zLX`Or@T!b9S%qZ__UuhlCBE@VeB+aWm^MeP#_}FE@dGUWcKqmv#5y~`F0!e+vFSXq zjO}AZNzQ$Q_+bR@b)qd#p)F6*`+17q&r|e%o}%~j6uqCP=>0rpasn4fANwiVax!z` z{z)d}pJ>Y0nG<)IUd3U06^H3n9Hv)sm|n%<6O3IG5h+cP_A(uNnU1|oC%^Utn(_pi z@&ual8k({NO?d)Mc>+y&0!?`WO_6imo zrgWnz-DpZTnv#sBIM5U)n$nG?bVq1PI+~J>rlg}O>1awinv#yDq@yY6Xi6%Y(ut;Y zqA8tdN++7qiKcX-DV=D_dNgG{nz9~ES&ycyM^o0LDeKXc^=QgJ(3JIP%3EkkI-2q{ zn$n4;bfPJpXi6uV@-&+AG@7yzO?etkc^XZ58co@crtCyhcA_ae(UhHN$~$PvJ7~%~ zXv#Zi$~$PvJ7~%~Xv#Zi$~$PvJ7~&>Xvzm@$~H7*JDRc`P1%m7yojc}h^D-Vro4!z z>_=1fqbZ-_;on0`Sl!7~5YQ4I(c-;m$-QXFKhcs8(UN=7lEY}peE}`$L`yo+64no6 zeW@*`324a_wB%m2RUyT8~iU!_@e2AmaU$h;NXHZA$;FiM16Om zbq~{DH=cdiL;R}KkJahN>h#e|xbG2aeTY7H6=yn#1g22yHflYaS|36Jhv-Q#BM5uL zlYYPq;y?;W1$N*7PT&IRWXm!b*uK*TreLj01H6}SOS)U23CU8!5Lr`SPjks zYXJQ>GAe^)R0heY43a4sG~EPl0k?wN!0q5(B8B_FPr&`)XW-}Hx8Nc0JMep8%)38; zTwbO{y|k#87WLBG^3mJ!nf!pvgo(@qy)7TTEg!utAH6Lfy)7TTEg!utAH6Lfy)7TT zEvYB3AcZh$&4VG z5hOE$WJZw82$C5=G9yT41j&pbnGqy2f@I!DGVddq5hOE$WJZw82$C5=G9yT41j&pb znGqy2f@DUJ%m|VhK{6vqW(3KMAej*)GlFDB;O|jd`{37_bMO|&$#uTo0pwxu82xyR zemq7$9-|+R(I4;_{dkOiJVrkrqaTmakH_f8WAx)O`tcb3cnhAW28X~9ILx{I;0RzH zETlYwlt+;A2vQzF$|Fd51SyXoSo(e}eLt4IA4}hlrSHem z_rrz}AtUk`d^Up?&Ji-}y1T*LJ9qc-=DDfo$eesyde%vuMt)?uBT zuc;ST*iVa#wOr(Cx%7Lqz&RMEXNS`a?weLs;}7 zBK;vE{UIX#A!3#xqWdAD`yrzHA)@;sqWdAD`yrzHA)@;sqWdA!&ER1qwhlZ3qaFp1 zgTG;s>46f5_=!XO#36p-5I=E99;! z5|FcFrgBUZm29#XEhDA!VyW8&Kwr-{+_F(V=d9(@2OK2Xf8hm~vSg`ACzWxfkXe=4uX zEQhxl88-T0`;f{ZI6Q(>IK zjhRJj)xFAC$gA$lm@|U6Cu+2^r}Xy03^uE4no`+QX0By6b&z}MWu57hAIE=!l{HMv z_!86V`hl)_Wgw&rGa`VPZW36RQ!JSc|}<)&jnk&+mcj!42SM z@CZ*BJPIBMf1^F00ndUL!K+|1cpba}wt%hRP4E`;gx)4Xdk1U-?}GP07x(~d2S&?x zp-)}tQy2Qwg+6tmPhIF!7y8tNK6Rl_N71M4=+k!eX*>F~otQqFm_C}AKAM<58vPnZ zzlPDTVPg6eVtS33UZ7vY=+`j%_WnfgmSJ%wx@Dj z6PO03gBj>aGiU*=pbfNxndI>nppOf|BCr@N0n5M{U==tMtOiE*_9%KbfSwJYX9MWj z0D5*5Jv&O=Dpx6W;vrtdL%fKGco7eg4a;OEPOc;BB{ugGn|oohTt}1@5ZLE!uni0S z9*{Fjb`de}BT8fq5nA2IaCW1kJ^1X8(2Ehy_zZgZ3Eb_0yE0?`rd)M{khOs zfq7#BE!Th<#DNr$3haOuH__t6G6NjRN^D3m9~6K>;08sY7?grCPywcZDo_Jz!Bo%& zW`WsYE|?D%fQ6s~ECEZwa@f5BoWk~LU?n&moB>vW)j-DCJfTf2GfXTqOe`}@EHg|j zGi!!UaoW*>vu$6)p`n0*XpAA{M)VD>N`#!qk6PjA&v zZ`BXe{V?4R)BP~r57YfH-4E0KFx?N+{V-knfkD`Q2(Iyypa6wVX_A6$l=K> z@Q3UnGpTFnr5m2^7(LDwBE!U-$5&j$WU=QM# z{$VDTBg4(wvC6jnzB({<7TWlXXMkgRvd_ z9G2^_qLG0=w)e2Ur92A={}J2r2dg4h?;B&yTl7tqGh)cU$SA;fAhl)Y|x$nRar;Hsg;KKxMnF2Z7a6!|fK_3hv83a?F&!a7~TxbU*#{>$RDW{EA6s2;Tx2u%U@VUcL${#SeG)esxE~#&K|>WhLn!VI)>U( z9>aWjj$v(Kd4}=psP!MwJW70EPvlj`-j`*@U*Jf&Pgkf+&N(nv zfc@Mmyy}+_6UR1joex!+QQsHjw(-XrjdJuR^oIt>ksI}gWL}qb8k2JZS*w&nwI(Us z`;+YE~^r_E7!t}Y>~jBs-^gKKkeu@YJ_FmPfb5% zjZbPAsjaMpYpn9A^e1=*^@&ym|Hj*@V5$5JYcw-eBkV8R5!~ThM7#6t>)wwrJ;r-k zZWgzQTX{dj9pd}E>E#FNO)vi`e#Dzze#{$L?i2U(o|gxB|J#GSJ2Y%^M;pg;$88c_&{tIABr7f zC+~#VBRpci=oUSqS9~h^M86mmhj{zTuox9%nn^SBPPS;xqFJ>VEmn)?4KRsX5^sR9 zX=%Ls#ieEN?w33*Un|fGHMdrz6>BA0saB><(yFu?t&umtv}$eIOl_7nTbrlN*A{3C zHQxTBE#d7i%e3XZ{bi+gx^{-PN;^|qt(~Q<(azS+(bj6`YZqzX(k{_1)h^?$Fjr_- zYFBAj^JbW9weM-yYd34RX}4>4oa8!$m(jZ4Wz_m=aU;?H&Ei)6y+izve}5!?#J_io zyII%n$KoEg?-lp5eV@3`WTD0HXZz>kLCSwEeoe`5#c$buNIb;cmEVcq@heiGWSv;Y zc)=gUAK2%Qg7r1TpTwWo{X4T6x&aWr}_1-f_E^9XT&r7i}d*Q zc|jgo%8>OP{x1H`_DkYretlKE%D%_(yu zc-ijZT`{~hM)0;ZDO>jM7yXnR6bC6m&TJ0}R%Q`Cag4svC{y*#NSs&%Nyqaq@B5)7 zQA=c-xBjqg(`@tt(zGwK^SumCFg4A(jUJ-yMXdzg(X%R;^D+FNt>%B&e0)V%5rUHnlQb zs#+P&rdEbaRV%|e)yi-#wK80aS{W`~tpt^3zSev#J!j3dR`D`cF)|L#zYTfZA%1{t zc*_&p|0({H?J!5pa8$mrPjb|%IBHWIHOqHEQT_n$Kay{V{3ZYLJ}CZ`OifozwPG=T z&l-1OzGf(CAN6)qinLhPBjxaZa`E*x@uewm5zxKaKw!KjORk z=D1A#x`RFA96QurMUEo&-=TgFpDWWizbX%$Rc;5)vPB-jx!H@dE&Qk1_t;-h|2=3o z{=3b78(XU>e-O0W^VOE|n}zRt(ms*@1@@5p$s^>R@+i*5Z-I01Dl$!-dr#mT@>Bko zul|#J$)k)bS%OD#w$lmE|u|4aV+_;vOo*Vyai?NVFewtSnET1n3&(A;)x z!*>~{UPq>B16E-pAh#&q0&jy)K_9usY3%ihxSE{AHQ-wCJ#Zbk9^3$K1UG|Q0BgsI zJHYqBo!|%HKfn*cj{x(f1^s&QbMOH81^6ZS6?hQ*7W_AO82k~)oG#B0iuK@0@D%tf zcm`}>Tx277iS3sG&ov01qZO|Mo}=Y%KH+XY;ch+=JkKQ%eHmD8+%&J__VC@80JAvrV#T8!X3a@j8*TuX1{vp@_c7h)8 zDdl~jpY1_#2n;dj(#I^3!@v)YfDv#M90Q}w&>LeOIQ=}$%uMAd5DhHA3SvM!NZ|KG zK9l)O1FR*cv6h&|3N#vPiD|4Qrm>comJ9L#Yl&%vH~>OmvFO$BX~w*%JC(dJS$@#b60o%6`kha&Q{ItpumDeFj(s z&f)vH-~zT;Lt49t?MuL=;4;d-!{-&?N^ljwU(M$=;977UxE|a9ZUi^;`z?Il#&Nfg zy+lmrQqt{4y4^^(8|m7SZa31kBi#X{+l_Slk**!-+L3NI(zPSqZlv3dbnQsD80i)x zT|3h4M!MZdw;SnpBi(MK+l_STZ-GxiA7CaQ((OjN-AH#Y((OjN-AK0^>2@RCZlv3d zbi0x6PNcgN>Fz|j-AK0^>2@RCZlv3dbi0vmH`3jSbi0x6PNcgN>2@RCZlv3dbi0vm zH`47!y4^^3AJW~4bcc}c5YoL4>DrKPH`28s-JM9c8|ii+ zC(^Yc-EO4Yjdb@R-JM8xKhoWgboV1&8`9m6bi0vmH`3jYboV3O{YZB|(zPMoZlt>t z>Fz|jcGI`fT^;G_NLNR)I#L}*s=AWuV|+dfnC*`gQ;=c`64a5Pjs$fis3Sog3F=5t zM}j&M)RCZ$1a%~+BS9Sr?n8n)64a5Pjs$fis3Sog3F=627ZTis1a~1p9SQ14P)C9~ z64a5Pjs$fixC;sDNN^Vt+=T>nB&Z`n9SQ14P)C9~64a4k4-(uJA;AlfU;+}nB&Z|71SF^pA;Dcp zP)C9~65NFZcOk)DNKi+D2aw<{B$$8%btI@G!5$>I3ke=Tf(MY`0VJ4!1P>rV9SQ14 z@Bk7#fCLX9!2?Jz0SW3za2FEXW%@JH>&K&e@#tPWx)+b`#iM)i=w3X!7mx16qkHk_ zUOc)NkM6~zd-3RAJh~T;?!}{f@#tPyuo18B#jAT^!$y4P6EI>U9^Q+G_u}Ebcz7=! z-iwF#;#Z%*%X?wW9vHI`Z|}w1dtuJU_}VA%`d<9)6L@|vp5KdY*ogP{;{CmNe=mOc z2_gV55r7w#ZG>eT@yk!(g?@(@`W=4x2_gb75rLP8z)M8nB_i+=5qM!?KP>Erh5bYX zUYNL%sK859;DwPJVdO>_xseFLON8KsnHz}`yhI6J7}^g*>GxB1kne+hGFupy?trBp zSn7eL9$4yur5;%7fu$Z;x*3*khNYWfsRx#NV5tX|dSIysmU>{R2bOMzr5;$i8J2E_ zr5;%7fu$Z;>Vc&mSn7eL9$2~?mTrcnd$BWnu`{p~Ntf_j8K0B*t&(k?Dc7p`&NJn( z)B{UBuyivl-K@1y-VSDS{9MX;z8sc%VCfE6x&xN(fTf#Z>1J5E8J2orsRx#BhNYWf z>1J5!fu);Z>1OSloa-XKUjidjro7 zv0@t@#ERsfL-Nld`R9;&AJXna+I>j74=MK{-RF?*b4a%j$@U@HJ|w#h$$F8j7s+~& ztQX08k*pWVdXa1=lI=vYok-S;WW7k%i)6h>){A7lNY;yFJCUpx$#xRm^&{O*r0Yex zUZm?qx?ZH~MY>+3>qWX_m#4NU@X1ub;@TpUAHtiF%Q!jzl|= zrWa{?k!Bat4e?_`{MZdYcEgX& z@MAOluxcx;+KRpK!zMDp^ftyA)g<>0D||4*M;0&+M);7p4=MYQs1J$ykl-*997ck} zNYIA_eMr!U|X>py_ z)@f~>*4Aldofg(k1Asw$Oql=)n^7;A3`U33~7)yRig4_>JB8jNMp)9{j^@tUwP|pa;LO8^7=p ze&Hqj!frIb2hHz6^Lx;Ia%F%wX`=BxXnYSc@*$&MWYmj{dXZ5tGU`QZhmlb)GLjK{ zEpqBbPQA#f7diQmlMgxhkW(*m>P1ey$f*}O^&+QUG;A0R8%D#11KQP#ta?AEQO9f2 zZR~UVSTDA4H(9+6uy`Y@Llm(RlI(eXO35Kg4#CGy;p3<9@l!ZQ-j6w08ov(l>ku*Y zcbO-1A5WV78m!~~{=ny-z|-J)uz`1cu&yPXPvl%(oU4m-b#bmP&ecVmgkxnH4+mpm z8SBcJHW<4`#-)+*sEk8p+!>A`6V)BaKD>`Q%D%dftNOUA?2r4nDl@*3^C4t>2>BjD zzK4+QA!K@pql}*a-^UKoHiy)`s+N%bO=fiRoEZIb6a8`%{c;oia^C+%D}2I{eO#}P z>xFXzf&M>vM08)1&rd#&HRahe=I$6zxXStECw{g+M*FI@d*rbve!enRJDF!=fRl%n-Z=K)4B`$V>e ze7@6|=^w9sohJy)TI8H5`OJcxH~ZzYZ#CM+m}jVkW;Y6s+DFFv|74yDiYVIw3;-h(^X$z z<0#;JNolFoYOz@5_q3YQl9Ez4-=eY$UGXo^dEa8!Y z^O-k=N~3-jD7Bi;GF@l-yWD%MO?$u`+`H5~Q$A09+))pNj#|wO&d%U9qJ9}FKb!K+ zq4IBq%GWT29O4lw7l}1epons}lNZ$+9G`M%TrjbXj3>|fv z>6^w;l08xLL*-|fW}Ds()wCm2ematUKUi-5Yp8q~@5xfNlI^6u87f!p6x#oZQ2BDx z4~_lhbk|Jg<6hoHwlE$neM{de@qdM9%Cue19+MT(LMeUZ)4!ZJeueek4QkKsA zX?sDHOT1?8c&VW=O^Ep7(*Ig{sJu8%h=;Q(6SG?CKWZ0oMP>ETHLeK>T8FUjL8Gdv z@b|R8)9zI!R`a-0R>4+V-+-dj)mJyvJFQ8Y)!}qfO^dsYRp2i6Z6v=C(5?&lTo*4Hb1x@!wgMqE3jS8AWB2?IO-yicY!l zD1XE=7MVVkr_QNeT$53?W@gI`<&{;J zTsWcQrZcN1t-NDp=~)w^I>bjSP7#$$FQ`B5`-|F|Ce56k-f-@%3uoPVXvx#21xPb5#>{r}=?9y-n2|&n0VUv6$$e!sWnswz6TfX+>RuBl@K4ohyDY zdUue(Us`w3xMbmo)TA(Tzoh z2Fgofk5lqc)go;H)iCM;lc&fh2fk))%wb-iT*V#@bNgiLC_Wp{a@BUqGotCR{7ihD zWUWyyeVHuBm#qnxN{$<)Yv%+@f2e$!agLP%uT+gUnX5dXESJ7)yE<3+sJT(nml;Q$ zW;###GIeF;%Z&0fOs&e78RgQK8Re&=XVRA$HT`R-e3^XaB2+H*&e*@6cSA|vq-v#Y z2$ic^h4z;|&e(r>z$Y5#mp;xYZ#Cr`=aH;aKF%m_!6&Noj~coJ$*M7=%uhelo%RajCI z@CM2qxGQiFA%9WdP#17_1&$=M!{IKp5XOpYFL_|;#M5qHnKf&6R#Zn@Z0+JHwH?(N zm1oULtF28nlrYYgVT(!6X)4HDkaG6#&y)Tl-kDOaH!dhq&g9MxOG4~ffjYGdi>)x{ zp_I7TWZ7=2eu~%Vq2l#3sy&Tz$!nv0mFd?J<&xP(`C8sutj;sKPu^#!d=_v13ZGxH z%hSW(SKXIQ-YUyf@@3a7jc`mSy!^9aNAzVisUGip znBOffQ93GXMIVmG&c+y3mZee?jncI*$x`YkR;eC~QM&A?ETtu>ztlo?U*>w#yr7Mj zEg3q;%nrGCzS>(_c;g()l_neKkoMg;N9)*wLHo|RWgo^UZ((k~Vc!pnvm(wtr%j$a zk#k=eQIlroRx|sQC$W>?0E?n+9y^xe;HF$ zmULcXUQ*E)sr>`D=T46oO4F0dC;u`r$97+KRW2`8FRV83hx|}mX+8NMm(wXd>E~== z_&&wUr5P#Fv1i0ZYf-hM9pfxt;I75aoXPWA^KEI__VN{@QD0IcrEj!5?Mu6_RPvZ* z+7#5G$a3v5-Z7m{t%*-$IhMPCK29C)qW+TFPNs)&(~0W1{z_5!ozaP3RySlnh0&1T zbFIZhB=lIJF70EtTkJvdy5+Ugf<#Y);Pka6@g?b9Y3O9o!IhTMjVPsyZWa#|&Mb_{ z$cooAA(+iw6}OKXS|Bfe?w>!8b&_98bS9K`l=e6adAl34|Ji5sV^@Jqi;3d3-4^ZT zxD^jCPn*4}vhlph&Wg#CT@hX`WTQuKbj_G*bGPSx^UVvn&*Mz_dkNF#=2;W1pB?5t zE6E0Xxz9@OQ^+)6TEG{p`!ffec8x%ZYl2=w-l4;$%^7_$F*`|UN-^b)sIB;4i|UMm z1mm9e;a%dyFKi|D(brE{(VOxsY+?pK$&`Ys>SymFX;mxqqf$l_U$b5jDs!?`9DOmY zMPIwRnmP9D3-=v(oZE$NbJ6ND(t z(%5 znOIs!qg+NVM)_L#mfK*t>K_~BD_I*)=6c=qk9R3gEz9X2^JKmBa^sJaJ!Ip!(@eh& z9EU7a57{U`gOvtkwpU$0O7@VA^3z!-RrZjLddVKLQNGOde4t)jU-fN_a&`UC{xVK7 z%9op74Bv;!_8R4_tj8)NBIEqAq5a!MVnq1|f$~zbD(C(h=~)}c$@>o;7yf;GJwAVY zL+E(gAyl96@#E_yqeEHW@bAs6$PljgtD$_&n9upJFeEgSVO4=cDg)K#89By409qr@}utwVDWc76@*V!cuAZW!j~HaXd8yQ7bbekvZJCKc0K~?Q=CzH0N7$orDZpd|`og^n>m3&V+{9 z`B~)^Y1Djt+=JV#T)VWaqos_9sE0mLoR1GgCN+>baeJ)-l zu)!}GwY11EN5(y+M8>Lqg>IYE84!r(xOITH@3{E5sUA@lIC zg5g%I)x_k>JW%IM{|oHXfj zYUfPA<#g<@y3$K#PHemQw$`BIslM>+h0YjPMt+&YI#Z;bzy$@`@gXE#XPR?dI|fCq zg}Y1Kh3qaB7KSozW;yZ{6g$H_p>~y$zio~tN;{^d6(>${78W|!rMm4464T;RoJj@| z3L0nS(a6bgAU=J3Bh#$qYnGNTYO=)?+2<6NrHS^$s{Cv1*>M*KDRFwi%$mxEEGvZA z$}%q43(4At@Tc-#mi;^KCc>=z>o=x_eewU{J&OMdyJ^*1QTHq3I%#(-=2hQOr9^c| zG*D_a&ob@jS7Dk+gi`|}r9~x_DYVD|FX)FBTj-LPy4-a&K|PjqH3vGiAH%g!#0S}Z#Kh6hWQzw%t>)RLmz4iC_Lgy!vG>}^#@_qJ z?LEu%8zr}LGUOYvbjS@mQrZxbk=tD-dv}bQkxD~|R<|4~Cgp-nE^t`u4I?8q)h;fn zO0Un!sVkg4XXe_pe8-(Fi*XjOW@lI{mR!&%(jKf@P?a%p-l~+6@^V*d&aB4PMee(D zDqK<8+20)Pvreq9jBj&J$Q1UDZ#HKwd`olBSWw(>+O%BBDpn0({Fj+m$c;{=)jd9| z#~coayP?3PHRLvwRBD>7E^hQAI%XA9+uNhHH5Rd>ey&@LPK@k|?G}rcdA+bAcy6;P z-^hzLe90BA6+bKgf@?I?RsHr0FN2)abyODSE<<`}OL?RqJ?;!C$x6U3YRTCMZ{+$BxYnL zM7t7Gs^dL{)lOSML196G&7x&w)TbEfn!-tqS2UKll;kcbbkCXXwlxLHE1M>r!Qbg5 z?1YJxI?YF@(Y!CHQL|ars3zAOs-HPrKk~<{e&Oa$j0BqP$+-BmoJ1<>PE5{Cj!lkb zLRwm~IVCSIc~w$Qc1}{fEk?wq#aWY*lB^bcvaGzbG(WLy`GhmBPPD~DC&gW1(Xw(X z169qfn0m$3!s(SsO*0$fYc9B;regK#)fI*Fi}Pm}XV%u$W~SE!_How6cpS+P%Q zxlt~yf>FLqEQ%5G7?F(?sZMB$T}y#xh2n*ZM7xE zjlN&(j8D#}$#hO~I-Ci%NpbDgnyO#bTu|evaVn~(=A~sf=3JDMm7u}^q03$oBXR(3zK+vv;n*U|+NPOlHNSbJcv7@qu zKU? z%aEghUwr0>H24=?WV9zNfiJk=aV@OwNyTnYsTN*!ifmz{RJMRDwK8t{5-q@7WyTJV z@!Wcq%*>pt6qK%y?C3CygXoo3P*WArT>`Xv=Knc}tb+GbMQsrlET()p8&(l+isxUZbAbe}rYiH}(jIEEH8-yJ&B!idrv zL#2yc;j7Agr%}Uc4dK#oy_qg_I04%fUPqQ!?p=V;v?KJ&Yw(iSypo;!L> z@-1}cIlQ?;#!!YVvqF2%m>)jJK&Z5tp$M}nhkivLoSlkK$2T#`{$+fX{)e=ZH9B%O zs|-~dnA%FeBS{7|4K+rh?vJets+ONuos^qlFHMYzE^y}*)ScB-GcPfFUelyg>c!}O zdtGJT{K84@MGFcWmtJONfM|nDhXx zi>JGbr&N?wUcA~;e_C}xd3jA;YIR|4{x=-9wBn-F0Lzauqc^XHna{_#*BtE-qtFCu zD*{7(@>zizn{i*kWQEn;AhQ>;e-+T%7SeVTVTNv$8a!JV~odog)3`qPQf>=+4~q<|{gu-aOA$Jn6p*%Tk4?KclK*d5sV*f(BvA z!&)4n<*_C*gBQq$r~xmFv=6i=7DJ^`ob__vuyD-0d}hh)vzuB^o#@Ul$(8OiC$_RV zqp7NVX?8`?;*ON*S1g;lcG0BL7IzMVL6aS^8F9%;(Zamy)asRunkX-tTwR+6L)5jE zCcLdISfd;d4V6nBljRokva9Fk2gqqC~g3rHe39IMQyq!re%j+`|^u*l?Nn!fq+1z8j2T&YQhK$InX zf$`;nIZ2t5664Ao6}1k>loVQj*-i7}t?fy*PN7MeeD=6u|Kii*3$xG6au87;jENVG zr%fqePNJ7g0Cjx9%$j3l`(}}ID2H%PxtlPTxQ#8bTdKe$u<0hx(vsZa&cqI^b497es^ZP^~x`7dwZGvQEU8^#giw_ zED`r@G3$+!T*P+9E~W0pJyrPNv~gX9L(vcW|#ELD}HdpJF8cM40}1=BT= zHFaf^t=b{1C6$h*=~Zb{GLt6Fa@91I&sbesd*QsS$(eDklB~Q*uBMd6OFF8~Su!O) zHEU{h(%kx~@hQ>sqnz)HlV5i&zUC;SW-c@v|!?_@+xObKpV%DmhK2>X?{pc$CRg)r zsq`{NX_Lwwav$2c%0C*V9j(T`Z6bU<=^th83B3*;!>`gm8pkZ2CjFy4Q;PDBM(L9D z@KvRMG)k8ahDw!xG)n8#{AZ(0rM-})GMaigaF^6ZSskNX)#e1P(jfD9!E#M{PUGyY z%2OL>m!8uoZ8=x%i|33y_Z(K7m!5NcT`cD2xzcjU(xXT{L(aolNq()N7`Gs&;+86Y zN}Dao*x=69j+Az^mIyH~qoJa3g&Scn$(w)a^p-0-Ce>JxdU1*pcEhRCTQOC)^@@dy zZeBE}rFufOlk3|@2UtyU$YRk>RrjR6OPR{=(jJq*7V4R}Kcm-%7n2TI#*l{7Q1z0J z@Hni&nJx19HxjpWx-R_Isws`>`MEjy%#cfrPD!;~{%sjZPK+BJCSN;$zGnO0MOkHz z%rYSgGNR+6qs?jA$=7$7N5_)tWZbE!6;;JV+%zEY38g+v;wl2@Y-d&wn=#I}yPtG+bW@CTB8n z#r&$Q;4lE+(!}_x?94WsZC=gvvucxUc@1uNPC|~|l@c|{meF3) zbViMt$T}%1DzCk1V%ucb?AmNcRtgh;q7sU1WmV$t!rCl%+k|-)?v@hdXS9iofe$Kq zO`jpzrb?A&8l}_P!=+L)jnbydaA{MZ)M{=E^#ONGW-t`V@5}#%OXW8tHT8lStClS{PwdeG@sbiX@nESv9(6!8ub33o^13 z;$mZ}Gh6EOXS=1>`p&|}wzL?BrM~In=^2v~Gu*aG)pj8q6<5|(JybrkD3^%CnVT4w z5pPdjH22KB48vnNW38XRc$5d_2@57J7iXYSH#cvtoPqwmoXQ;f1wS_5{{!2_zQQ9%Z)cQ%%vZzuqDxbl+ zM#{tp&8*UZghR7}3EAmZ)yfsE#KUZr(({^O^ES)UI7(+I&tdFa_ogg8!9B>*v9^diD>2JEvzTX22^|q}_6AiG z<2=%H7-w(2Megh5n$?>097bu2uFf#Zn`}bu7Cif$e14N_$BUJr-|!x98AlAT^6UV! z$K`p9BT7Y_z_my{X6;OQ?Ej1on0n>0f_tUD_4Lk!Dm{Qa+%WL?8FBS>!P$yI=~x`$ zxo&ATi#e|1a(bW!BV zu@;fcRhY3g_K?aC$?~6>t@JKRj_X@|zEOkM7E>d;4=SZy{DwX_{wfd`eC@N4}?J<*I%|5nKzJj(9UBD!i7M*qFPs0x77j4x-*puv)S%vL^T$?=Z!L~}_OioNs{7b+n zs{3ZW-YEHIBtxgh-#2m5an4RD9yca^zw?~z-M#O$r0=5W#ryPk=PRuI5v;Q>H zPmOYPkUI{Q&kBrqtNoSbGxl#*^MPq0BAZFH5O#9>Y+xC^NaJ^WQy8-Uf_9X_jyOGN zAGP=>45Sur8X|`Xp9Vn!?btZpa0;`uoPUsEgssr_o3P*`m=S8$(Vfz&8vO^>u8%S$ z%btpn>rs3*`VCC0XNnUKva2{ZcivSqXJ0vM-WBbwm(MPnz|^G)xuuiSoK-2!S1w+0 z-m!i3poOpgi$th2@yDFD{R>*RCi_4^x z#_vrZPd!g5OV5%0!oa>AEyliW5oeC*7lw{;$$nwrn8i)OexXbD3j?J~R1Vj;>UTq> zO9w)Ak={M9Z(X3j$yF6!jQfe`|3%csYHnb4fbd!H;(@cY9uAh)Xl;Q~tGV6uqtM

ydH3W6$S22DiIDZi`ggC=_$hA2<+ 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

bKiZ4;znZrbc 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 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf b/.claude/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f4d7c021b6e0edd88bb152d8cee73154efa086c1 GIT binary patch literal 79208 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�stbat+(KP2;O@wSiE$_ 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

_D|SM{OB@3r=vNe%xDoq(!DB8q;k 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 Y@EUPfoVW59lH;&FR3%@_<|?23AM)G6o&W#< literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf b/.claude/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f9f2f72afdee8011d61048072576ceee2f95ea60 GIT binary patch literal 55392 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

jwi(bUJ({=T%gRx>J4GBQ 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

;M(C~l$)H`I ze8&5JHvRB_-jqMMc#$W)+4(D;_xWdgYmdy9BHnsSe(%yH)B*`*`%nw^>p;jYrr?_w z-6>s&LoFP!GfWyL{YrI!^oc&^Llc&tGVJpHF^- z|D$%tJ@Zx`+&BNBxd#m&iq(>M`+p=oa5XZP6y}qdT*yu6_8hCloSeyRMPN#R_B9r9 z$c1k_m-KgDzB6IXb2ksLhK5APObW3l!Bv2Ocq)!|(yu3R~(&!R}bE@Ax= z3nxtOH*C)I?fHfqNoxfI(+|M$e$;D3=wRxz6oji(%a8K~HvTqgOq z{YrFB2Y!>F>0)scZqOBR6A35;A;lDrYpXdKa^hTbWiuBf5A(I{PslkMqQ5C7|-C6mf$-tpF*g=WO?O3YyYS-JtRJ7evFQ3KI_b02Q< zE#eYLKrQD38y?>OuZLW zMFg>=Q~D~@04-q%2flvjp)W*J`8uVk z5;Vo{>@Ge4?ZN0nQXwIY88Bb~WP^7i`Ji`BvYp}`(h&Gvr%B(K;$)IP?p;(QA6JDC zS_#oXYo+-ZO<8DCcxN7-g!nc22OcE9!jHEm@7bIBETHBfqNt9O)S+gQ)o@~?I+9l* zv#%%YiKD)7g@z4HmUKiTeeR}hC&v%;dFa&IXICt(ZTkaF_F_4Z`XcF1F`^hS z+Bqb@tB)r4I!%k4tzhFwi=&561nv6g7rg&xpPqb^B%dc=TB_GK6iwT-XPaPi#DFxSY)k}&owt6ShgJPf@aVKLNWOO7v|56 zI)l#0bq1_MEjHdJ&)t;37aZeDbch|}@$#qAF?kj3*ee6!YE@|f5kr9?4bAaj(q23? zSdledxRRIY`;E^w44b}fre5zicKNb#etzl212d#66@8LNbP8Q@;#U5eT(RoVO78pZ zkjjD7C+Qe*S4eG$0VK+Z;m(Bdj^wv%geeE(4SyzZ#*rCc?43Pz%AD<&E^VJPWny6c zleK$3&rRw}?d_YCi`EgIp8!u^(vE~>SHjOo2zE^_)9-)d^#l4;Kfi6qj!9QOlwbS1 zbg^y3IUaLf;S0vcqb!XYG^mpPF@+n-c;|1=ocUJ%i8RH`IJ?S2jE}{;prQ6|u(6B> zeslV?f!>=HCx7bNu4vp?48cIgL*pz6X^R@);NHHG<9U3X{DaN4jXecSv{Blu;K`x* zgAGWgV1v|PFto`A1NQV?X$ujZcSRls+S2~Y8}U9movgufyn+`9yD<9?d_8_4T4DU4 zzD!K9kb)0>{QbpK1Ih>VIaDLP8Q1pPob`DW1PHv@^C#ATQ5Y(U!*MQl zZI9e#x@+X^LIJ4KuoP59Y`7CsZiG>#AzRj~YWt3{zFg|{PrW{*V%e&Zoq_Pl+vM-B zTv1Sl1!Vt`p99@e!ABSk;&@nOychmrpe3t3$6CnE8D97Uy%ibGr;V6aJSe`btT5%K z%H_q;wL2Qj!zT?lPv}3%Dm|W6Xz}i2j_8$bE6)n3oHxUoS2DHSCufu;KWAvV@1W9w zChAk#Z*wc~ramR>7MhXY`iS8%NLE`W_>tZL$4CKq2Yo=cxdkF1OcTm|cvirqm4=4< z=NMLYSyd&)w0$vV-rTWLblaEHZX)>h?<5&z!HwR;zb3vx-q;jlD%z+bW~sg zo&6Qwf^^_59;!3NaFZ?+mpVRKKAOaPY~0m-QiL2b_kKqBteg&G67Q2^r)-1mCYvEvD^J(Rp{D@3MMp2TmGS0b3SO#U0k zAfZs=H&lET^7AbvPg=qu5#5XUFcs&<8*7{6j+-58VdV0Dp|@%7UnB{ z3qt9wO6f>pbs8=6s#dSI>W0MqwOsT}kQB>%OAm|D8qDo$v>k5gQ9q~WCh6gg_4ON7 zT!&#^360bPYLO3<&vUb|sDluX{*pxd7a>`Z#-JXXdP-{-klYyUzwkChrU%h@3~^It zJnhHIHht{8zBDrST^Om2j383cyuAJx2nXigs11aGSb#AnLi8^nn!qWMq2dLbQ^)|XPdK08CKCIqx~mD@xDgZqB>Wk>6)0QK{3z(7U4g& zWz+e=36zRTrG`_xRt7sPf;N5p`~pI%XhDoT zeaV65=KT=!wvaiten6|gjqhx`7tfY21H@GO&xj>Hk7#>Hm4+Ed>wuEv6Bfynd7OXc zt()E`m0#|+q%xu8M6-n(i#lz7VdF^ooY|IP8qSY5?=9d4D_U6q9q<+Ah@H_t;h0v4 zLDCp(wtkskv1yaOMp_bEUMT+_`zXIqS}EF-#bwk^vuFnWtXSvJ8lXub7n4?{3%xXZ z_9OkOnR)f`(R1_1&x>gkR!+YgW8_-U9t}lb&TL#~?wOI*ckzq?N-yNS(hLGNE7Ge6yqZjC>wak?MEw7l?I7hzuS`ANACKiOclf(Pw?+Vfc}-twpR`&ww6q$ZIi=-qpyzBVuaWi+3EEE`HI zrC+FwpctPG%U>BS;X)Dmw?KcS#~aYPpXsG<<^0`G$v^)4-{NiTZu%1a54*w^u4%O| zOKS8Lp|O>v((tw;g&58SROxX@1FShl6FaSuF1ab3jMhlLW=zv0{m|K?^h4{*_4=?8 zV}^(D?fK)&D>EsSMU;ULK_Ktklw=N~Qc7AFawI>5W`By%FrfbWR)Fv)*W1#BPdJLN!>rB63pTrx~U!j;##p_@_(>&Dz z3#a9-_R$uxNGugb4hyNKIwTA^m=|IF{h_7wJ5dsC}UjK=)NPY z$w`)yY-5isf}LakgMA2p9`I3lhTI((4L=0mw6s)2fOGie)>v6qcqa$Ayv$Eg-$Ejd z7DB`^eDZyIy|Z)WBI;i5BmW_~mpnT^VJE^V8acTskefpJ(YOykGQI%0%;p#5g@jKO z^y+rJgK;y|6iVg{xIQw}q)YLQGCVu3N?$Q5e%jchac@tbfntk~UOfEdrDu7IZ2sT_ zl&0DCJt&Q_G6tf8*}DMn)zeA$-={ykIH{&a&x7Ufe))xWdFn14{X*@}6Yaq)R@E>m zHdVp2Z`!g6^?jt+i8-b9*-fJs>1$hRfx*xlmW|5E%9~v_blSp^u5AUpk-$V9QQ>Lh ze1v?CV=@{q+hb$-zF2tz>QBTTsDJCSX%-zylcEUNM#6;&lPEc*2zy~LeGl)#A2#X- zBENPPI{%mZmdI&~^byDzgMBED;1Y8fnTRMnvGH@M6}Kd3 zr>10Qt{K{c&&(L?)!&rnHMk$iE6pypNxvwXle8{r&NT*uslU{cj=3-9<%s0_1N&~{ zv4e|wTfl8*Yi~|YIpNWS?JNe!F4$lct`h@hZ_eYrX02$N%QMXBW@GX;sbtB)#ez06Z1%f4^~5)To-8 zu~B2|dD`Mp(cy2%m(E_`X=oi;d2JXUFi%c`M^iKg4N?q4F=6HVTMU~vZEAkY_|}Dl z3r#I8k3ar+Ty+BGVPq**CRC$GCZNxj1Bw{!sLw1&%Z>QQV~+Az(PzK$CDKpWV~0U3 zRJflM6$N^Q#d{_2h)8(E#QdLTjOaj%Ig=-+BwH1CkvV5{L0WoARgaW$rij2O|5zS7 zC^UL>VOqwJSxL#}6l+!VsEB~KXO<41S;`j|jPr`g8Qb4zDacCd7S%b}H;4zN#w68^ z_le0F-!IA5Co|cW)1{XwYS)mNB|~NazaS}t9hPd87SQ;cgA|mXZId#r_=o22D&dH)Ie^Zm(Q4?LLuQnZqxe{}$&-{hDMU7Zzp`Uvum6DGAHzSM1cQ z!>_Q8g@G@8TRa+;vzJ?Y6-finySF%rY<==%(wtLs)^HCE9-dHLIIbwWu}8z8K^Y|_ z86Bp<6}$MUaW|HCx_1}v^uv(KA;7InvhuFdNP!zTl6O6GMzTUBO4wgIo;@OL8jLuh zLi`B{Z5^e`E527+pR}})xE}HGJ>sPC>4j-&h3Qk{6H*f}TuO)s-_Mr|Z$6DEB)+OY zKN1AGr1GgI(*}>FC4Q*no(dxhL**!px4Jt zo;e`~Mujr;VOS^{muAiBC4WI}B^w1T0zTfDoRUH_iDj5zBM(XlD;zzxh}$M4+;&#l zJZ|Z@xW8uT?xs@Qn{5zYPvP?{Dw#IWb{kv4?fUK z$*7zS-p$^ccQc6^ZnlZFH=%zqIgr8<%~J0U?#-Xwy_=E`S^&?r@F~)2r?8A&yo#8^ zweu{>-(pVZ>Ryx7{ne9QiL+I-2+tewu&~}I%SleUvte)%I!I?PG z1)II1Mcv$BB_`7_g5g7qEA3#`#Z?#R6H;>h<0se>5;EOjhuOHL+>$*EvZ~N)i%Ks@ zg_B}T)n)Af%fCRkxq(X%dQO9NO27&wi@*sBgK7IUOLs5tGw!123ZMVrCWaD?JlNww zJWsAe;WdCZfhP|O!Pr8qlXfaz(pTX@Zahvt(Ajaa9H;pq`BM27@VX6>vmSn4(#Vz! z-WBr-H!m+t0B9&T{^$4I@wS`WcebCaK=kwblABzdz{zg%F$TC!(;b2}NxH+ut4rR6 zF`8#LgWL?NcUO040p#Nv<$Rsxo+YK?R*rmw^F@82l3RTW4?3#6Tj4&J(kkaEHE$6Z zLqoa3(8f6j5Hk&UTKy9QLjZU1K05;(l({S{d>z_4!C)vAt!xWXTG-*OP{Mz=) zzJ>Emu*F}%Qs%G5P^BGs(V(?JysKglE@8)XTSVQk;K|=i>pwI)qewr2FWz_Hie3@^ z`aosfSMk@ATZw%3Vz_ep?F$N0{gy3r`tEsM9C^3mg^X=?OM zwhpoF=3U;pebiQyRMc0#d*o(Q+e>{elXimdI}AK2II^Sno8+D6J3QdWz=s{Y;JO#U zht~lKTra1iRr1-c|^{L0BiB7+|>U+jKoWp4dPJu?oOq|9j>iO^}HOin&?_ah3 zu1Ws>qgSmOE&Y4Z=2N%cElrRoH9filMPV=gM+%cp(~1uhkrK+20q{ zwtTX=Y5mj}esl7U!v<*QId=HDXw;K@J^091f=A#A>EI{lI6?Qip(8lLGjtwERJ{uL zcJN^vT@`zUhdegmYlWMxQi(b`DO73{RDyrtYV{xj!qvv}SRe1{uE;!9{GF!Cywv`w zQTvA`C|6m*u&Se_$4b|OyFFF(hv09mmK~xN5oK_-T5KIGLyz@+;BFs!s`|W}nTWnj zwf~~K3EokvKU0xf3gUA0x+*^1NOcjSyXyJxE*2xCOF>1m5~7{)4bce={p+>0iMC*M z2_~}{@pnam18wshAr5nG1GEK;JB9amdGnq^Wz`}bGrrfcHq(>hyfWa9(|kW+B!XB7 zp>^*LhUa&q=DN@NXZUy0xtgB+yR3iGb=J?5Tx?GoD}LthKqhJBMb(K^v)kGWe49p| z;$i*e3y`G9%S*lAVZI6J`#7FRaNc@_(VkvJ;N7LNU<Fs@T_FVK?-tgPsqCM&9#f;f;6VmAl1G7pfXpeF(Wh7(&3l4$~dLO5c zi8uuE0lKg8gu3g%>CRPwKiVrk*A*Zhr|CRp)bI!0RLi;JS`bH{9Ccq0lK+Mta$gkU zzX^+(boVu(k)NO)w0qEz9f7%H2FdJ*nd&iU2kr%>yE{O18D0EAQEIQ=BUE>qwu8RH zov!U_xl^O7qUHU;UklSG|&>7WEi_?T1oG)l;=k^5B`riddZ;wV&s#vYZ+U{D#=EdBu{kjz?(nC%zmH$*N8rKCZewL*Ezd#cHCKpIcRokUK zAU8i7yU}D%@cHs6@8?v zzaJ?jAxPiEJ+3epoH^sksNzyAD4^h^cvUg^bo%vZ6tJ0Sy^JEA zaax^g< z@HkPOr??>ztBP4<1a^jz?V?Tn!;|4WSEE&hEOm@n?MnlaYeXlaR&~dO1c~?|=(lk4 zv}zWS``VNM+A)e~3V^nYB$BoYm`+TwSa3B=Rco#zvX$y^*AZXRRYZ40JPC|lY`At9 ztH3)VJzfFc5pM;yg89~K(wL;)LsamF{0 zUn2!DctA99ZTz~Pvu1a|_Sgbgk`8={Bd$tc4R}YC(-h$C@!l$6W2Yx1{uA&p#Yw|g z+CEa+rXcMWFg;0u=pHxy4;3D?3C@1{PG~~11>CiXGjdIf^M^Y05W*HnvHuK;_Wz;Jm@w~)bq%qGkJSe_o!ylNEjT(A$AAGYh%a2|jK13y*LF^ezxy<9mll9W z-XGB8`r^uI_Kavfj40QfGtzM4DQ3^_%o$IUqIF^wR$zf14#SuFCv2(W$ds=ZYEP#yM1Z!unOWiaa&okXEM>-#=cr6|HEuo;B+JGhrCkapN;u5i$S6;3RW+Ck(H~R)QD&v^cOO4=^#22q- z2tH`HLd8{?*BF4uY67opd%&_0=_QSpO21#tN1!SYkL2v3!1YAa%c2U=OEtDV?4yvjX|r{s9TBP+#VA4*{vlZ0YGmHkV^l-cQSI8Hs^2(F{i{W+ z@(}_F*VfXS!qxYQv@`rXHd_9}O`be$B9R(2ff9D0v;EoE*Zy`k;kC)o!8*JuHF`O) z(kQYO@<9IJt5ZY_*dFQdO1{UY7b^Nd>GfLC>sX7vo?a)J%S8X*~jFCs$tZ5vY(P}%ERN-}QT>3!~8L|MhxB*0m zC>CJ>@K<8HG1n%4m3wrzDw8fj-e*-{?y=r{g$fU|4}4MX3RZNWxv{TR4EzE!8t@U= z;0+H5P|MAwT~#(4_EojXB3*eguI)R4UvS)uFaGoniqmKWZyLTIAaGM40HV83ZMxoO z)8BNHBMQAZZsW$d_gw?g5o6v8NP$?x*1@kL*3a8{;;?FXD4uIm1oaTVQ=-(OL3P2$5DSC{eu2Atp#B@<*)5xMgq&j2AVXG)_ zQ9XF8PQL(iTHz2~DBk)EZ+(c~$JtK`EQ;ZF&Rzj^xSPTf6*#O6319hOjJ)VddGe*Y zm9Nvg7gws@qp1>Zml0h>yWbG+KrL|_n9B{0d7u~7>ll#Hy5CTab_8^#d1|CKPbI!H z0S1{H#bN^Ktp|)Q`ReQx4F?eEBSqE+0QcpvRvdIBb%hpphJ6Au3fqL^iv*0-@soIq zg`$0RdZi7J9NM3E1hi9Z^maS+Qj}51xlu1qWq7y!dLJv}oY=d-Q$a_6qJ(qrf+{y+ z`$Clhz`2J(SE`nVl~bth`3n_v)OP(jw#~b3|GS{r@veISPitCdEttr^ z2zf;P(QI1mtO!B@=k5yK-88pFd)57lT{QTi+T4XIsa0nxRLfr@+}ft@-+=TwcX0S> zWkrQXD(tNB9ksY(-732z9kn`$LbV=tsdcfVQ~}!e2RPiHG={TI2fm`t6!$u%S|`pl zGf--E(304jDm+r8Qc}K&e7@9ozp|f2U2e3bu~AgxU*v4pk0QDeJJ$qsydR2{6JID= z10CrQT)!l26ROAz8-NW}qj2+A+;6zSCJE?MKl`uHVPbb*686Cqaw=gG<>4dpDyb<9 ztI*F5TPe21Ovep>QJ#wXb=cxSy@x%a;10!;t;GSMzqOsAmlYmy><-mU7M!AtF{+Q* z!ImG zF?qm5gXV(HK7!|tk8E>7bkYR8rDDZ(ip{U#G+(p$o%?1%8R!7&d6ZK8@9OyLKDMc| z2N!&Jkpj&fC6Gvg*IU551*3w;7COuy7l=~F7VtUC# z+;-+n=k^iZ(hBmyl9$wuG485sSUQY(?e;X)pE=WRjpZOlLJdD9l8i#OJM2JiXWo0l zw7_kw?1=P!ZQyg@uB^YIJ`bxzZX;>CR>*I;Rn@LVmmT%cdKA%Ji;#l_)Ujn08Ipv= zJ+)~w$&nBKbZpM~1q&7+URLP^Z6y&kbZiT0bE=_TE8f>&x5NK80t~Ls!Jo^}Gs><~ zS_Kt*{wZ?aWPp?ikFIoCgtq=|_lN(ukK-7Uu&~?Dzb?Hg4g>g@=l%_QlAk&wzyB&| zZbS4#Fut8c-Xw}~RpKlnv6!o^`%|a^&U{c-L~O~4zH}-JPopgc&lDGrMX19oeQ6tJ zZP3WRedjB?NW?TrIi+DKdV=<*PQ_5wJ?tQ4q^dPt@nm)llGuxn z9!{nC+;!~67oBvC9r+`u+pl9+K2IZV5W5)Bj(D8db*+7j#A8?6%h-h&<*NG`FA1r1 zwleejTB$l@uF=qWs&RaMZKWwE+S?7-cgZ&NkJuh!&HrS5CBnkuA|7IMW& z3m6+CE!Z5|;cx{y{|mwK+W89|LYCfa=}u);?qa1+6c+QwDdH6r%3dWhd&JviERFKf28$5nDgsDGy%w|%XS{jM(I{Irws zM}Apw|Ml^OCS3I{WN3FJMVKnM*T)xRx_~bd!55|1!56B&*snFY-L~EvRZ+i&G$^)G z81$TS9tK&Iv_gS33WwShM`JvzC`#pg4A&V+j=fOb9Sj}mzCYM8D^WKJ#}EwH-NNrV zG%fTNzZI1Cg$Lb%L6WMw=x7dJu4zC8g;ScwqTR`#i`~f`>UXq2tv|MX{rq2=epXJx zAR3UTMcsWuRKO5TXM-$SWLUI_&Igez<7nC$$M3^%!&v}o{|dDua$jjXO2E0J4D+-{ z`m2%}lS#i~g|<(+F1n&3x=h_GO*09cG6HW*u;!O{Y?P**V?OQn7PuTc($(EZ(=jG_ zvgU3fD+K)XvKEU)R)_nZ?Dn;|Y|)ZoafV2y2sddY)*dr z2wR0)c4+l=Y?X)lTv~R(y}}MH8`!=+XFoY&6WlpRv%OvVsGdf7vgtdv=LIsoDTbA} zNSSNHqW91W7!hL5;DURr2DSs%X9=oUjT5H=k?=!4U6;-%=Glq26fkepaAnzSsF!k9 z5L_K!PF(3XPgydX<9cooAm?EGqf--TJpz2>=0|iFS1`ZBt*FzS1%$BXUUU@&$Uzw9 zPhUZ|3NK&#lZLdlCQk#V3v>;>73Xqd&$M#M}CJG{Q{k*D~W9* zE+;HK58hNyS<-DM8WC5IL>q+{DhX#Y(Fqcwl=Bpc9Vn!pBq7ZdHYb(313qI%DJ(;9 z^2fQJ=G2g{)l{T-nw7e0ou#NQQOa3YNxoK7C<-AS1~u)`#&p6DH6aE|30K+eJUWUe zC_}qe<#yGBL**xl_Q57_v`;O6gX5r#-;~l?-7`gLIwd5ZS75~it1pq_Bpn)=5%r8y zh2pRrgR$8ss&_?obn#ooo(iiQi?iZ-Z-ADr~t8tg>F z0gE#2Go7G}+EqP4%^k zjgHkzsVnyb6!_@f*Y?xhj38;MX7pe@43aY05OHFbIL#m^U&<6(B}ig8m3W8nn0h$v zVUoM`f%R~=(;k%55LTlnu|vP9PWlf-IU?6??Zr43^#m<(7Lc?~RQnw7Y(a`FIo z(^xWUrZAlz5{#Xnw5BN5Hx)aBPKXdD3kE50mf}s*VvRxp-{Bn$HfZ}f_;_X0JMa7+ zMh?{_C|yyub_g9O&L@UH$y?|+ZJVERYBz212#22IPxP*+-7p=KsHKls8pkZIeL1?K zh#LpZs2+e*N8gN#lkcCjaJ2kk*%a_Qt=5dywJIxLzzM7ADUfPD_8S8aEJGWlH{p-G za+c27!){e+4bDKJ(Lvp3A08Hob8+EVPU$^jdLR);UsH-7VjmFvQnHC790dgN*tB(Wh17IDb@wTQY`amyTA> zfSiCDnlazQswl00G}Ec2r14>Iu*Y>bh`z&U90~$xz0qJOGTY3wv?^V(neh+J#yInX zm^-6f`!i0TyxJM3%4r9`pu#YUy)>W>@}r6_G$==?V3ed?n{cjv^TU!V---sF<3DoC z#z|h@BbF{1<_A{L*R79hzJa&Nf8X%ThWN#M7nA1zy(gUo++fis3Md?aL^a?D*I;-Z z6`&sqVBO^>3W9C0YIGysF>G*R<6vYo_+VF;UHfG z-Wt7F4@Psc6diyEF4Hhe)g1+0NtVD-zF4_Z&vxa-DH~H8Tn~8F9o<;uy1Yve^!QV& zyBAsnc)05kZ=5AfM`(WUrcd}{d3VBC`K#{S=PzB8s#^}Vg*+|gwS6PeaE`gv9w`wm zLr=qMBND;(4ma}D4-Nbd!v_>BiUUF0LaI z-d-#KklWno*xUR41^>!zJ8Jw!u520yv*G94PTh(X`iaXQSx)>&^7y}bGBUxZlZNTU zH6iVaq$^U6RvYbmbdw}I&KHFCj&fg!^*?XkN$bvJ%>Ke3ksHw6$u5^l4lC zimEDIOk1^}F8-*Isjk}1snr}Bjov2u(y38c3BU{}ROO9ej=+7K19wdSdy;&G@8}`l zqL?$&jiSfDgKmN+nbYC%+JSf??2ZJ>B4hyv zZCh}_A-}o2qHf2mzH<^{<`hp{bJOHxy{V*R(!fsXnRaLD=aO}Pq zdr9#jmGO5C@+@&KH8HlUT++&`V>QNk%5vGYPFbdr?-z`G*E~=BdH3_SJ)I{mc%IX@ zRA47)epkM&-ATmgCuxfE4mwHbIcbVhvk{9qG#dFmzSPC(d=bH-c#G&fyskJ;h`f@@ z@h9Oa&~dar7z$pc@qpjyyZOR}+x!g3F5c#w>g#vYv13R4d~bUGL{!1+JnYr{{MY3x zuN91w8lSTtlN#GLJtrS0N&_=atDDfCZs!i~|F7o`lir=HlHUIsWDv$U@y1-3+n^d=SsBIUONOU4d z9a$*e&OjdBd*-Alq#Oz$(OaIR# zE_EKeWBY`V&LdYXBf-HbZ@o~xl1aDMt#9r3P8!|#max+_7FUHMp z5oZqEjl*oWRSumyD9#ieIyi2~sC)bi2CAH65~rF9`ij+M40=>WC>b26GeynIMyHsP zQf*_4Mvt{xvxubXN|*wdnGl4cCAV>r7DucL-atPPr{fGsyHHvrFZ|RP24fpzo{vW-#@1gEn z_^GX1aU$}U_=iJYx01}q!&)ff=g5m6f{qcS(~h5a8ViE!&*a5~r1zcNcT7gmz-eV= zIo-lyl9OX{BlP^7tzS?7PGjax99WQ^J9Ngdm{eOyM!uQoLsr>2924&^qK6%JfqQJKqx>)K)`AUQ)jtOJt~C*|s_%0avra1bxe{mStDnrOjsWYwbIfn*>LF6(~gY`p%p zvk->){5H9W-y+X}t+r65!EvR8kWhnIW;5{JdcAxBhY)9z03A5MPqir=@{8F0Eym{% z@ntO9kJ??0Y)KWzJO@nK$d4;AEWAG*^t}17a?rCv@uyK6&A=U2z%0G|j-IOF`*5@_ z(V6xYYtoL>8a0y6BqYc$=@meF6%IIBfd%aiP^tz&1={$p^|%J5tQ`P>h*DV5hA)7N5jkno#(SD4 z(W#X9UX=X@SDr@3#5%_HnmLk8@@7fF@JJ@Q`3H^tTvyBs*M|8*gUKB06)Bp zcJ>P$ff-aA+9*bSD+c@Cn1Wf1zQ#Trd<}r6*+t_D3-pHhiH-f@>7?0%(wJ$aS!3G!#b zIolXrV85#I0h)Kt=;pbLT5mXT08YAvH6^`A)NH6VNCV9iwhl zza;^G8z1s#_>GGy69%8(gfn1j2Z_%~NM~aDPNYvrpbMx^o5ytOA|U>P!@&RBsq_1; z5}tB(4>a{{Ir_Fm_ z0znPH7Z%O{s)*HB)`cj}g31N-t}uA`!h&+D+fZlkTtpjw1v*m{29`0t_sCzP z3dW2pv_4nO3%iko)8`tZ6d`Xbtt8vZA)OM&JJnC;0*-nx+@$FXUYF2~PWv^>7$XxR zVXb9B&T-~1?d9+r;;7^f^=fze9dAYTM#3Xbm(gSIU1o3x%=lV+IS^t8*=agQOCGNHpU+QB&dX* zC0$6Pl^7ki>mQ24B6unka8Z>qIDi|;W*V!j5FS|}ffvtX{iN=|&|Tq74FL%TI{z-_-k9-tgA zEGXU?>+3eG~^KAC%^i3miHak|S@Y}~OzkMucVRr|e z+s;{yWMijwX^2f=p%5UkKXW~8y_6nXv`B2Oq_?7^T($(?Wu>>s!$PC|Xz|w31q&Q+ zh1v7i0?cCZ7CgbqTO;VL!82znFG*A%?<49XznWHKq;?^yUglPRKL;L=6JYzZz=KL_ zb);w)7pb69y0x)URM}6>70JkD-ywp=k7j}n3>~FkbCe!3V}?>#%~jp78e=r+8X89t zE z$~FMU*ZDA7Q^md}@=G^VMn`-%B{L!loLy%Boj<{BxDq2;gldhDMN(EgytstE0Zad| z$&PjdcvVQw?+B+e3!S_{5n_sQrJaGVxI)O>(!M3^eByY=gfGb^Ui0h1(#Uo{52g># zUh8YaZL?fIMJ%=8^CE(JAv{T(DzAOHpv>iK1@s2aoo82+HCh<6)9K4l0#5 zgD%QrFf!`FJdVSotT*mUm(gByfJ=3UaFh*MAqyKz{Q9m;%a0$n-TU#$Qai1V9lW5P zwK|K|-mkF-kBHr?YyHt1ub)J^)A7i}D_ouuy_ftp5QEinz0n_t@`}EBx+ipyyN|?- zso)ELbH*7gcT3){R_kWV)dMlL=|yc}6}qZE>!+^06DC|d$3|ASWM>e^dKy0PQJb2% z6q}sLjYr2-MTL)!oZkoEzJFEW%T8S>Y(vS;u?r^5D)tPx!%q09FtBy-{!}S5tP+^xaPRU*(Tv+m9^4PF_OojLq~x3otUuj zz;BsRX{C4}+doqBh-q(`na21u6(a8@iMbntp8|XA^3lo6E5mQ|jl>T*r$b?t8M)M+ zV<{%N5KCFsGi0ffSW3S{SP;8ZIa_E5B&4x6LzoRG$x)TiPv6!HI3GH2irr z^<>#}A7pd>AQ$4IxQY*17hwDJ^curvnK?+Ve_5eO~O+rEH;U7E^UqII9@--svF> F)<4m^GAIB5 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf b/.claude/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a6e3cf157ad71c0620620c9da48a8c8d0ca26cdf GIT binary patch literal 34420 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

@06)el&dAngA!gYTP<&vHI+9v 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 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt new file mode 100644 index 0000000..16cf394 --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2024 The Red Hat Project Authors (https://github.com/RedHatOfficial/RedHatFont) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3bf6a698bbb3ab2caefdd2cd0456fc08b35ecf1d GIT binary patch literal 34488 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 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt new file mode 100644 index 0000000..a1fe7d5 --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2001 The Silkscreen Project Authors (https://github.com/googlefonts/silkscreen) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8abaa7c500d4555073f9e303ec2e5e343d3b8f3f GIT binary patch literal 31960 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 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf b/.claude/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0af9ead07bc2b95a691a63c72d328595b93183a0 GIT binary patch literal 59704 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 HQ0M;vf5V{( literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt new file mode 100644 index 0000000..4c2f033 --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2016 The Smooch Sans Project Authors (https://github.com/googlefonts/smooch-sans) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf b/.claude/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..34fc797195169923bad8e76181d60ae02019fef0 GIT binary patch literal 76248 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

  • cHEqa9AH!ee?-ydsA4i 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 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/Tektur-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/Tektur-OFL.txt new file mode 100644 index 0000000..2cad55f --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/Tektur-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2023 The Tektur Project Authors (https://www.github.com/hyvyys/Tektur) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f280fba407441453779b16f7021a286219421486 GIT binary patch literal 75604 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
    n*WzI@P3*$8 zNIZsXv3OkkP+Tnbh>yh;;_ujlwo6Wzz2Y}=kz9o@jMd0B;+R|~*I@^LgFICnmlxu@ zB;oQ(`8GLG{yM&YQ7k_#zbQ|V4=b_qIwe7Am%p!!QM%-#%6Mh2{GPHsiVag_4(aJ5#*OeIMH@K3O-zu*wDav1zkMLFV6pLTUvs7E^lom^arBUgybXmqL zV=WUb6Yy<~J`48pTly{i%6Q9c%N(W0vedFv>9zdWvQL?4`Kjfn%H*)zuw122lBMq; zm+{ROeC;J2qr?nc^o=Jw*1J2TR>198?=ExhTaf!bz)z4C0JBh9Bzf?~nDv0KM;Tb8 z9n!Y}@5E&RSA2y-`kwS7eBoset_JBDTo!4sv>#vA`58*f%B7W#(s~~)^8=JwrgQ?A zEd2wQ%q1tItPG1-)$s$TbNmh{~asWGp6K=Jrmcm7ir~yr_sD*DG_83Hnsrb%b z3`%eg_8H6**TdZ)Hb|rK{gO>m2FmyrxL?ICg&46#+%H9o2gCzXq<9eDJd4KO!EXb< zQ|tuhJK`}Z8D;+r;Jt!&DE>+O3GiWY7&LE*w}3e!-UH@+@v)R3{wDqg{3+~jNEUw= zXQUKyR!)#c%1QEQDH}D$A;sbQhaM>xJ94~Iw45&&;$sa(avAm+l*=_z4AmjH4KnS| zo+?kp_ikp%v*6B^=SnH4Rg1ylV)4(!O97*1OZCc1Wu@dt{az*2DXW#$QmwK^StAuIS1DIXMatF6)l!XejdG1t zt*pgfs6w=ZYb77G1cbd=xfx+^QEoxluPR?f*v&X=p;-AEzD8K2+^XD)u(x5yZMCum zJE#iLZoZDNuPCob&1gBlmD-h8l~<)U<#*V<*QESj`MuPtyr#S+wJ3j3{vb7?ZM`lP zpmm*)vXs9nC-D`=kCcz3EVMMc6l-x<@&G$6PO04Dvf#UH7PrL>*kkbk#&M~V-I8y~ zmmHP?O95aUIS9DOQY^VFC6*FkN-d?p_$)raIFbc$wWV6Bu+&&;q$*3Tr513Vr4BIK zvs8xm+=Xu!bz8czqh-8hJYckKd>;vI8!+0oREoAe8}1y-94VbzxKuzb9ABD53zuBf z!lgX4B$JE4`Y1iS*eS%Gd|5BEV_5v&p7SR*8|M(AQ)kQ1T{ zT&xSySr_E7{#Njn&CkH$477M0>w;L;1xipCL_@EKvtEy2y{@ock7K=_6Vwj6Ug(oX z;!|J!(g@ZL7HEgrQnr`_9Wfd@VxCkb=8J`Z7m3AE7Igh}pj;2#LEk;vAl0(&@UZUi zu%Oi0hXcV-GK#!7$)=oO5h;>Q=>y#|kDKV@~y!0tG z=z>b@IINO!0Y)DMm-Nf%5dAWWbxHz#RZAKrUkaU)0iCi$s+BL3FM}ppDldh$x*X?@ z#NcaN%K($E$q4Ei(lSx3Wg=O>xS?OZDarD7dApQP--3eXB3&c1mWhX!`8{;aYw{tf zOnx0ZscrIM`E9sIp>e{Xaqu-TB^G)ok~NOZ8Yh`GP6}%r2Wy;Y);PtiaWYxs;} zW{nfi8Yhf3PABV{aja{`vaYFTT~o)pW(@0^4%Rg_tZN!s*L1R$8OK^?ENhv1)-rXh zWyY|U>0m8W!&;`1`e*1A(lV1+%S>b~)1w?z4oc%$*YvWknZUZHTREg00zGM*YSuV~ ztZ^z?;}o*SNn(vt$Qq}GHBK9AoEFwNZLD!hSmTtk#wlTqQ_32roHb4fYn)QnI3=uc zN?GHyvc_p=jnm2+r=2xUGi#hw);QU$aZ*|1B(lbdWsTFo8mECZj*B%;HESFnYn*b{ zI6g@fy^o$=62BbvoOZ2zdep7wUQxy`VqN4bp_lcH_2cLx){p6$uq@Q)!r-V1Ew-o% zTyxX!i&z);EZtFaiQ~wHu`hhlD`IcNUf&xLTSBi9`y)T5YsCH$`y*Z~Gu` z=?uLh-W}rFIRwt28xc=eoF&eZ-bAi;4Htr>{8z7ty;TRx!(-w{rVhMD93A=^xnc^X+m=}(n)y{zcb=Y)JsvHCLN0$8#6X@VO&f6yD{q{ z&WvmrxhHPJh=OSM=;blHV~$01SQlG+($7Rp%XrMXJYtD;t#zYyi}mT!gAtLoRS9m7 zcSJ{u+>z!v=|7p>k=-%!=*Xkl9jWn?#;z}_s9W}q_28}ZZ)(dtP`@Lw_lZ{{Qul4J z-t*#oYv24W5zfWytUH!$8~wt-EAK`9x$=gRSCh+97dltCUKp`<#9X=)-%NZ{hf{jJ z&&^yiJ}PoabbrpR_V5w+jJT(!#`;+FlcV~hpG>^VI%8Ch^ZWZu4;=+4!x45#d>4C z$s6cOnwB&zVtK@JqPwswZWD5T^S3vS9B=_Q_?mkTX7{KAF}tJo#Oxk*X4IL{Yhref zUZY=W+s~!eFeKr>dc|yB?PywRza{y(ffqh}Kh!lXYj(yB<`uQ)i(K~}O+ja%UAJ$~ z-IlX{@D;a*@}DkBp()Ye9F5wOb{b^@ii{i5PA5%^+LPXUp;tzZMj3xJ{%G8>k$Xcg zOTX)r*l9_3QSU%yPc#>P#T|<~mMX^_jtaRVwi(w6%aIWl%aKIca-^W!a>Tr%W{pUr zCu^DINbDxMVr((CiCf5xu{qu`IGDV)QCxIopV6T&{vUrd^|{pNGS|ds47?KShPpf( zW_CwBAMt$3Y;v{BS~mD{?+s7WFWoQNqCq21Mme#={cg-!iLh*Pl~3{BM!@1EOX*Ja zBleS(Z{W;BJOTGQMkz~S(*sgZTb3dWLC*tv9$#sVR8LxBFoQ2!;sGTSB&FfqS2}K4 z`KkK6@*L&>WaS$5L*+KSStaPtfc{Jn;9WL-AL4({5~Y3&8IIv89#4sQO2(4~DLV=OzgeP!)E4Cq^)#o9 zINptU_8t+?-G45j>Tgm9_HEgr^Tb)$u1)cJ%d$3Vka^&Q0i5n}%U<5IkZL!2KW z&a)x3c%RNbn6)ICEiWMlL5uiwOci1ZVhs+a)M241w#0)&GEyF{bbyw5qs%@~Pbr_M zM>$WzF zP`rw<>ml_|3f|FC9e||oLDD}#(&Lcy_m-bvebETTja>S?TpIz3<2XZ-Bt5R@9QYjq zzrTRr-@)%)@LGe?yap7fQ8HSK{V>>GKeVh+PgzzWe%1-yPs_ZT(f~f5K>Vg6)JGcOfxMA2q5L5(Q zD&SYFD-jiF3A7Xl!jw)41Dz%_oe%=eOp-foI&+gLtvJ8uoun0%FN-2S|M>p#dQ95P zOy=Hu&inm7pL6b+#xt#%9&LMfX?sISEA$#ivb_F?E7InQJmrc!VrEmz@s~SB+Hk#h z)fL^?&tqISJ+;v`*LFrK(X->H;5OV@FDE{zJv7dNcZu5U{?T9e%z^kR^_pia_KfOi zTZ&psq(uvw+=b*EE@?b7t3_9%-AST0tB)-8>`vz(YI%L0o$<`R#xq~^eznB*TKWg; zD@J?wz(`xGKOg;N@4Gy57aqKkmPA~i4byi)C@3<=8eVwba z&Z;x`-8XO+N1om2``TpGCr5ffq>s@RFO90BtL{v$qph!PpV`=GTfh3{ZN2g8_j-rv z&eL405E}2To)U|7gObFexn(UOMulSDB^Iqrq=Blh-n(%v@2szIHkbdSR{A6_j9&e| zCVMHw){U;X8U&RA9kC0lD@G?9{Uf$_)7mOy>&CXzSKs9olVj_>qHmPz-O0sRidRvW zrYZIArfuupcFBv{KovJguk24L4r-6<6!4-XZEs%Ns4P;tY3dOJ!&H1;^Fx zxXN1f3;x#2Up3kXw7%#S&wIsUuPA!O^IoyoD~gS461{4O5)adkm;bGbS1$3&F0YJK zqQ@({yfX00p2pv5^d7DKMQ6sf{|EIOx%Sn@-6xbe9n%cQJJTHu z(cfC;Z$0Z(6|Wldsv)oH@~R=Piu&V-`t9%4jUMb1uKAC>N40c}TIm>-(lP3!V`A&m z+CEzQob%PK@*7>7HkIC(I&X~b_R-zv=x(>lF17bNo}`W&QzfGzBdzn5Il-B&+Jkn) zXV>z%U(`DHj#_6!v7HyKaaAvG8ZX~O&nkG<#;>XA8@Mv9yd_9B^s_#5q`%ega=u%f zhg+Qoiql9l3;F9kw6vq?1NB>)_O{bV^y=%A&%3rS)Thz=#SP`{uTM=5_`l)$e%|Fu z?{bQFS?pbgU4w#mnd)73l_dNUfnm+cj|*`?a^7D=T#+ttH@j>tKh5GZ_TFEDW+9&V!ZoS?u@NS`Z z>(zP+BicNw^~+tW7qysIe+ZN1=cbbEH$8S6=Y!QY}Ht6YADz8pO> z@{gCl=c>f@it8V_&5Q9L#I}0fHn8C<&hSc=h|co0K0&1OucsK%JN$Fsf8{&8whnCA z$O4D!y+`0k9EGEC435QdI36dU|DPR2MLRk(x0!8vBWGuwSV!d8^{i({PWzOzzNm55 zN7HDORb9zyLvNz@?)S`vo>}zF-o~{Vc4l0k{U(e~8kQ$)HltW8x^{y*k(ySpq-72>W>{5lwm#Qz7sK$JwPBVMHL z9gFtaQ}d1`_QLxSrRI(N&5)*r@jLy`7_EtZHrn>+$Y#{{{+?qut}oIc zMzQniflvN|Ru+rWg(FxRf3`l5*crQEcSK3Z=SdFf@5}46BX>@|-2%>75(uW>dW5n6Q)U!i9JJhp7Jv-F1Lp?jxv%|(; z>W@-@7V`20sO2`sdz%ThcJ{knFf+E6`NUXkeOLQwXLe|`2TAJE`UmTO zb#|i>?aH%Ta1`^M-H}`oo!v39*81bI`|$u~Viq36Y(!&;XWbXnjp+WM9z2g1un4^< zqQsYOGn;;f*Nho$FOfIQ{fG8a(Ox=7+e@eR(y6_4Hu_|vy)>@fV=LQBBQeh~hKqdf z)%Br~A!xx!?Vz9I{If1ZuO4)6ile=4iEA<}Jq&9ni?z5{jGw(jCuQm9y^(8%T0JEh zRn3u+iCW65T$^#D*JhkK<3`(P^ukS}adM>X$@5*~3ni7v&o1)w*D+jACts|;;B!2t z@AfnuCh?x2$DgN9pYJ+dAOn24o^Se!G;^_coi4@9unKncUESx@Rey|LmR#+0qb6~H z3c_La$CBUY*FW$VZuIy=kGF8B7bMF?9(%RO{`#XMy@d`m`kha?p_b79Z=I{icSpyb zlsHl;8tv*XZk+MP-)W@jRU>L=yXyBgOra;LD-X8vBw7~?#RcxB1?TIzf)9d(D1{295z-$$p>=xC%3{e6UL2t-qhGzn`tYpY2Hh^=!Gh^S7cg-aDmU96j=J z@#x6!toJp}=<91v}~=`Mf{&bJ;O0#!?lM&Gp|cuqC#_ z*4PGPF%IJ~0TVF^lQG5XwuLi8tvc#I(&A)~dPaM_*LjZWMXhr6Z0ecSOIMBv?vt%{ zrl5Zx6>RKh`!}U)<18x)@$|oD}Da&(19q+UgziQ@vrK@R@Q06V)x?#L>Xun zB0rc7s$(5jES5ta3sHbX_C~7@Rx`z{V2Q;xd(E>H)$Y{m{-v`Oy>lBKi;`P33hr?Y zo^=hDx(4%H1J%9yJ+5&n5>w=rcLsZ%f1j&9M8Zj7#~>(JWx%(F)QaLMRMsiOS{ z$tTgS{bW2oO%b2buCg8%_;&|Fn!K!$ke+b0qsnwtmB=>o)lB;!j*ZcXk*i$4*7+Rc zvoDJ>jn6OBjkKY}EwXG>CqAHlt;{hd`T1xJSfF5le|6zSFJ{5P?Q&ji|@t*qqj`tz{^MGqMZzQETlfzi%7}PQKnGR=e5jB2_ z8b1=Lanl^fGcj>N{iej1@fBQ%ui_$n4PVDM@J)OR7vtM##wEBEm*H|;fh%zpuEsU^ z4z8`=^tx5(ZJgCYqrR?|5&s^(k7xvOBY1!OCb(X4*R!F;Klb<&{1lNR{S3F_w%86< zDaN9`yhpB|$5*RJC+K9{irH9W#q42?wOQvhR?MCo`<7Li7sc+g;_}apRaT|OTFXA` ztJaGxX{@Gtv9X$Jd1E!zipFZHzgkUoW$dNK`q)Do>tj!9tdBj%+NOKr=f-CwHjQ5> zt-sc_y`g@8{CoA@(QEwDKVIW_wb3vCwd*`3xq~yoQIpY`c?aH!cR`A^Rxu_Yzp-(4 zQ4i|ZKVM#b{}=Q>Hbu*8*7BOQyk;%0S<7qI@|v~0W-YH-%WKy1nzg)UEw5S2Yu56b zwY+96uUX4$*7BOQyk;%0S<7qI@|v~0W-YH-%WHm9HQ@%AN2p<=>Nab|9_+Z-=qJ}h)4Zn<;eO+ejZ6 z!+1=uoa*s3oL+DLx1D6l>z|wYWBSjs|Ly$fKTF=ybF|Z_`!q%X@k{jX zOK}-4#}&8|SL3$Wb*{|F2x05k0f}ue7UM7;6EG2zFd0*DDo(@c7;&(FeN^#I-^X`T zEP*7Nuo_m!8dwu+VQs8~b+I1S#|GFC8)0K?f-%?>n_+Wofi1DJLa|rpl33@jpy#XV=0VBNuBfSA5y#XV= z0VBNuBfWvfRXmV$9fX5%2o42j=V(1DK0PWvJt{suDn30bK0PWvJt{suDn30bK0V2g zdG5#Y349VK;sv8xvw+q*jNx`Y$+GIrVl2gqdaE4rJoFsB>lbil_pT4eKZt#> zFFu6*@L_xeAI1Kl8}S2i5Dvy6I23AG@xyThj>J(o8pq&R9Eam^g6p+aJxpw?4{nF; zu>*EgCoHSdEXGoVj%vC7v$p=QF4o5s{cu|}`jS4<=t~}>8HU{&spWQ=;10Cl54a0| z#GmkI+>Lv1FQ#J#?n43H;52bF;c;_%aTVUUJ`nFk5idc0h}T^goih=K9}-D4VKuCd zHLxbuf=_Q{ek|b#66?WHBsRc?*a#bA6X=8Px07UM7;6EG2zFd0*@EkD=}+hYgph*P}xseX4F zPRH5)eGbmW=kW!63Flb_@N%78?%IsZc1Ejnmac4Nv3*tZ3hKIr*aMh}S$Gh$5zP&B znj_00kA)~e_EYc8srTm8dvof&IrZM0dT&m>H>cj4Q}4~G_vX}k3pBDoBMUULKqCt@ zvOpsXG_pV=3pBDXc_7_72nXX39EwICs^_RdjvC~sL5>>as6mbza7C$MON~Yo`C+8;T z#!rdv3-Il#&nK7q9@c7dIDTGoS#pK%i+w5ixA@nZ4AbJ@Xj-djz4$kqHf-87eu)L5 zd&IA5dUw;_@jIfG{PEv6?ca1jyd}CLFn(9GhClx2rem6piQgTq7n?eO>>&&#Q)MX zw`p$tv1pxt{PEcP|JQlB>-C~2$$t<3`bf7izF0NK_e<|J4Zp&#@f-XWzr*jLRYh}v z?!9Y_j-z!c|Jz*PNHx}#T&X)FGau0%UD3?P4y&$wG+KzR^oL$ni#c1HzF3>SSew3B zo4#0^zBsDSXwxTZ(daX20);MEdPolDe zE${70OFKB~9kCPMfp_9v*crRvfJph}#ly`HAAuur6pqF*I2Om@c$|PY*EarnMaO8{ za4%=9F)Q~0kK7`5xV91`z6@)_5*OmDFe@h&2U2k$6$esrAQcBvaUc~3QgI*^2U2k$ z6$esrAQcBvaUc~3QgI*^2U2k$6$h&_ksQW59>J(>p6Ye$$)l})lLQ^g`7n9u%7d9(>tWNcVRc|fyUX=rW$9<5y7Fq?Qh;r9*1zkXkxM)5$O;AExBPl-xc7cma#h3zc+AJ{;@wUi2eoT|g{A*$l&8 z_@x{?4Zp&#@f-XWzr*hl%5srEonicOfdpgz)rz>m(bbBhE8?`}tNiY2zq`ioj2O&+ zjIN0DyBGX!k>Br6=WFwC$(%^T|30BNx9iRA zdULzp+^#pb>&@+YbGzQ$t~a;q&Fy+~yWZTcH@EA}?Rs;&-rTM?x9iRAdULzp+^#pb z>&@+YbGzQ$t~a++{%MqdTH=}d!-@HN)a(1;vR5BH>X~n}-u*FI|Ks=sK8X`iG)q*j zU!!MVqi0{EXGd#*R;~vhP$wy=la$m+N=;i~YixtD7>DtgfQgud$(T~Vh7w%Uw3G3} zJFzQvN2COi3e0s!i5(5}zyy+L!fIF@YhX>Rg|)E`*2Q{Q9~)ppY=n)m38H<~HpOPx z99v*ZY-Mb*HBPlB(rIXQf6M)N05dTQ4`Mbt+!@p9IXUF95CvETBkyIYM3zcqsYI4a zWT`}!N@S@-mP%x)M3y3S81I>p8VmYi1G3pCcP>V)={YHKLMt%K8 zef>s#{YHI(QD0GiDC!SI{h_Eo6!nLq{!r8(iuyxQe<&K^*?Yv}X*eBcSYLOxwfX1Z zTznp1z?X2IWW=MA(Q0SjLR~t{8+MGY=?EIL_tDI~JkS`CYmNFs$t+Tw_9c)+6IR3O zSOaTfEv$`ourAia`q%&)Vk2yfO)v(=x~|f&t2FE?4ZBLiuF`<3G~ntib9I)vI?G(0 zWvz4{RGd_<8C|$-*V#W1g=it>IAM%;OYdf zPGGlzSj-W|1`t51<<3ZDeKp-;>(O^%YI3A&qq^c0qBZQ?MM@jmFyG2`W!9^Kd%)>*RmOH8F88b!ro`{Bd*2=>PTI1)$UXdHuM zaU71v36RiYAIB%~Nt}qNmhx$wgp+X!K7-HVb2uGm;7pu_vvCg2#pm$_d=X#5c{m?Z zY)p!ceFbWMv9IDHIP0;m;~V%UzJ-hNKllZVOk+l-F(cF1uVG{w`z?Nl-{W=DhUavH zXT9cK8n2Qz?3WX>TTaX_8L`-3@e=-qx>oEVz78h9H6BSDT90G2_li~FxC&R}8faOu zYqaN9KG(|UTKQZnpKIlFt$ePP&$aToRzBCt=UVw(E1zrSbFF-?mCv>ExmG^c%I8}7 zTq~bz<#Vlku9eTV^0`*+`F1{cd*TLl!tdex_yKOj4{;Oj#=V%18MqIvxE~MTnffnz zaJdRQMDU_)#IJu5jD<1il1esUrvVKVf(q+XYFMeL*#OP=aAr{Q#*firOy z&V~x*=-oa~@#7o#@eN7eE14X`Qa>;A`{nh=8@1ETt#H}`TVgA0jcqU%<1ii*FcFh5 z8B^*v@Z=jBp8SsbvkhNwe^Bx{oR=}o9^>aC=R-!#=M{h@cJfV`5P)SOt zBqe@;8}UQjgu9{Eo0yInxDTzk9}mFVHG7VXi}GMXUr8*%AeN$nDnbll82VDeSxvl% z<hqHan#(x|2jdVNio>msIRZ!GC>)Jra4e3)@i+k=^O-)5 zPvDa{5vSrboQ^Xy?c4O2&F6IU!1ID-xS(8Jl5qY=JEit%=y$@3z5MjKg?Lz(h>KWK6-U)#^|6 z|EJ+}oKb(0F89#o9=hB^mwV`P4_)q|%RO|thc5TfcEnD22jsL@taLiS zzYoU|I1)!ewtBU@gJ08qBxWPQKR2oivPa|YhjM)u7n+r%qxMKMi|*%WWofj!eDnHT z4m6ho&E-IIInZ1VG?xR-e&|D5Qmjlh^Kyx|JTn;pg1I-%I5H08f*ccCPmq#D4P^zlcH==lue4VNl`W_$|gnGq$rydWs{<8 zQj|@KvPn@kDas~A*`z3&6lIg5Y*Lg>in2*jHYv&`McJg7+(vD5EXH9xCSW2aVKU70 zC(ZOHw}Za?CR$NZhAGN0MH!|j!xUwhq6||UxqDJe=|xd}z0czS0<3IBEAKzsTr1iF zTVgA0jcqU%<1ii*FcFh589T`_dV%cHY0tfw?9$n^n@9J2H0|N>J&5kiG^T5Mzxn15 zc--5g#Gqvbv0JpPw2iXjK)hs-jg@w5p0$ zRne*{T2)2jP0^&3R#nleDq2-VtEy;K6|JhGRaLaAidI$8sw!GlMXRc4RTZtOqE%J2 zs)|-s(W)w1RYj|+XjK)hs-jg@w5p0$Rne*{T2)1>s%TXet*W9`RkW&#R#nleDq2-V ztEy;KRjsP3RaLdBs#aCis;XL5RjaCMRaLF3s#R6Bs_L6)RTZtOqE%J2s)|-s(W)w1 zRi$xfZBYfZv7doDc3G`&F`O6aIGV}1mL|D#aJ>$$*TMBVxLya>>)?7F zT(5)cb#T27uGhi!I=Eg3*X!VV9bB)2>vh=UGnTj+x8O(kF@A!dVk&-yTX7q1$IoE| zn=pb++ySH5#5DX0zs7H16r1=RjA9daq6L4zUHBvZgg@gR%)~74`NV8Igop76+VCj; zg2(VUQka7$Fc)de!;@&oQ^??HWU&Ap=tK^AEJOiacoyA=l70`K#|u~l+LI`v1p1Tc z2MtQlAUhAnk{e-TjDakdl;x7LTvC=x%5q5=Gbv-5k!zE{+a&Nd3A{}LZ{l>X`FtxKtTG183qaoQ-pEE6$3i@dA)jj)H7vu6SdJC=t5%^UylSe~3aoC8S=}15 zx;18XYb-GV6EO*sF$FtI?Ym%C?1tU32lm7VRSoy?xGz40{qSLY1RurzH~{8$6Xtdk z=5`b2b`$1y6Nlk&9DyTo6pqF*I2Om@c$@&O#46jERkks!Y-0)6I^kN|-7{uy&sak1 zNqin(z?X2I7Ug>a>1ZGQ?4zG$RsSXC@}k`d7Rz^K8d|2IWg1$hp=BCcrlDmTTBf08 z8d|2IWg1$hp=BD{M??D>_2cb1uIxIpI?{W-6Fd9&F4)!2c4u#Ld`(t+HAV|F8YQfR zHl9QiR>SI818ZU}tc`WBF4n{P*Z>gm0+|`MH5w1|&6^iqd_yzbfzJd$!Ra}Ix;p_MYzKL()VtgBy;8I+M%W(y+ z#MNlU{dfQ~F$)i3HXg#mcm!>D6o0{EcpP**J_k==F4C9>Iv%Iv@uxt?<8(a!4CW(? z1?YhD9?v0F zdH=>8Z*3|Q&&Bt4Bp-xN8~17BK5g8mjr+85pEmB(#(mnjPaF4X<34TNr;Yoxai2Es z-QqrN+^3EEv~iy{?$gG7+PF^}_i5ukZQQ4Atk`5r4v;aX0S4 zy_k;s&|06VZaP!lbf&uLOm)+l>ZUW*O=nW4`Rb;Dx@n+p8mOBF>ZXC3=_6{UkEoeG zqGtMtn&~5IrjMwZKB8v&h??mmYNn68>fCCR9b5h@z7LyyA2$0wZ1#QF?EA3U_hGZ|!=rnf-PM?d^BwCWDM^pmL65NFxygPfP4+u! z()N4QosKWkiV|1w%sVn5v6>{ndIdz4cxkHiV{+;-IrW&FdQ46| zCZ`^gQ;*51$K=#wa_TWT^_ZM`Oin!}ryi42kIAXWM=R>n4Ee{PCX{49+Oj# z$*ITW)MIk$F*)^^oO(=7Jtn6flT(k$smJ8hV{+;-xm6?CP5eBDHgAf}usOECme8sj zquDoGx7ndS-RO6^(eHGl-|0rb(~W+o8~si<`kkKK)xKc6VR!6-J@Ib52k*uEuovEs z4`6S65c^$6&|&uX$%ua+cI}ye{hL6|(7W;(9PvS&; z3ZKSFI2n>q>@)Z*K8I7i?`d$?S?mm)iL-Dv&cV6(JidT0;!8LW=i>r=8DGJL_$n^K z*YI_G1K-5Aa528^?=<5QT#CzZIj+E!xC&R}8hi)W;yQd6*W(6!58uZRa3g+*n{YF3 z!H@7``~*M6RQwFL;x^olpW}ago?qY&KmXF>H2ey`#&7Uj{0_f|y#Qk^_yg|3AMq#r z8F%9z+zWFHvHQH=L+(g<7>}S0kK!+Q438s)Id}qdk;XhciFQ1N44%d_n2#(LV6o35 zEypC}*kADy{)W25979vRGrk&D#~N4@Yr)>I@pb&(Tv2?2NA27yiN5&z{r?Bd%bd^8 zFK}P;m#td=idD)N)}Kj!)&E~)F6ZmUnBVY!S9;D>o^!S5T;t#0@tkWt=Q_{1-g9oS zns_6-)ox;Sl6KqV{)MI^&9}H$!H6Or?Sqdbny?yH#~N4@Yhi7y13S9u?MwCcrF#2P zy?v?PzEp2ts<$uI+n4I?OZE1pdizqneW~8QRBtcp?Zw6_%CYt{8;9|jfQgud$(TZa zXzBm=6_yA3EC=CW9D+k}7~CK8A6b2Qs&Ak@4W~QyGjJx(0=<6AS7CnJF*M^6T#CzZ zIj+E!xC(Z2*W3H`_I|y+UvKZ%+xzwQe!ab4Z|~RJ`}OvIy}e&=@7LS=_4adKizO4Ugh4cnpstg*kWvbCJe8Jc)KZg$$m?GnkJo z7NEoD=|m3du&Z|Ql6PX=kau2lW$I$TuVDrLikI*=)a4-$)S{nS^izv|YSB+E`l&@f zwdilGP+eCJn&5dd2envAE&8d&FtvzQs1H$!Dy0ahM6{>j5-L%p5@jkeL?NmaBA^b@ zK4(j)LzOyIC__JG=%);Wl%YSWx5hW74hyNnLh7)PIxM6P3#r3G>adVH_%=4!?UXt! zqz((I!$Rt?kUA`+4hyNnLh7)PIxM6P3#r3G>adVHETj$#sl!6*kfjdUQFSO#hXQpd zP=^9_C{Tw2btwE7sY8J}6sSXiIuxiwfjShZL*YN94q57ueVf#wKphIyp+Fr9)S*Bf z3e=%M9SYQ;KphIyp+Fr9)S*Bf3e=%M9SYQ;KphIyp+Fr9)S*Bf3e=%M9SYQ;KphIy zp+Fr9)S*Bf3e=%M9SYQ;KphIyq3|+wD7*o6C{c$JbtqAX5_Kq1hZ1!tQHK(BC{c$J zbtqAXf^Sib#U92ZXv3rU3m(JcNMR11z+9v;4^N^UPa%V+p>7gWH;Jj6#MDjxS9R#} zyEm#3eV*Ho0R$-H^;M%lH40RtKs5?fqd+wZRHHDW8hZ4ERjRR&Y82uhFm6BJ&UzQf z3+}z790Qc2qj6{5MfR5ex)n*^@PAi&&Q+e{eo6{5KtVc^*Lv-Bo^!qD++cO%MpVO! zZc0+1Bn3)Rq9lcelK95fdJ83Kp(HJoq=k~SP?8o((n3jEC`k(?X`v)7l%$1{v`~^3 zO433}S|~{iC264~EtI5%lC)5g7E01WNm?jL3njUclH4dgx9Kr$G2`Kw@o?+`%)~4_ zh}r0}+T`E38g#csJ)>%mkg7dGs`dz}#*H50Mh|hLhq%#0{G%{}h#Nt~4}@K5;s?X7 zH1R`m7~FRjx1V|3C?akYVULiiJwmE+qX>J1RP7N`wMR(Rs)dqO3ni--N>(kDtXe2p zwNSEZp=8xU$zAe2RxXsRTqs$&P_lBNWaUE1%7v1Z3neQTO7XLBHqODh_&mOVFXBr$ z59i|od>Im_l?x>+7fMzxl&oARS-DWMa-n49LdnX7l9dZ3D;G-Y86D~w9qJh!>KPsC z86D~w9qJj;&QG!U?YILicvCeE?|nZWz)Z}-gP4tn@Gu@h8y>}9@E9IP3UlxT<|2)G zcoOY+3K=|&XD}aGEIFadD3c9EQVj1oXnh zQ8*gM;8+}o<8cC3)(Pa!gf^1UMiO82xh|-;ScBDK4OWXaSS{9IwOE7IVhvV{HCQdy zV6|9-)nW}+i#1p+)?l?*gVkaUR*N-QE!JSQScBDK4OWXaSS{9IwOE7IlDG!n!L_)q zeq-Xhc&6TFrC!_X-oJTRv^t;a9DyTo6pqF*I2Om@c$@&o^-rtw%Xar%jHTudHn$to z7T6M7VQXxIu^5N(n1G3xgvprVb=$)EHQPMaxNjWBV*(~(5+>t79E5{$2oA+zI0C1_ zIz8j=3a_p3+6u3&@Y)Kmt?=3kudVRf3a_p3+6u3&@Y)Kmt?=3kudVRf3a_p3+6u3& z@Y)Kmt?=3kudVRf3a_p3+6u3&@Y)Kmt?=3kudVRf3a_p3+KTaZMZ#XeLs#(76+CnW z4_(1SSMbmkJah#QUBN?F@X!@Jv|=V~wwbWmX2NEh37c&uY_^%O*=E9K|7ZPG0`H{Y z|CGM#-DcUk&9ZfyW$QM})@_!p+bmmmtQSR;>fO?Hg-=%aWQ9*w_+*7oR`_HkzOG*V zevf>Sx(`wJA?iLv-G`|A5Op7-?nBglh`J9^_aW*&MBRs|`w(>>qV7Y~eTcdbQTHM0 zK1AJzsQVCgAENF<)P0D$4^j6a>OMr>1L_`7_kg+w)IFf?0d)_kd$bR4A9W9?dqCX- z>K;({fVv0NJ)rIZbq}a}K-~lC9#Hpyx(C!fpzZ;652$-U-2>_#Q1^hk2h=^F?g4cV zsCz)&1L_`7_kg+w)IFf?FH-jxsr!r6{YC2jB6WX}x<}tE)e~>^ocr+rW?~i|#B4l- zhw%v7@F@O*$M85(n1d%^g)x;5sB}Q311cR*>3~WHR63y20hJD@bU>v8DjiVifJz5c zI-t^l^=g5t@(=|cqQFBGc!&ZIQQ#p8JVb$qDDV&k9-_cQ6gZ&30R;{ya6o|r3LH>i z-{oT0%6&ZUiw|Kxd>9|WN3lN+z=1dj2jdVNio;+PBNYy)a6p9vDjZPZfC>jxIH1A- z6%G<-)Mr!Qfcgg1cWBkxfu&UJmEZNTkaDFdSDJFADOZ|ur72gMa-}I(nsTKnSDJFA zDOZ|urC+wLz+ERQy*pq>?Bp)>cUV96PLJ>MxU0wAJnrr>+IPb7$#WHo7szxKnQnzl zSBWxRW8ImZ53Ssa*V|(WB+-P`usYVjnpg{KV;!uE^{_rRz=qfe8)FlU!KT;@n_~-X ziLL6>WV>n9^I_`w@M~tf=-ZfHO(D9Z|7TU@y73%(@H}3?BJ`q&68d}}T0aI5plq+P zz3T06>*}MATM7CJd=e+(Q}{Ga!pS(r*#9#gKa0=dRGfy>aR$!BSvVW#;9PtjU%(gf zC7g%zaRI)Jui!#_6&K-a_&UCUZ{l0H7~jSvdfKJ9442~yT#2i3ry518=iHA6;Cr&D zLX9fas6ve@)Tly@D%7Y#jVjcrLX9fas6ve@)Tly@D%7Y#jVjcrLX9fas6ve@)Tly@ zD%7Y#jVjcrLX9fas6ve@)Tly@D%7Y#jVjdM)H*pc!T)rR+RnbEU>EF)-LO0Mz@8Xc zrCOsDHA+#V6g5gwqZBntQKJ+!N>QT}HA+#V6g5gwqZBntQKJ+!N>QT}HA+#V6g5gw zqZBntQKJ+!N>NLU!^$Ic=JpHcd{OCZ|o4)27L3)8w>ia@z0YwBIFeFjw?F zd>=o+jrbvM!rizR(_uxbl?%gGE(|B`#{+oAT_f{hUN2!@FJWFUVO}p`UN2FFxxK^? zhEc;ZyolvkfxqG<{0()rt{CjAVD^95?Ei4mz6weEDwzErHv2zp_J7#y|FGHrVYC0k zX8(uH{tqYD#|GFCo8VNOhSPBd&cs=;4kdY^eLcSOI(vKk{ktCjy?s8^@*1lAkNbT@ z-yfuXj4E!?deUuVpRw*L9*6OmfQgud$@uT7qUU7boD7_kfpao&P6p1&z`6fSoy>VT z4W~md`43mobFzC*cF)P~IoUlYyXR#0oa~;H-E*?LJHPQAT#M`QU0e_Ak7W0p?4Fa| zbFzC*cF)P~IoUlYyXR#0oa~;H-E*;@Vk&-yTX7q1$ItOUj`bI~!_Ti@MX$>ERT;l3 z<5y+;s*GQi@vAa^RmQK%_*EIdD&yy5{OL0ObQyoTj6Yq*pDyE1m+_~ouy?DlcdM{> ztFU*guy?DlcdM{>tFU*+Qka7$Fc)de!;@&oQ^??HJcIejVgWkp4_QgqZY5p2m2~Y^ z(zRPj=X?q8rbl2hZaLEJ81Q`xFOneYMqeZ=i;jGd9Q>8{~`)a>fQZV}qQr zL2k72-W{J{Y@oLqC*$!=NjkcHvCe)o`zrH*Z2*7i{Ih*xYPG# zwtCI|cmOjo3lCy89>T+T1Z{W}f5BsT94XAf6PSxM=HW@S<0)kDG@ikHWU&Ap=tK^A zEX1=2eXb#E%!g6KGQ5c8Sb@LdCCB(T)Ky7hh$Dd{ny?yH#~N4@Yr!`bC)R;)ElI40 z^|1jq#76L)ONmV&{U$c`ZG)R(b8LYvu{Ecs`)}YrnqCQ|S3>EPPUHXD?8hxdtcmL;jS8vSmuajj#%c1WsX?ph~?OUI0y&h5FCob zU@y$rx1rTi@-ihaQ}Qw;FH`a|B`;I*G9@ol@-ihaQ}Qw;FH`a|B`;I*G9@ol@-iha zQ}Qw;FH`a|B`;I*G9@ol@-ihaQ}Qw;FH`a|B`;I*G9@ol@-hW4Q{6JveVFP#Om!co zx(`#`hpFzvRQF-3yM*d4p}I?`?h>lIgz7G#x=X0;5~{m|>Mo(WOQ`M=s=I{hE}^lIgz7G#x=X0;Osbovx@oGLrn+gWo2Iz4DDEtZJB#AZqPVjt z?ktKsi{j3rxU(qkER~fq^(<4*GW9G|&ocEaQ_r#$4ofIznPM(c?Fgw@NX3jE@hN;7 zC*fp7-~99$d={UBJzuC;NX0@b7E-a0iiK1xq+%fz3#nL0#X>3;Qn8SVg;Xr0Vj&d^ zsaQzGLMj$gv5<;|R4k-oAr%X$SV+Y}Di%_)0qdz_)>Fscl0A9vblmphp>!do3n^Vl z=|V~uQo4}Rg_JI&bRne+DP2hELP{4>x{%U^lrE%nA*Bl`T}bIdN*7YPkkW;eE~IoJ zr3)!tNa;dK7gD;A(uI^Rq;w&r3n^Vl0@ zkjjNrE~IiHl?$m{NaaE*7gD*9%7s)eq;esZ3#nX4!Na9iLLAT#5Nd;u-Z4_L=OU>*B_b?gJyu@4wWm5rmy#!+SC zsIqZXIYBcLG{ZQmY#dcKjw%~Rm5rmy#!+SCsIqZX+4!k!{8To6DjPqQji1WKPi5n$ zvhh>d_^E9CR5pGp8$XqepUTEhW#gx^@l)COscigIHhwA_Kb4K2%EnJ+a(AQ({TpQ#925SR?#KhgKquA(&X3b4cyXSd7DX zNR&+zF$t4l1lPC^Zaa6%Z*R|r9X#&nap(H%rd_a?-@ji~PnEi9Z;$(6U+^^!8FI)n zcPw+qwEG@rTQeK4-x^CGi6*Ru)v*TF#9CMz>tJ21hxM@mHpE8Q7@J@WHpOPx99v*Z ztekxv>yDRk7>@~>H9<+@p}o8`J$uAAk$S+1Mqx>>H9<+@p}o8`J$uAAk$S+1Mq zx>>H9<+@p}o8`J$uAAk$*?2Rzy`(-*MRA^r;ye|_c`AzYR21i_D9(%DZftW0qHmCH z@%RVag+Jm?_%rM@6Tb&`n~B?PCT_QxxZP&BZ#^FD6g$IU}-KE%z3xcLw_AL8aiiLK0?Z0&d3U@XRAJSJcwCSfwBz_*wrw!`+= z0Xt%6y^{TVCs?Of3I(w_??5(P^x2n$GsychC>g=tmv$v|w-l{r#tLp5ns3J?qNlOT$=x3B#dOTT zeQ3q~cmU7TA5YAOl?_rxkCf3PW%NiHJyJ%Gl+hz)^hg;!Qbv!I(IaK_NEtm+Mvs)y zBW3hR89h=)kCf3PW%NiHJyJ%Gl+hz)^hg;!Qbv!I(IaK_NEtm+Mvs)yBW3hR89h=) zkCf3PW%NiHJ;^t_6Vs_)a~e*^88{PX;cT2At##ti7y3@TizJD!`?vY_#=f54@qgF( zKlAI{y)yEhPyVmZ{|)%}%iVo>{oizV?)_@x-1kSWj(xB%_#;=(a`nKtcZjpQo6$9T zd-i^pSsMEVjx~2S4&!03YOY@5>LspT8g=y&S1)n(5?3#A^%7SvarKh>e@7~_)(LU+ z5=Sp_^b$uear6>LFLCq|M=x>o5=Sp_^b$uear6>LFLCq|M=x>o5=Sp_^b$uear6>L zFLCq|M=x>o5=Sp_^b$uear6>LFLCq|M=x>o5=Sp_^wOJjbaRJ}qZ@k2Ypw6){3Xs` z;`}AfU*h~F&R^pEjXe-Ke~I(gIDd`v*EoNT^Vc|kjq}$ye~t6kIDd`v*EoNT^Vc|k zjq}$ye~t6kIDd`v*EoNT^Vc|kjq}$ye~t6kIDd`v*EoNk^XEB#p7ZB9f1dN_Ie(t> z=Q)3Y^XEB#p7ZB9f1dN_Ie(t>=Q)3#^XEB#p7ZB9f1dN_Ie(t>=Q)3#^XEB#p7ZB9 zf1dN_Ie(t>=Q)3#^XEB#p7ZB9f1dN_Ie(t>=Z&|Qa{mAQez+UVz21&HaHqQ#T0H&% zcj1rt6aI|5aS!grbj-kgX!SSl#{=+P!Q4O3{qx*E&;9ewMm!z&n!8kBj{85y z{h#Ch&vF0fIDZ%C@8bMjoWG0ncX9qM&fmrPyEuOr=kMb3c`l#l@_80T&vW@am(O$gJeSXN`8=1;bNM`%&vW@am(O$gJeSXN`8=1;bNM`%&vW@am(O$g zJeSXN`8=1;bNM`%&vW_ZTzJ z#7w`Rg$FSk?wv@ucOv25iG+J667HQyxOXDq-id^JClc^2RdO-*+d@plug)EHqnJ=(T(TOgXi%A7NHkKl+cHM3?M)mi+%nj z7{pRkP(=v+LQ)ANl|WJnB$Yr?2_%(3QVArLKvD@Ll|WJnB$Yr?2_%(3QVArLKvD@L zl|WJnB$Yr?2_%(3QVArLKvD@Ll|WJnk{g*b-WZ$sd5p(Ru^BeU7T6M7VQXyTIY!D! zBju!#a&iKUl#@ovNh9Ut6l{y_ussgIfnIkI4#puk6o=yo9EqcFG>*ZsI1b0-1bhmg z#z{CCr{GlYc^Xc~88{PX;cT4a_vhk#N$CQ7rIDE2dFJu!Xw*bJUIjBgNh=hS*LhSo zZPZ4VcpOAj)gOkWnEabGvpzP%e`4>-{jFG%JEWz&v{V{ROQpu%mD+uinWiQ)P0^nI zO;-1>Hqng4nQ9|#Y9noGBW-FUZL!s`I@Z9NSPN@o9juG>us$}xhS&%jV-t+Qrq~Rd zV+(AFt?DzZUYcQ+Vo-`2l%fWus6i=eP>LFqq6T9J;vgK1LvSb#!x1>Oo{F7@Z~M6! zm*7%dhRbmUuEbSvAD{#^C_xQMP=gZGpaeB2K@Cb!gA&xB1T`o@4N6dh64amsH7G$1 zN>GCm)Sv`4C_xQMP=gZGpaeB2K@Cb!gA&xB1T`o@4N6dNW!Tl%1BTd2`VE&WhAJK1eKAX zG7?lqg33rx83`&QL1iSUj0BaDpfVCvMuN&nP#Fm-BSB>(sEh;^t;T9oJ84rpX;V9C zQ#)x>J84rpX^Xorr!kWet;GK!euSxTuZ>hykgA@SstQt7L8>Z9RRyW4AXOEls)AHi zkg5t&RY9sMNL2-?DkD{8q^gWmm6574QdLH(%1BiisVXB?Wu&T%RF#pcGE!AWs>(=J z8L28GRb`~Aj8v78sxnelMykq4RT-%&BUNRjs*F^Xk*YFMRYt1HNL3lBDkD{8q^gWm zRgkJOQdL2!Do9lYsj47V6{MNL(3-Dt)|8Hp<+ab+Z~jKr0Z zxH1w~M&imyTp5Y0AaNBWuA0PElelUUS54x|NL(3-t0r;PB(9poRg<`^cJu#V@^~K3 z=h_$4r>d=wlY<1WvbfBRJE087;(%t`FUr|q%?gHs9knRHM zE|Bg5=`N7&0_iT0?gHs9knRHME|Bg5=`N7&0_iT0?gHs9knRHME|Bg5=`N7&0_iT0 z?gHs9knRHME|Bg5>8?k*3tqFXGt=*9;X%yCLwFdEpbd}WFL(@(BZWD50&|hZJUoeZ zJcSIN#xqt2&PUeI3($d1w|0x}UFv z`!kc*`L~ft^7Zz69E9k7!-Wk&XYp4T+8|MR@2k^P_NHSJ+0YyWze zlr|`(Wu&x0DJ@#dG1wIC0j(}6rB$W0YLwC>w5r`o;#PAdkVF$!!|GTAYho>|jdidt z*2DVP02^W>Y>Z7X2Ag6tY>q9kCAO;HETP>jp@kA!D4~TCS}37~5?Uysg%VmQp@kA! zD4~TCS}37~5?Uys{Zc~vrGyqrXrY7_N@$^k7D{NLgceF@p@bGnXrY7_N@$^k7D{NL zgceF@p@bGnXrY7_N@$^k7D{NLgceF@p@bGnXrY7_N@$^k7D{NLgceF@p@bGnXrY7_ zN@(Gm+uzQ7e-q5@OJ1Sm6-r*AKLb-RDxfjiB{w0Qgj?!q7OC;S6n50(CYo}#{-y&S$Gh$@em%yBWS~;_zNDx<49o+p1@qBF%M6o9Zw;Hr(x%Oi7O>> zr6jJD#Fdh`QW956;z~(eDT!-=#Fdh`7D!wRB(4P#*8+)afyA{y;#weaEs(g<5?5N{ zN=sa6i7PE}r6sPk#Fdt~(h^r%;z~uB^nB zmAJAJS61T6N?ciqD=TqjC9bT*m6f=%5?5B@%1T^Wi7P8{WhJhx#Fdq}vJzKT;>t=~ zS&1tvarH}F0}|JO#5Evs4MTPPzr@uqarH}F{SsHd#MLix zJuPuPEpa_9aXl?@JuPviB(9Xim6Etp5?4y%N=aNPiK{Ger6jJD#Fdh`QW956;z~(e zDTym3ait`#l*E;ixKa{VO5#dMTq%hwC2^%Bu9U=;lDJY5S4!eaNn9z3D|ChL=kpGUvb%Mlo z!v7^Mspr)bS4VQJH96xj9uqJTlQ0=mur0R3_SjWzYB%f-`?DqY#Jlkxych3-^)^Yf za!KoLl4j*dPCDlKXqDZPCkWYl|ef*Zw}ck(%1S{+)Kw zOytNNf!)$u^xbyd(p&W1cHPoj^xbyd(%ZArTc7k6N^dFYEgacn)noKscXlj|Qk(CJ z_`f~m{%;St|Jy_EzhVzLX+0~gXQlP5w4RmLv(kE2TF*-BS!q2ht!Jh6thAn$*0a)j zR$9+W>se_%E3Idx^{lj>mDaP;dRAJ`O6yr^Ju9terS+_|o|e|r(t282PfP1*X+15i zr=|6@wEm2=o|e|r(t282PfP1*X+15ir=|6@w4RpM)6#lcT2D*sX=yzzt*52+w6va< z*3;5@T3Sy_>uG5{Ev=`e^|Z8}me$kKdRkgfOY3QAJuR)LrS;-#ezU_{v+DaJjk@a3 z)mKMqt5MQ_v$fT8Be{R{PXe`_xwZ)K>e{R{PXe`_xwZ)K>e{R{PXe`_xwZ)K>e{R{PXe z`_xwZ)K>e{R{PXe`_xwZ)K>e{R{PXe`x4jUy882p@8WuY&mN*?&O6PVcbYlxG;`i* z=DgF)d8e84s@iH*ZMCYlT2))Es;ySlR;y~ORkhWs+Gp9tya}mt7@xN zwbiQHYE^Busp9tyU9h%)^st$5Y7QX*}co=OgRq1?WI0a>!#L3h07e4b)bvYO7VX)vDTR zRc*DZwpvwNt*Wh7)mE!&t5vnts@iH*ZMCYlT2))^G=tu02EEe^dZ!umPBZA8X3#s$ zpm&-5_#3W3{6zHdt{tJ@+3&~y0Q16D_u?P0VyYU{p7w^Mfu>VUk+Iw|xd=UF!UwjDr z;lua{K8pSEDWB!jI0+}?6rAew+rKw?I?lkEI16Xv9KSyoZ_(baN&DO+U$7_JBKyDg z+W)m!pELR$q=o<2-rX!oQdR*NE~~i(5x5Um>_ve+f}mcDf8ot>78!iq2>B5Xr=YVA ziDt&sWVjojf`S-CB3fbwB8*;~m`$&Hp7&(-$*a%Yf1N!E_eRfiF1V8W-^l%4a{u}U z?EYW0et!d2zwPwfPP^@XVeW6h-rs=r9@EZyOgrx}?cOuZc%NzKeWvfc@_5I0MDOsI z=-=xGEbSNV7ws4A7ws4A7ws4A7ws4A7ws4A7ws4A7ws4A7ws4A7ws4A7ws4A7ws4A z7ws4A7ws4AC+#QgC+#QgC+#QgC+#Qge?t37`$_vr`$_vr`$_vr`$_vr`$_vr`$_vr z`$_vr`$_vr`$_vr`$_vr`$_vr`$_vr`$_vr`$_vr`$_vr`==j3`#-1s*>`i!+CSgD z`3LRK_WHBE{%o&5+w0Hv`m??MY_C7t>(BQ3v%UUouRq)CC+#QgC+#QgC+#QgC+#Qg zC+#QgC+#QgC+#QgC+#QgC+#QgC+#QgC+#QgC+#QgC+#QgC+#QgC+#QgC+#QgC+#Qg zC+(jvXeI5>_WHBE{%o&5+w0Hv`m??MY_EU5uyv&UBkdn)|492s+CS3%k@kq5XyS7usKFf1&+__7~b;Xus_A%TB-cJM$B>H&@0j6e{;+3A;^e%a}loqpNrmz{pu>6e{;U3U62?a#D7)Ba5RGwq-M>SUq#h2j^AUnqXL zC_X7ZDLyGaDLyGaDLyIwd=V@uJ}EvaJ}EvaJ}EvaJ}EvaJ}EvaJ}EvaJ}EvaJ}Eva zJ}EvaJ}EvaJ}EvaJ}Evaezvcl?dumi`Xu)x_Y=9F$o)j_CvrcL`;pvF6|c+>6|c+>6}n*?vjMGo5Cx z?Lu$N`^G)8{RielGn#HbGXB5V|J^(=ADc7>^NIP?+?vT8jf=ofeutObi`xnNZ)g8X1w2=Ek?hCmuFXX_M`1g0*zb*XxJMQ;)-2ZRxxRd`t{sZ|Bh>y z59B|P|3Ll&`48kjkpDpb1Njf+Kal@G{sZ|Bh>y59B|P|3Ll&`48kDPL?c`ZKPDYqfCw1JpuS3tcUAwb0cnAF0g7ACbYsf9@`Owa6%p6{xK*Qx)m#qfro{k3`1yk&l4 z{(D7q7132hR}o!BbQRH6M1P_pp2~MyRK-D6xOJc=KJ^^o_VN3d=LZke#jU#dOkI@c T2VZ{M#qTJE@s01h>~{YK&lW|r literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt new file mode 100644 index 0000000..f09443c --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2023 The Young Serif Project Authors (https://github.com/noirblancrouge/YoungSerif) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f454fbedd4c8b00833d17fffa1f89acb5149b02c GIT binary patch literal 105136 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 fs.writeFileSync("doc.docx", buffer)); +``` + +### Validation +After creating the file, validate it. If validation fails, unpack, fix the XML, and repack. +```bash +python scripts/office/validate.py doc.docx +``` + +### Page Size + +```javascript +// CRITICAL: docx-js defaults to A4, not US Letter +// Always set page size explicitly for consistent results +sections: [{ + properties: { + page: { + size: { + width: 12240, // 8.5 inches in DXA + height: 15840 // 11 inches in DXA + }, + margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } // 1 inch margins + } + }, + children: [/* content */] +}] +``` + +**Common page sizes (DXA units, 1440 DXA = 1 inch):** + +| Paper | Width | Height | Content Width (1" margins) | +|-------|-------|--------|---------------------------| +| US Letter | 12,240 | 15,840 | 9,360 | +| A4 (default) | 11,906 | 16,838 | 9,026 | + +**Landscape orientation:** docx-js swaps width/height internally, so pass portrait dimensions and let it handle the swap: +```javascript +size: { + width: 12240, // Pass SHORT edge as width + height: 15840, // Pass LONG edge as height + orientation: PageOrientation.LANDSCAPE // docx-js swaps them in the XML +}, +// Content width = 15840 - left margin - right margin (uses the long edge) +``` + +### Styles (Override Built-in Headings) + +Use Arial as the default font (universally supported). Keep titles black for readability. + +```javascript +const doc = new Document({ + styles: { + default: { document: { run: { font: "Arial", size: 24 } } }, // 12pt default + paragraphStyles: [ + // IMPORTANT: Use exact IDs to override built-in styles + { id: "Heading1", name: "Heading 1", basedOn: "Normal", next: "Normal", quickFormat: true, + run: { size: 32, bold: true, font: "Arial" }, + paragraph: { spacing: { before: 240, after: 240 }, outlineLevel: 0 } }, // outlineLevel required for TOC + { id: "Heading2", name: "Heading 2", basedOn: "Normal", next: "Normal", quickFormat: true, + run: { size: 28, bold: true, font: "Arial" }, + paragraph: { spacing: { before: 180, after: 180 }, outlineLevel: 1 } }, + ] + }, + sections: [{ + children: [ + new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("Title")] }), + ] + }] +}); +``` + +### Lists (NEVER use unicode bullets) + +```javascript +// ❌ WRONG - never manually insert bullet characters +new Paragraph({ children: [new TextRun("• Item")] }) // BAD +new Paragraph({ children: [new TextRun("\u2022 Item")] }) // BAD + +// ✅ CORRECT - use numbering config with LevelFormat.BULLET +const doc = new Document({ + numbering: { + config: [ + { reference: "bullets", + levels: [{ level: 0, format: LevelFormat.BULLET, text: "•", alignment: AlignmentType.LEFT, + style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] }, + { reference: "numbers", + levels: [{ level: 0, format: LevelFormat.DECIMAL, text: "%1.", alignment: AlignmentType.LEFT, + style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] }, + ] + }, + sections: [{ + children: [ + new Paragraph({ numbering: { reference: "bullets", level: 0 }, + children: [new TextRun("Bullet item")] }), + new Paragraph({ numbering: { reference: "numbers", level: 0 }, + children: [new TextRun("Numbered item")] }), + ] + }] +}); + +// ⚠️ Each reference creates INDEPENDENT numbering +// Same reference = continues (1,2,3 then 4,5,6) +// Different reference = restarts (1,2,3 then 1,2,3) +``` + +### Tables + +**CRITICAL: Tables need dual widths** - set both `columnWidths` on the table AND `width` on each cell. Without both, tables render incorrectly on some platforms. + +```javascript +// CRITICAL: Always set table width for consistent rendering +// CRITICAL: Use ShadingType.CLEAR (not SOLID) to prevent black backgrounds +const border = { style: BorderStyle.SINGLE, size: 1, color: "CCCCCC" }; +const borders = { top: border, bottom: border, left: border, right: border }; + +new Table({ + width: { size: 9360, type: WidthType.DXA }, // Always use DXA (percentages break in Google Docs) + columnWidths: [4680, 4680], // Must sum to table width (DXA: 1440 = 1 inch) + rows: [ + new TableRow({ + children: [ + new TableCell({ + borders, + width: { size: 4680, type: WidthType.DXA }, // Also set on each cell + shading: { fill: "D5E8F0", type: ShadingType.CLEAR }, // CLEAR not SOLID + margins: { top: 80, bottom: 80, left: 120, right: 120 }, // Cell padding (internal, not added to width) + children: [new Paragraph({ children: [new TextRun("Cell")] })] + }) + ] + }) + ] +}) +``` + +**Table width calculation:** + +Always use `WidthType.DXA` — `WidthType.PERCENTAGE` breaks in Google Docs. + +```javascript +// Table width = sum of columnWidths = content width +// US Letter with 1" margins: 12240 - 2880 = 9360 DXA +width: { size: 9360, type: WidthType.DXA }, +columnWidths: [7000, 2360] // Must sum to table width +``` + +**Width rules:** +- **Always use `WidthType.DXA`** — never `WidthType.PERCENTAGE` (incompatible with Google Docs) +- Table width must equal the sum of `columnWidths` +- Cell `width` must match corresponding `columnWidth` +- Cell `margins` are internal padding - they reduce content area, not add to cell width +- For full-width tables: use content width (page width minus left and right margins) + +### Images + +```javascript +// CRITICAL: type parameter is REQUIRED +new Paragraph({ + children: [new ImageRun({ + type: "png", // Required: png, jpg, jpeg, gif, bmp, svg + data: fs.readFileSync("image.png"), + transformation: { width: 200, height: 150 }, + altText: { title: "Title", description: "Desc", name: "Name" } // All three required + })] +}) +``` + +### Page Breaks + +```javascript +// CRITICAL: PageBreak must be inside a Paragraph +new Paragraph({ children: [new PageBreak()] }) + +// Or use pageBreakBefore +new Paragraph({ pageBreakBefore: true, children: [new TextRun("New page")] }) +``` + +### Hyperlinks + +```javascript +// External link +new Paragraph({ + children: [new ExternalHyperlink({ + children: [new TextRun({ text: "Click here", style: "Hyperlink" })], + link: "https://example.com", + })] +}) + +// Internal link (bookmark + reference) +// 1. Create bookmark at destination +new Paragraph({ heading: HeadingLevel.HEADING_1, children: [ + new Bookmark({ id: "chapter1", children: [new TextRun("Chapter 1")] }), +]}) +// 2. Link to it +new Paragraph({ children: [new InternalHyperlink({ + children: [new TextRun({ text: "See Chapter 1", style: "Hyperlink" })], + anchor: "chapter1", +})]}) +``` + +### Footnotes + +```javascript +const doc = new Document({ + footnotes: { + 1: { children: [new Paragraph("Source: Annual Report 2024")] }, + 2: { children: [new Paragraph("See appendix for methodology")] }, + }, + sections: [{ + children: [new Paragraph({ + children: [ + new TextRun("Revenue grew 15%"), + new FootnoteReferenceRun(1), + new TextRun(" using adjusted metrics"), + new FootnoteReferenceRun(2), + ], + })] + }] +}); +``` + +### Tab Stops + +```javascript +// Right-align text on same line (e.g., date opposite a title) +new Paragraph({ + children: [ + new TextRun("Company Name"), + new TextRun("\tJanuary 2025"), + ], + tabStops: [{ type: TabStopType.RIGHT, position: TabStopPosition.MAX }], +}) + +// Dot leader (e.g., TOC-style) +new Paragraph({ + children: [ + new TextRun("Introduction"), + new TextRun({ children: [ + new PositionalTab({ + alignment: PositionalTabAlignment.RIGHT, + relativeTo: PositionalTabRelativeTo.MARGIN, + leader: PositionalTabLeader.DOT, + }), + "3", + ]}), + ], +}) +``` + +### Multi-Column Layouts + +```javascript +// Equal-width columns +sections: [{ + properties: { + column: { + count: 2, // number of columns + space: 720, // gap between columns in DXA (720 = 0.5 inch) + equalWidth: true, + separate: true, // vertical line between columns + }, + }, + children: [/* content flows naturally across columns */] +}] + +// Custom-width columns (equalWidth must be false) +sections: [{ + properties: { + column: { + equalWidth: false, + children: [ + new Column({ width: 5400, space: 720 }), + new Column({ width: 3240 }), + ], + }, + }, + children: [/* content */] +}] +``` + +Force a column break with a new section using `type: SectionType.NEXT_COLUMN`. + +### Table of Contents + +```javascript +// CRITICAL: Headings must use HeadingLevel ONLY - no custom styles +new TableOfContents("Table of Contents", { hyperlink: true, headingStyleRange: "1-3" }) +``` + +### Headers/Footers + +```javascript +sections: [{ + properties: { + page: { margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } } // 1440 = 1 inch + }, + headers: { + default: new Header({ children: [new Paragraph({ children: [new TextRun("Header")] })] }) + }, + footers: { + default: new Footer({ children: [new Paragraph({ + children: [new TextRun("Page "), new TextRun({ children: [PageNumber.CURRENT] })] + })] }) + }, + children: [/* content */] +}] +``` + +### Critical Rules for docx-js + +- **Set page size explicitly** - docx-js defaults to A4; use US Letter (12240 x 15840 DXA) for US documents +- **Landscape: pass portrait dimensions** - docx-js swaps width/height internally; pass short edge as `width`, long edge as `height`, and set `orientation: PageOrientation.LANDSCAPE` +- **Never use `\n`** - use separate Paragraph elements +- **Never use unicode bullets** - use `LevelFormat.BULLET` with numbering config +- **PageBreak must be in Paragraph** - standalone creates invalid XML +- **ImageRun requires `type`** - always specify png/jpg/etc +- **Always set table `width` with DXA** - never use `WidthType.PERCENTAGE` (breaks in Google Docs) +- **Tables need dual widths** - `columnWidths` array AND cell `width`, both must match +- **Table width = sum of columnWidths** - for DXA, ensure they add up exactly +- **Always add cell margins** - use `margins: { top: 80, bottom: 80, left: 120, right: 120 }` for readable padding +- **Use `ShadingType.CLEAR`** - never SOLID for table shading +- **Never use tables as dividers/rules** - cells have minimum height and render as empty boxes (including in headers/footers); use `border: { bottom: { style: BorderStyle.SINGLE, size: 6, color: "2E75B6", space: 1 } }` on a Paragraph instead. For two-column footers, use tab stops (see Tab Stops section), not tables +- **TOC requires HeadingLevel only** - no custom styles on heading paragraphs +- **Override built-in styles** - use exact IDs: "Heading1", "Heading2", etc. +- **Include `outlineLevel`** - required for TOC (0 for H1, 1 for H2, etc.) + +--- + +## Editing Existing Documents + +**Follow all 3 steps in order.** + +### Step 1: Unpack +```bash +python scripts/office/unpack.py document.docx unpacked/ +``` +Extracts XML, pretty-prints, merges adjacent runs, and converts smart quotes to XML entities (`“` etc.) so they survive editing. Use `--merge-runs false` to skip run merging. + +### Step 2: Edit XML + +Edit files in `unpacked/word/`. See XML Reference below for patterns. + +**Use "Claude" as the author** for tracked changes and comments, unless the user explicitly requests use of a different name. + +**Use the Edit tool directly for string replacement. Do not write Python scripts.** Scripts introduce unnecessary complexity. The Edit tool shows exactly what is being replaced. + +**CRITICAL: Use smart quotes for new content.** When adding text with apostrophes or quotes, use XML entities to produce smart quotes: +```xml + +Here’s a quote: “Hello” +``` +| Entity | Character | +|--------|-----------| +| `‘` | ‘ (left single) | +| `’` | ’ (right single / apostrophe) | +| `“` | “ (left double) | +| `”` | ” (right double) | + +**Adding comments:** Use `comment.py` to handle boilerplate across multiple XML files (text must be pre-escaped XML): +```bash +python scripts/comment.py unpacked/ 0 "Comment text with & and ’" +python scripts/comment.py unpacked/ 1 "Reply text" --parent 0 # reply to comment 0 +python scripts/comment.py unpacked/ 0 "Text" --author "Custom Author" # custom author name +``` +Then add markers to document.xml (see Comments in XML Reference). + +### Step 3: Pack +```bash +python scripts/office/pack.py unpacked/ output.docx --original document.docx +``` +Validates with auto-repair, condenses XML, and creates DOCX. Use `--validate false` to skip. + +**Auto-repair will fix:** +- `durableId` >= 0x7FFFFFFF (regenerates valid ID) +- Missing `xml:space="preserve"` on `` with whitespace + +**Auto-repair won't fix:** +- Malformed XML, invalid element nesting, missing relationships, schema violations + +### Common Pitfalls + +- **Replace entire `` elements**: When adding tracked changes, replace the whole `...` block with `......` as siblings. Don't inject tracked change tags inside a run. +- **Preserve `` formatting**: Copy the original run's `` block into your tracked change runs to maintain bold, font size, etc. + +--- + +## XML Reference + +### Schema Compliance + +- **Element order in ``**: ``, ``, ``, ``, ``, `` last +- **Whitespace**: Add `xml:space="preserve"` to `` with leading/trailing spaces +- **RSIDs**: Must be 8-digit hex (e.g., `00AB1234`) + +### Tracked Changes + +**Insertion:** +```xml + + inserted text + +``` + +**Deletion:** +```xml + + deleted text + +``` + +**Inside ``**: Use `` instead of ``, and `` instead of ``. + +**Minimal edits** - only mark what changes: +```xml + +The term is + + 30 + + + 60 + + days. +``` + +**Deleting entire paragraphs/list items** - when removing ALL content from a paragraph, also mark the paragraph mark as deleted so it merges with the next paragraph. Add `` inside ``: +```xml + + + ... + + + + + + Entire paragraph content being deleted... + + +``` +Without the `` in ``, accepting changes leaves an empty paragraph/list item. + +**Rejecting another author's insertion** - nest deletion inside their insertion: +```xml + + + their inserted text + + +``` + +**Restoring another author's deletion** - add insertion after (don't modify their deletion): +```xml + + deleted text + + + deleted text + +``` + +### Comments + +After running `comment.py` (see Step 2), add markers to document.xml. For replies, use `--parent` flag and nest markers inside the parent's. + +**CRITICAL: `` and `` are siblings of ``, never inside ``.** + +```xml + + + + deleted + + more text + + + + + + + text + + + + +``` + +### Images + +1. Add image file to `word/media/` +2. Add relationship to `word/_rels/document.xml.rels`: +```xml + +``` +3. Add content type to `[Content_Types].xml`: +```xml + +``` +4. Reference in document.xml: +```xml + + + + + + + + + + + + +``` + +--- + +## Dependencies + +- **pandoc**: Text extraction +- **docx**: `npm install -g docx` (new documents) +- **LibreOffice**: PDF conversion (auto-configured for sandboxed environments via `scripts/office/soffice.py`) +- **Poppler**: `pdftoppm` for images diff --git a/.claude/skills/docx/scripts/__init__.py b/.claude/skills/docx/scripts/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.claude/skills/docx/scripts/__init__.py @@ -0,0 +1 @@ + diff --git a/.claude/skills/docx/scripts/accept_changes.py b/.claude/skills/docx/scripts/accept_changes.py new file mode 100644 index 0000000..8e36316 --- /dev/null +++ b/.claude/skills/docx/scripts/accept_changes.py @@ -0,0 +1,135 @@ +"""Accept all tracked changes in a DOCX file using LibreOffice. + +Requires LibreOffice (soffice) to be installed. +""" + +import argparse +import logging +import shutil +import subprocess +from pathlib import Path + +from office.soffice import get_soffice_env + +logger = logging.getLogger(__name__) + +LIBREOFFICE_PROFILE = "/tmp/libreoffice_docx_profile" +MACRO_DIR = f"{LIBREOFFICE_PROFILE}/user/basic/Standard" + +ACCEPT_CHANGES_MACRO = """ + + + Sub AcceptAllTrackedChanges() + Dim document As Object + Dim dispatcher As Object + + document = ThisComponent.CurrentController.Frame + dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") + + dispatcher.executeDispatch(document, ".uno:AcceptAllTrackedChanges", "", 0, Array()) + ThisComponent.store() + ThisComponent.close(True) + End Sub +""" + + +def accept_changes( + input_file: str, + output_file: str, +) -> tuple[None, str]: + input_path = Path(input_file) + output_path = Path(output_file) + + if not input_path.exists(): + return None, f"Error: Input file not found: {input_file}" + + if not input_path.suffix.lower() == ".docx": + return None, f"Error: Input file is not a DOCX file: {input_file}" + + try: + output_path.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(input_path, output_path) + except Exception as e: + return None, f"Error: Failed to copy input file to output location: {e}" + + if not _setup_libreoffice_macro(): + return None, "Error: Failed to setup LibreOffice macro" + + cmd = [ + "soffice", + "--headless", + f"-env:UserInstallation=file://{LIBREOFFICE_PROFILE}", + "--norestore", + "vnd.sun.star.script:Standard.Module1.AcceptAllTrackedChanges?language=Basic&location=application", + str(output_path.absolute()), + ] + + try: + result = subprocess.run( + cmd, + capture_output=True, + text=True, + timeout=30, + check=False, + env=get_soffice_env(), + ) + except subprocess.TimeoutExpired: + return ( + None, + f"Successfully accepted all tracked changes: {input_file} -> {output_file}", + ) + + if result.returncode != 0: + return None, f"Error: LibreOffice failed: {result.stderr}" + + return ( + None, + f"Successfully accepted all tracked changes: {input_file} -> {output_file}", + ) + + +def _setup_libreoffice_macro() -> bool: + macro_dir = Path(MACRO_DIR) + macro_file = macro_dir / "Module1.xba" + + if macro_file.exists() and "AcceptAllTrackedChanges" in macro_file.read_text(): + return True + + if not macro_dir.exists(): + subprocess.run( + [ + "soffice", + "--headless", + f"-env:UserInstallation=file://{LIBREOFFICE_PROFILE}", + "--terminate_after_init", + ], + capture_output=True, + timeout=10, + check=False, + env=get_soffice_env(), + ) + macro_dir.mkdir(parents=True, exist_ok=True) + + try: + macro_file.write_text(ACCEPT_CHANGES_MACRO) + return True + except Exception as e: + logger.warning(f"Failed to setup LibreOffice macro: {e}") + return False + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Accept all tracked changes in a DOCX file" + ) + parser.add_argument("input_file", help="Input DOCX file with tracked changes") + parser.add_argument( + "output_file", help="Output DOCX file (clean, no tracked changes)" + ) + args = parser.parse_args() + + _, message = accept_changes(args.input_file, args.output_file) + print(message) + + if "Error" in message: + raise SystemExit(1) diff --git a/.claude/skills/docx/scripts/comment.py b/.claude/skills/docx/scripts/comment.py new file mode 100644 index 0000000..36e1c93 --- /dev/null +++ b/.claude/skills/docx/scripts/comment.py @@ -0,0 +1,318 @@ +"""Add comments to DOCX documents. + +Usage: + python comment.py unpacked/ 0 "Comment text" + python comment.py unpacked/ 1 "Reply text" --parent 0 + +Text should be pre-escaped XML (e.g., & for &, ’ for smart quotes). + +After running, add markers to document.xml: + + ... commented content ... + + +""" + +import argparse +import random +import shutil +import sys +from datetime import datetime, timezone +from pathlib import Path + +import defusedxml.minidom + +TEMPLATE_DIR = Path(__file__).parent / "templates" +NS = { + "w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main", + "w14": "http://schemas.microsoft.com/office/word/2010/wordml", + "w15": "http://schemas.microsoft.com/office/word/2012/wordml", + "w16cid": "http://schemas.microsoft.com/office/word/2016/wordml/cid", + "w16cex": "http://schemas.microsoft.com/office/word/2018/wordml/cex", +} + +COMMENT_XML = """\ + + + + + + + + + + + + + {text} + + +""" + +COMMENT_MARKER_TEMPLATE = """ +Add to document.xml (markers must be direct children of w:p, never inside w:r): + + ... + + """ + +REPLY_MARKER_TEMPLATE = """ +Nest markers inside parent {pid}'s markers (markers must be direct children of w:p, never inside w:r): + + ... + + + """ + + +def _generate_hex_id() -> str: + return f"{random.randint(0, 0x7FFFFFFE):08X}" + + +SMART_QUOTE_ENTITIES = { + "\u201c": "“", + "\u201d": "”", + "\u2018": "‘", + "\u2019": "’", +} + + +def _encode_smart_quotes(text: str) -> str: + for char, entity in SMART_QUOTE_ENTITIES.items(): + text = text.replace(char, entity) + return text + + +def _append_xml(xml_path: Path, root_tag: str, content: str) -> None: + dom = defusedxml.minidom.parseString(xml_path.read_text(encoding="utf-8")) + root = dom.getElementsByTagName(root_tag)[0] + ns_attrs = " ".join(f'xmlns:{k}="{v}"' for k, v in NS.items()) + wrapper_dom = defusedxml.minidom.parseString(f"{content}") + for child in wrapper_dom.documentElement.childNodes: + if child.nodeType == child.ELEMENT_NODE: + root.appendChild(dom.importNode(child, True)) + output = _encode_smart_quotes(dom.toxml(encoding="UTF-8").decode("utf-8")) + xml_path.write_text(output, encoding="utf-8") + + +def _find_para_id(comments_path: Path, comment_id: int) -> str | None: + dom = defusedxml.minidom.parseString(comments_path.read_text(encoding="utf-8")) + for c in dom.getElementsByTagName("w:comment"): + if c.getAttribute("w:id") == str(comment_id): + for p in c.getElementsByTagName("w:p"): + if pid := p.getAttribute("w14:paraId"): + return pid + return None + + +def _get_next_rid(rels_path: Path) -> int: + dom = defusedxml.minidom.parseString(rels_path.read_text(encoding="utf-8")) + max_rid = 0 + for rel in dom.getElementsByTagName("Relationship"): + rid = rel.getAttribute("Id") + if rid and rid.startswith("rId"): + try: + max_rid = max(max_rid, int(rid[3:])) + except ValueError: + pass + return max_rid + 1 + + +def _has_relationship(rels_path: Path, target: str) -> bool: + dom = defusedxml.minidom.parseString(rels_path.read_text(encoding="utf-8")) + for rel in dom.getElementsByTagName("Relationship"): + if rel.getAttribute("Target") == target: + return True + return False + + +def _has_content_type(ct_path: Path, part_name: str) -> bool: + dom = defusedxml.minidom.parseString(ct_path.read_text(encoding="utf-8")) + for override in dom.getElementsByTagName("Override"): + if override.getAttribute("PartName") == part_name: + return True + return False + + +def _ensure_comment_relationships(unpacked_dir: Path) -> None: + rels_path = unpacked_dir / "word" / "_rels" / "document.xml.rels" + if not rels_path.exists(): + return + + if _has_relationship(rels_path, "comments.xml"): + return + + dom = defusedxml.minidom.parseString(rels_path.read_text(encoding="utf-8")) + root = dom.documentElement + next_rid = _get_next_rid(rels_path) + + rels = [ + ( + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments", + "comments.xml", + ), + ( + "http://schemas.microsoft.com/office/2011/relationships/commentsExtended", + "commentsExtended.xml", + ), + ( + "http://schemas.microsoft.com/office/2016/09/relationships/commentsIds", + "commentsIds.xml", + ), + ( + "http://schemas.microsoft.com/office/2018/08/relationships/commentsExtensible", + "commentsExtensible.xml", + ), + ] + + for rel_type, target in rels: + rel = dom.createElement("Relationship") + rel.setAttribute("Id", f"rId{next_rid}") + rel.setAttribute("Type", rel_type) + rel.setAttribute("Target", target) + root.appendChild(rel) + next_rid += 1 + + rels_path.write_bytes(dom.toxml(encoding="UTF-8")) + + +def _ensure_comment_content_types(unpacked_dir: Path) -> None: + ct_path = unpacked_dir / "[Content_Types].xml" + if not ct_path.exists(): + return + + if _has_content_type(ct_path, "/word/comments.xml"): + return + + dom = defusedxml.minidom.parseString(ct_path.read_text(encoding="utf-8")) + root = dom.documentElement + + overrides = [ + ( + "/word/comments.xml", + "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml", + ), + ( + "/word/commentsExtended.xml", + "application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtended+xml", + ), + ( + "/word/commentsIds.xml", + "application/vnd.openxmlformats-officedocument.wordprocessingml.commentsIds+xml", + ), + ( + "/word/commentsExtensible.xml", + "application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtensible+xml", + ), + ] + + for part_name, content_type in overrides: + override = dom.createElement("Override") + override.setAttribute("PartName", part_name) + override.setAttribute("ContentType", content_type) + root.appendChild(override) + + ct_path.write_bytes(dom.toxml(encoding="UTF-8")) + + +def add_comment( + unpacked_dir: str, + comment_id: int, + text: str, + author: str = "Claude", + initials: str = "C", + parent_id: int | None = None, +) -> tuple[str, str]: + word = Path(unpacked_dir) / "word" + if not word.exists(): + return "", f"Error: {word} not found" + + para_id, durable_id = _generate_hex_id(), _generate_hex_id() + ts = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + + comments = word / "comments.xml" + first_comment = not comments.exists() + if first_comment: + shutil.copy(TEMPLATE_DIR / "comments.xml", comments) + _ensure_comment_relationships(Path(unpacked_dir)) + _ensure_comment_content_types(Path(unpacked_dir)) + _append_xml( + comments, + "w:comments", + COMMENT_XML.format( + id=comment_id, + author=author, + date=ts, + initials=initials, + para_id=para_id, + text=text, + ), + ) + + ext = word / "commentsExtended.xml" + if not ext.exists(): + shutil.copy(TEMPLATE_DIR / "commentsExtended.xml", ext) + if parent_id is not None: + parent_para = _find_para_id(comments, parent_id) + if not parent_para: + return "", f"Error: Parent comment {parent_id} not found" + _append_xml( + ext, + "w15:commentsEx", + f'', + ) + else: + _append_xml( + ext, + "w15:commentsEx", + f'', + ) + + ids = word / "commentsIds.xml" + if not ids.exists(): + shutil.copy(TEMPLATE_DIR / "commentsIds.xml", ids) + _append_xml( + ids, + "w16cid:commentsIds", + f'', + ) + + extensible = word / "commentsExtensible.xml" + if not extensible.exists(): + shutil.copy(TEMPLATE_DIR / "commentsExtensible.xml", extensible) + _append_xml( + extensible, + "w16cex:commentsExtensible", + f'', + ) + + action = "reply" if parent_id is not None else "comment" + return para_id, f"Added {action} {comment_id} (para_id={para_id})" + + +if __name__ == "__main__": + p = argparse.ArgumentParser(description="Add comments to DOCX documents") + p.add_argument("unpacked_dir", help="Unpacked DOCX directory") + p.add_argument("comment_id", type=int, help="Comment ID (must be unique)") + p.add_argument("text", help="Comment text") + p.add_argument("--author", default="Claude", help="Author name") + p.add_argument("--initials", default="C", help="Author initials") + p.add_argument("--parent", type=int, help="Parent comment ID (for replies)") + args = p.parse_args() + + para_id, msg = add_comment( + args.unpacked_dir, + args.comment_id, + args.text, + args.author, + args.initials, + args.parent, + ) + print(msg) + if "Error" in msg: + sys.exit(1) + cid = args.comment_id + if args.parent is not None: + print(REPLY_MARKER_TEMPLATE.format(pid=args.parent, cid=cid)) + else: + print(COMMENT_MARKER_TEMPLATE.format(cid=cid)) diff --git a/.claude/skills/docx/scripts/office/helpers/__init__.py b/.claude/skills/docx/scripts/office/helpers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/.claude/skills/docx/scripts/office/helpers/merge_runs.py b/.claude/skills/docx/scripts/office/helpers/merge_runs.py new file mode 100644 index 0000000..ad7c25e --- /dev/null +++ b/.claude/skills/docx/scripts/office/helpers/merge_runs.py @@ -0,0 +1,199 @@ +"""Merge adjacent runs with identical formatting in DOCX. + +Merges adjacent elements that have identical properties. +Works on runs in paragraphs and inside tracked changes (, ). + +Also: +- Removes rsid attributes from runs (revision metadata that doesn't affect rendering) +- Removes proofErr elements (spell/grammar markers that block merging) +""" + +from pathlib import Path + +import defusedxml.minidom + + +def merge_runs(input_dir: str) -> tuple[int, str]: + doc_xml = Path(input_dir) / "word" / "document.xml" + + if not doc_xml.exists(): + return 0, f"Error: {doc_xml} not found" + + try: + dom = defusedxml.minidom.parseString(doc_xml.read_text(encoding="utf-8")) + root = dom.documentElement + + _remove_elements(root, "proofErr") + _strip_run_rsid_attrs(root) + + containers = {run.parentNode for run in _find_elements(root, "r")} + + merge_count = 0 + for container in containers: + merge_count += _merge_runs_in(container) + + doc_xml.write_bytes(dom.toxml(encoding="UTF-8")) + return merge_count, f"Merged {merge_count} runs" + + except Exception as e: + return 0, f"Error: {e}" + + + + +def _find_elements(root, tag: str) -> list: + results = [] + + def traverse(node): + if node.nodeType == node.ELEMENT_NODE: + name = node.localName or node.tagName + if name == tag or name.endswith(f":{tag}"): + results.append(node) + for child in node.childNodes: + traverse(child) + + traverse(root) + return results + + +def _get_child(parent, tag: str): + for child in parent.childNodes: + if child.nodeType == child.ELEMENT_NODE: + name = child.localName or child.tagName + if name == tag or name.endswith(f":{tag}"): + return child + return None + + +def _get_children(parent, tag: str) -> list: + results = [] + for child in parent.childNodes: + if child.nodeType == child.ELEMENT_NODE: + name = child.localName or child.tagName + if name == tag or name.endswith(f":{tag}"): + results.append(child) + return results + + +def _is_adjacent(elem1, elem2) -> bool: + node = elem1.nextSibling + while node: + if node == elem2: + return True + if node.nodeType == node.ELEMENT_NODE: + return False + if node.nodeType == node.TEXT_NODE and node.data.strip(): + return False + node = node.nextSibling + return False + + + + +def _remove_elements(root, tag: str): + for elem in _find_elements(root, tag): + if elem.parentNode: + elem.parentNode.removeChild(elem) + + +def _strip_run_rsid_attrs(root): + for run in _find_elements(root, "r"): + for attr in list(run.attributes.values()): + if "rsid" in attr.name.lower(): + run.removeAttribute(attr.name) + + + + +def _merge_runs_in(container) -> int: + merge_count = 0 + run = _first_child_run(container) + + while run: + while True: + next_elem = _next_element_sibling(run) + if next_elem and _is_run(next_elem) and _can_merge(run, next_elem): + _merge_run_content(run, next_elem) + container.removeChild(next_elem) + merge_count += 1 + else: + break + + _consolidate_text(run) + run = _next_sibling_run(run) + + return merge_count + + +def _first_child_run(container): + for child in container.childNodes: + if child.nodeType == child.ELEMENT_NODE and _is_run(child): + return child + return None + + +def _next_element_sibling(node): + sibling = node.nextSibling + while sibling: + if sibling.nodeType == sibling.ELEMENT_NODE: + return sibling + sibling = sibling.nextSibling + return None + + +def _next_sibling_run(node): + sibling = node.nextSibling + while sibling: + if sibling.nodeType == sibling.ELEMENT_NODE: + if _is_run(sibling): + return sibling + sibling = sibling.nextSibling + return None + + +def _is_run(node) -> bool: + name = node.localName or node.tagName + return name == "r" or name.endswith(":r") + + +def _can_merge(run1, run2) -> bool: + rpr1 = _get_child(run1, "rPr") + rpr2 = _get_child(run2, "rPr") + + if (rpr1 is None) != (rpr2 is None): + return False + if rpr1 is None: + return True + return rpr1.toxml() == rpr2.toxml() + + +def _merge_run_content(target, source): + for child in list(source.childNodes): + if child.nodeType == child.ELEMENT_NODE: + name = child.localName or child.tagName + if name != "rPr" and not name.endswith(":rPr"): + target.appendChild(child) + + +def _consolidate_text(run): + t_elements = _get_children(run, "t") + + for i in range(len(t_elements) - 1, 0, -1): + curr, prev = t_elements[i], t_elements[i - 1] + + if _is_adjacent(prev, curr): + prev_text = prev.firstChild.data if prev.firstChild else "" + curr_text = curr.firstChild.data if curr.firstChild else "" + merged = prev_text + curr_text + + if prev.firstChild: + prev.firstChild.data = merged + else: + prev.appendChild(run.ownerDocument.createTextNode(merged)) + + if merged.startswith(" ") or merged.endswith(" "): + prev.setAttribute("xml:space", "preserve") + elif prev.hasAttribute("xml:space"): + prev.removeAttribute("xml:space") + + run.removeChild(curr) diff --git a/.claude/skills/docx/scripts/office/helpers/simplify_redlines.py b/.claude/skills/docx/scripts/office/helpers/simplify_redlines.py new file mode 100644 index 0000000..db963bb --- /dev/null +++ b/.claude/skills/docx/scripts/office/helpers/simplify_redlines.py @@ -0,0 +1,197 @@ +"""Simplify tracked changes by merging adjacent w:ins or w:del elements. + +Merges adjacent elements from the same author into a single element. +Same for elements. This makes heavily-redlined documents easier to +work with by reducing the number of tracked change wrappers. + +Rules: +- Only merges w:ins with w:ins, w:del with w:del (same element type) +- Only merges if same author (ignores timestamp differences) +- Only merges if truly adjacent (only whitespace between them) +""" + +import xml.etree.ElementTree as ET +import zipfile +from pathlib import Path + +import defusedxml.minidom + +WORD_NS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main" + + +def simplify_redlines(input_dir: str) -> tuple[int, str]: + doc_xml = Path(input_dir) / "word" / "document.xml" + + if not doc_xml.exists(): + return 0, f"Error: {doc_xml} not found" + + try: + dom = defusedxml.minidom.parseString(doc_xml.read_text(encoding="utf-8")) + root = dom.documentElement + + merge_count = 0 + + containers = _find_elements(root, "p") + _find_elements(root, "tc") + + for container in containers: + merge_count += _merge_tracked_changes_in(container, "ins") + merge_count += _merge_tracked_changes_in(container, "del") + + doc_xml.write_bytes(dom.toxml(encoding="UTF-8")) + return merge_count, f"Simplified {merge_count} tracked changes" + + except Exception as e: + return 0, f"Error: {e}" + + +def _merge_tracked_changes_in(container, tag: str) -> int: + merge_count = 0 + + tracked = [ + child + for child in container.childNodes + if child.nodeType == child.ELEMENT_NODE and _is_element(child, tag) + ] + + if len(tracked) < 2: + return 0 + + i = 0 + while i < len(tracked) - 1: + curr = tracked[i] + next_elem = tracked[i + 1] + + if _can_merge_tracked(curr, next_elem): + _merge_tracked_content(curr, next_elem) + container.removeChild(next_elem) + tracked.pop(i + 1) + merge_count += 1 + else: + i += 1 + + return merge_count + + +def _is_element(node, tag: str) -> bool: + name = node.localName or node.tagName + return name == tag or name.endswith(f":{tag}") + + +def _get_author(elem) -> str: + author = elem.getAttribute("w:author") + if not author: + for attr in elem.attributes.values(): + if attr.localName == "author" or attr.name.endswith(":author"): + return attr.value + return author + + +def _can_merge_tracked(elem1, elem2) -> bool: + if _get_author(elem1) != _get_author(elem2): + return False + + node = elem1.nextSibling + while node and node != elem2: + if node.nodeType == node.ELEMENT_NODE: + return False + if node.nodeType == node.TEXT_NODE and node.data.strip(): + return False + node = node.nextSibling + + return True + + +def _merge_tracked_content(target, source): + while source.firstChild: + child = source.firstChild + source.removeChild(child) + target.appendChild(child) + + +def _find_elements(root, tag: str) -> list: + results = [] + + def traverse(node): + if node.nodeType == node.ELEMENT_NODE: + name = node.localName or node.tagName + if name == tag or name.endswith(f":{tag}"): + results.append(node) + for child in node.childNodes: + traverse(child) + + traverse(root) + return results + + +def get_tracked_change_authors(doc_xml_path: Path) -> dict[str, int]: + if not doc_xml_path.exists(): + return {} + + try: + tree = ET.parse(doc_xml_path) + root = tree.getroot() + except ET.ParseError: + return {} + + namespaces = {"w": WORD_NS} + author_attr = f"{{{WORD_NS}}}author" + + authors: dict[str, int] = {} + for tag in ["ins", "del"]: + for elem in root.findall(f".//w:{tag}", namespaces): + author = elem.get(author_attr) + if author: + authors[author] = authors.get(author, 0) + 1 + + return authors + + +def _get_authors_from_docx(docx_path: Path) -> dict[str, int]: + try: + with zipfile.ZipFile(docx_path, "r") as zf: + if "word/document.xml" not in zf.namelist(): + return {} + with zf.open("word/document.xml") as f: + tree = ET.parse(f) + root = tree.getroot() + + namespaces = {"w": WORD_NS} + author_attr = f"{{{WORD_NS}}}author" + + authors: dict[str, int] = {} + for tag in ["ins", "del"]: + for elem in root.findall(f".//w:{tag}", namespaces): + author = elem.get(author_attr) + if author: + authors[author] = authors.get(author, 0) + 1 + return authors + except (zipfile.BadZipFile, ET.ParseError): + return {} + + +def infer_author(modified_dir: Path, original_docx: Path, default: str = "Claude") -> str: + modified_xml = modified_dir / "word" / "document.xml" + modified_authors = get_tracked_change_authors(modified_xml) + + if not modified_authors: + return default + + original_authors = _get_authors_from_docx(original_docx) + + new_changes: dict[str, int] = {} + for author, count in modified_authors.items(): + original_count = original_authors.get(author, 0) + diff = count - original_count + if diff > 0: + new_changes[author] = diff + + if not new_changes: + return default + + if len(new_changes) == 1: + return next(iter(new_changes)) + + raise ValueError( + f"Multiple authors added new changes: {new_changes}. " + "Cannot infer which author to validate." + ) diff --git a/.claude/skills/docx/scripts/office/pack.py b/.claude/skills/docx/scripts/office/pack.py new file mode 100644 index 0000000..db29ed8 --- /dev/null +++ b/.claude/skills/docx/scripts/office/pack.py @@ -0,0 +1,159 @@ +"""Pack a directory into a DOCX, PPTX, or XLSX file. + +Validates with auto-repair, condenses XML formatting, and creates the Office file. + +Usage: + python pack.py [--original ] [--validate true|false] + +Examples: + python pack.py unpacked/ output.docx --original input.docx + python pack.py unpacked/ output.pptx --validate false +""" + +import argparse +import sys +import shutil +import tempfile +import zipfile +from pathlib import Path + +import defusedxml.minidom + +from validators import DOCXSchemaValidator, PPTXSchemaValidator, RedliningValidator + +def pack( + input_directory: str, + output_file: str, + original_file: str | None = None, + validate: bool = True, + infer_author_func=None, +) -> tuple[None, str]: + input_dir = Path(input_directory) + output_path = Path(output_file) + suffix = output_path.suffix.lower() + + if not input_dir.is_dir(): + return None, f"Error: {input_dir} is not a directory" + + if suffix not in {".docx", ".pptx", ".xlsx"}: + return None, f"Error: {output_file} must be a .docx, .pptx, or .xlsx file" + + if validate and original_file: + original_path = Path(original_file) + if original_path.exists(): + success, output = _run_validation( + input_dir, original_path, suffix, infer_author_func + ) + if output: + print(output) + if not success: + return None, f"Error: Validation failed for {input_dir}" + + with tempfile.TemporaryDirectory() as temp_dir: + temp_content_dir = Path(temp_dir) / "content" + shutil.copytree(input_dir, temp_content_dir) + + for pattern in ["*.xml", "*.rels"]: + for xml_file in temp_content_dir.rglob(pattern): + _condense_xml(xml_file) + + output_path.parent.mkdir(parents=True, exist_ok=True) + with zipfile.ZipFile(output_path, "w", zipfile.ZIP_DEFLATED) as zf: + for f in temp_content_dir.rglob("*"): + if f.is_file(): + zf.write(f, f.relative_to(temp_content_dir)) + + return None, f"Successfully packed {input_dir} to {output_file}" + + +def _run_validation( + unpacked_dir: Path, + original_file: Path, + suffix: str, + infer_author_func=None, +) -> tuple[bool, str | None]: + output_lines = [] + validators = [] + + if suffix == ".docx": + author = "Claude" + if infer_author_func: + try: + author = infer_author_func(unpacked_dir, original_file) + except ValueError as e: + print(f"Warning: {e} Using default author 'Claude'.", file=sys.stderr) + + validators = [ + DOCXSchemaValidator(unpacked_dir, original_file), + RedliningValidator(unpacked_dir, original_file, author=author), + ] + elif suffix == ".pptx": + validators = [PPTXSchemaValidator(unpacked_dir, original_file)] + + if not validators: + return True, None + + total_repairs = sum(v.repair() for v in validators) + if total_repairs: + output_lines.append(f"Auto-repaired {total_repairs} issue(s)") + + success = all(v.validate() for v in validators) + + if success: + output_lines.append("All validations PASSED!") + + return success, "\n".join(output_lines) if output_lines else None + + +def _condense_xml(xml_file: Path) -> None: + try: + with open(xml_file, encoding="utf-8") as f: + dom = defusedxml.minidom.parse(f) + + for element in dom.getElementsByTagName("*"): + if element.tagName.endswith(":t"): + continue + + for child in list(element.childNodes): + if ( + child.nodeType == child.TEXT_NODE + and child.nodeValue + and child.nodeValue.strip() == "" + ) or child.nodeType == child.COMMENT_NODE: + element.removeChild(child) + + xml_file.write_bytes(dom.toxml(encoding="UTF-8")) + except Exception as e: + print(f"ERROR: Failed to parse {xml_file.name}: {e}", file=sys.stderr) + raise + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Pack a directory into a DOCX, PPTX, or XLSX file" + ) + parser.add_argument("input_directory", help="Unpacked Office document directory") + parser.add_argument("output_file", help="Output Office file (.docx/.pptx/.xlsx)") + parser.add_argument( + "--original", + help="Original file for validation comparison", + ) + parser.add_argument( + "--validate", + type=lambda x: x.lower() == "true", + default=True, + metavar="true|false", + help="Run validation with auto-repair (default: true)", + ) + args = parser.parse_args() + + _, message = pack( + args.input_directory, + args.output_file, + original_file=args.original, + validate=args.validate, + ) + print(message) + + if "Error" in message: + sys.exit(1) diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd new file mode 100644 index 0000000..6454ef9 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd @@ -0,0 +1,1499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd new file mode 100644 index 0000000..afa4f46 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd new file mode 100644 index 0000000..64e66b8 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd @@ -0,0 +1,1085 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd new file mode 100644 index 0000000..687eea8 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd @@ -0,0 +1,11 @@ + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd new file mode 100644 index 0000000..6ac81b0 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd @@ -0,0 +1,3081 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd new file mode 100644 index 0000000..1dbf051 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd new file mode 100644 index 0000000..f1af17d --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd new file mode 100644 index 0000000..0a185ab --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd @@ -0,0 +1,287 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd new file mode 100644 index 0000000..14ef488 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd @@ -0,0 +1,1676 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd new file mode 100644 index 0000000..c20f3bf --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd new file mode 100644 index 0000000..ac60252 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd new file mode 100644 index 0000000..424b8ba --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd new file mode 100644 index 0000000..2bddce2 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd new file mode 100644 index 0000000..8a8c18b --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd new file mode 100644 index 0000000..5c42706 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd new file mode 100644 index 0000000..853c341 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd new file mode 100644 index 0000000..da835ee --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd new file mode 100644 index 0000000..87ad265 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd @@ -0,0 +1,582 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd new file mode 100644 index 0000000..9e86f1b --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd new file mode 100644 index 0000000..d0be42e --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd @@ -0,0 +1,4439 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd new file mode 100644 index 0000000..8821dd1 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd @@ -0,0 +1,570 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd new file mode 100644 index 0000000..ca2575c --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd @@ -0,0 +1,509 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd new file mode 100644 index 0000000..dd079e6 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd new file mode 100644 index 0000000..3dd6cf6 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd new file mode 100644 index 0000000..f1041e3 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd new file mode 100644 index 0000000..9c5b7a6 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd @@ -0,0 +1,3646 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd new file mode 100644 index 0000000..0f13678 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd @@ -0,0 +1,116 @@ + + + + + + See http://www.w3.org/XML/1998/namespace.html and + http://www.w3.org/TR/REC-xml for information about this namespace. + + This schema document describes the XML namespace, in a form + suitable for import by other schema documents. + + Note that local names in this namespace are intended to be defined + only by the World Wide Web Consortium or its subgroups. The + following names are currently defined in this namespace and should + not be used with conflicting semantics by any Working Group, + specification, or document instance: + + base (as an attribute name): denotes an attribute whose value + provides a URI to be used as the base for interpreting any + relative URIs in the scope of the element on which it + appears; its value is inherited. This name is reserved + by virtue of its definition in the XML Base specification. + + lang (as an attribute name): denotes an attribute whose value + is a language code for the natural language of the content of + any element; its value is inherited. This name is reserved + by virtue of its definition in the XML specification. + + space (as an attribute name): denotes an attribute whose + value is a keyword indicating what whitespace processing + discipline is intended for the content of the element; its + value is inherited. This name is reserved by virtue of its + definition in the XML specification. + + Father (in any context at all): denotes Jon Bosak, the chair of + the original XML Working Group. This name is reserved by + the following decision of the W3C XML Plenary and + XML Coordination groups: + + In appreciation for his vision, leadership and dedication + the W3C XML Plenary on this 10th day of February, 2000 + reserves for Jon Bosak in perpetuity the XML name + xml:Father + + + + + This schema defines attributes and an attribute group + suitable for use by + schemas wishing to allow xml:base, xml:lang or xml:space attributes + on elements they define. + + To enable this, such a schema must import this schema + for the XML namespace, e.g. as follows: + <schema . . .> + . . . + <import namespace="http://www.w3.org/XML/1998/namespace" + schemaLocation="http://www.w3.org/2001/03/xml.xsd"/> + + Subsequently, qualified reference to any of the attributes + or the group defined below will have the desired effect, e.g. + + <type . . .> + . . . + <attributeGroup ref="xml:specialAttrs"/> + + will define a type which will schema-validate an instance + element with any of those attributes + + + + In keeping with the XML Schema WG's standard versioning + policy, this schema document will persist at + http://www.w3.org/2001/03/xml.xsd. + At the date of issue it can also be found at + http://www.w3.org/2001/xml.xsd. + The schema document at that URI may however change in the future, + in order to remain compatible with the latest version of XML Schema + itself. In other words, if the XML Schema namespace changes, the version + of this document at + http://www.w3.org/2001/xml.xsd will change + accordingly; the version at + http://www.w3.org/2001/03/xml.xsd will not change. + + + + + + In due course, we should install the relevant ISO 2- and 3-letter + codes as the enumerated possible values . . . + + + + + + + + + + + + + + + See http://www.w3.org/TR/xmlbase/ for + information about this attribute. + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd b/.claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd new file mode 100644 index 0000000..a6de9d2 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd b/.claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd new file mode 100644 index 0000000..10e978b --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd b/.claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd new file mode 100644 index 0000000..4248bf7 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd b/.claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd new file mode 100644 index 0000000..5649746 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/mce/mc.xsd b/.claude/skills/docx/scripts/office/schemas/mce/mc.xsd new file mode 100644 index 0000000..ef72545 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/mce/mc.xsd @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd b/.claude/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd new file mode 100644 index 0000000..f65f777 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd @@ -0,0 +1,560 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd b/.claude/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd new file mode 100644 index 0000000..6b00755 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd b/.claude/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd new file mode 100644 index 0000000..f321d33 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd b/.claude/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd new file mode 100644 index 0000000..364c6a9 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd b/.claude/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd new file mode 100644 index 0000000..fed9d15 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd b/.claude/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd new file mode 100644 index 0000000..680cf15 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd @@ -0,0 +1,4 @@ + + + + diff --git a/.claude/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd b/.claude/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd new file mode 100644 index 0000000..89ada90 --- /dev/null +++ b/.claude/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/.claude/skills/docx/scripts/office/soffice.py b/.claude/skills/docx/scripts/office/soffice.py new file mode 100644 index 0000000..c7f7e32 --- /dev/null +++ b/.claude/skills/docx/scripts/office/soffice.py @@ -0,0 +1,183 @@ +""" +Helper for running LibreOffice (soffice) in environments where AF_UNIX +sockets may be blocked (e.g., sandboxed VMs). Detects the restriction +at runtime and applies an LD_PRELOAD shim if needed. + +Usage: + from office.soffice import run_soffice, get_soffice_env + + # Option 1 – run soffice directly + result = run_soffice(["--headless", "--convert-to", "pdf", "input.docx"]) + + # Option 2 – get env dict for your own subprocess calls + env = get_soffice_env() + subprocess.run(["soffice", ...], env=env) +""" + +import os +import socket +import subprocess +import tempfile +from pathlib import Path + + +def get_soffice_env() -> dict: + env = os.environ.copy() + env["SAL_USE_VCLPLUGIN"] = "svp" + + if _needs_shim(): + shim = _ensure_shim() + env["LD_PRELOAD"] = str(shim) + + return env + + +def run_soffice(args: list[str], **kwargs) -> subprocess.CompletedProcess: + env = get_soffice_env() + return subprocess.run(["soffice"] + args, env=env, **kwargs) + + + +_SHIM_SO = Path(tempfile.gettempdir()) / "lo_socket_shim.so" + + +def _needs_shim() -> bool: + try: + s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + s.close() + return False + except OSError: + return True + + +def _ensure_shim() -> Path: + if _SHIM_SO.exists(): + return _SHIM_SO + + src = Path(tempfile.gettempdir()) / "lo_socket_shim.c" + src.write_text(_SHIM_SOURCE) + subprocess.run( + ["gcc", "-shared", "-fPIC", "-o", str(_SHIM_SO), str(src), "-ldl"], + check=True, + capture_output=True, + ) + src.unlink() + return _SHIM_SO + + + +_SHIM_SOURCE = r""" +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include + +static int (*real_socket)(int, int, int); +static int (*real_socketpair)(int, int, int, int[2]); +static int (*real_listen)(int, int); +static int (*real_accept)(int, struct sockaddr *, socklen_t *); +static int (*real_close)(int); +static int (*real_read)(int, void *, size_t); + +/* Per-FD bookkeeping (FDs >= 1024 are passed through unshimmed). */ +static int is_shimmed[1024]; +static int peer_of[1024]; +static int wake_r[1024]; /* accept() blocks reading this */ +static int wake_w[1024]; /* close() writes to this */ +static int listener_fd = -1; /* FD that received listen() */ + +__attribute__((constructor)) +static void init(void) { + real_socket = dlsym(RTLD_NEXT, "socket"); + real_socketpair = dlsym(RTLD_NEXT, "socketpair"); + real_listen = dlsym(RTLD_NEXT, "listen"); + real_accept = dlsym(RTLD_NEXT, "accept"); + real_close = dlsym(RTLD_NEXT, "close"); + real_read = dlsym(RTLD_NEXT, "read"); + for (int i = 0; i < 1024; i++) { + peer_of[i] = -1; + wake_r[i] = -1; + wake_w[i] = -1; + } +} + +/* ---- socket ---------------------------------------------------------- */ +int socket(int domain, int type, int protocol) { + if (domain == AF_UNIX) { + int fd = real_socket(domain, type, protocol); + if (fd >= 0) return fd; + /* socket(AF_UNIX) blocked – fall back to socketpair(). */ + int sv[2]; + if (real_socketpair(domain, type, protocol, sv) == 0) { + if (sv[0] >= 0 && sv[0] < 1024) { + is_shimmed[sv[0]] = 1; + peer_of[sv[0]] = sv[1]; + int wp[2]; + if (pipe(wp) == 0) { + wake_r[sv[0]] = wp[0]; + wake_w[sv[0]] = wp[1]; + } + } + return sv[0]; + } + errno = EPERM; + return -1; + } + return real_socket(domain, type, protocol); +} + +/* ---- listen ---------------------------------------------------------- */ +int listen(int sockfd, int backlog) { + if (sockfd >= 0 && sockfd < 1024 && is_shimmed[sockfd]) { + listener_fd = sockfd; + return 0; + } + return real_listen(sockfd, backlog); +} + +/* ---- accept ---------------------------------------------------------- */ +int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) { + if (sockfd >= 0 && sockfd < 1024 && is_shimmed[sockfd]) { + /* Block until close() writes to the wake pipe. */ + if (wake_r[sockfd] >= 0) { + char buf; + real_read(wake_r[sockfd], &buf, 1); + } + errno = ECONNABORTED; + return -1; + } + return real_accept(sockfd, addr, addrlen); +} + +/* ---- close ----------------------------------------------------------- */ +int close(int fd) { + if (fd >= 0 && fd < 1024 && is_shimmed[fd]) { + int was_listener = (fd == listener_fd); + is_shimmed[fd] = 0; + + if (wake_w[fd] >= 0) { /* unblock accept() */ + char c = 0; + write(wake_w[fd], &c, 1); + real_close(wake_w[fd]); + wake_w[fd] = -1; + } + if (wake_r[fd] >= 0) { real_close(wake_r[fd]); wake_r[fd] = -1; } + if (peer_of[fd] >= 0) { real_close(peer_of[fd]); peer_of[fd] = -1; } + + if (was_listener) + _exit(0); /* conversion done – exit */ + } + return real_close(fd); +} +""" + + + +if __name__ == "__main__": + import sys + result = run_soffice(sys.argv[1:]) + sys.exit(result.returncode) diff --git a/.claude/skills/docx/scripts/office/unpack.py b/.claude/skills/docx/scripts/office/unpack.py new file mode 100644 index 0000000..0015253 --- /dev/null +++ b/.claude/skills/docx/scripts/office/unpack.py @@ -0,0 +1,132 @@ +"""Unpack Office files (DOCX, PPTX, XLSX) for editing. + +Extracts the ZIP archive, pretty-prints XML files, and optionally: +- Merges adjacent runs with identical formatting (DOCX only) +- Simplifies adjacent tracked changes from same author (DOCX only) + +Usage: + python unpack.py [options] + +Examples: + python unpack.py document.docx unpacked/ + python unpack.py presentation.pptx unpacked/ + python unpack.py document.docx unpacked/ --merge-runs false +""" + +import argparse +import sys +import zipfile +from pathlib import Path + +import defusedxml.minidom + +from helpers.merge_runs import merge_runs as do_merge_runs +from helpers.simplify_redlines import simplify_redlines as do_simplify_redlines + +SMART_QUOTE_REPLACEMENTS = { + "\u201c": "“", + "\u201d": "”", + "\u2018": "‘", + "\u2019": "’", +} + + +def unpack( + input_file: str, + output_directory: str, + merge_runs: bool = True, + simplify_redlines: bool = True, +) -> tuple[None, str]: + input_path = Path(input_file) + output_path = Path(output_directory) + suffix = input_path.suffix.lower() + + if not input_path.exists(): + return None, f"Error: {input_file} does not exist" + + if suffix not in {".docx", ".pptx", ".xlsx"}: + return None, f"Error: {input_file} must be a .docx, .pptx, or .xlsx file" + + try: + output_path.mkdir(parents=True, exist_ok=True) + + with zipfile.ZipFile(input_path, "r") as zf: + zf.extractall(output_path) + + xml_files = list(output_path.rglob("*.xml")) + list(output_path.rglob("*.rels")) + for xml_file in xml_files: + _pretty_print_xml(xml_file) + + message = f"Unpacked {input_file} ({len(xml_files)} XML files)" + + if suffix == ".docx": + if simplify_redlines: + simplify_count, _ = do_simplify_redlines(str(output_path)) + message += f", simplified {simplify_count} tracked changes" + + if merge_runs: + merge_count, _ = do_merge_runs(str(output_path)) + message += f", merged {merge_count} runs" + + for xml_file in xml_files: + _escape_smart_quotes(xml_file) + + return None, message + + except zipfile.BadZipFile: + return None, f"Error: {input_file} is not a valid Office file" + except Exception as e: + return None, f"Error unpacking: {e}" + + +def _pretty_print_xml(xml_file: Path) -> None: + try: + content = xml_file.read_text(encoding="utf-8") + dom = defusedxml.minidom.parseString(content) + xml_file.write_bytes(dom.toprettyxml(indent=" ", encoding="utf-8")) + except Exception: + pass + + +def _escape_smart_quotes(xml_file: Path) -> None: + try: + content = xml_file.read_text(encoding="utf-8") + for char, entity in SMART_QUOTE_REPLACEMENTS.items(): + content = content.replace(char, entity) + xml_file.write_text(content, encoding="utf-8") + except Exception: + pass + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Unpack an Office file (DOCX, PPTX, XLSX) for editing" + ) + parser.add_argument("input_file", help="Office file to unpack") + parser.add_argument("output_directory", help="Output directory") + parser.add_argument( + "--merge-runs", + type=lambda x: x.lower() == "true", + default=True, + metavar="true|false", + help="Merge adjacent runs with identical formatting (DOCX only, default: true)", + ) + parser.add_argument( + "--simplify-redlines", + type=lambda x: x.lower() == "true", + default=True, + metavar="true|false", + help="Merge adjacent tracked changes from same author (DOCX only, default: true)", + ) + args = parser.parse_args() + + _, message = unpack( + args.input_file, + args.output_directory, + merge_runs=args.merge_runs, + simplify_redlines=args.simplify_redlines, + ) + print(message) + + if "Error" in message: + sys.exit(1) diff --git a/.claude/skills/docx/scripts/office/validate.py b/.claude/skills/docx/scripts/office/validate.py new file mode 100644 index 0000000..03b01f6 --- /dev/null +++ b/.claude/skills/docx/scripts/office/validate.py @@ -0,0 +1,111 @@ +""" +Command line tool to validate Office document XML files against XSD schemas and tracked changes. + +Usage: + python validate.py [--original ] [--auto-repair] [--author NAME] + +The first argument can be either: +- An unpacked directory containing the Office document XML files +- A packed Office file (.docx/.pptx/.xlsx) which will be unpacked to a temp directory + +Auto-repair fixes: +- paraId/durableId values that exceed OOXML limits +- Missing xml:space="preserve" on w:t elements with whitespace +""" + +import argparse +import sys +import tempfile +import zipfile +from pathlib import Path + +from validators import DOCXSchemaValidator, PPTXSchemaValidator, RedliningValidator + + +def main(): + parser = argparse.ArgumentParser(description="Validate Office document XML files") + parser.add_argument( + "path", + help="Path to unpacked directory or packed Office file (.docx/.pptx/.xlsx)", + ) + parser.add_argument( + "--original", + required=False, + default=None, + help="Path to original file (.docx/.pptx/.xlsx). If omitted, all XSD errors are reported and redlining validation is skipped.", + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + help="Enable verbose output", + ) + parser.add_argument( + "--auto-repair", + action="store_true", + help="Automatically repair common issues (hex IDs, whitespace preservation)", + ) + parser.add_argument( + "--author", + default="Claude", + help="Author name for redlining validation (default: Claude)", + ) + args = parser.parse_args() + + path = Path(args.path) + assert path.exists(), f"Error: {path} does not exist" + + original_file = None + if args.original: + original_file = Path(args.original) + assert original_file.is_file(), f"Error: {original_file} is not a file" + assert original_file.suffix.lower() in [".docx", ".pptx", ".xlsx"], ( + f"Error: {original_file} must be a .docx, .pptx, or .xlsx file" + ) + + file_extension = (original_file or path).suffix.lower() + assert file_extension in [".docx", ".pptx", ".xlsx"], ( + f"Error: Cannot determine file type from {path}. Use --original or provide a .docx/.pptx/.xlsx file." + ) + + if path.is_file() and path.suffix.lower() in [".docx", ".pptx", ".xlsx"]: + temp_dir = tempfile.mkdtemp() + with zipfile.ZipFile(path, "r") as zf: + zf.extractall(temp_dir) + unpacked_dir = Path(temp_dir) + else: + assert path.is_dir(), f"Error: {path} is not a directory or Office file" + unpacked_dir = path + + match file_extension: + case ".docx": + validators = [ + DOCXSchemaValidator(unpacked_dir, original_file, verbose=args.verbose), + ] + if original_file: + validators.append( + RedliningValidator(unpacked_dir, original_file, verbose=args.verbose, author=args.author) + ) + case ".pptx": + validators = [ + PPTXSchemaValidator(unpacked_dir, original_file, verbose=args.verbose), + ] + case _: + print(f"Error: Validation not supported for file type {file_extension}") + sys.exit(1) + + if args.auto_repair: + total_repairs = sum(v.repair() for v in validators) + if total_repairs: + print(f"Auto-repaired {total_repairs} issue(s)") + + success = all(v.validate() for v in validators) + + if success: + print("All validations PASSED!") + + sys.exit(0 if success else 1) + + +if __name__ == "__main__": + main() diff --git a/.claude/skills/docx/scripts/office/validators/__init__.py b/.claude/skills/docx/scripts/office/validators/__init__.py new file mode 100644 index 0000000..db092ec --- /dev/null +++ b/.claude/skills/docx/scripts/office/validators/__init__.py @@ -0,0 +1,15 @@ +""" +Validation modules for Word document processing. +""" + +from .base import BaseSchemaValidator +from .docx import DOCXSchemaValidator +from .pptx import PPTXSchemaValidator +from .redlining import RedliningValidator + +__all__ = [ + "BaseSchemaValidator", + "DOCXSchemaValidator", + "PPTXSchemaValidator", + "RedliningValidator", +] diff --git a/.claude/skills/docx/scripts/office/validators/base.py b/.claude/skills/docx/scripts/office/validators/base.py new file mode 100644 index 0000000..db4a06a --- /dev/null +++ b/.claude/skills/docx/scripts/office/validators/base.py @@ -0,0 +1,847 @@ +""" +Base validator with common validation logic for document files. +""" + +import re +from pathlib import Path + +import defusedxml.minidom +import lxml.etree + + +class BaseSchemaValidator: + + IGNORED_VALIDATION_ERRORS = [ + "hyphenationZone", + "purl.org/dc/terms", + ] + + UNIQUE_ID_REQUIREMENTS = { + "comment": ("id", "file"), + "commentrangestart": ("id", "file"), + "commentrangeend": ("id", "file"), + "bookmarkstart": ("id", "file"), + "bookmarkend": ("id", "file"), + "sldid": ("id", "file"), + "sldmasterid": ("id", "global"), + "sldlayoutid": ("id", "global"), + "cm": ("authorid", "file"), + "sheet": ("sheetid", "file"), + "definedname": ("id", "file"), + "cxnsp": ("id", "file"), + "sp": ("id", "file"), + "pic": ("id", "file"), + "grpsp": ("id", "file"), + } + + EXCLUDED_ID_CONTAINERS = { + "sectionlst", + } + + ELEMENT_RELATIONSHIP_TYPES = {} + + SCHEMA_MAPPINGS = { + "word": "ISO-IEC29500-4_2016/wml.xsd", + "ppt": "ISO-IEC29500-4_2016/pml.xsd", + "xl": "ISO-IEC29500-4_2016/sml.xsd", + "[Content_Types].xml": "ecma/fouth-edition/opc-contentTypes.xsd", + "app.xml": "ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd", + "core.xml": "ecma/fouth-edition/opc-coreProperties.xsd", + "custom.xml": "ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd", + ".rels": "ecma/fouth-edition/opc-relationships.xsd", + "people.xml": "microsoft/wml-2012.xsd", + "commentsIds.xml": "microsoft/wml-cid-2016.xsd", + "commentsExtensible.xml": "microsoft/wml-cex-2018.xsd", + "commentsExtended.xml": "microsoft/wml-2012.xsd", + "chart": "ISO-IEC29500-4_2016/dml-chart.xsd", + "theme": "ISO-IEC29500-4_2016/dml-main.xsd", + "drawing": "ISO-IEC29500-4_2016/dml-main.xsd", + } + + MC_NAMESPACE = "http://schemas.openxmlformats.org/markup-compatibility/2006" + XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace" + + PACKAGE_RELATIONSHIPS_NAMESPACE = ( + "http://schemas.openxmlformats.org/package/2006/relationships" + ) + OFFICE_RELATIONSHIPS_NAMESPACE = ( + "http://schemas.openxmlformats.org/officeDocument/2006/relationships" + ) + CONTENT_TYPES_NAMESPACE = ( + "http://schemas.openxmlformats.org/package/2006/content-types" + ) + + MAIN_CONTENT_FOLDERS = {"word", "ppt", "xl"} + + OOXML_NAMESPACES = { + "http://schemas.openxmlformats.org/officeDocument/2006/math", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships", + "http://schemas.openxmlformats.org/schemaLibrary/2006/main", + "http://schemas.openxmlformats.org/drawingml/2006/main", + "http://schemas.openxmlformats.org/drawingml/2006/chart", + "http://schemas.openxmlformats.org/drawingml/2006/chartDrawing", + "http://schemas.openxmlformats.org/drawingml/2006/diagram", + "http://schemas.openxmlformats.org/drawingml/2006/picture", + "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing", + "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing", + "http://schemas.openxmlformats.org/wordprocessingml/2006/main", + "http://schemas.openxmlformats.org/presentationml/2006/main", + "http://schemas.openxmlformats.org/spreadsheetml/2006/main", + "http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes", + "http://www.w3.org/XML/1998/namespace", + } + + def __init__(self, unpacked_dir, original_file=None, verbose=False): + self.unpacked_dir = Path(unpacked_dir).resolve() + self.original_file = Path(original_file) if original_file else None + self.verbose = verbose + + self.schemas_dir = Path(__file__).parent.parent / "schemas" + + patterns = ["*.xml", "*.rels"] + self.xml_files = [ + f for pattern in patterns for f in self.unpacked_dir.rglob(pattern) + ] + + if not self.xml_files: + print(f"Warning: No XML files found in {self.unpacked_dir}") + + def validate(self): + raise NotImplementedError("Subclasses must implement the validate method") + + def repair(self) -> int: + return self.repair_whitespace_preservation() + + def repair_whitespace_preservation(self) -> int: + repairs = 0 + + for xml_file in self.xml_files: + try: + content = xml_file.read_text(encoding="utf-8") + dom = defusedxml.minidom.parseString(content) + modified = False + + for elem in dom.getElementsByTagName("*"): + if elem.tagName.endswith(":t") and elem.firstChild: + text = elem.firstChild.nodeValue + if text and (text.startswith((' ', '\t')) or text.endswith((' ', '\t'))): + if elem.getAttribute("xml:space") != "preserve": + elem.setAttribute("xml:space", "preserve") + text_preview = repr(text[:30]) + "..." if len(text) > 30 else repr(text) + print(f" Repaired: {xml_file.name}: Added xml:space='preserve' to {elem.tagName}: {text_preview}") + repairs += 1 + modified = True + + if modified: + xml_file.write_bytes(dom.toxml(encoding="UTF-8")) + + except Exception: + pass + + return repairs + + def validate_xml(self): + errors = [] + + for xml_file in self.xml_files: + try: + lxml.etree.parse(str(xml_file)) + except lxml.etree.XMLSyntaxError as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {e.lineno}: {e.msg}" + ) + except Exception as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Unexpected error: {str(e)}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} XML violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All XML files are well-formed") + return True + + def validate_namespaces(self): + errors = [] + + for xml_file in self.xml_files: + try: + root = lxml.etree.parse(str(xml_file)).getroot() + declared = set(root.nsmap.keys()) - {None} + + for attr_val in [ + v for k, v in root.attrib.items() if k.endswith("Ignorable") + ]: + undeclared = set(attr_val.split()) - declared + errors.extend( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Namespace '{ns}' in Ignorable but not declared" + for ns in undeclared + ) + except lxml.etree.XMLSyntaxError: + continue + + if errors: + print(f"FAILED - {len(errors)} namespace issues:") + for error in errors: + print(error) + return False + if self.verbose: + print("PASSED - All namespace prefixes properly declared") + return True + + def validate_unique_ids(self): + errors = [] + global_ids = {} + + for xml_file in self.xml_files: + try: + root = lxml.etree.parse(str(xml_file)).getroot() + file_ids = {} + + mc_elements = root.xpath( + ".//mc:AlternateContent", namespaces={"mc": self.MC_NAMESPACE} + ) + for elem in mc_elements: + elem.getparent().remove(elem) + + for elem in root.iter(): + tag = ( + elem.tag.split("}")[-1].lower() + if "}" in elem.tag + else elem.tag.lower() + ) + + if tag in self.UNIQUE_ID_REQUIREMENTS: + in_excluded_container = any( + ancestor.tag.split("}")[-1].lower() in self.EXCLUDED_ID_CONTAINERS + for ancestor in elem.iterancestors() + ) + if in_excluded_container: + continue + + attr_name, scope = self.UNIQUE_ID_REQUIREMENTS[tag] + + id_value = None + for attr, value in elem.attrib.items(): + attr_local = ( + attr.split("}")[-1].lower() + if "}" in attr + else attr.lower() + ) + if attr_local == attr_name: + id_value = value + break + + if id_value is not None: + if scope == "global": + if id_value in global_ids: + prev_file, prev_line, prev_tag = global_ids[ + id_value + ] + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {elem.sourceline}: Global ID '{id_value}' in <{tag}> " + f"already used in {prev_file} at line {prev_line} in <{prev_tag}>" + ) + else: + global_ids[id_value] = ( + xml_file.relative_to(self.unpacked_dir), + elem.sourceline, + tag, + ) + elif scope == "file": + key = (tag, attr_name) + if key not in file_ids: + file_ids[key] = {} + + if id_value in file_ids[key]: + prev_line = file_ids[key][id_value] + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {elem.sourceline}: Duplicate {attr_name}='{id_value}' in <{tag}> " + f"(first occurrence at line {prev_line})" + ) + else: + file_ids[key][id_value] = elem.sourceline + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} ID uniqueness violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All required IDs are unique") + return True + + def validate_file_references(self): + errors = [] + + rels_files = list(self.unpacked_dir.rglob("*.rels")) + + if not rels_files: + if self.verbose: + print("PASSED - No .rels files found") + return True + + all_files = [] + for file_path in self.unpacked_dir.rglob("*"): + if ( + file_path.is_file() + and file_path.name != "[Content_Types].xml" + and not file_path.name.endswith(".rels") + ): + all_files.append(file_path.resolve()) + + all_referenced_files = set() + + if self.verbose: + print( + f"Found {len(rels_files)} .rels files and {len(all_files)} target files" + ) + + for rels_file in rels_files: + try: + rels_root = lxml.etree.parse(str(rels_file)).getroot() + + rels_dir = rels_file.parent + + referenced_files = set() + broken_refs = [] + + for rel in rels_root.findall( + ".//ns:Relationship", + namespaces={"ns": self.PACKAGE_RELATIONSHIPS_NAMESPACE}, + ): + target = rel.get("Target") + if target and not target.startswith( + ("http", "mailto:") + ): + if target.startswith("/"): + target_path = self.unpacked_dir / target.lstrip("/") + elif rels_file.name == ".rels": + target_path = self.unpacked_dir / target + else: + base_dir = rels_dir.parent + target_path = base_dir / target + + try: + target_path = target_path.resolve() + if target_path.exists() and target_path.is_file(): + referenced_files.add(target_path) + all_referenced_files.add(target_path) + else: + broken_refs.append((target, rel.sourceline)) + except (OSError, ValueError): + broken_refs.append((target, rel.sourceline)) + + if broken_refs: + rel_path = rels_file.relative_to(self.unpacked_dir) + for broken_ref, line_num in broken_refs: + errors.append( + f" {rel_path}: Line {line_num}: Broken reference to {broken_ref}" + ) + + except Exception as e: + rel_path = rels_file.relative_to(self.unpacked_dir) + errors.append(f" Error parsing {rel_path}: {e}") + + unreferenced_files = set(all_files) - all_referenced_files + + if unreferenced_files: + for unref_file in sorted(unreferenced_files): + unref_rel_path = unref_file.relative_to(self.unpacked_dir) + errors.append(f" Unreferenced file: {unref_rel_path}") + + if errors: + print(f"FAILED - Found {len(errors)} relationship validation errors:") + for error in errors: + print(error) + print( + "CRITICAL: These errors will cause the document to appear corrupt. " + + "Broken references MUST be fixed, " + + "and unreferenced files MUST be referenced or removed." + ) + return False + else: + if self.verbose: + print( + "PASSED - All references are valid and all files are properly referenced" + ) + return True + + def validate_all_relationship_ids(self): + import lxml.etree + + errors = [] + + for xml_file in self.xml_files: + if xml_file.suffix == ".rels": + continue + + rels_dir = xml_file.parent / "_rels" + rels_file = rels_dir / f"{xml_file.name}.rels" + + if not rels_file.exists(): + continue + + try: + rels_root = lxml.etree.parse(str(rels_file)).getroot() + rid_to_type = {} + + for rel in rels_root.findall( + f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship" + ): + rid = rel.get("Id") + rel_type = rel.get("Type", "") + if rid: + if rid in rid_to_type: + rels_rel_path = rels_file.relative_to(self.unpacked_dir) + errors.append( + f" {rels_rel_path}: Line {rel.sourceline}: " + f"Duplicate relationship ID '{rid}' (IDs must be unique)" + ) + type_name = ( + rel_type.split("/")[-1] if "/" in rel_type else rel_type + ) + rid_to_type[rid] = type_name + + xml_root = lxml.etree.parse(str(xml_file)).getroot() + + r_ns = self.OFFICE_RELATIONSHIPS_NAMESPACE + rid_attrs_to_check = ["id", "embed", "link"] + for elem in xml_root.iter(): + for attr_name in rid_attrs_to_check: + rid_attr = elem.get(f"{{{r_ns}}}{attr_name}") + if not rid_attr: + continue + xml_rel_path = xml_file.relative_to(self.unpacked_dir) + elem_name = ( + elem.tag.split("}")[-1] if "}" in elem.tag else elem.tag + ) + + if rid_attr not in rid_to_type: + errors.append( + f" {xml_rel_path}: Line {elem.sourceline}: " + f"<{elem_name}> r:{attr_name} references non-existent relationship '{rid_attr}' " + f"(valid IDs: {', '.join(sorted(rid_to_type.keys())[:5])}{'...' if len(rid_to_type) > 5 else ''})" + ) + elif attr_name == "id" and self.ELEMENT_RELATIONSHIP_TYPES: + expected_type = self._get_expected_relationship_type( + elem_name + ) + if expected_type: + actual_type = rid_to_type[rid_attr] + if expected_type not in actual_type.lower(): + errors.append( + f" {xml_rel_path}: Line {elem.sourceline}: " + f"<{elem_name}> references '{rid_attr}' which points to '{actual_type}' " + f"but should point to a '{expected_type}' relationship" + ) + + except Exception as e: + xml_rel_path = xml_file.relative_to(self.unpacked_dir) + errors.append(f" Error processing {xml_rel_path}: {e}") + + if errors: + print(f"FAILED - Found {len(errors)} relationship ID reference errors:") + for error in errors: + print(error) + print("\nThese ID mismatches will cause the document to appear corrupt!") + return False + else: + if self.verbose: + print("PASSED - All relationship ID references are valid") + return True + + def _get_expected_relationship_type(self, element_name): + elem_lower = element_name.lower() + + if elem_lower in self.ELEMENT_RELATIONSHIP_TYPES: + return self.ELEMENT_RELATIONSHIP_TYPES[elem_lower] + + if elem_lower.endswith("id") and len(elem_lower) > 2: + prefix = elem_lower[:-2] + if prefix.endswith("master"): + return prefix.lower() + elif prefix.endswith("layout"): + return prefix.lower() + else: + if prefix == "sld": + return "slide" + return prefix.lower() + + if elem_lower.endswith("reference") and len(elem_lower) > 9: + prefix = elem_lower[:-9] + return prefix.lower() + + return None + + def validate_content_types(self): + errors = [] + + content_types_file = self.unpacked_dir / "[Content_Types].xml" + if not content_types_file.exists(): + print("FAILED - [Content_Types].xml file not found") + return False + + try: + root = lxml.etree.parse(str(content_types_file)).getroot() + declared_parts = set() + declared_extensions = set() + + for override in root.findall( + f".//{{{self.CONTENT_TYPES_NAMESPACE}}}Override" + ): + part_name = override.get("PartName") + if part_name is not None: + declared_parts.add(part_name.lstrip("/")) + + for default in root.findall( + f".//{{{self.CONTENT_TYPES_NAMESPACE}}}Default" + ): + extension = default.get("Extension") + if extension is not None: + declared_extensions.add(extension.lower()) + + declarable_roots = { + "sld", + "sldLayout", + "sldMaster", + "presentation", + "document", + "workbook", + "worksheet", + "theme", + } + + media_extensions = { + "png": "image/png", + "jpg": "image/jpeg", + "jpeg": "image/jpeg", + "gif": "image/gif", + "bmp": "image/bmp", + "tiff": "image/tiff", + "wmf": "image/x-wmf", + "emf": "image/x-emf", + } + + all_files = list(self.unpacked_dir.rglob("*")) + all_files = [f for f in all_files if f.is_file()] + + for xml_file in self.xml_files: + path_str = str(xml_file.relative_to(self.unpacked_dir)).replace( + "\\", "/" + ) + + if any( + skip in path_str + for skip in [".rels", "[Content_Types]", "docProps/", "_rels/"] + ): + continue + + try: + root_tag = lxml.etree.parse(str(xml_file)).getroot().tag + root_name = root_tag.split("}")[-1] if "}" in root_tag else root_tag + + if root_name in declarable_roots and path_str not in declared_parts: + errors.append( + f" {path_str}: File with <{root_name}> root not declared in [Content_Types].xml" + ) + + except Exception: + continue + + for file_path in all_files: + if file_path.suffix.lower() in {".xml", ".rels"}: + continue + if file_path.name == "[Content_Types].xml": + continue + if "_rels" in file_path.parts or "docProps" in file_path.parts: + continue + + extension = file_path.suffix.lstrip(".").lower() + if extension and extension not in declared_extensions: + if extension in media_extensions: + relative_path = file_path.relative_to(self.unpacked_dir) + errors.append( + f' {relative_path}: File with extension \'{extension}\' not declared in [Content_Types].xml - should add: ' + ) + + except Exception as e: + errors.append(f" Error parsing [Content_Types].xml: {e}") + + if errors: + print(f"FAILED - Found {len(errors)} content type declaration errors:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print( + "PASSED - All content files are properly declared in [Content_Types].xml" + ) + return True + + def validate_file_against_xsd(self, xml_file, verbose=False): + xml_file = Path(xml_file).resolve() + unpacked_dir = self.unpacked_dir.resolve() + + is_valid, current_errors = self._validate_single_file_xsd( + xml_file, unpacked_dir + ) + + if is_valid is None: + return None, set() + elif is_valid: + return True, set() + + original_errors = self._get_original_file_errors(xml_file) + + assert current_errors is not None + new_errors = current_errors - original_errors + + new_errors = { + e for e in new_errors + if not any(pattern in e for pattern in self.IGNORED_VALIDATION_ERRORS) + } + + if new_errors: + if verbose: + relative_path = xml_file.relative_to(unpacked_dir) + print(f"FAILED - {relative_path}: {len(new_errors)} new error(s)") + for error in list(new_errors)[:3]: + truncated = error[:250] + "..." if len(error) > 250 else error + print(f" - {truncated}") + return False, new_errors + else: + if verbose: + print( + f"PASSED - No new errors (original had {len(current_errors)} errors)" + ) + return True, set() + + def validate_against_xsd(self): + new_errors = [] + original_error_count = 0 + valid_count = 0 + skipped_count = 0 + + for xml_file in self.xml_files: + relative_path = str(xml_file.relative_to(self.unpacked_dir)) + is_valid, new_file_errors = self.validate_file_against_xsd( + xml_file, verbose=False + ) + + if is_valid is None: + skipped_count += 1 + continue + elif is_valid and not new_file_errors: + valid_count += 1 + continue + elif is_valid: + original_error_count += 1 + valid_count += 1 + continue + + new_errors.append(f" {relative_path}: {len(new_file_errors)} new error(s)") + for error in list(new_file_errors)[:3]: + new_errors.append( + f" - {error[:250]}..." if len(error) > 250 else f" - {error}" + ) + + if self.verbose: + print(f"Validated {len(self.xml_files)} files:") + print(f" - Valid: {valid_count}") + print(f" - Skipped (no schema): {skipped_count}") + if original_error_count: + print(f" - With original errors (ignored): {original_error_count}") + print( + f" - With NEW errors: {len(new_errors) > 0 and len([e for e in new_errors if not e.startswith(' ')]) or 0}" + ) + + if new_errors: + print("\nFAILED - Found NEW validation errors:") + for error in new_errors: + print(error) + return False + else: + if self.verbose: + print("\nPASSED - No new XSD validation errors introduced") + return True + + def _get_schema_path(self, xml_file): + if xml_file.name in self.SCHEMA_MAPPINGS: + return self.schemas_dir / self.SCHEMA_MAPPINGS[xml_file.name] + + if xml_file.suffix == ".rels": + return self.schemas_dir / self.SCHEMA_MAPPINGS[".rels"] + + if "charts/" in str(xml_file) and xml_file.name.startswith("chart"): + return self.schemas_dir / self.SCHEMA_MAPPINGS["chart"] + + if "theme/" in str(xml_file) and xml_file.name.startswith("theme"): + return self.schemas_dir / self.SCHEMA_MAPPINGS["theme"] + + if xml_file.parent.name in self.MAIN_CONTENT_FOLDERS: + return self.schemas_dir / self.SCHEMA_MAPPINGS[xml_file.parent.name] + + return None + + def _clean_ignorable_namespaces(self, xml_doc): + xml_string = lxml.etree.tostring(xml_doc, encoding="unicode") + xml_copy = lxml.etree.fromstring(xml_string) + + for elem in xml_copy.iter(): + attrs_to_remove = [] + + for attr in elem.attrib: + if "{" in attr: + ns = attr.split("}")[0][1:] + if ns not in self.OOXML_NAMESPACES: + attrs_to_remove.append(attr) + + for attr in attrs_to_remove: + del elem.attrib[attr] + + self._remove_ignorable_elements(xml_copy) + + return lxml.etree.ElementTree(xml_copy) + + def _remove_ignorable_elements(self, root): + elements_to_remove = [] + + for elem in list(root): + if not hasattr(elem, "tag") or callable(elem.tag): + continue + + tag_str = str(elem.tag) + if tag_str.startswith("{"): + ns = tag_str.split("}")[0][1:] + if ns not in self.OOXML_NAMESPACES: + elements_to_remove.append(elem) + continue + + self._remove_ignorable_elements(elem) + + for elem in elements_to_remove: + root.remove(elem) + + def _preprocess_for_mc_ignorable(self, xml_doc): + root = xml_doc.getroot() + + if f"{{{self.MC_NAMESPACE}}}Ignorable" in root.attrib: + del root.attrib[f"{{{self.MC_NAMESPACE}}}Ignorable"] + + return xml_doc + + def _validate_single_file_xsd(self, xml_file, base_path): + schema_path = self._get_schema_path(xml_file) + if not schema_path: + return None, None + + try: + with open(schema_path, "rb") as xsd_file: + parser = lxml.etree.XMLParser() + xsd_doc = lxml.etree.parse( + xsd_file, parser=parser, base_url=str(schema_path) + ) + schema = lxml.etree.XMLSchema(xsd_doc) + + with open(xml_file, "r") as f: + xml_doc = lxml.etree.parse(f) + + xml_doc, _ = self._remove_template_tags_from_text_nodes(xml_doc) + xml_doc = self._preprocess_for_mc_ignorable(xml_doc) + + relative_path = xml_file.relative_to(base_path) + if ( + relative_path.parts + and relative_path.parts[0] in self.MAIN_CONTENT_FOLDERS + ): + xml_doc = self._clean_ignorable_namespaces(xml_doc) + + if schema.validate(xml_doc): + return True, set() + else: + errors = set() + for error in schema.error_log: + errors.add(error.message) + return False, errors + + except Exception as e: + return False, {str(e)} + + def _get_original_file_errors(self, xml_file): + if self.original_file is None: + return set() + + import tempfile + import zipfile + + xml_file = Path(xml_file).resolve() + unpacked_dir = self.unpacked_dir.resolve() + relative_path = xml_file.relative_to(unpacked_dir) + + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + with zipfile.ZipFile(self.original_file, "r") as zip_ref: + zip_ref.extractall(temp_path) + + original_xml_file = temp_path / relative_path + + if not original_xml_file.exists(): + return set() + + is_valid, errors = self._validate_single_file_xsd( + original_xml_file, temp_path + ) + return errors if errors else set() + + def _remove_template_tags_from_text_nodes(self, xml_doc): + warnings = [] + template_pattern = re.compile(r"\{\{[^}]*\}\}") + + xml_string = lxml.etree.tostring(xml_doc, encoding="unicode") + xml_copy = lxml.etree.fromstring(xml_string) + + def process_text_content(text, content_type): + if not text: + return text + matches = list(template_pattern.finditer(text)) + if matches: + for match in matches: + warnings.append( + f"Found template tag in {content_type}: {match.group()}" + ) + return template_pattern.sub("", text) + return text + + for elem in xml_copy.iter(): + if not hasattr(elem, "tag") or callable(elem.tag): + continue + tag_str = str(elem.tag) + if tag_str.endswith("}t") or tag_str == "t": + continue + + elem.text = process_text_content(elem.text, "text content") + elem.tail = process_text_content(elem.tail, "tail content") + + return lxml.etree.ElementTree(xml_copy), warnings + + +if __name__ == "__main__": + raise RuntimeError("This module should not be run directly.") diff --git a/.claude/skills/docx/scripts/office/validators/docx.py b/.claude/skills/docx/scripts/office/validators/docx.py new file mode 100644 index 0000000..fec405e --- /dev/null +++ b/.claude/skills/docx/scripts/office/validators/docx.py @@ -0,0 +1,446 @@ +""" +Validator for Word document XML files against XSD schemas. +""" + +import random +import re +import tempfile +import zipfile + +import defusedxml.minidom +import lxml.etree + +from .base import BaseSchemaValidator + + +class DOCXSchemaValidator(BaseSchemaValidator): + + WORD_2006_NAMESPACE = "http://schemas.openxmlformats.org/wordprocessingml/2006/main" + W14_NAMESPACE = "http://schemas.microsoft.com/office/word/2010/wordml" + W16CID_NAMESPACE = "http://schemas.microsoft.com/office/word/2016/wordml/cid" + + ELEMENT_RELATIONSHIP_TYPES = {} + + def validate(self): + if not self.validate_xml(): + return False + + all_valid = True + if not self.validate_namespaces(): + all_valid = False + + if not self.validate_unique_ids(): + all_valid = False + + if not self.validate_file_references(): + all_valid = False + + if not self.validate_content_types(): + all_valid = False + + if not self.validate_against_xsd(): + all_valid = False + + if not self.validate_whitespace_preservation(): + all_valid = False + + if not self.validate_deletions(): + all_valid = False + + if not self.validate_insertions(): + all_valid = False + + if not self.validate_all_relationship_ids(): + all_valid = False + + if not self.validate_id_constraints(): + all_valid = False + + if not self.validate_comment_markers(): + all_valid = False + + self.compare_paragraph_counts() + + return all_valid + + def validate_whitespace_preservation(self): + errors = [] + + for xml_file in self.xml_files: + if xml_file.name != "document.xml": + continue + + try: + root = lxml.etree.parse(str(xml_file)).getroot() + + for elem in root.iter(f"{{{self.WORD_2006_NAMESPACE}}}t"): + if elem.text: + text = elem.text + if re.search(r"^[ \t\n\r]", text) or re.search( + r"[ \t\n\r]$", text + ): + xml_space_attr = f"{{{self.XML_NAMESPACE}}}space" + if ( + xml_space_attr not in elem.attrib + or elem.attrib[xml_space_attr] != "preserve" + ): + text_preview = ( + repr(text)[:50] + "..." + if len(repr(text)) > 50 + else repr(text) + ) + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {elem.sourceline}: w:t element with whitespace missing xml:space='preserve': {text_preview}" + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} whitespace preservation violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All whitespace is properly preserved") + return True + + def validate_deletions(self): + errors = [] + + for xml_file in self.xml_files: + if xml_file.name != "document.xml": + continue + + try: + root = lxml.etree.parse(str(xml_file)).getroot() + namespaces = {"w": self.WORD_2006_NAMESPACE} + + for t_elem in root.xpath(".//w:del//w:t", namespaces=namespaces): + if t_elem.text: + text_preview = ( + repr(t_elem.text)[:50] + "..." + if len(repr(t_elem.text)) > 50 + else repr(t_elem.text) + ) + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {t_elem.sourceline}: found within : {text_preview}" + ) + + for instr_elem in root.xpath( + ".//w:del//w:instrText", namespaces=namespaces + ): + text_preview = ( + repr(instr_elem.text or "")[:50] + "..." + if len(repr(instr_elem.text or "")) > 50 + else repr(instr_elem.text or "") + ) + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {instr_elem.sourceline}: found within (use ): {text_preview}" + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} deletion validation violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - No w:t elements found within w:del elements") + return True + + def count_paragraphs_in_unpacked(self): + count = 0 + + for xml_file in self.xml_files: + if xml_file.name != "document.xml": + continue + + try: + root = lxml.etree.parse(str(xml_file)).getroot() + paragraphs = root.findall(f".//{{{self.WORD_2006_NAMESPACE}}}p") + count = len(paragraphs) + except Exception as e: + print(f"Error counting paragraphs in unpacked document: {e}") + + return count + + def count_paragraphs_in_original(self): + original = self.original_file + if original is None: + return 0 + + count = 0 + + try: + with tempfile.TemporaryDirectory() as temp_dir: + with zipfile.ZipFile(original, "r") as zip_ref: + zip_ref.extractall(temp_dir) + + doc_xml_path = temp_dir + "/word/document.xml" + root = lxml.etree.parse(doc_xml_path).getroot() + + paragraphs = root.findall(f".//{{{self.WORD_2006_NAMESPACE}}}p") + count = len(paragraphs) + + except Exception as e: + print(f"Error counting paragraphs in original document: {e}") + + return count + + def validate_insertions(self): + errors = [] + + for xml_file in self.xml_files: + if xml_file.name != "document.xml": + continue + + try: + root = lxml.etree.parse(str(xml_file)).getroot() + namespaces = {"w": self.WORD_2006_NAMESPACE} + + invalid_elements = root.xpath( + ".//w:ins//w:delText[not(ancestor::w:del)]", namespaces=namespaces + ) + + for elem in invalid_elements: + text_preview = ( + repr(elem.text or "")[:50] + "..." + if len(repr(elem.text or "")) > 50 + else repr(elem.text or "") + ) + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {elem.sourceline}: within : {text_preview}" + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} insertion validation violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - No w:delText elements within w:ins elements") + return True + + def compare_paragraph_counts(self): + original_count = self.count_paragraphs_in_original() + new_count = self.count_paragraphs_in_unpacked() + + diff = new_count - original_count + diff_str = f"+{diff}" if diff > 0 else str(diff) + print(f"\nParagraphs: {original_count} → {new_count} ({diff_str})") + + def _parse_id_value(self, val: str, base: int = 16) -> int: + return int(val, base) + + def validate_id_constraints(self): + errors = [] + para_id_attr = f"{{{self.W14_NAMESPACE}}}paraId" + durable_id_attr = f"{{{self.W16CID_NAMESPACE}}}durableId" + + for xml_file in self.xml_files: + try: + for elem in lxml.etree.parse(str(xml_file)).iter(): + if val := elem.get(para_id_attr): + if self._parse_id_value(val, base=16) >= 0x80000000: + errors.append( + f" {xml_file.name}:{elem.sourceline}: paraId={val} >= 0x80000000" + ) + + if val := elem.get(durable_id_attr): + if xml_file.name == "numbering.xml": + try: + if self._parse_id_value(val, base=10) >= 0x7FFFFFFF: + errors.append( + f" {xml_file.name}:{elem.sourceline}: " + f"durableId={val} >= 0x7FFFFFFF" + ) + except ValueError: + errors.append( + f" {xml_file.name}:{elem.sourceline}: " + f"durableId={val} must be decimal in numbering.xml" + ) + else: + if self._parse_id_value(val, base=16) >= 0x7FFFFFFF: + errors.append( + f" {xml_file.name}:{elem.sourceline}: " + f"durableId={val} >= 0x7FFFFFFF" + ) + except Exception: + pass + + if errors: + print(f"FAILED - {len(errors)} ID constraint violations:") + for e in errors: + print(e) + elif self.verbose: + print("PASSED - All paraId/durableId values within constraints") + return not errors + + def validate_comment_markers(self): + errors = [] + + document_xml = None + comments_xml = None + for xml_file in self.xml_files: + if xml_file.name == "document.xml" and "word" in str(xml_file): + document_xml = xml_file + elif xml_file.name == "comments.xml": + comments_xml = xml_file + + if not document_xml: + if self.verbose: + print("PASSED - No document.xml found (skipping comment validation)") + return True + + try: + doc_root = lxml.etree.parse(str(document_xml)).getroot() + namespaces = {"w": self.WORD_2006_NAMESPACE} + + range_starts = { + elem.get(f"{{{self.WORD_2006_NAMESPACE}}}id") + for elem in doc_root.xpath( + ".//w:commentRangeStart", namespaces=namespaces + ) + } + range_ends = { + elem.get(f"{{{self.WORD_2006_NAMESPACE}}}id") + for elem in doc_root.xpath( + ".//w:commentRangeEnd", namespaces=namespaces + ) + } + references = { + elem.get(f"{{{self.WORD_2006_NAMESPACE}}}id") + for elem in doc_root.xpath( + ".//w:commentReference", namespaces=namespaces + ) + } + + orphaned_ends = range_ends - range_starts + for comment_id in sorted( + orphaned_ends, key=lambda x: int(x) if x and x.isdigit() else 0 + ): + errors.append( + f' document.xml: commentRangeEnd id="{comment_id}" has no matching commentRangeStart' + ) + + orphaned_starts = range_starts - range_ends + for comment_id in sorted( + orphaned_starts, key=lambda x: int(x) if x and x.isdigit() else 0 + ): + errors.append( + f' document.xml: commentRangeStart id="{comment_id}" has no matching commentRangeEnd' + ) + + comment_ids = set() + if comments_xml and comments_xml.exists(): + comments_root = lxml.etree.parse(str(comments_xml)).getroot() + comment_ids = { + elem.get(f"{{{self.WORD_2006_NAMESPACE}}}id") + for elem in comments_root.xpath( + ".//w:comment", namespaces=namespaces + ) + } + + marker_ids = range_starts | range_ends | references + invalid_refs = marker_ids - comment_ids + for comment_id in sorted( + invalid_refs, key=lambda x: int(x) if x and x.isdigit() else 0 + ): + if comment_id: + errors.append( + f' document.xml: marker id="{comment_id}" references non-existent comment' + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append(f" Error parsing XML: {e}") + + if errors: + print(f"FAILED - {len(errors)} comment marker violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All comment markers properly paired") + return True + + def repair(self) -> int: + repairs = super().repair() + repairs += self.repair_durableId() + return repairs + + def repair_durableId(self) -> int: + repairs = 0 + + for xml_file in self.xml_files: + try: + content = xml_file.read_text(encoding="utf-8") + dom = defusedxml.minidom.parseString(content) + modified = False + + for elem in dom.getElementsByTagName("*"): + if not elem.hasAttribute("w16cid:durableId"): + continue + + durable_id = elem.getAttribute("w16cid:durableId") + needs_repair = False + + if xml_file.name == "numbering.xml": + try: + needs_repair = ( + self._parse_id_value(durable_id, base=10) >= 0x7FFFFFFF + ) + except ValueError: + needs_repair = True + else: + try: + needs_repair = ( + self._parse_id_value(durable_id, base=16) >= 0x7FFFFFFF + ) + except ValueError: + needs_repair = True + + if needs_repair: + value = random.randint(1, 0x7FFFFFFE) + if xml_file.name == "numbering.xml": + new_id = str(value) + else: + new_id = f"{value:08X}" + + elem.setAttribute("w16cid:durableId", new_id) + print( + f" Repaired: {xml_file.name}: durableId {durable_id} → {new_id}" + ) + repairs += 1 + modified = True + + if modified: + xml_file.write_bytes(dom.toxml(encoding="UTF-8")) + + except Exception: + pass + + return repairs + + +if __name__ == "__main__": + raise RuntimeError("This module should not be run directly.") diff --git a/.claude/skills/docx/scripts/office/validators/pptx.py b/.claude/skills/docx/scripts/office/validators/pptx.py new file mode 100644 index 0000000..09842aa --- /dev/null +++ b/.claude/skills/docx/scripts/office/validators/pptx.py @@ -0,0 +1,275 @@ +""" +Validator for PowerPoint presentation XML files against XSD schemas. +""" + +import re + +from .base import BaseSchemaValidator + + +class PPTXSchemaValidator(BaseSchemaValidator): + + PRESENTATIONML_NAMESPACE = ( + "http://schemas.openxmlformats.org/presentationml/2006/main" + ) + + ELEMENT_RELATIONSHIP_TYPES = { + "sldid": "slide", + "sldmasterid": "slidemaster", + "notesmasterid": "notesmaster", + "sldlayoutid": "slidelayout", + "themeid": "theme", + "tablestyleid": "tablestyles", + } + + def validate(self): + if not self.validate_xml(): + return False + + all_valid = True + if not self.validate_namespaces(): + all_valid = False + + if not self.validate_unique_ids(): + all_valid = False + + if not self.validate_uuid_ids(): + all_valid = False + + if not self.validate_file_references(): + all_valid = False + + if not self.validate_slide_layout_ids(): + all_valid = False + + if not self.validate_content_types(): + all_valid = False + + if not self.validate_against_xsd(): + all_valid = False + + if not self.validate_notes_slide_references(): + all_valid = False + + if not self.validate_all_relationship_ids(): + all_valid = False + + if not self.validate_no_duplicate_slide_layouts(): + all_valid = False + + return all_valid + + def validate_uuid_ids(self): + import lxml.etree + + errors = [] + uuid_pattern = re.compile( + r"^[\{\(]?[0-9A-Fa-f]{8}-?[0-9A-Fa-f]{4}-?[0-9A-Fa-f]{4}-?[0-9A-Fa-f]{4}-?[0-9A-Fa-f]{12}[\}\)]?$" + ) + + for xml_file in self.xml_files: + try: + root = lxml.etree.parse(str(xml_file)).getroot() + + for elem in root.iter(): + for attr, value in elem.attrib.items(): + attr_name = attr.split("}")[-1].lower() + if attr_name == "id" or attr_name.endswith("id"): + if self._looks_like_uuid(value): + if not uuid_pattern.match(value): + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {elem.sourceline}: ID '{value}' appears to be a UUID but contains invalid hex characters" + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} UUID ID validation errors:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All UUID-like IDs contain valid hex values") + return True + + def _looks_like_uuid(self, value): + clean_value = value.strip("{}()").replace("-", "") + return len(clean_value) == 32 and all(c.isalnum() for c in clean_value) + + def validate_slide_layout_ids(self): + import lxml.etree + + errors = [] + + slide_masters = list(self.unpacked_dir.glob("ppt/slideMasters/*.xml")) + + if not slide_masters: + if self.verbose: + print("PASSED - No slide masters found") + return True + + for slide_master in slide_masters: + try: + root = lxml.etree.parse(str(slide_master)).getroot() + + rels_file = slide_master.parent / "_rels" / f"{slide_master.name}.rels" + + if not rels_file.exists(): + errors.append( + f" {slide_master.relative_to(self.unpacked_dir)}: " + f"Missing relationships file: {rels_file.relative_to(self.unpacked_dir)}" + ) + continue + + rels_root = lxml.etree.parse(str(rels_file)).getroot() + + valid_layout_rids = set() + for rel in rels_root.findall( + f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship" + ): + rel_type = rel.get("Type", "") + if "slideLayout" in rel_type: + valid_layout_rids.add(rel.get("Id")) + + for sld_layout_id in root.findall( + f".//{{{self.PRESENTATIONML_NAMESPACE}}}sldLayoutId" + ): + r_id = sld_layout_id.get( + f"{{{self.OFFICE_RELATIONSHIPS_NAMESPACE}}}id" + ) + layout_id = sld_layout_id.get("id") + + if r_id and r_id not in valid_layout_rids: + errors.append( + f" {slide_master.relative_to(self.unpacked_dir)}: " + f"Line {sld_layout_id.sourceline}: sldLayoutId with id='{layout_id}' " + f"references r:id='{r_id}' which is not found in slide layout relationships" + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {slide_master.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} slide layout ID validation errors:") + for error in errors: + print(error) + print( + "Remove invalid references or add missing slide layouts to the relationships file." + ) + return False + else: + if self.verbose: + print("PASSED - All slide layout IDs reference valid slide layouts") + return True + + def validate_no_duplicate_slide_layouts(self): + import lxml.etree + + errors = [] + slide_rels_files = list(self.unpacked_dir.glob("ppt/slides/_rels/*.xml.rels")) + + for rels_file in slide_rels_files: + try: + root = lxml.etree.parse(str(rels_file)).getroot() + + layout_rels = [ + rel + for rel in root.findall( + f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship" + ) + if "slideLayout" in rel.get("Type", "") + ] + + if len(layout_rels) > 1: + errors.append( + f" {rels_file.relative_to(self.unpacked_dir)}: has {len(layout_rels)} slideLayout references" + ) + + except Exception as e: + errors.append( + f" {rels_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print("FAILED - Found slides with duplicate slideLayout references:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All slides have exactly one slideLayout reference") + return True + + def validate_notes_slide_references(self): + import lxml.etree + + errors = [] + notes_slide_references = {} + + slide_rels_files = list(self.unpacked_dir.glob("ppt/slides/_rels/*.xml.rels")) + + if not slide_rels_files: + if self.verbose: + print("PASSED - No slide relationship files found") + return True + + for rels_file in slide_rels_files: + try: + root = lxml.etree.parse(str(rels_file)).getroot() + + for rel in root.findall( + f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship" + ): + rel_type = rel.get("Type", "") + if "notesSlide" in rel_type: + target = rel.get("Target", "") + if target: + normalized_target = target.replace("../", "") + + slide_name = rels_file.stem.replace( + ".xml", "" + ) + + if normalized_target not in notes_slide_references: + notes_slide_references[normalized_target] = [] + notes_slide_references[normalized_target].append( + (slide_name, rels_file) + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {rels_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + for target, references in notes_slide_references.items(): + if len(references) > 1: + slide_names = [ref[0] for ref in references] + errors.append( + f" Notes slide '{target}' is referenced by multiple slides: {', '.join(slide_names)}" + ) + for slide_name, rels_file in references: + errors.append(f" - {rels_file.relative_to(self.unpacked_dir)}") + + if errors: + print( + f"FAILED - Found {len([e for e in errors if not e.startswith(' ')])} notes slide reference validation errors:" + ) + for error in errors: + print(error) + print("Each slide may optionally have its own slide file.") + return False + else: + if self.verbose: + print("PASSED - All notes slide references are unique") + return True + + +if __name__ == "__main__": + raise RuntimeError("This module should not be run directly.") diff --git a/.claude/skills/docx/scripts/office/validators/redlining.py b/.claude/skills/docx/scripts/office/validators/redlining.py new file mode 100644 index 0000000..71c81b6 --- /dev/null +++ b/.claude/skills/docx/scripts/office/validators/redlining.py @@ -0,0 +1,247 @@ +""" +Validator for tracked changes in Word documents. +""" + +import subprocess +import tempfile +import zipfile +from pathlib import Path + + +class RedliningValidator: + + def __init__(self, unpacked_dir, original_docx, verbose=False, author="Claude"): + self.unpacked_dir = Path(unpacked_dir) + self.original_docx = Path(original_docx) + self.verbose = verbose + self.author = author + self.namespaces = { + "w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main" + } + + def repair(self) -> int: + return 0 + + def validate(self): + modified_file = self.unpacked_dir / "word" / "document.xml" + if not modified_file.exists(): + print(f"FAILED - Modified document.xml not found at {modified_file}") + return False + + try: + import xml.etree.ElementTree as ET + + tree = ET.parse(modified_file) + root = tree.getroot() + + del_elements = root.findall(".//w:del", self.namespaces) + ins_elements = root.findall(".//w:ins", self.namespaces) + + author_del_elements = [ + elem + for elem in del_elements + if elem.get(f"{{{self.namespaces['w']}}}author") == self.author + ] + author_ins_elements = [ + elem + for elem in ins_elements + if elem.get(f"{{{self.namespaces['w']}}}author") == self.author + ] + + if not author_del_elements and not author_ins_elements: + if self.verbose: + print(f"PASSED - No tracked changes by {self.author} found.") + return True + + except Exception: + pass + + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + try: + with zipfile.ZipFile(self.original_docx, "r") as zip_ref: + zip_ref.extractall(temp_path) + except Exception as e: + print(f"FAILED - Error unpacking original docx: {e}") + return False + + original_file = temp_path / "word" / "document.xml" + if not original_file.exists(): + print( + f"FAILED - Original document.xml not found in {self.original_docx}" + ) + return False + + try: + import xml.etree.ElementTree as ET + + modified_tree = ET.parse(modified_file) + modified_root = modified_tree.getroot() + original_tree = ET.parse(original_file) + original_root = original_tree.getroot() + except ET.ParseError as e: + print(f"FAILED - Error parsing XML files: {e}") + return False + + self._remove_author_tracked_changes(original_root) + self._remove_author_tracked_changes(modified_root) + + modified_text = self._extract_text_content(modified_root) + original_text = self._extract_text_content(original_root) + + if modified_text != original_text: + error_message = self._generate_detailed_diff( + original_text, modified_text + ) + print(error_message) + return False + + if self.verbose: + print(f"PASSED - All changes by {self.author} are properly tracked") + return True + + def _generate_detailed_diff(self, original_text, modified_text): + error_parts = [ + f"FAILED - Document text doesn't match after removing {self.author}'s tracked changes", + "", + "Likely causes:", + " 1. Modified text inside another author's or tags", + " 2. Made edits without proper tracked changes", + " 3. Didn't nest inside when deleting another's insertion", + "", + "For pre-redlined documents, use correct patterns:", + " - To reject another's INSERTION: Nest inside their ", + " - To restore another's DELETION: Add new AFTER their ", + "", + ] + + git_diff = self._get_git_word_diff(original_text, modified_text) + if git_diff: + error_parts.extend(["Differences:", "============", git_diff]) + else: + error_parts.append("Unable to generate word diff (git not available)") + + return "\n".join(error_parts) + + def _get_git_word_diff(self, original_text, modified_text): + try: + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + original_file = temp_path / "original.txt" + modified_file = temp_path / "modified.txt" + + original_file.write_text(original_text, encoding="utf-8") + modified_file.write_text(modified_text, encoding="utf-8") + + result = subprocess.run( + [ + "git", + "diff", + "--word-diff=plain", + "--word-diff-regex=.", + "-U0", + "--no-index", + str(original_file), + str(modified_file), + ], + capture_output=True, + text=True, + ) + + if result.stdout.strip(): + lines = result.stdout.split("\n") + content_lines = [] + in_content = False + for line in lines: + if line.startswith("@@"): + in_content = True + continue + if in_content and line.strip(): + content_lines.append(line) + + if content_lines: + return "\n".join(content_lines) + + result = subprocess.run( + [ + "git", + "diff", + "--word-diff=plain", + "-U0", + "--no-index", + str(original_file), + str(modified_file), + ], + capture_output=True, + text=True, + ) + + if result.stdout.strip(): + lines = result.stdout.split("\n") + content_lines = [] + in_content = False + for line in lines: + if line.startswith("@@"): + in_content = True + continue + if in_content and line.strip(): + content_lines.append(line) + return "\n".join(content_lines) + + except (subprocess.CalledProcessError, FileNotFoundError, Exception): + pass + + return None + + def _remove_author_tracked_changes(self, root): + ins_tag = f"{{{self.namespaces['w']}}}ins" + del_tag = f"{{{self.namespaces['w']}}}del" + author_attr = f"{{{self.namespaces['w']}}}author" + + for parent in root.iter(): + to_remove = [] + for child in parent: + if child.tag == ins_tag and child.get(author_attr) == self.author: + to_remove.append(child) + for elem in to_remove: + parent.remove(elem) + + deltext_tag = f"{{{self.namespaces['w']}}}delText" + t_tag = f"{{{self.namespaces['w']}}}t" + + for parent in root.iter(): + to_process = [] + for child in parent: + if child.tag == del_tag and child.get(author_attr) == self.author: + to_process.append((child, list(parent).index(child))) + + for del_elem, del_index in reversed(to_process): + for elem in del_elem.iter(): + if elem.tag == deltext_tag: + elem.tag = t_tag + + for child in reversed(list(del_elem)): + parent.insert(del_index, child) + parent.remove(del_elem) + + def _extract_text_content(self, root): + p_tag = f"{{{self.namespaces['w']}}}p" + t_tag = f"{{{self.namespaces['w']}}}t" + + paragraphs = [] + for p_elem in root.findall(f".//{p_tag}"): + text_parts = [] + for t_elem in p_elem.findall(f".//{t_tag}"): + if t_elem.text: + text_parts.append(t_elem.text) + paragraph_text = "".join(text_parts) + if paragraph_text: + paragraphs.append(paragraph_text) + + return "\n".join(paragraphs) + + +if __name__ == "__main__": + raise RuntimeError("This module should not be run directly.") diff --git a/.claude/skills/docx/scripts/templates/comments.xml b/.claude/skills/docx/scripts/templates/comments.xml new file mode 100644 index 0000000..cd01a7d --- /dev/null +++ b/.claude/skills/docx/scripts/templates/comments.xml @@ -0,0 +1,3 @@ + + + diff --git a/.claude/skills/docx/scripts/templates/commentsExtended.xml b/.claude/skills/docx/scripts/templates/commentsExtended.xml new file mode 100644 index 0000000..411003c --- /dev/null +++ b/.claude/skills/docx/scripts/templates/commentsExtended.xml @@ -0,0 +1,3 @@ + + + diff --git a/.claude/skills/docx/scripts/templates/commentsExtensible.xml b/.claude/skills/docx/scripts/templates/commentsExtensible.xml new file mode 100644 index 0000000..f5572d7 --- /dev/null +++ b/.claude/skills/docx/scripts/templates/commentsExtensible.xml @@ -0,0 +1,3 @@ + + + diff --git a/.claude/skills/docx/scripts/templates/commentsIds.xml b/.claude/skills/docx/scripts/templates/commentsIds.xml new file mode 100644 index 0000000..32f1629 --- /dev/null +++ b/.claude/skills/docx/scripts/templates/commentsIds.xml @@ -0,0 +1,3 @@ + + + diff --git a/.claude/skills/docx/scripts/templates/people.xml b/.claude/skills/docx/scripts/templates/people.xml new file mode 100644 index 0000000..3803d2d --- /dev/null +++ b/.claude/skills/docx/scripts/templates/people.xml @@ -0,0 +1,3 @@ + + + diff --git a/.claude/skills/frontend-design/.openskills.json b/.claude/skills/frontend-design/.openskills.json new file mode 100644 index 0000000..a445f48 --- /dev/null +++ b/.claude/skills/frontend-design/.openskills.json @@ -0,0 +1,7 @@ +{ + "source": "anthropics/skills", + "sourceType": "git", + "repoUrl": "https://github.com/anthropics/skills", + "subpath": "skills\\frontend-design", + "installedAt": "2026-03-02T09:19:50.104Z" +} \ No newline at end of file diff --git a/.claude/skills/frontend-design/LICENSE.txt b/.claude/skills/frontend-design/LICENSE.txt new file mode 100644 index 0000000..f433b1a --- /dev/null +++ b/.claude/skills/frontend-design/LICENSE.txt @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/.claude/skills/frontend-design/SKILL.md b/.claude/skills/frontend-design/SKILL.md new file mode 100644 index 0000000..5be498e --- /dev/null +++ b/.claude/skills/frontend-design/SKILL.md @@ -0,0 +1,42 @@ +--- +name: frontend-design +description: Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML/CSS layouts, or when styling/beautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics. +license: Complete terms in LICENSE.txt +--- + +This skill guides creation of distinctive, production-grade frontend interfaces that avoid generic "AI slop" aesthetics. Implement real working code with exceptional attention to aesthetic details and creative choices. + +The user provides frontend requirements: a component, page, application, or interface to build. They may include context about the purpose, audience, or technical constraints. + +## Design Thinking + +Before coding, understand the context and commit to a BOLD aesthetic direction: +- **Purpose**: What problem does this interface solve? Who uses it? +- **Tone**: Pick an extreme: brutally minimal, maximalist chaos, retro-futuristic, organic/natural, luxury/refined, playful/toy-like, editorial/magazine, brutalist/raw, art deco/geometric, soft/pastel, industrial/utilitarian, etc. There are so many flavors to choose from. Use these for inspiration but design one that is true to the aesthetic direction. +- **Constraints**: Technical requirements (framework, performance, accessibility). +- **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember? + +**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work - the key is intentionality, not intensity. + +Then implement working code (HTML/CSS/JS, React, Vue, etc.) that is: +- Production-grade and functional +- Visually striking and memorable +- Cohesive with a clear aesthetic point-of-view +- Meticulously refined in every detail + +## Frontend Aesthetics Guidelines + +Focus on: +- **Typography**: Choose fonts that are beautiful, unique, and interesting. Avoid generic fonts like Arial and Inter; opt instead for distinctive choices that elevate the frontend's aesthetics; unexpected, characterful font choices. Pair a distinctive display font with a refined body font. +- **Color & Theme**: Commit to a cohesive aesthetic. Use CSS variables for consistency. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. +- **Motion**: Use animations for effects and micro-interactions. Prioritize CSS-only solutions for HTML. Use Motion library for React when available. Focus on high-impact moments: one well-orchestrated page load with staggered reveals (animation-delay) creates more delight than scattered micro-interactions. Use scroll-triggering and hover states that surprise. +- **Spatial Composition**: Unexpected layouts. Asymmetry. Overlap. Diagonal flow. Grid-breaking elements. Generous negative space OR controlled density. +- **Backgrounds & Visual Details**: Create atmosphere and depth rather than defaulting to solid colors. Add contextual effects and textures that match the overall aesthetic. Apply creative forms like gradient meshes, noise textures, geometric patterns, layered transparencies, dramatic shadows, decorative borders, custom cursors, and grain overlays. + +NEVER use generic AI-generated aesthetics like overused font families (Inter, Roboto, Arial, system fonts), cliched color schemes (particularly purple gradients on white backgrounds), predictable layouts and component patterns, and cookie-cutter design that lacks context-specific character. + +Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices (Space Grotesk, for example) across generations. + +**IMPORTANT**: Match implementation complexity to the aesthetic vision. Maximalist designs need elaborate code with extensive animations and effects. Minimalist or refined designs need restraint, precision, and careful attention to spacing, typography, and subtle details. Elegance comes from executing the vision well. + +Remember: Claude is capable of extraordinary creative work. Don't hold back, show what can truly be created when thinking outside the box and committing fully to a distinctive vision. diff --git a/.claude/skills/internal-comms/.openskills.json b/.claude/skills/internal-comms/.openskills.json new file mode 100644 index 0000000..ae0f1ec --- /dev/null +++ b/.claude/skills/internal-comms/.openskills.json @@ -0,0 +1,7 @@ +{ + "source": "anthropics/skills", + "sourceType": "git", + "repoUrl": "https://github.com/anthropics/skills", + "subpath": "skills\\internal-comms", + "installedAt": "2026-03-02T09:19:50.108Z" +} \ No newline at end of file diff --git a/.claude/skills/internal-comms/LICENSE.txt b/.claude/skills/internal-comms/LICENSE.txt new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/.claude/skills/internal-comms/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/.claude/skills/internal-comms/SKILL.md b/.claude/skills/internal-comms/SKILL.md new file mode 100644 index 0000000..56ea935 --- /dev/null +++ b/.claude/skills/internal-comms/SKILL.md @@ -0,0 +1,32 @@ +--- +name: internal-comms +description: A set of resources to help me write all kinds of internal communications, using the formats that my company likes to use. Claude should use this skill whenever asked to write some sort of internal communications (status reports, leadership updates, 3P updates, company newsletters, FAQs, incident reports, project updates, etc.). +license: Complete terms in LICENSE.txt +--- + +## When to use this skill +To write internal communications, use this skill for: +- 3P updates (Progress, Plans, Problems) +- Company newsletters +- FAQ responses +- Status reports +- Leadership updates +- Project updates +- Incident reports + +## How to use this skill + +To write any internal communication: + +1. **Identify the communication type** from the request +2. **Load the appropriate guideline file** from the `examples/` directory: + - `examples/3p-updates.md` - For Progress/Plans/Problems team updates + - `examples/company-newsletter.md` - For company-wide newsletters + - `examples/faq-answers.md` - For answering frequently asked questions + - `examples/general-comms.md` - For anything else that doesn't explicitly match one of the above +3. **Follow the specific instructions** in that file for formatting, tone, and content gathering + +If the communication type doesn't match any existing guideline, ask for clarification or more context about the desired format. + +## Keywords +3P updates, company newsletter, company comms, weekly update, faqs, common questions, updates, internal comms diff --git a/.claude/skills/internal-comms/examples/3p-updates.md b/.claude/skills/internal-comms/examples/3p-updates.md new file mode 100644 index 0000000..5329bfb --- /dev/null +++ b/.claude/skills/internal-comms/examples/3p-updates.md @@ -0,0 +1,47 @@ +## Instructions +You are being asked to write a 3P update. 3P updates stand for "Progress, Plans, Problems." The main audience is for executives, leadership, other teammates, etc. They're meant to be very succinct and to-the-point: think something you can read in 30-60sec or less. They're also for people with some, but not a lot of context on what the team does. + +3Ps can cover a team of any size, ranging all the way up to the entire company. The bigger the team, the less granular the tasks should be. For example, "mobile team" might have "shipped feature" or "fixed bugs," whereas the company might have really meaty 3Ps, like "hired 20 new people" or "closed 10 new deals." + +They represent the work of the team across a time period, almost always one week. They include three sections: +1) Progress: what the team has accomplished over the next time period. Focus mainly on things shipped, milestones achieved, tasks created, etc. +2) Plans: what the team plans to do over the next time period. Focus on what things are top-of-mind, really high priority, etc. for the team. +3) Problems: anything that is slowing the team down. This could be things like too few people, bugs or blockers that are preventing the team from moving forward, some deal that fell through, etc. + +Before writing them, make sure that you know the team name. If it's not specified, you can ask explicitly what the team name you're writing for is. + + +## Tools Available +Whenever possible, try to pull from available sources to get the information you need: +- Slack: posts from team members with their updates - ideally look for posts in large channels with lots of reactions +- Google Drive: docs written from critical team members with lots of views +- Email: emails with lots of responses of lots of content that seems relevant +- Calendar: non-recurring meetings that have a lot of importance, like product reviews, etc. + + +Try to gather as much context as you can, focusing on the things that covered the time period you're writing for: +- Progress: anything between a week ago and today +- Plans: anything from today to the next week +- Problems: anything between a week ago and today + + +If you don't have access, you can ask the user for things they want to cover. They might also include these things to you directly, in which case you're mostly just formatting for this particular format. + +## Workflow + +1. **Clarify scope**: Confirm the team name and time period (usually past week for Progress/Problems, next +week for Plans) +2. **Gather information**: Use available tools or ask the user directly +3. **Draft the update**: Follow the strict formatting guidelines +4. **Review**: Ensure it's concise (30-60 seconds to read) and data-driven + +## Formatting + +The format is always the same, very strict formatting. Never use any formatting other than this. Pick an emoji that is fun and captures the vibe of the team and update. + +[pick an emoji] [Team Name] (Dates Covered, usually a week) +Progress: [1-3 sentences of content] +Plans: [1-3 sentences of content] +Problems: [1-3 sentences of content] + +Each section should be no more than 1-3 sentences: clear, to the point. It should be data-driven, and generally include metrics where possible. The tone should be very matter-of-fact, not super prose-heavy. \ No newline at end of file diff --git a/.claude/skills/internal-comms/examples/company-newsletter.md b/.claude/skills/internal-comms/examples/company-newsletter.md new file mode 100644 index 0000000..4997a07 --- /dev/null +++ b/.claude/skills/internal-comms/examples/company-newsletter.md @@ -0,0 +1,65 @@ +## Instructions +You are being asked to write a company-wide newsletter update. You are meant to summarize the past week/month of a company in the form of a newsletter that the entire company will read. It should be maybe ~20-25 bullet points long. It will be sent via Slack and email, so make it consumable for that. + +Ideally it includes the following attributes: +- Lots of links: pulling documents from Google Drive that are very relevant, linking to prominent Slack messages in announce channels and from executives, perhgaps referencing emails that went company-wide, highlighting significant things that have happened in the company. +- Short and to-the-point: each bullet should probably be no longer than ~1-2 sentences +- Use the "we" tense, as you are part of the company. Many of the bullets should say "we did this" or "we did that" + +## Tools to use +If you have access to the following tools, please try to use them. If not, you can also let the user know directly that their responses would be better if they gave them access. + +- Slack: look for messages in channels with lots of people, with lots of reactions or lots of responses within the thread +- Email: look for things from executives that discuss company-wide announcements +- Calendar: if there were meetings with large attendee lists, particularly things like All-Hands meetings, big company announcements, etc. If there were documents attached to those meetings, those are great links to include. +- Documents: if there were new docs published in the last week or two that got a lot of attention, you can link them. These should be things like company-wide vision docs, plans for the upcoming quarter or half, things authored by critical executives, etc. +- External press: if you see references to articles or press we've received over the past week, that could be really cool too. + +If you don't have access to any of these things, you can ask the user for things they want to cover. In this case, you'll mostly just be polishing up and fitting to this format more directly. + +## Sections +The company is pretty big: 1000+ people. There are a variety of different teams and initiatives going on across the company. To make sure the update works well, try breaking it into sections of similar things. You might break into clusters like {product development, go to market, finance} or {recruiting, execution, vision}, or {external news, internal news} etc. Try to make sure the different areas of the company are highlighted well. + +## Prioritization +Focus on: +- Company-wide impact (not team-specific details) +- Announcements from leadership +- Major milestones and achievements +- Information that affects most employees +- External recognition or press + +Avoid: +- Overly granular team updates (save those for 3Ps) +- Information only relevant to small groups +- Duplicate information already communicated + +## Example Formats + +:megaphone: Company Announcements +- Announcement 1 +- Announcement 2 +- Announcement 3 + +:dart: Progress on Priorities +- Area 1 + - Sub-area 1 + - Sub-area 2 + - Sub-area 3 +- Area 2 + - Sub-area 1 + - Sub-area 2 + - Sub-area 3 +- Area 3 + - Sub-area 1 + - Sub-area 2 + - Sub-area 3 + +:pillar: Leadership Updates +- Post 1 +- Post 2 +- Post 3 + +:thread: Social Updates +- Update 1 +- Update 2 +- Update 3 diff --git a/.claude/skills/internal-comms/examples/faq-answers.md b/.claude/skills/internal-comms/examples/faq-answers.md new file mode 100644 index 0000000..395262a --- /dev/null +++ b/.claude/skills/internal-comms/examples/faq-answers.md @@ -0,0 +1,30 @@ +## Instructions +You are an assistant for answering questions that are being asked across the company. Every week, there are lots of questions that get asked across the company, and your goal is to try to summarize what those questions are. We want our company to be well-informed and on the same page, so your job is to produce a set of frequently asked questions that our employees are asking and attempt to answer them. Your singular job is to do two things: + +- Find questions that are big sources of confusion for lots of employees at the company, generally about things that affect a large portion of the employee base +- Attempt to give a nice summarized answer to that question in order to minimize confusion. + +Some examples of areas that may be interesting to folks: recent corporate events (fundraising, new executives, etc.), upcoming launches, hiring progress, changes to vision or focus, etc. + + +## Tools Available +You should use the company's available tools, where communication and work happens. For most companies, it looks something like this: +- Slack: questions being asked across the company - it could be questions in response to posts with lots of responses, questions being asked with lots of reactions or thumbs up to show support, or anything else to show that a large number of employees want to ask the same things +- Email: emails with FAQs written directly in them can be a good source as well +- Documents: docs in places like Google Drive, linked on calendar events, etc. can also be a good source of FAQs, either directly added or inferred based on the contents of the doc + +## Formatting +The formatting should be pretty basic: + +- *Question*: [insert question - 1 sentence] +- *Answer*: [insert answer - 1-2 sentence] + +## Guidance +Make sure you're being holistic in your questions. Don't focus too much on just the user in question or the team they are a part of, but try to capture the entire company. Try to be as holistic as you can in reading all the tools available, producing responses that are relevant to all at the company. + +## Answer Guidelines +- Base answers on official company communications when possible +- If information is uncertain, indicate that clearly +- Link to authoritative sources (docs, announcements, emails) +- Keep tone professional but approachable +- Flag if a question requires executive input or official response \ No newline at end of file diff --git a/.claude/skills/internal-comms/examples/general-comms.md b/.claude/skills/internal-comms/examples/general-comms.md new file mode 100644 index 0000000..0ea9770 --- /dev/null +++ b/.claude/skills/internal-comms/examples/general-comms.md @@ -0,0 +1,16 @@ + ## Instructions + You are being asked to write internal company communication that doesn't fit into the standard formats (3P + updates, newsletters, or FAQs). + + Before proceeding: + 1. Ask the user about their target audience + 2. Understand the communication's purpose + 3. Clarify the desired tone (formal, casual, urgent, informational) + 4. Confirm any specific formatting requirements + + Use these general principles: + - Be clear and concise + - Use active voice + - Put the most important information first + - Include relevant links and references + - Match the company's communication style \ No newline at end of file diff --git a/.claude/skills/mcp-builder/.openskills.json b/.claude/skills/mcp-builder/.openskills.json new file mode 100644 index 0000000..6cf1c09 --- /dev/null +++ b/.claude/skills/mcp-builder/.openskills.json @@ -0,0 +1,7 @@ +{ + "source": "anthropics/skills", + "sourceType": "git", + "repoUrl": "https://github.com/anthropics/skills", + "subpath": "skills\\mcp-builder", + "installedAt": "2026-03-02T09:19:50.113Z" +} \ No newline at end of file diff --git a/.claude/skills/mcp-builder/LICENSE.txt b/.claude/skills/mcp-builder/LICENSE.txt new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/.claude/skills/mcp-builder/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/.claude/skills/mcp-builder/SKILL.md b/.claude/skills/mcp-builder/SKILL.md new file mode 100644 index 0000000..8a1a77a --- /dev/null +++ b/.claude/skills/mcp-builder/SKILL.md @@ -0,0 +1,236 @@ +--- +name: mcp-builder +description: Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK). +license: Complete terms in LICENSE.txt +--- + +# MCP Server Development Guide + +## Overview + +Create MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. The quality of an MCP server is measured by how well it enables LLMs to accomplish real-world tasks. + +--- + +# Process + +## 🚀 High-Level Workflow + +Creating a high-quality MCP server involves four main phases: + +### Phase 1: Deep Research and Planning + +#### 1.1 Understand Modern MCP Design + +**API Coverage vs. Workflow Tools:** +Balance comprehensive API endpoint coverage with specialized workflow tools. Workflow tools can be more convenient for specific tasks, while comprehensive coverage gives agents flexibility to compose operations. Performance varies by client—some clients benefit from code execution that combines basic tools, while others work better with higher-level workflows. When uncertain, prioritize comprehensive API coverage. + +**Tool Naming and Discoverability:** +Clear, descriptive tool names help agents find the right tools quickly. Use consistent prefixes (e.g., `github_create_issue`, `github_list_repos`) and action-oriented naming. + +**Context Management:** +Agents benefit from concise tool descriptions and the ability to filter/paginate results. Design tools that return focused, relevant data. Some clients support code execution which can help agents filter and process data efficiently. + +**Actionable Error Messages:** +Error messages should guide agents toward solutions with specific suggestions and next steps. + +#### 1.2 Study MCP Protocol Documentation + +**Navigate the MCP specification:** + +Start with the sitemap to find relevant pages: `https://modelcontextprotocol.io/sitemap.xml` + +Then fetch specific pages with `.md` suffix for markdown format (e.g., `https://modelcontextprotocol.io/specification/draft.md`). + +Key pages to review: +- Specification overview and architecture +- Transport mechanisms (streamable HTTP, stdio) +- Tool, resource, and prompt definitions + +#### 1.3 Study Framework Documentation + +**Recommended stack:** +- **Language**: TypeScript (high-quality SDK support and good compatibility in many execution environments e.g. MCPB. Plus AI models are good at generating TypeScript code, benefiting from its broad usage, static typing and good linting tools) +- **Transport**: Streamable HTTP for remote servers, using stateless JSON (simpler to scale and maintain, as opposed to stateful sessions and streaming responses). stdio for local servers. + +**Load framework documentation:** + +- **MCP Best Practices**: [📋 View Best Practices](./reference/mcp_best_practices.md) - Core guidelines + +**For TypeScript (recommended):** +- **TypeScript SDK**: Use WebFetch to load `https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/main/README.md` +- [⚡ TypeScript Guide](./reference/node_mcp_server.md) - TypeScript patterns and examples + +**For Python:** +- **Python SDK**: Use WebFetch to load `https://raw.githubusercontent.com/modelcontextprotocol/python-sdk/main/README.md` +- [🐍 Python Guide](./reference/python_mcp_server.md) - Python patterns and examples + +#### 1.4 Plan Your Implementation + +**Understand the API:** +Review the service's API documentation to identify key endpoints, authentication requirements, and data models. Use web search and WebFetch as needed. + +**Tool Selection:** +Prioritize comprehensive API coverage. List endpoints to implement, starting with the most common operations. + +--- + +### Phase 2: Implementation + +#### 2.1 Set Up Project Structure + +See language-specific guides for project setup: +- [⚡ TypeScript Guide](./reference/node_mcp_server.md) - Project structure, package.json, tsconfig.json +- [🐍 Python Guide](./reference/python_mcp_server.md) - Module organization, dependencies + +#### 2.2 Implement Core Infrastructure + +Create shared utilities: +- API client with authentication +- Error handling helpers +- Response formatting (JSON/Markdown) +- Pagination support + +#### 2.3 Implement Tools + +For each tool: + +**Input Schema:** +- Use Zod (TypeScript) or Pydantic (Python) +- Include constraints and clear descriptions +- Add examples in field descriptions + +**Output Schema:** +- Define `outputSchema` where possible for structured data +- Use `structuredContent` in tool responses (TypeScript SDK feature) +- Helps clients understand and process tool outputs + +**Tool Description:** +- Concise summary of functionality +- Parameter descriptions +- Return type schema + +**Implementation:** +- Async/await for I/O operations +- Proper error handling with actionable messages +- Support pagination where applicable +- Return both text content and structured data when using modern SDKs + +**Annotations:** +- `readOnlyHint`: true/false +- `destructiveHint`: true/false +- `idempotentHint`: true/false +- `openWorldHint`: true/false + +--- + +### Phase 3: Review and Test + +#### 3.1 Code Quality + +Review for: +- No duplicated code (DRY principle) +- Consistent error handling +- Full type coverage +- Clear tool descriptions + +#### 3.2 Build and Test + +**TypeScript:** +- Run `npm run build` to verify compilation +- Test with MCP Inspector: `npx @modelcontextprotocol/inspector` + +**Python:** +- Verify syntax: `python -m py_compile your_server.py` +- Test with MCP Inspector + +See language-specific guides for detailed testing approaches and quality checklists. + +--- + +### Phase 4: Create Evaluations + +After implementing your MCP server, create comprehensive evaluations to test its effectiveness. + +**Load [✅ Evaluation Guide](./reference/evaluation.md) for complete evaluation guidelines.** + +#### 4.1 Understand Evaluation Purpose + +Use evaluations to test whether LLMs can effectively use your MCP server to answer realistic, complex questions. + +#### 4.2 Create 10 Evaluation Questions + +To create effective evaluations, follow the process outlined in the evaluation guide: + +1. **Tool Inspection**: List available tools and understand their capabilities +2. **Content Exploration**: Use READ-ONLY operations to explore available data +3. **Question Generation**: Create 10 complex, realistic questions +4. **Answer Verification**: Solve each question yourself to verify answers + +#### 4.3 Evaluation Requirements + +Ensure each question is: +- **Independent**: Not dependent on other questions +- **Read-only**: Only non-destructive operations required +- **Complex**: Requiring multiple tool calls and deep exploration +- **Realistic**: Based on real use cases humans would care about +- **Verifiable**: Single, clear answer that can be verified by string comparison +- **Stable**: Answer won't change over time + +#### 4.4 Output Format + +Create an XML file with this structure: + +```xml + + + Find discussions about AI model launches with animal codenames. One model needed a specific safety designation that uses the format ASL-X. What number X was being determined for the model named after a spotted wild cat? + 3 + + + +``` + +--- + +# Reference Files + +## 📚 Documentation Library + +Load these resources as needed during development: + +### Core MCP Documentation (Load First) +- **MCP Protocol**: Start with sitemap at `https://modelcontextprotocol.io/sitemap.xml`, then fetch specific pages with `.md` suffix +- [📋 MCP Best Practices](./reference/mcp_best_practices.md) - Universal MCP guidelines including: + - Server and tool naming conventions + - Response format guidelines (JSON vs Markdown) + - Pagination best practices + - Transport selection (streamable HTTP vs stdio) + - Security and error handling standards + +### SDK Documentation (Load During Phase 1/2) +- **Python SDK**: Fetch from `https://raw.githubusercontent.com/modelcontextprotocol/python-sdk/main/README.md` +- **TypeScript SDK**: Fetch from `https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/main/README.md` + +### Language-Specific Implementation Guides (Load During Phase 2) +- [🐍 Python Implementation Guide](./reference/python_mcp_server.md) - Complete Python/FastMCP guide with: + - Server initialization patterns + - Pydantic model examples + - Tool registration with `@mcp.tool` + - Complete working examples + - Quality checklist + +- [⚡ TypeScript Implementation Guide](./reference/node_mcp_server.md) - Complete TypeScript guide with: + - Project structure + - Zod schema patterns + - Tool registration with `server.registerTool` + - Complete working examples + - Quality checklist + +### Evaluation Guide (Load During Phase 4) +- [✅ Evaluation Guide](./reference/evaluation.md) - Complete evaluation creation guide with: + - Question creation guidelines + - Answer verification strategies + - XML format specifications + - Example questions and answers + - Running an evaluation with the provided scripts diff --git a/.claude/skills/mcp-builder/reference/evaluation.md b/.claude/skills/mcp-builder/reference/evaluation.md new file mode 100644 index 0000000..87e9bb7 --- /dev/null +++ b/.claude/skills/mcp-builder/reference/evaluation.md @@ -0,0 +1,602 @@ +# MCP Server Evaluation Guide + +## Overview + +This document provides guidance on creating comprehensive evaluations for MCP servers. Evaluations test whether LLMs can effectively use your MCP server to answer realistic, complex questions using only the tools provided. + +--- + +## Quick Reference + +### Evaluation Requirements +- Create 10 human-readable questions +- Questions must be READ-ONLY, INDEPENDENT, NON-DESTRUCTIVE +- Each question requires multiple tool calls (potentially dozens) +- Answers must be single, verifiable values +- Answers must be STABLE (won't change over time) + +### Output Format +```xml + + + Your question here + Single verifiable answer + + +``` + +--- + +## Purpose of Evaluations + +The measure of quality of an MCP server is NOT how well or comprehensively the server implements tools, but how well these implementations (input/output schemas, docstrings/descriptions, functionality) enable LLMs with no other context and access ONLY to the MCP servers to answer realistic and difficult questions. + +## Evaluation Overview + +Create 10 human-readable questions requiring ONLY READ-ONLY, INDEPENDENT, NON-DESTRUCTIVE, and IDEMPOTENT operations to answer. Each question should be: +- Realistic +- Clear and concise +- Unambiguous +- Complex, requiring potentially dozens of tool calls or steps +- Answerable with a single, verifiable value that you identify in advance + +## Question Guidelines + +### Core Requirements + +1. **Questions MUST be independent** + - Each question should NOT depend on the answer to any other question + - Should not assume prior write operations from processing another question + +2. **Questions MUST require ONLY NON-DESTRUCTIVE AND IDEMPOTENT tool use** + - Should not instruct or require modifying state to arrive at the correct answer + +3. **Questions must be REALISTIC, CLEAR, CONCISE, and COMPLEX** + - Must require another LLM to use multiple (potentially dozens of) tools or steps to answer + +### Complexity and Depth + +4. **Questions must require deep exploration** + - Consider multi-hop questions requiring multiple sub-questions and sequential tool calls + - Each step should benefit from information found in previous questions + +5. **Questions may require extensive paging** + - May need paging through multiple pages of results + - May require querying old data (1-2 years out-of-date) to find niche information + - The questions must be DIFFICULT + +6. **Questions must require deep understanding** + - Rather than surface-level knowledge + - May pose complex ideas as True/False questions requiring evidence + - May use multiple-choice format where LLM must search different hypotheses + +7. **Questions must not be solvable with straightforward keyword search** + - Do not include specific keywords from the target content + - Use synonyms, related concepts, or paraphrases + - Require multiple searches, analyzing multiple related items, extracting context, then deriving the answer + +### Tool Testing + +8. **Questions should stress-test tool return values** + - May elicit tools returning large JSON objects or lists, overwhelming the LLM + - Should require understanding multiple modalities of data: + - IDs and names + - Timestamps and datetimes (months, days, years, seconds) + - File IDs, names, extensions, and mimetypes + - URLs, GIDs, etc. + - Should probe the tool's ability to return all useful forms of data + +9. **Questions should MOSTLY reflect real human use cases** + - The kinds of information retrieval tasks that HUMANS assisted by an LLM would care about + +10. **Questions may require dozens of tool calls** + - This challenges LLMs with limited context + - Encourages MCP server tools to reduce information returned + +11. **Include ambiguous questions** + - May be ambiguous OR require difficult decisions on which tools to call + - Force the LLM to potentially make mistakes or misinterpret + - Ensure that despite AMBIGUITY, there is STILL A SINGLE VERIFIABLE ANSWER + +### Stability + +12. **Questions must be designed so the answer DOES NOT CHANGE** + - Do not ask questions that rely on "current state" which is dynamic + - For example, do not count: + - Number of reactions to a post + - Number of replies to a thread + - Number of members in a channel + +13. **DO NOT let the MCP server RESTRICT the kinds of questions you create** + - Create challenging and complex questions + - Some may not be solvable with the available MCP server tools + - Questions may require specific output formats (datetime vs. epoch time, JSON vs. MARKDOWN) + - Questions may require dozens of tool calls to complete + +## Answer Guidelines + +### Verification + +1. **Answers must be VERIFIABLE via direct string comparison** + - If the answer can be re-written in many formats, clearly specify the output format in the QUESTION + - Examples: "Use YYYY/MM/DD.", "Respond True or False.", "Answer A, B, C, or D and nothing else." + - Answer should be a single VERIFIABLE value such as: + - User ID, user name, display name, first name, last name + - Channel ID, channel name + - Message ID, string + - URL, title + - Numerical quantity + - Timestamp, datetime + - Boolean (for True/False questions) + - Email address, phone number + - File ID, file name, file extension + - Multiple choice answer + - Answers must not require special formatting or complex, structured output + - Answer will be verified using DIRECT STRING COMPARISON + +### Readability + +2. **Answers should generally prefer HUMAN-READABLE formats** + - Examples: names, first name, last name, datetime, file name, message string, URL, yes/no, true/false, a/b/c/d + - Rather than opaque IDs (though IDs are acceptable) + - The VAST MAJORITY of answers should be human-readable + +### Stability + +3. **Answers must be STABLE/STATIONARY** + - Look at old content (e.g., conversations that have ended, projects that have launched, questions answered) + - Create QUESTIONS based on "closed" concepts that will always return the same answer + - Questions may ask to consider a fixed time window to insulate from non-stationary answers + - Rely on context UNLIKELY to change + - Example: if finding a paper name, be SPECIFIC enough so answer is not confused with papers published later + +4. **Answers must be CLEAR and UNAMBIGUOUS** + - Questions must be designed so there is a single, clear answer + - Answer can be derived from using the MCP server tools + +### Diversity + +5. **Answers must be DIVERSE** + - Answer should be a single VERIFIABLE value in diverse modalities and formats + - User concept: user ID, user name, display name, first name, last name, email address, phone number + - Channel concept: channel ID, channel name, channel topic + - Message concept: message ID, message string, timestamp, month, day, year + +6. **Answers must NOT be complex structures** + - Not a list of values + - Not a complex object + - Not a list of IDs or strings + - Not natural language text + - UNLESS the answer can be straightforwardly verified using DIRECT STRING COMPARISON + - And can be realistically reproduced + - It should be unlikely that an LLM would return the same list in any other order or format + +## Evaluation Process + +### Step 1: Documentation Inspection + +Read the documentation of the target API to understand: +- Available endpoints and functionality +- If ambiguity exists, fetch additional information from the web +- Parallelize this step AS MUCH AS POSSIBLE +- Ensure each subagent is ONLY examining documentation from the file system or on the web + +### Step 2: Tool Inspection + +List the tools available in the MCP server: +- Inspect the MCP server directly +- Understand input/output schemas, docstrings, and descriptions +- WITHOUT calling the tools themselves at this stage + +### Step 3: Developing Understanding + +Repeat steps 1 & 2 until you have a good understanding: +- Iterate multiple times +- Think about the kinds of tasks you want to create +- Refine your understanding +- At NO stage should you READ the code of the MCP server implementation itself +- Use your intuition and understanding to create reasonable, realistic, but VERY challenging tasks + +### Step 4: Read-Only Content Inspection + +After understanding the API and tools, USE the MCP server tools: +- Inspect content using READ-ONLY and NON-DESTRUCTIVE operations ONLY +- Goal: identify specific content (e.g., users, channels, messages, projects, tasks) for creating realistic questions +- Should NOT call any tools that modify state +- Will NOT read the code of the MCP server implementation itself +- Parallelize this step with individual sub-agents pursuing independent explorations +- Ensure each subagent is only performing READ-ONLY, NON-DESTRUCTIVE, and IDEMPOTENT operations +- BE CAREFUL: SOME TOOLS may return LOTS OF DATA which would cause you to run out of CONTEXT +- Make INCREMENTAL, SMALL, AND TARGETED tool calls for exploration +- In all tool call requests, use the `limit` parameter to limit results (<10) +- Use pagination + +### Step 5: Task Generation + +After inspecting the content, create 10 human-readable questions: +- An LLM should be able to answer these with the MCP server +- Follow all question and answer guidelines above + +## Output Format + +Each QA pair consists of a question and an answer. The output should be an XML file with this structure: + +```xml + + + Find the project created in Q2 2024 with the highest number of completed tasks. What is the project name? + Website Redesign + + + Search for issues labeled as "bug" that were closed in March 2024. Which user closed the most issues? Provide their username. + sarah_dev + + + Look for pull requests that modified files in the /api directory and were merged between January 1 and January 31, 2024. How many different contributors worked on these PRs? + 7 + + + Find the repository with the most stars that was created before 2023. What is the repository name? + data-pipeline + + +``` + +## Evaluation Examples + +### Good Questions + +**Example 1: Multi-hop question requiring deep exploration (GitHub MCP)** +```xml + + Find the repository that was archived in Q3 2023 and had previously been the most forked project in the organization. What was the primary programming language used in that repository? + Python + +``` + +This question is good because: +- Requires multiple searches to find archived repositories +- Needs to identify which had the most forks before archival +- Requires examining repository details for the language +- Answer is a simple, verifiable value +- Based on historical (closed) data that won't change + +**Example 2: Requires understanding context without keyword matching (Project Management MCP)** +```xml + + Locate the initiative focused on improving customer onboarding that was completed in late 2023. The project lead created a retrospective document after completion. What was the lead's role title at that time? + Product Manager + +``` + +This question is good because: +- Doesn't use specific project name ("initiative focused on improving customer onboarding") +- Requires finding completed projects from specific timeframe +- Needs to identify the project lead and their role +- Requires understanding context from retrospective documents +- Answer is human-readable and stable +- Based on completed work (won't change) + +**Example 3: Complex aggregation requiring multiple steps (Issue Tracker MCP)** +```xml + + Among all bugs reported in January 2024 that were marked as critical priority, which assignee resolved the highest percentage of their assigned bugs within 48 hours? Provide the assignee's username. + alex_eng + +``` + +This question is good because: +- Requires filtering bugs by date, priority, and status +- Needs to group by assignee and calculate resolution rates +- Requires understanding timestamps to determine 48-hour windows +- Tests pagination (potentially many bugs to process) +- Answer is a single username +- Based on historical data from specific time period + +**Example 4: Requires synthesis across multiple data types (CRM MCP)** +```xml + + Find the account that upgraded from the Starter to Enterprise plan in Q4 2023 and had the highest annual contract value. What industry does this account operate in? + Healthcare + +``` + +This question is good because: +- Requires understanding subscription tier changes +- Needs to identify upgrade events in specific timeframe +- Requires comparing contract values +- Must access account industry information +- Answer is simple and verifiable +- Based on completed historical transactions + +### Poor Questions + +**Example 1: Answer changes over time** +```xml + + How many open issues are currently assigned to the engineering team? + 47 + +``` + +This question is poor because: +- The answer will change as issues are created, closed, or reassigned +- Not based on stable/stationary data +- Relies on "current state" which is dynamic + +**Example 2: Too easy with keyword search** +```xml + + Find the pull request with title "Add authentication feature" and tell me who created it. + developer123 + +``` + +This question is poor because: +- Can be solved with a straightforward keyword search for exact title +- Doesn't require deep exploration or understanding +- No synthesis or analysis needed + +**Example 3: Ambiguous answer format** +```xml + + List all the repositories that have Python as their primary language. + repo1, repo2, repo3, data-pipeline, ml-tools + +``` + +This question is poor because: +- Answer is a list that could be returned in any order +- Difficult to verify with direct string comparison +- LLM might format differently (JSON array, comma-separated, newline-separated) +- Better to ask for a specific aggregate (count) or superlative (most stars) + +## Verification Process + +After creating evaluations: + +1. **Examine the XML file** to understand the schema +2. **Load each task instruction** and in parallel using the MCP server and tools, identify the correct answer by attempting to solve the task YOURSELF +3. **Flag any operations** that require WRITE or DESTRUCTIVE operations +4. **Accumulate all CORRECT answers** and replace any incorrect answers in the document +5. **Remove any ``** that require WRITE or DESTRUCTIVE operations + +Remember to parallelize solving tasks to avoid running out of context, then accumulate all answers and make changes to the file at the end. + +## Tips for Creating Quality Evaluations + +1. **Think Hard and Plan Ahead** before generating tasks +2. **Parallelize Where Opportunity Arises** to speed up the process and manage context +3. **Focus on Realistic Use Cases** that humans would actually want to accomplish +4. **Create Challenging Questions** that test the limits of the MCP server's capabilities +5. **Ensure Stability** by using historical data and closed concepts +6. **Verify Answers** by solving the questions yourself using the MCP server tools +7. **Iterate and Refine** based on what you learn during the process + +--- + +# Running Evaluations + +After creating your evaluation file, you can use the provided evaluation harness to test your MCP server. + +## Setup + +1. **Install Dependencies** + + ```bash + pip install -r scripts/requirements.txt + ``` + + Or install manually: + ```bash + pip install anthropic mcp + ``` + +2. **Set API Key** + + ```bash + export ANTHROPIC_API_KEY=your_api_key_here + ``` + +## Evaluation File Format + +Evaluation files use XML format with `` elements: + +```xml + + + Find the project created in Q2 2024 with the highest number of completed tasks. What is the project name? + Website Redesign + + + Search for issues labeled as "bug" that were closed in March 2024. Which user closed the most issues? Provide their username. + sarah_dev + + +``` + +## Running Evaluations + +The evaluation script (`scripts/evaluation.py`) supports three transport types: + +**Important:** +- **stdio transport**: The evaluation script automatically launches and manages the MCP server process for you. Do not run the server manually. +- **sse/http transports**: You must start the MCP server separately before running the evaluation. The script connects to the already-running server at the specified URL. + +### 1. Local STDIO Server + +For locally-run MCP servers (script launches the server automatically): + +```bash +python scripts/evaluation.py \ + -t stdio \ + -c python \ + -a my_mcp_server.py \ + evaluation.xml +``` + +With environment variables: +```bash +python scripts/evaluation.py \ + -t stdio \ + -c python \ + -a my_mcp_server.py \ + -e API_KEY=abc123 \ + -e DEBUG=true \ + evaluation.xml +``` + +### 2. Server-Sent Events (SSE) + +For SSE-based MCP servers (you must start the server first): + +```bash +python scripts/evaluation.py \ + -t sse \ + -u https://example.com/mcp \ + -H "Authorization: Bearer token123" \ + -H "X-Custom-Header: value" \ + evaluation.xml +``` + +### 3. HTTP (Streamable HTTP) + +For HTTP-based MCP servers (you must start the server first): + +```bash +python scripts/evaluation.py \ + -t http \ + -u https://example.com/mcp \ + -H "Authorization: Bearer token123" \ + evaluation.xml +``` + +## Command-Line Options + +``` +usage: evaluation.py [-h] [-t {stdio,sse,http}] [-m MODEL] [-c COMMAND] + [-a ARGS [ARGS ...]] [-e ENV [ENV ...]] [-u URL] + [-H HEADERS [HEADERS ...]] [-o OUTPUT] + eval_file + +positional arguments: + eval_file Path to evaluation XML file + +optional arguments: + -h, --help Show help message + -t, --transport Transport type: stdio, sse, or http (default: stdio) + -m, --model Claude model to use (default: claude-3-7-sonnet-20250219) + -o, --output Output file for report (default: print to stdout) + +stdio options: + -c, --command Command to run MCP server (e.g., python, node) + -a, --args Arguments for the command (e.g., server.py) + -e, --env Environment variables in KEY=VALUE format + +sse/http options: + -u, --url MCP server URL + -H, --header HTTP headers in 'Key: Value' format +``` + +## Output + +The evaluation script generates a detailed report including: + +- **Summary Statistics**: + - Accuracy (correct/total) + - Average task duration + - Average tool calls per task + - Total tool calls + +- **Per-Task Results**: + - Prompt and expected response + - Actual response from the agent + - Whether the answer was correct (✅/❌) + - Duration and tool call details + - Agent's summary of its approach + - Agent's feedback on the tools + +### Save Report to File + +```bash +python scripts/evaluation.py \ + -t stdio \ + -c python \ + -a my_server.py \ + -o evaluation_report.md \ + evaluation.xml +``` + +## Complete Example Workflow + +Here's a complete example of creating and running an evaluation: + +1. **Create your evaluation file** (`my_evaluation.xml`): + +```xml + + + Find the user who created the most issues in January 2024. What is their username? + alice_developer + + + Among all pull requests merged in Q1 2024, which repository had the highest number? Provide the repository name. + backend-api + + + Find the project that was completed in December 2023 and had the longest duration from start to finish. How many days did it take? + 127 + + +``` + +2. **Install dependencies**: + +```bash +pip install -r scripts/requirements.txt +export ANTHROPIC_API_KEY=your_api_key +``` + +3. **Run evaluation**: + +```bash +python scripts/evaluation.py \ + -t stdio \ + -c python \ + -a github_mcp_server.py \ + -e GITHUB_TOKEN=ghp_xxx \ + -o github_eval_report.md \ + my_evaluation.xml +``` + +4. **Review the report** in `github_eval_report.md` to: + - See which questions passed/failed + - Read the agent's feedback on your tools + - Identify areas for improvement + - Iterate on your MCP server design + +## Troubleshooting + +### Connection Errors + +If you get connection errors: +- **STDIO**: Verify the command and arguments are correct +- **SSE/HTTP**: Check the URL is accessible and headers are correct +- Ensure any required API keys are set in environment variables or headers + +### Low Accuracy + +If many evaluations fail: +- Review the agent's feedback for each task +- Check if tool descriptions are clear and comprehensive +- Verify input parameters are well-documented +- Consider whether tools return too much or too little data +- Ensure error messages are actionable + +### Timeout Issues + +If tasks are timing out: +- Use a more capable model (e.g., `claude-3-7-sonnet-20250219`) +- Check if tools are returning too much data +- Verify pagination is working correctly +- Consider simplifying complex questions \ No newline at end of file diff --git a/.claude/skills/mcp-builder/reference/mcp_best_practices.md b/.claude/skills/mcp-builder/reference/mcp_best_practices.md new file mode 100644 index 0000000..b9d343c --- /dev/null +++ b/.claude/skills/mcp-builder/reference/mcp_best_practices.md @@ -0,0 +1,249 @@ +# MCP Server Best Practices + +## Quick Reference + +### Server Naming +- **Python**: `{service}_mcp` (e.g., `slack_mcp`) +- **Node/TypeScript**: `{service}-mcp-server` (e.g., `slack-mcp-server`) + +### Tool Naming +- Use snake_case with service prefix +- Format: `{service}_{action}_{resource}` +- Example: `slack_send_message`, `github_create_issue` + +### Response Formats +- Support both JSON and Markdown formats +- JSON for programmatic processing +- Markdown for human readability + +### Pagination +- Always respect `limit` parameter +- Return `has_more`, `next_offset`, `total_count` +- Default to 20-50 items + +### Transport +- **Streamable HTTP**: For remote servers, multi-client scenarios +- **stdio**: For local integrations, command-line tools +- Avoid SSE (deprecated in favor of streamable HTTP) + +--- + +## Server Naming Conventions + +Follow these standardized naming patterns: + +**Python**: Use format `{service}_mcp` (lowercase with underscores) +- Examples: `slack_mcp`, `github_mcp`, `jira_mcp` + +**Node/TypeScript**: Use format `{service}-mcp-server` (lowercase with hyphens) +- Examples: `slack-mcp-server`, `github-mcp-server`, `jira-mcp-server` + +The name should be general, descriptive of the service being integrated, easy to infer from the task description, and without version numbers. + +--- + +## Tool Naming and Design + +### Tool Naming + +1. **Use snake_case**: `search_users`, `create_project`, `get_channel_info` +2. **Include service prefix**: Anticipate that your MCP server may be used alongside other MCP servers + - Use `slack_send_message` instead of just `send_message` + - Use `github_create_issue` instead of just `create_issue` +3. **Be action-oriented**: Start with verbs (get, list, search, create, etc.) +4. **Be specific**: Avoid generic names that could conflict with other servers + +### Tool Design + +- Tool descriptions must narrowly and unambiguously describe functionality +- Descriptions must precisely match actual functionality +- Provide tool annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) +- Keep tool operations focused and atomic + +--- + +## Response Formats + +All tools that return data should support multiple formats: + +### JSON Format (`response_format="json"`) +- Machine-readable structured data +- Include all available fields and metadata +- Consistent field names and types +- Use for programmatic processing + +### Markdown Format (`response_format="markdown"`, typically default) +- Human-readable formatted text +- Use headers, lists, and formatting for clarity +- Convert timestamps to human-readable format +- Show display names with IDs in parentheses +- Omit verbose metadata + +--- + +## Pagination + +For tools that list resources: + +- **Always respect the `limit` parameter** +- **Implement pagination**: Use `offset` or cursor-based pagination +- **Return pagination metadata**: Include `has_more`, `next_offset`/`next_cursor`, `total_count` +- **Never load all results into memory**: Especially important for large datasets +- **Default to reasonable limits**: 20-50 items is typical + +Example pagination response: +```json +{ + "total": 150, + "count": 20, + "offset": 0, + "items": [...], + "has_more": true, + "next_offset": 20 +} +``` + +--- + +## Transport Options + +### Streamable HTTP + +**Best for**: Remote servers, web services, multi-client scenarios + +**Characteristics**: +- Bidirectional communication over HTTP +- Supports multiple simultaneous clients +- Can be deployed as a web service +- Enables server-to-client notifications + +**Use when**: +- Serving multiple clients simultaneously +- Deploying as a cloud service +- Integration with web applications + +### stdio + +**Best for**: Local integrations, command-line tools + +**Characteristics**: +- Standard input/output stream communication +- Simple setup, no network configuration needed +- Runs as a subprocess of the client + +**Use when**: +- Building tools for local development environments +- Integrating with desktop applications +- Single-user, single-session scenarios + +**Note**: stdio servers should NOT log to stdout (use stderr for logging) + +### Transport Selection + +| Criterion | stdio | Streamable HTTP | +|-----------|-------|-----------------| +| **Deployment** | Local | Remote | +| **Clients** | Single | Multiple | +| **Complexity** | Low | Medium | +| **Real-time** | No | Yes | + +--- + +## Security Best Practices + +### Authentication and Authorization + +**OAuth 2.1**: +- Use secure OAuth 2.1 with certificates from recognized authorities +- Validate access tokens before processing requests +- Only accept tokens specifically intended for your server + +**API Keys**: +- Store API keys in environment variables, never in code +- Validate keys on server startup +- Provide clear error messages when authentication fails + +### Input Validation + +- Sanitize file paths to prevent directory traversal +- Validate URLs and external identifiers +- Check parameter sizes and ranges +- Prevent command injection in system calls +- Use schema validation (Pydantic/Zod) for all inputs + +### Error Handling + +- Don't expose internal errors to clients +- Log security-relevant errors server-side +- Provide helpful but not revealing error messages +- Clean up resources after errors + +### DNS Rebinding Protection + +For streamable HTTP servers running locally: +- Enable DNS rebinding protection +- Validate the `Origin` header on all incoming connections +- Bind to `127.0.0.1` rather than `0.0.0.0` + +--- + +## Tool Annotations + +Provide annotations to help clients understand tool behavior: + +| Annotation | Type | Default | Description | +|-----------|------|---------|-------------| +| `readOnlyHint` | boolean | false | Tool does not modify its environment | +| `destructiveHint` | boolean | true | Tool may perform destructive updates | +| `idempotentHint` | boolean | false | Repeated calls with same args have no additional effect | +| `openWorldHint` | boolean | true | Tool interacts with external entities | + +**Important**: Annotations are hints, not security guarantees. Clients should not make security-critical decisions based solely on annotations. + +--- + +## Error Handling + +- Use standard JSON-RPC error codes +- Report tool errors within result objects (not protocol-level errors) +- Provide helpful, specific error messages with suggested next steps +- Don't expose internal implementation details +- Clean up resources properly on errors + +Example error handling: +```typescript +try { + const result = performOperation(); + return { content: [{ type: "text", text: result }] }; +} catch (error) { + return { + isError: true, + content: [{ + type: "text", + text: `Error: ${error.message}. Try using filter='active_only' to reduce results.` + }] + }; +} +``` + +--- + +## Testing Requirements + +Comprehensive testing should cover: + +- **Functional testing**: Verify correct execution with valid/invalid inputs +- **Integration testing**: Test interaction with external systems +- **Security testing**: Validate auth, input sanitization, rate limiting +- **Performance testing**: Check behavior under load, timeouts +- **Error handling**: Ensure proper error reporting and cleanup + +--- + +## Documentation Requirements + +- Provide clear documentation of all tools and capabilities +- Include working examples (at least 3 per major feature) +- Document security considerations +- Specify required permissions and access levels +- Document rate limits and performance characteristics diff --git a/.claude/skills/mcp-builder/reference/node_mcp_server.md b/.claude/skills/mcp-builder/reference/node_mcp_server.md new file mode 100644 index 0000000..f6e5df9 --- /dev/null +++ b/.claude/skills/mcp-builder/reference/node_mcp_server.md @@ -0,0 +1,970 @@ +# Node/TypeScript MCP Server Implementation Guide + +## Overview + +This document provides Node/TypeScript-specific best practices and examples for implementing MCP servers using the MCP TypeScript SDK. It covers project structure, server setup, tool registration patterns, input validation with Zod, error handling, and complete working examples. + +--- + +## Quick Reference + +### Key Imports +```typescript +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import express from "express"; +import { z } from "zod"; +``` + +### Server Initialization +```typescript +const server = new McpServer({ + name: "service-mcp-server", + version: "1.0.0" +}); +``` + +### Tool Registration Pattern +```typescript +server.registerTool( + "tool_name", + { + title: "Tool Display Name", + description: "What the tool does", + inputSchema: { param: z.string() }, + outputSchema: { result: z.string() } + }, + async ({ param }) => { + const output = { result: `Processed: ${param}` }; + return { + content: [{ type: "text", text: JSON.stringify(output) }], + structuredContent: output // Modern pattern for structured data + }; + } +); +``` + +--- + +## MCP TypeScript SDK + +The official MCP TypeScript SDK provides: +- `McpServer` class for server initialization +- `registerTool` method for tool registration +- Zod schema integration for runtime input validation +- Type-safe tool handler implementations + +**IMPORTANT - Use Modern APIs Only:** +- **DO use**: `server.registerTool()`, `server.registerResource()`, `server.registerPrompt()` +- **DO NOT use**: Old deprecated APIs such as `server.tool()`, `server.setRequestHandler(ListToolsRequestSchema, ...)`, or manual handler registration +- The `register*` methods provide better type safety, automatic schema handling, and are the recommended approach + +See the MCP SDK documentation in the references for complete details. + +## Server Naming Convention + +Node/TypeScript MCP servers must follow this naming pattern: +- **Format**: `{service}-mcp-server` (lowercase with hyphens) +- **Examples**: `github-mcp-server`, `jira-mcp-server`, `stripe-mcp-server` + +The name should be: +- General (not tied to specific features) +- Descriptive of the service/API being integrated +- Easy to infer from the task description +- Without version numbers or dates + +## Project Structure + +Create the following structure for Node/TypeScript MCP servers: + +``` +{service}-mcp-server/ +├── package.json +├── tsconfig.json +├── README.md +├── src/ +│ ├── index.ts # Main entry point with McpServer initialization +│ ├── types.ts # TypeScript type definitions and interfaces +│ ├── tools/ # Tool implementations (one file per domain) +│ ├── services/ # API clients and shared utilities +│ ├── schemas/ # Zod validation schemas +│ └── constants.ts # Shared constants (API_URL, CHARACTER_LIMIT, etc.) +└── dist/ # Built JavaScript files (entry point: dist/index.js) +``` + +## Tool Implementation + +### Tool Naming + +Use snake_case for tool names (e.g., "search_users", "create_project", "get_channel_info") with clear, action-oriented names. + +**Avoid Naming Conflicts**: Include the service context to prevent overlaps: +- Use "slack_send_message" instead of just "send_message" +- Use "github_create_issue" instead of just "create_issue" +- Use "asana_list_tasks" instead of just "list_tasks" + +### Tool Structure + +Tools are registered using the `registerTool` method with the following requirements: +- Use Zod schemas for runtime input validation and type safety +- The `description` field must be explicitly provided - JSDoc comments are NOT automatically extracted +- Explicitly provide `title`, `description`, `inputSchema`, and `annotations` +- The `inputSchema` must be a Zod schema object (not a JSON schema) +- Type all parameters and return values explicitly + +```typescript +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { z } from "zod"; + +const server = new McpServer({ + name: "example-mcp", + version: "1.0.0" +}); + +// Zod schema for input validation +const UserSearchInputSchema = z.object({ + query: z.string() + .min(2, "Query must be at least 2 characters") + .max(200, "Query must not exceed 200 characters") + .describe("Search string to match against names/emails"), + limit: z.number() + .int() + .min(1) + .max(100) + .default(20) + .describe("Maximum results to return"), + offset: z.number() + .int() + .min(0) + .default(0) + .describe("Number of results to skip for pagination"), + response_format: z.nativeEnum(ResponseFormat) + .default(ResponseFormat.MARKDOWN) + .describe("Output format: 'markdown' for human-readable or 'json' for machine-readable") +}).strict(); + +// Type definition from Zod schema +type UserSearchInput = z.infer; + +server.registerTool( + "example_search_users", + { + title: "Search Example Users", + description: `Search for users in the Example system by name, email, or team. + +This tool searches across all user profiles in the Example platform, supporting partial matches and various search filters. It does NOT create or modify users, only searches existing ones. + +Args: + - query (string): Search string to match against names/emails + - limit (number): Maximum results to return, between 1-100 (default: 20) + - offset (number): Number of results to skip for pagination (default: 0) + - response_format ('markdown' | 'json'): Output format (default: 'markdown') + +Returns: + For JSON format: Structured data with schema: + { + "total": number, // Total number of matches found + "count": number, // Number of results in this response + "offset": number, // Current pagination offset + "users": [ + { + "id": string, // User ID (e.g., "U123456789") + "name": string, // Full name (e.g., "John Doe") + "email": string, // Email address + "team": string, // Team name (optional) + "active": boolean // Whether user is active + } + ], + "has_more": boolean, // Whether more results are available + "next_offset": number // Offset for next page (if has_more is true) + } + +Examples: + - Use when: "Find all marketing team members" -> params with query="team:marketing" + - Use when: "Search for John's account" -> params with query="john" + - Don't use when: You need to create a user (use example_create_user instead) + +Error Handling: + - Returns "Error: Rate limit exceeded" if too many requests (429 status) + - Returns "No users found matching ''" if search returns empty`, + inputSchema: UserSearchInputSchema, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true + } + }, + async (params: UserSearchInput) => { + try { + // Input validation is handled by Zod schema + // Make API request using validated parameters + const data = await makeApiRequest( + "users/search", + "GET", + undefined, + { + q: params.query, + limit: params.limit, + offset: params.offset + } + ); + + const users = data.users || []; + const total = data.total || 0; + + if (!users.length) { + return { + content: [{ + type: "text", + text: `No users found matching '${params.query}'` + }] + }; + } + + // Prepare structured output + const output = { + total, + count: users.length, + offset: params.offset, + users: users.map((user: any) => ({ + id: user.id, + name: user.name, + email: user.email, + ...(user.team ? { team: user.team } : {}), + active: user.active ?? true + })), + has_more: total > params.offset + users.length, + ...(total > params.offset + users.length ? { + next_offset: params.offset + users.length + } : {}) + }; + + // Format text representation based on requested format + let textContent: string; + if (params.response_format === ResponseFormat.MARKDOWN) { + const lines = [`# User Search Results: '${params.query}'`, "", + `Found ${total} users (showing ${users.length})`, ""]; + for (const user of users) { + lines.push(`## ${user.name} (${user.id})`); + lines.push(`- **Email**: ${user.email}`); + if (user.team) lines.push(`- **Team**: ${user.team}`); + lines.push(""); + } + textContent = lines.join("\n"); + } else { + textContent = JSON.stringify(output, null, 2); + } + + return { + content: [{ type: "text", text: textContent }], + structuredContent: output // Modern pattern for structured data + }; + } catch (error) { + return { + content: [{ + type: "text", + text: handleApiError(error) + }] + }; + } + } +); +``` + +## Zod Schemas for Input Validation + +Zod provides runtime type validation: + +```typescript +import { z } from "zod"; + +// Basic schema with validation +const CreateUserSchema = z.object({ + name: z.string() + .min(1, "Name is required") + .max(100, "Name must not exceed 100 characters"), + email: z.string() + .email("Invalid email format"), + age: z.number() + .int("Age must be a whole number") + .min(0, "Age cannot be negative") + .max(150, "Age cannot be greater than 150") +}).strict(); // Use .strict() to forbid extra fields + +// Enums +enum ResponseFormat { + MARKDOWN = "markdown", + JSON = "json" +} + +const SearchSchema = z.object({ + response_format: z.nativeEnum(ResponseFormat) + .default(ResponseFormat.MARKDOWN) + .describe("Output format") +}); + +// Optional fields with defaults +const PaginationSchema = z.object({ + limit: z.number() + .int() + .min(1) + .max(100) + .default(20) + .describe("Maximum results to return"), + offset: z.number() + .int() + .min(0) + .default(0) + .describe("Number of results to skip") +}); +``` + +## Response Format Options + +Support multiple output formats for flexibility: + +```typescript +enum ResponseFormat { + MARKDOWN = "markdown", + JSON = "json" +} + +const inputSchema = z.object({ + query: z.string(), + response_format: z.nativeEnum(ResponseFormat) + .default(ResponseFormat.MARKDOWN) + .describe("Output format: 'markdown' for human-readable or 'json' for machine-readable") +}); +``` + +**Markdown format**: +- Use headers, lists, and formatting for clarity +- Convert timestamps to human-readable format +- Show display names with IDs in parentheses +- Omit verbose metadata +- Group related information logically + +**JSON format**: +- Return complete, structured data suitable for programmatic processing +- Include all available fields and metadata +- Use consistent field names and types + +## Pagination Implementation + +For tools that list resources: + +```typescript +const ListSchema = z.object({ + limit: z.number().int().min(1).max(100).default(20), + offset: z.number().int().min(0).default(0) +}); + +async function listItems(params: z.infer) { + const data = await apiRequest(params.limit, params.offset); + + const response = { + total: data.total, + count: data.items.length, + offset: params.offset, + items: data.items, + has_more: data.total > params.offset + data.items.length, + next_offset: data.total > params.offset + data.items.length + ? params.offset + data.items.length + : undefined + }; + + return JSON.stringify(response, null, 2); +} +``` + +## Character Limits and Truncation + +Add a CHARACTER_LIMIT constant to prevent overwhelming responses: + +```typescript +// At module level in constants.ts +export const CHARACTER_LIMIT = 25000; // Maximum response size in characters + +async function searchTool(params: SearchInput) { + let result = generateResponse(data); + + // Check character limit and truncate if needed + if (result.length > CHARACTER_LIMIT) { + const truncatedData = data.slice(0, Math.max(1, data.length / 2)); + response.data = truncatedData; + response.truncated = true; + response.truncation_message = + `Response truncated from ${data.length} to ${truncatedData.length} items. ` + + `Use 'offset' parameter or add filters to see more results.`; + result = JSON.stringify(response, null, 2); + } + + return result; +} +``` + +## Error Handling + +Provide clear, actionable error messages: + +```typescript +import axios, { AxiosError } from "axios"; + +function handleApiError(error: unknown): string { + if (error instanceof AxiosError) { + if (error.response) { + switch (error.response.status) { + case 404: + return "Error: Resource not found. Please check the ID is correct."; + case 403: + return "Error: Permission denied. You don't have access to this resource."; + case 429: + return "Error: Rate limit exceeded. Please wait before making more requests."; + default: + return `Error: API request failed with status ${error.response.status}`; + } + } else if (error.code === "ECONNABORTED") { + return "Error: Request timed out. Please try again."; + } + } + return `Error: Unexpected error occurred: ${error instanceof Error ? error.message : String(error)}`; +} +``` + +## Shared Utilities + +Extract common functionality into reusable functions: + +```typescript +// Shared API request function +async function makeApiRequest( + endpoint: string, + method: "GET" | "POST" | "PUT" | "DELETE" = "GET", + data?: any, + params?: any +): Promise { + try { + const response = await axios({ + method, + url: `${API_BASE_URL}/${endpoint}`, + data, + params, + timeout: 30000, + headers: { + "Content-Type": "application/json", + "Accept": "application/json" + } + }); + return response.data; + } catch (error) { + throw error; + } +} +``` + +## Async/Await Best Practices + +Always use async/await for network requests and I/O operations: + +```typescript +// Good: Async network request +async function fetchData(resourceId: string): Promise { + const response = await axios.get(`${API_URL}/resource/${resourceId}`); + return response.data; +} + +// Bad: Promise chains +function fetchData(resourceId: string): Promise { + return axios.get(`${API_URL}/resource/${resourceId}`) + .then(response => response.data); // Harder to read and maintain +} +``` + +## TypeScript Best Practices + +1. **Use Strict TypeScript**: Enable strict mode in tsconfig.json +2. **Define Interfaces**: Create clear interface definitions for all data structures +3. **Avoid `any`**: Use proper types or `unknown` instead of `any` +4. **Zod for Runtime Validation**: Use Zod schemas to validate external data +5. **Type Guards**: Create type guard functions for complex type checking +6. **Error Handling**: Always use try-catch with proper error type checking +7. **Null Safety**: Use optional chaining (`?.`) and nullish coalescing (`??`) + +```typescript +// Good: Type-safe with Zod and interfaces +interface UserResponse { + id: string; + name: string; + email: string; + team?: string; + active: boolean; +} + +const UserSchema = z.object({ + id: z.string(), + name: z.string(), + email: z.string().email(), + team: z.string().optional(), + active: z.boolean() +}); + +type User = z.infer; + +async function getUser(id: string): Promise { + const data = await apiCall(`/users/${id}`); + return UserSchema.parse(data); // Runtime validation +} + +// Bad: Using any +async function getUser(id: string): Promise { + return await apiCall(`/users/${id}`); // No type safety +} +``` + +## Package Configuration + +### package.json + +```json +{ + "name": "{service}-mcp-server", + "version": "1.0.0", + "description": "MCP server for {Service} API integration", + "type": "module", + "main": "dist/index.js", + "scripts": { + "start": "node dist/index.js", + "dev": "tsx watch src/index.ts", + "build": "tsc", + "clean": "rm -rf dist" + }, + "engines": { + "node": ">=18" + }, + "dependencies": { + "@modelcontextprotocol/sdk": "^1.6.1", + "axios": "^1.7.9", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/node": "^22.10.0", + "tsx": "^4.19.2", + "typescript": "^5.7.2" + } +} +``` + +### tsconfig.json + +```json +{ + "compilerOptions": { + "target": "ES2022", + "module": "Node16", + "moduleResolution": "Node16", + "lib": ["ES2022"], + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "allowSyntheticDefaultImports": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} +``` + +## Complete Example + +```typescript +#!/usr/bin/env node +/** + * MCP Server for Example Service. + * + * This server provides tools to interact with Example API, including user search, + * project management, and data export capabilities. + */ + +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { z } from "zod"; +import axios, { AxiosError } from "axios"; + +// Constants +const API_BASE_URL = "https://api.example.com/v1"; +const CHARACTER_LIMIT = 25000; + +// Enums +enum ResponseFormat { + MARKDOWN = "markdown", + JSON = "json" +} + +// Zod schemas +const UserSearchInputSchema = z.object({ + query: z.string() + .min(2, "Query must be at least 2 characters") + .max(200, "Query must not exceed 200 characters") + .describe("Search string to match against names/emails"), + limit: z.number() + .int() + .min(1) + .max(100) + .default(20) + .describe("Maximum results to return"), + offset: z.number() + .int() + .min(0) + .default(0) + .describe("Number of results to skip for pagination"), + response_format: z.nativeEnum(ResponseFormat) + .default(ResponseFormat.MARKDOWN) + .describe("Output format: 'markdown' for human-readable or 'json' for machine-readable") +}).strict(); + +type UserSearchInput = z.infer; + +// Shared utility functions +async function makeApiRequest( + endpoint: string, + method: "GET" | "POST" | "PUT" | "DELETE" = "GET", + data?: any, + params?: any +): Promise { + try { + const response = await axios({ + method, + url: `${API_BASE_URL}/${endpoint}`, + data, + params, + timeout: 30000, + headers: { + "Content-Type": "application/json", + "Accept": "application/json" + } + }); + return response.data; + } catch (error) { + throw error; + } +} + +function handleApiError(error: unknown): string { + if (error instanceof AxiosError) { + if (error.response) { + switch (error.response.status) { + case 404: + return "Error: Resource not found. Please check the ID is correct."; + case 403: + return "Error: Permission denied. You don't have access to this resource."; + case 429: + return "Error: Rate limit exceeded. Please wait before making more requests."; + default: + return `Error: API request failed with status ${error.response.status}`; + } + } else if (error.code === "ECONNABORTED") { + return "Error: Request timed out. Please try again."; + } + } + return `Error: Unexpected error occurred: ${error instanceof Error ? error.message : String(error)}`; +} + +// Create MCP server instance +const server = new McpServer({ + name: "example-mcp", + version: "1.0.0" +}); + +// Register tools +server.registerTool( + "example_search_users", + { + title: "Search Example Users", + description: `[Full description as shown above]`, + inputSchema: UserSearchInputSchema, + annotations: { + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: true + } + }, + async (params: UserSearchInput) => { + // Implementation as shown above + } +); + +// Main function +// For stdio (local): +async function runStdio() { + if (!process.env.EXAMPLE_API_KEY) { + console.error("ERROR: EXAMPLE_API_KEY environment variable is required"); + process.exit(1); + } + + const transport = new StdioServerTransport(); + await server.connect(transport); + console.error("MCP server running via stdio"); +} + +// For streamable HTTP (remote): +async function runHTTP() { + if (!process.env.EXAMPLE_API_KEY) { + console.error("ERROR: EXAMPLE_API_KEY environment variable is required"); + process.exit(1); + } + + const app = express(); + app.use(express.json()); + + app.post('/mcp', async (req, res) => { + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + enableJsonResponse: true + }); + res.on('close', () => transport.close()); + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + }); + + const port = parseInt(process.env.PORT || '3000'); + app.listen(port, () => { + console.error(`MCP server running on http://localhost:${port}/mcp`); + }); +} + +// Choose transport based on environment +const transport = process.env.TRANSPORT || 'stdio'; +if (transport === 'http') { + runHTTP().catch(error => { + console.error("Server error:", error); + process.exit(1); + }); +} else { + runStdio().catch(error => { + console.error("Server error:", error); + process.exit(1); + }); +} +``` + +--- + +## Advanced MCP Features + +### Resource Registration + +Expose data as resources for efficient, URI-based access: + +```typescript +import { ResourceTemplate } from "@modelcontextprotocol/sdk/types.js"; + +// Register a resource with URI template +server.registerResource( + { + uri: "file://documents/{name}", + name: "Document Resource", + description: "Access documents by name", + mimeType: "text/plain" + }, + async (uri: string) => { + // Extract parameter from URI + const match = uri.match(/^file:\/\/documents\/(.+)$/); + if (!match) { + throw new Error("Invalid URI format"); + } + + const documentName = match[1]; + const content = await loadDocument(documentName); + + return { + contents: [{ + uri, + mimeType: "text/plain", + text: content + }] + }; + } +); + +// List available resources dynamically +server.registerResourceList(async () => { + const documents = await getAvailableDocuments(); + return { + resources: documents.map(doc => ({ + uri: `file://documents/${doc.name}`, + name: doc.name, + mimeType: "text/plain", + description: doc.description + })) + }; +}); +``` + +**When to use Resources vs Tools:** +- **Resources**: For data access with simple URI-based parameters +- **Tools**: For complex operations requiring validation and business logic +- **Resources**: When data is relatively static or template-based +- **Tools**: When operations have side effects or complex workflows + +### Transport Options + +The TypeScript SDK supports two main transport mechanisms: + +#### Streamable HTTP (Recommended for Remote Servers) + +```typescript +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import express from "express"; + +const app = express(); +app.use(express.json()); + +app.post('/mcp', async (req, res) => { + // Create new transport for each request (stateless, prevents request ID collisions) + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + enableJsonResponse: true + }); + + res.on('close', () => transport.close()); + + await server.connect(transport); + await transport.handleRequest(req, res, req.body); +}); + +app.listen(3000); +``` + +#### stdio (For Local Integrations) + +```typescript +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; + +const transport = new StdioServerTransport(); +await server.connect(transport); +``` + +**Transport selection:** +- **Streamable HTTP**: Web services, remote access, multiple clients +- **stdio**: Command-line tools, local development, subprocess integration + +### Notification Support + +Notify clients when server state changes: + +```typescript +// Notify when tools list changes +server.notification({ + method: "notifications/tools/list_changed" +}); + +// Notify when resources change +server.notification({ + method: "notifications/resources/list_changed" +}); +``` + +Use notifications sparingly - only when server capabilities genuinely change. + +--- + +## Code Best Practices + +### Code Composability and Reusability + +Your implementation MUST prioritize composability and code reuse: + +1. **Extract Common Functionality**: + - Create reusable helper functions for operations used across multiple tools + - Build shared API clients for HTTP requests instead of duplicating code + - Centralize error handling logic in utility functions + - Extract business logic into dedicated functions that can be composed + - Extract shared markdown or JSON field selection & formatting functionality + +2. **Avoid Duplication**: + - NEVER copy-paste similar code between tools + - If you find yourself writing similar logic twice, extract it into a function + - Common operations like pagination, filtering, field selection, and formatting should be shared + - Authentication/authorization logic should be centralized + +## Building and Running + +Always build your TypeScript code before running: + +```bash +# Build the project +npm run build + +# Run the server +npm start + +# Development with auto-reload +npm run dev +``` + +Always ensure `npm run build` completes successfully before considering the implementation complete. + +## Quality Checklist + +Before finalizing your Node/TypeScript MCP server implementation, ensure: + +### Strategic Design +- [ ] Tools enable complete workflows, not just API endpoint wrappers +- [ ] Tool names reflect natural task subdivisions +- [ ] Response formats optimize for agent context efficiency +- [ ] Human-readable identifiers used where appropriate +- [ ] Error messages guide agents toward correct usage + +### Implementation Quality +- [ ] FOCUSED IMPLEMENTATION: Most important and valuable tools implemented +- [ ] All tools registered using `registerTool` with complete configuration +- [ ] All tools include `title`, `description`, `inputSchema`, and `annotations` +- [ ] Annotations correctly set (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) +- [ ] All tools use Zod schemas for runtime input validation with `.strict()` enforcement +- [ ] All Zod schemas have proper constraints and descriptive error messages +- [ ] All tools have comprehensive descriptions with explicit input/output types +- [ ] Descriptions include return value examples and complete schema documentation +- [ ] Error messages are clear, actionable, and educational + +### TypeScript Quality +- [ ] TypeScript interfaces are defined for all data structures +- [ ] Strict TypeScript is enabled in tsconfig.json +- [ ] No use of `any` type - use `unknown` or proper types instead +- [ ] All async functions have explicit Promise return types +- [ ] Error handling uses proper type guards (e.g., `axios.isAxiosError`, `z.ZodError`) + +### Advanced Features (where applicable) +- [ ] Resources registered for appropriate data endpoints +- [ ] Appropriate transport configured (stdio or streamable HTTP) +- [ ] Notifications implemented for dynamic server capabilities +- [ ] Type-safe with SDK interfaces + +### Project Configuration +- [ ] Package.json includes all necessary dependencies +- [ ] Build script produces working JavaScript in dist/ directory +- [ ] Main entry point is properly configured as dist/index.js +- [ ] Server name follows format: `{service}-mcp-server` +- [ ] tsconfig.json properly configured with strict mode + +### Code Quality +- [ ] Pagination is properly implemented where applicable +- [ ] Large responses check CHARACTER_LIMIT constant and truncate with clear messages +- [ ] Filtering options are provided for potentially large result sets +- [ ] All network operations handle timeouts and connection errors gracefully +- [ ] Common functionality is extracted into reusable functions +- [ ] Return types are consistent across similar operations + +### Testing and Build +- [ ] `npm run build` completes successfully without errors +- [ ] dist/index.js created and executable +- [ ] Server runs: `node dist/index.js --help` +- [ ] All imports resolve correctly +- [ ] Sample tool calls work as expected \ No newline at end of file diff --git a/.claude/skills/mcp-builder/reference/python_mcp_server.md b/.claude/skills/mcp-builder/reference/python_mcp_server.md new file mode 100644 index 0000000..cf7ec99 --- /dev/null +++ b/.claude/skills/mcp-builder/reference/python_mcp_server.md @@ -0,0 +1,719 @@ +# Python MCP Server Implementation Guide + +## Overview + +This document provides Python-specific best practices and examples for implementing MCP servers using the MCP Python SDK. It covers server setup, tool registration patterns, input validation with Pydantic, error handling, and complete working examples. + +--- + +## Quick Reference + +### Key Imports +```python +from mcp.server.fastmcp import FastMCP +from pydantic import BaseModel, Field, field_validator, ConfigDict +from typing import Optional, List, Dict, Any +from enum import Enum +import httpx +``` + +### Server Initialization +```python +mcp = FastMCP("service_mcp") +``` + +### Tool Registration Pattern +```python +@mcp.tool(name="tool_name", annotations={...}) +async def tool_function(params: InputModel) -> str: + # Implementation + pass +``` + +--- + +## MCP Python SDK and FastMCP + +The official MCP Python SDK provides FastMCP, a high-level framework for building MCP servers. It provides: +- Automatic description and inputSchema generation from function signatures and docstrings +- Pydantic model integration for input validation +- Decorator-based tool registration with `@mcp.tool` + +**For complete SDK documentation, use WebFetch to load:** +`https://raw.githubusercontent.com/modelcontextprotocol/python-sdk/main/README.md` + +## Server Naming Convention + +Python MCP servers must follow this naming pattern: +- **Format**: `{service}_mcp` (lowercase with underscores) +- **Examples**: `github_mcp`, `jira_mcp`, `stripe_mcp` + +The name should be: +- General (not tied to specific features) +- Descriptive of the service/API being integrated +- Easy to infer from the task description +- Without version numbers or dates + +## Tool Implementation + +### Tool Naming + +Use snake_case for tool names (e.g., "search_users", "create_project", "get_channel_info") with clear, action-oriented names. + +**Avoid Naming Conflicts**: Include the service context to prevent overlaps: +- Use "slack_send_message" instead of just "send_message" +- Use "github_create_issue" instead of just "create_issue" +- Use "asana_list_tasks" instead of just "list_tasks" + +### Tool Structure with FastMCP + +Tools are defined using the `@mcp.tool` decorator with Pydantic models for input validation: + +```python +from pydantic import BaseModel, Field, ConfigDict +from mcp.server.fastmcp import FastMCP + +# Initialize the MCP server +mcp = FastMCP("example_mcp") + +# Define Pydantic model for input validation +class ServiceToolInput(BaseModel): + '''Input model for service tool operation.''' + model_config = ConfigDict( + str_strip_whitespace=True, # Auto-strip whitespace from strings + validate_assignment=True, # Validate on assignment + extra='forbid' # Forbid extra fields + ) + + param1: str = Field(..., description="First parameter description (e.g., 'user123', 'project-abc')", min_length=1, max_length=100) + param2: Optional[int] = Field(default=None, description="Optional integer parameter with constraints", ge=0, le=1000) + tags: Optional[List[str]] = Field(default_factory=list, description="List of tags to apply", max_items=10) + +@mcp.tool( + name="service_tool_name", + annotations={ + "title": "Human-Readable Tool Title", + "readOnlyHint": True, # Tool does not modify environment + "destructiveHint": False, # Tool does not perform destructive operations + "idempotentHint": True, # Repeated calls have no additional effect + "openWorldHint": False # Tool does not interact with external entities + } +) +async def service_tool_name(params: ServiceToolInput) -> str: + '''Tool description automatically becomes the 'description' field. + + This tool performs a specific operation on the service. It validates all inputs + using the ServiceToolInput Pydantic model before processing. + + Args: + params (ServiceToolInput): Validated input parameters containing: + - param1 (str): First parameter description + - param2 (Optional[int]): Optional parameter with default + - tags (Optional[List[str]]): List of tags + + Returns: + str: JSON-formatted response containing operation results + ''' + # Implementation here + pass +``` + +## Pydantic v2 Key Features + +- Use `model_config` instead of nested `Config` class +- Use `field_validator` instead of deprecated `validator` +- Use `model_dump()` instead of deprecated `dict()` +- Validators require `@classmethod` decorator +- Type hints are required for validator methods + +```python +from pydantic import BaseModel, Field, field_validator, ConfigDict + +class CreateUserInput(BaseModel): + model_config = ConfigDict( + str_strip_whitespace=True, + validate_assignment=True + ) + + name: str = Field(..., description="User's full name", min_length=1, max_length=100) + email: str = Field(..., description="User's email address", pattern=r'^[\w\.-]+@[\w\.-]+\.\w+$') + age: int = Field(..., description="User's age", ge=0, le=150) + + @field_validator('email') + @classmethod + def validate_email(cls, v: str) -> str: + if not v.strip(): + raise ValueError("Email cannot be empty") + return v.lower() +``` + +## Response Format Options + +Support multiple output formats for flexibility: + +```python +from enum import Enum + +class ResponseFormat(str, Enum): + '''Output format for tool responses.''' + MARKDOWN = "markdown" + JSON = "json" + +class UserSearchInput(BaseModel): + query: str = Field(..., description="Search query") + response_format: ResponseFormat = Field( + default=ResponseFormat.MARKDOWN, + description="Output format: 'markdown' for human-readable or 'json' for machine-readable" + ) +``` + +**Markdown format**: +- Use headers, lists, and formatting for clarity +- Convert timestamps to human-readable format (e.g., "2024-01-15 10:30:00 UTC" instead of epoch) +- Show display names with IDs in parentheses (e.g., "@john.doe (U123456)") +- Omit verbose metadata (e.g., show only one profile image URL, not all sizes) +- Group related information logically + +**JSON format**: +- Return complete, structured data suitable for programmatic processing +- Include all available fields and metadata +- Use consistent field names and types + +## Pagination Implementation + +For tools that list resources: + +```python +class ListInput(BaseModel): + limit: Optional[int] = Field(default=20, description="Maximum results to return", ge=1, le=100) + offset: Optional[int] = Field(default=0, description="Number of results to skip for pagination", ge=0) + +async def list_items(params: ListInput) -> str: + # Make API request with pagination + data = await api_request(limit=params.limit, offset=params.offset) + + # Return pagination info + response = { + "total": data["total"], + "count": len(data["items"]), + "offset": params.offset, + "items": data["items"], + "has_more": data["total"] > params.offset + len(data["items"]), + "next_offset": params.offset + len(data["items"]) if data["total"] > params.offset + len(data["items"]) else None + } + return json.dumps(response, indent=2) +``` + +## Error Handling + +Provide clear, actionable error messages: + +```python +def _handle_api_error(e: Exception) -> str: + '''Consistent error formatting across all tools.''' + if isinstance(e, httpx.HTTPStatusError): + if e.response.status_code == 404: + return "Error: Resource not found. Please check the ID is correct." + elif e.response.status_code == 403: + return "Error: Permission denied. You don't have access to this resource." + elif e.response.status_code == 429: + return "Error: Rate limit exceeded. Please wait before making more requests." + return f"Error: API request failed with status {e.response.status_code}" + elif isinstance(e, httpx.TimeoutException): + return "Error: Request timed out. Please try again." + return f"Error: Unexpected error occurred: {type(e).__name__}" +``` + +## Shared Utilities + +Extract common functionality into reusable functions: + +```python +# Shared API request function +async def _make_api_request(endpoint: str, method: str = "GET", **kwargs) -> dict: + '''Reusable function for all API calls.''' + async with httpx.AsyncClient() as client: + response = await client.request( + method, + f"{API_BASE_URL}/{endpoint}", + timeout=30.0, + **kwargs + ) + response.raise_for_status() + return response.json() +``` + +## Async/Await Best Practices + +Always use async/await for network requests and I/O operations: + +```python +# Good: Async network request +async def fetch_data(resource_id: str) -> dict: + async with httpx.AsyncClient() as client: + response = await client.get(f"{API_URL}/resource/{resource_id}") + response.raise_for_status() + return response.json() + +# Bad: Synchronous request +def fetch_data(resource_id: str) -> dict: + response = requests.get(f"{API_URL}/resource/{resource_id}") # Blocks + return response.json() +``` + +## Type Hints + +Use type hints throughout: + +```python +from typing import Optional, List, Dict, Any + +async def get_user(user_id: str) -> Dict[str, Any]: + data = await fetch_user(user_id) + return {"id": data["id"], "name": data["name"]} +``` + +## Tool Docstrings + +Every tool must have comprehensive docstrings with explicit type information: + +```python +async def search_users(params: UserSearchInput) -> str: + ''' + Search for users in the Example system by name, email, or team. + + This tool searches across all user profiles in the Example platform, + supporting partial matches and various search filters. It does NOT + create or modify users, only searches existing ones. + + Args: + params (UserSearchInput): Validated input parameters containing: + - query (str): Search string to match against names/emails (e.g., "john", "@example.com", "team:marketing") + - limit (Optional[int]): Maximum results to return, between 1-100 (default: 20) + - offset (Optional[int]): Number of results to skip for pagination (default: 0) + + Returns: + str: JSON-formatted string containing search results with the following schema: + + Success response: + { + "total": int, # Total number of matches found + "count": int, # Number of results in this response + "offset": int, # Current pagination offset + "users": [ + { + "id": str, # User ID (e.g., "U123456789") + "name": str, # Full name (e.g., "John Doe") + "email": str, # Email address (e.g., "john@example.com") + "team": str # Team name (e.g., "Marketing") - optional + } + ] + } + + Error response: + "Error: " or "No users found matching ''" + + Examples: + - Use when: "Find all marketing team members" -> params with query="team:marketing" + - Use when: "Search for John's account" -> params with query="john" + - Don't use when: You need to create a user (use example_create_user instead) + - Don't use when: You have a user ID and need full details (use example_get_user instead) + + Error Handling: + - Input validation errors are handled by Pydantic model + - Returns "Error: Rate limit exceeded" if too many requests (429 status) + - Returns "Error: Invalid API authentication" if API key is invalid (401 status) + - Returns formatted list of results or "No users found matching 'query'" + ''' +``` + +## Complete Example + +See below for a complete Python MCP server example: + +```python +#!/usr/bin/env python3 +''' +MCP Server for Example Service. + +This server provides tools to interact with Example API, including user search, +project management, and data export capabilities. +''' + +from typing import Optional, List, Dict, Any +from enum import Enum +import httpx +from pydantic import BaseModel, Field, field_validator, ConfigDict +from mcp.server.fastmcp import FastMCP + +# Initialize the MCP server +mcp = FastMCP("example_mcp") + +# Constants +API_BASE_URL = "https://api.example.com/v1" + +# Enums +class ResponseFormat(str, Enum): + '''Output format for tool responses.''' + MARKDOWN = "markdown" + JSON = "json" + +# Pydantic Models for Input Validation +class UserSearchInput(BaseModel): + '''Input model for user search operations.''' + model_config = ConfigDict( + str_strip_whitespace=True, + validate_assignment=True + ) + + query: str = Field(..., description="Search string to match against names/emails", min_length=2, max_length=200) + limit: Optional[int] = Field(default=20, description="Maximum results to return", ge=1, le=100) + offset: Optional[int] = Field(default=0, description="Number of results to skip for pagination", ge=0) + response_format: ResponseFormat = Field(default=ResponseFormat.MARKDOWN, description="Output format") + + @field_validator('query') + @classmethod + def validate_query(cls, v: str) -> str: + if not v.strip(): + raise ValueError("Query cannot be empty or whitespace only") + return v.strip() + +# Shared utility functions +async def _make_api_request(endpoint: str, method: str = "GET", **kwargs) -> dict: + '''Reusable function for all API calls.''' + async with httpx.AsyncClient() as client: + response = await client.request( + method, + f"{API_BASE_URL}/{endpoint}", + timeout=30.0, + **kwargs + ) + response.raise_for_status() + return response.json() + +def _handle_api_error(e: Exception) -> str: + '''Consistent error formatting across all tools.''' + if isinstance(e, httpx.HTTPStatusError): + if e.response.status_code == 404: + return "Error: Resource not found. Please check the ID is correct." + elif e.response.status_code == 403: + return "Error: Permission denied. You don't have access to this resource." + elif e.response.status_code == 429: + return "Error: Rate limit exceeded. Please wait before making more requests." + return f"Error: API request failed with status {e.response.status_code}" + elif isinstance(e, httpx.TimeoutException): + return "Error: Request timed out. Please try again." + return f"Error: Unexpected error occurred: {type(e).__name__}" + +# Tool definitions +@mcp.tool( + name="example_search_users", + annotations={ + "title": "Search Example Users", + "readOnlyHint": True, + "destructiveHint": False, + "idempotentHint": True, + "openWorldHint": True + } +) +async def example_search_users(params: UserSearchInput) -> str: + '''Search for users in the Example system by name, email, or team. + + [Full docstring as shown above] + ''' + try: + # Make API request using validated parameters + data = await _make_api_request( + "users/search", + params={ + "q": params.query, + "limit": params.limit, + "offset": params.offset + } + ) + + users = data.get("users", []) + total = data.get("total", 0) + + if not users: + return f"No users found matching '{params.query}'" + + # Format response based on requested format + if params.response_format == ResponseFormat.MARKDOWN: + lines = [f"# User Search Results: '{params.query}'", ""] + lines.append(f"Found {total} users (showing {len(users)})") + lines.append("") + + for user in users: + lines.append(f"## {user['name']} ({user['id']})") + lines.append(f"- **Email**: {user['email']}") + if user.get('team'): + lines.append(f"- **Team**: {user['team']}") + lines.append("") + + return "\n".join(lines) + + else: + # Machine-readable JSON format + import json + response = { + "total": total, + "count": len(users), + "offset": params.offset, + "users": users + } + return json.dumps(response, indent=2) + + except Exception as e: + return _handle_api_error(e) + +if __name__ == "__main__": + mcp.run() +``` + +--- + +## Advanced FastMCP Features + +### Context Parameter Injection + +FastMCP can automatically inject a `Context` parameter into tools for advanced capabilities like logging, progress reporting, resource reading, and user interaction: + +```python +from mcp.server.fastmcp import FastMCP, Context + +mcp = FastMCP("example_mcp") + +@mcp.tool() +async def advanced_search(query: str, ctx: Context) -> str: + '''Advanced tool with context access for logging and progress.''' + + # Report progress for long operations + await ctx.report_progress(0.25, "Starting search...") + + # Log information for debugging + await ctx.log_info("Processing query", {"query": query, "timestamp": datetime.now()}) + + # Perform search + results = await search_api(query) + await ctx.report_progress(0.75, "Formatting results...") + + # Access server configuration + server_name = ctx.fastmcp.name + + return format_results(results) + +@mcp.tool() +async def interactive_tool(resource_id: str, ctx: Context) -> str: + '''Tool that can request additional input from users.''' + + # Request sensitive information when needed + api_key = await ctx.elicit( + prompt="Please provide your API key:", + input_type="password" + ) + + # Use the provided key + return await api_call(resource_id, api_key) +``` + +**Context capabilities:** +- `ctx.report_progress(progress, message)` - Report progress for long operations +- `ctx.log_info(message, data)` / `ctx.log_error()` / `ctx.log_debug()` - Logging +- `ctx.elicit(prompt, input_type)` - Request input from users +- `ctx.fastmcp.name` - Access server configuration +- `ctx.read_resource(uri)` - Read MCP resources + +### Resource Registration + +Expose data as resources for efficient, template-based access: + +```python +@mcp.resource("file://documents/{name}") +async def get_document(name: str) -> str: + '''Expose documents as MCP resources. + + Resources are useful for static or semi-static data that doesn't + require complex parameters. They use URI templates for flexible access. + ''' + document_path = f"./docs/{name}" + with open(document_path, "r") as f: + return f.read() + +@mcp.resource("config://settings/{key}") +async def get_setting(key: str, ctx: Context) -> str: + '''Expose configuration as resources with context.''' + settings = await load_settings() + return json.dumps(settings.get(key, {})) +``` + +**When to use Resources vs Tools:** +- **Resources**: For data access with simple parameters (URI templates) +- **Tools**: For complex operations with validation and business logic + +### Structured Output Types + +FastMCP supports multiple return types beyond strings: + +```python +from typing import TypedDict +from dataclasses import dataclass +from pydantic import BaseModel + +# TypedDict for structured returns +class UserData(TypedDict): + id: str + name: str + email: str + +@mcp.tool() +async def get_user_typed(user_id: str) -> UserData: + '''Returns structured data - FastMCP handles serialization.''' + return {"id": user_id, "name": "John Doe", "email": "john@example.com"} + +# Pydantic models for complex validation +class DetailedUser(BaseModel): + id: str + name: str + email: str + created_at: datetime + metadata: Dict[str, Any] + +@mcp.tool() +async def get_user_detailed(user_id: str) -> DetailedUser: + '''Returns Pydantic model - automatically generates schema.''' + user = await fetch_user(user_id) + return DetailedUser(**user) +``` + +### Lifespan Management + +Initialize resources that persist across requests: + +```python +from contextlib import asynccontextmanager + +@asynccontextmanager +async def app_lifespan(): + '''Manage resources that live for the server's lifetime.''' + # Initialize connections, load config, etc. + db = await connect_to_database() + config = load_configuration() + + # Make available to all tools + yield {"db": db, "config": config} + + # Cleanup on shutdown + await db.close() + +mcp = FastMCP("example_mcp", lifespan=app_lifespan) + +@mcp.tool() +async def query_data(query: str, ctx: Context) -> str: + '''Access lifespan resources through context.''' + db = ctx.request_context.lifespan_state["db"] + results = await db.query(query) + return format_results(results) +``` + +### Transport Options + +FastMCP supports two main transport mechanisms: + +```python +# stdio transport (for local tools) - default +if __name__ == "__main__": + mcp.run() + +# Streamable HTTP transport (for remote servers) +if __name__ == "__main__": + mcp.run(transport="streamable_http", port=8000) +``` + +**Transport selection:** +- **stdio**: Command-line tools, local integrations, subprocess execution +- **Streamable HTTP**: Web services, remote access, multiple clients + +--- + +## Code Best Practices + +### Code Composability and Reusability + +Your implementation MUST prioritize composability and code reuse: + +1. **Extract Common Functionality**: + - Create reusable helper functions for operations used across multiple tools + - Build shared API clients for HTTP requests instead of duplicating code + - Centralize error handling logic in utility functions + - Extract business logic into dedicated functions that can be composed + - Extract shared markdown or JSON field selection & formatting functionality + +2. **Avoid Duplication**: + - NEVER copy-paste similar code between tools + - If you find yourself writing similar logic twice, extract it into a function + - Common operations like pagination, filtering, field selection, and formatting should be shared + - Authentication/authorization logic should be centralized + +### Python-Specific Best Practices + +1. **Use Type Hints**: Always include type annotations for function parameters and return values +2. **Pydantic Models**: Define clear Pydantic models for all input validation +3. **Avoid Manual Validation**: Let Pydantic handle input validation with constraints +4. **Proper Imports**: Group imports (standard library, third-party, local) +5. **Error Handling**: Use specific exception types (httpx.HTTPStatusError, not generic Exception) +6. **Async Context Managers**: Use `async with` for resources that need cleanup +7. **Constants**: Define module-level constants in UPPER_CASE + +## Quality Checklist + +Before finalizing your Python MCP server implementation, ensure: + +### Strategic Design +- [ ] Tools enable complete workflows, not just API endpoint wrappers +- [ ] Tool names reflect natural task subdivisions +- [ ] Response formats optimize for agent context efficiency +- [ ] Human-readable identifiers used where appropriate +- [ ] Error messages guide agents toward correct usage + +### Implementation Quality +- [ ] FOCUSED IMPLEMENTATION: Most important and valuable tools implemented +- [ ] All tools have descriptive names and documentation +- [ ] Return types are consistent across similar operations +- [ ] Error handling is implemented for all external calls +- [ ] Server name follows format: `{service}_mcp` +- [ ] All network operations use async/await +- [ ] Common functionality is extracted into reusable functions +- [ ] Error messages are clear, actionable, and educational +- [ ] Outputs are properly validated and formatted + +### Tool Configuration +- [ ] All tools implement 'name' and 'annotations' in the decorator +- [ ] Annotations correctly set (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) +- [ ] All tools use Pydantic BaseModel for input validation with Field() definitions +- [ ] All Pydantic Fields have explicit types and descriptions with constraints +- [ ] All tools have comprehensive docstrings with explicit input/output types +- [ ] Docstrings include complete schema structure for dict/JSON returns +- [ ] Pydantic models handle input validation (no manual validation needed) + +### Advanced Features (where applicable) +- [ ] Context injection used for logging, progress, or elicitation +- [ ] Resources registered for appropriate data endpoints +- [ ] Lifespan management implemented for persistent connections +- [ ] Structured output types used (TypedDict, Pydantic models) +- [ ] Appropriate transport configured (stdio or streamable HTTP) + +### Code Quality +- [ ] File includes proper imports including Pydantic imports +- [ ] Pagination is properly implemented where applicable +- [ ] Filtering options are provided for potentially large result sets +- [ ] All async functions are properly defined with `async def` +- [ ] HTTP client usage follows async patterns with proper context managers +- [ ] Type hints are used throughout the code +- [ ] Constants are defined at module level in UPPER_CASE + +### Testing +- [ ] Server runs successfully: `python your_server.py --help` +- [ ] All imports resolve correctly +- [ ] Sample tool calls work as expected +- [ ] Error scenarios handled gracefully \ No newline at end of file diff --git a/.claude/skills/mcp-builder/scripts/connections.py b/.claude/skills/mcp-builder/scripts/connections.py new file mode 100644 index 0000000..ffcd0da --- /dev/null +++ b/.claude/skills/mcp-builder/scripts/connections.py @@ -0,0 +1,151 @@ +"""Lightweight connection handling for MCP servers.""" + +from abc import ABC, abstractmethod +from contextlib import AsyncExitStack +from typing import Any + +from mcp import ClientSession, StdioServerParameters +from mcp.client.sse import sse_client +from mcp.client.stdio import stdio_client +from mcp.client.streamable_http import streamablehttp_client + + +class MCPConnection(ABC): + """Base class for MCP server connections.""" + + def __init__(self): + self.session = None + self._stack = None + + @abstractmethod + def _create_context(self): + """Create the connection context based on connection type.""" + + async def __aenter__(self): + """Initialize MCP server connection.""" + self._stack = AsyncExitStack() + await self._stack.__aenter__() + + try: + ctx = self._create_context() + result = await self._stack.enter_async_context(ctx) + + if len(result) == 2: + read, write = result + elif len(result) == 3: + read, write, _ = result + else: + raise ValueError(f"Unexpected context result: {result}") + + session_ctx = ClientSession(read, write) + self.session = await self._stack.enter_async_context(session_ctx) + await self.session.initialize() + return self + except BaseException: + await self._stack.__aexit__(None, None, None) + raise + + async def __aexit__(self, exc_type, exc_val, exc_tb): + """Clean up MCP server connection resources.""" + if self._stack: + await self._stack.__aexit__(exc_type, exc_val, exc_tb) + self.session = None + self._stack = None + + async def list_tools(self) -> list[dict[str, Any]]: + """Retrieve available tools from the MCP server.""" + response = await self.session.list_tools() + return [ + { + "name": tool.name, + "description": tool.description, + "input_schema": tool.inputSchema, + } + for tool in response.tools + ] + + async def call_tool(self, tool_name: str, arguments: dict[str, Any]) -> Any: + """Call a tool on the MCP server with provided arguments.""" + result = await self.session.call_tool(tool_name, arguments=arguments) + return result.content + + +class MCPConnectionStdio(MCPConnection): + """MCP connection using standard input/output.""" + + def __init__(self, command: str, args: list[str] = None, env: dict[str, str] = None): + super().__init__() + self.command = command + self.args = args or [] + self.env = env + + def _create_context(self): + return stdio_client( + StdioServerParameters(command=self.command, args=self.args, env=self.env) + ) + + +class MCPConnectionSSE(MCPConnection): + """MCP connection using Server-Sent Events.""" + + def __init__(self, url: str, headers: dict[str, str] = None): + super().__init__() + self.url = url + self.headers = headers or {} + + def _create_context(self): + return sse_client(url=self.url, headers=self.headers) + + +class MCPConnectionHTTP(MCPConnection): + """MCP connection using Streamable HTTP.""" + + def __init__(self, url: str, headers: dict[str, str] = None): + super().__init__() + self.url = url + self.headers = headers or {} + + def _create_context(self): + return streamablehttp_client(url=self.url, headers=self.headers) + + +def create_connection( + transport: str, + command: str = None, + args: list[str] = None, + env: dict[str, str] = None, + url: str = None, + headers: dict[str, str] = None, +) -> MCPConnection: + """Factory function to create the appropriate MCP connection. + + Args: + transport: Connection type ("stdio", "sse", or "http") + command: Command to run (stdio only) + args: Command arguments (stdio only) + env: Environment variables (stdio only) + url: Server URL (sse and http only) + headers: HTTP headers (sse and http only) + + Returns: + MCPConnection instance + """ + transport = transport.lower() + + if transport == "stdio": + if not command: + raise ValueError("Command is required for stdio transport") + return MCPConnectionStdio(command=command, args=args, env=env) + + elif transport == "sse": + if not url: + raise ValueError("URL is required for sse transport") + return MCPConnectionSSE(url=url, headers=headers) + + elif transport in ["http", "streamable_http", "streamable-http"]: + if not url: + raise ValueError("URL is required for http transport") + return MCPConnectionHTTP(url=url, headers=headers) + + else: + raise ValueError(f"Unsupported transport type: {transport}. Use 'stdio', 'sse', or 'http'") diff --git a/.claude/skills/mcp-builder/scripts/evaluation.py b/.claude/skills/mcp-builder/scripts/evaluation.py new file mode 100644 index 0000000..4177856 --- /dev/null +++ b/.claude/skills/mcp-builder/scripts/evaluation.py @@ -0,0 +1,373 @@ +"""MCP Server Evaluation Harness + +This script evaluates MCP servers by running test questions against them using Claude. +""" + +import argparse +import asyncio +import json +import re +import sys +import time +import traceback +import xml.etree.ElementTree as ET +from pathlib import Path +from typing import Any + +from anthropic import Anthropic + +from connections import create_connection + +EVALUATION_PROMPT = """You are an AI assistant with access to tools. + +When given a task, you MUST: +1. Use the available tools to complete the task +2. Provide summary of each step in your approach, wrapped in tags +3. Provide feedback on the tools provided, wrapped in tags +4. Provide your final response, wrapped in tags + +Summary Requirements: +- In your tags, you must explain: + - The steps you took to complete the task + - Which tools you used, in what order, and why + - The inputs you provided to each tool + - The outputs you received from each tool + - A summary for how you arrived at the response + +Feedback Requirements: +- In your tags, provide constructive feedback on the tools: + - Comment on tool names: Are they clear and descriptive? + - Comment on input parameters: Are they well-documented? Are required vs optional parameters clear? + - Comment on descriptions: Do they accurately describe what the tool does? + - Comment on any errors encountered during tool usage: Did the tool fail to execute? Did the tool return too many tokens? + - Identify specific areas for improvement and explain WHY they would help + - Be specific and actionable in your suggestions + +Response Requirements: +- Your response should be concise and directly address what was asked +- Always wrap your final response in tags +- If you cannot solve the task return NOT_FOUND +- For numeric responses, provide just the number +- For IDs, provide just the ID +- For names or text, provide the exact text requested +- Your response should go last""" + + +def parse_evaluation_file(file_path: Path) -> list[dict[str, Any]]: + """Parse XML evaluation file with qa_pair elements.""" + try: + tree = ET.parse(file_path) + root = tree.getroot() + evaluations = [] + + for qa_pair in root.findall(".//qa_pair"): + question_elem = qa_pair.find("question") + answer_elem = qa_pair.find("answer") + + if question_elem is not None and answer_elem is not None: + evaluations.append({ + "question": (question_elem.text or "").strip(), + "answer": (answer_elem.text or "").strip(), + }) + + return evaluations + except Exception as e: + print(f"Error parsing evaluation file {file_path}: {e}") + return [] + + +def extract_xml_content(text: str, tag: str) -> str | None: + """Extract content from XML tags.""" + pattern = rf"<{tag}>(.*?)" + matches = re.findall(pattern, text, re.DOTALL) + return matches[-1].strip() if matches else None + + +async def agent_loop( + client: Anthropic, + model: str, + question: str, + tools: list[dict[str, Any]], + connection: Any, +) -> tuple[str, dict[str, Any]]: + """Run the agent loop with MCP tools.""" + messages = [{"role": "user", "content": question}] + + response = await asyncio.to_thread( + client.messages.create, + model=model, + max_tokens=4096, + system=EVALUATION_PROMPT, + messages=messages, + tools=tools, + ) + + messages.append({"role": "assistant", "content": response.content}) + + tool_metrics = {} + + while response.stop_reason == "tool_use": + tool_use = next(block for block in response.content if block.type == "tool_use") + tool_name = tool_use.name + tool_input = tool_use.input + + tool_start_ts = time.time() + try: + tool_result = await connection.call_tool(tool_name, tool_input) + tool_response = json.dumps(tool_result) if isinstance(tool_result, (dict, list)) else str(tool_result) + except Exception as e: + tool_response = f"Error executing tool {tool_name}: {str(e)}\n" + tool_response += traceback.format_exc() + tool_duration = time.time() - tool_start_ts + + if tool_name not in tool_metrics: + tool_metrics[tool_name] = {"count": 0, "durations": []} + tool_metrics[tool_name]["count"] += 1 + tool_metrics[tool_name]["durations"].append(tool_duration) + + messages.append({ + "role": "user", + "content": [{ + "type": "tool_result", + "tool_use_id": tool_use.id, + "content": tool_response, + }] + }) + + response = await asyncio.to_thread( + client.messages.create, + model=model, + max_tokens=4096, + system=EVALUATION_PROMPT, + messages=messages, + tools=tools, + ) + messages.append({"role": "assistant", "content": response.content}) + + response_text = next( + (block.text for block in response.content if hasattr(block, "text")), + None, + ) + return response_text, tool_metrics + + +async def evaluate_single_task( + client: Anthropic, + model: str, + qa_pair: dict[str, Any], + tools: list[dict[str, Any]], + connection: Any, + task_index: int, +) -> dict[str, Any]: + """Evaluate a single QA pair with the given tools.""" + start_time = time.time() + + print(f"Task {task_index + 1}: Running task with question: {qa_pair['question']}") + response, tool_metrics = await agent_loop(client, model, qa_pair["question"], tools, connection) + + response_value = extract_xml_content(response, "response") + summary = extract_xml_content(response, "summary") + feedback = extract_xml_content(response, "feedback") + + duration_seconds = time.time() - start_time + + return { + "question": qa_pair["question"], + "expected": qa_pair["answer"], + "actual": response_value, + "score": int(response_value == qa_pair["answer"]) if response_value else 0, + "total_duration": duration_seconds, + "tool_calls": tool_metrics, + "num_tool_calls": sum(len(metrics["durations"]) for metrics in tool_metrics.values()), + "summary": summary, + "feedback": feedback, + } + + +REPORT_HEADER = """ +# Evaluation Report + +## Summary + +- **Accuracy**: {correct}/{total} ({accuracy:.1f}%) +- **Average Task Duration**: {average_duration_s:.2f}s +- **Average Tool Calls per Task**: {average_tool_calls:.2f} +- **Total Tool Calls**: {total_tool_calls} + +--- +""" + +TASK_TEMPLATE = """ +### Task {task_num} + +**Question**: {question} +**Ground Truth Answer**: `{expected_answer}` +**Actual Answer**: `{actual_answer}` +**Correct**: {correct_indicator} +**Duration**: {total_duration:.2f}s +**Tool Calls**: {tool_calls} + +**Summary** +{summary} + +**Feedback** +{feedback} + +--- +""" + + +async def run_evaluation( + eval_path: Path, + connection: Any, + model: str = "claude-3-7-sonnet-20250219", +) -> str: + """Run evaluation with MCP server tools.""" + print("🚀 Starting Evaluation") + + client = Anthropic() + + tools = await connection.list_tools() + print(f"📋 Loaded {len(tools)} tools from MCP server") + + qa_pairs = parse_evaluation_file(eval_path) + print(f"📋 Loaded {len(qa_pairs)} evaluation tasks") + + results = [] + for i, qa_pair in enumerate(qa_pairs): + print(f"Processing task {i + 1}/{len(qa_pairs)}") + result = await evaluate_single_task(client, model, qa_pair, tools, connection, i) + results.append(result) + + correct = sum(r["score"] for r in results) + accuracy = (correct / len(results)) * 100 if results else 0 + average_duration_s = sum(r["total_duration"] for r in results) / len(results) if results else 0 + average_tool_calls = sum(r["num_tool_calls"] for r in results) / len(results) if results else 0 + total_tool_calls = sum(r["num_tool_calls"] for r in results) + + report = REPORT_HEADER.format( + correct=correct, + total=len(results), + accuracy=accuracy, + average_duration_s=average_duration_s, + average_tool_calls=average_tool_calls, + total_tool_calls=total_tool_calls, + ) + + report += "".join([ + TASK_TEMPLATE.format( + task_num=i + 1, + question=qa_pair["question"], + expected_answer=qa_pair["answer"], + actual_answer=result["actual"] or "N/A", + correct_indicator="✅" if result["score"] else "❌", + total_duration=result["total_duration"], + tool_calls=json.dumps(result["tool_calls"], indent=2), + summary=result["summary"] or "N/A", + feedback=result["feedback"] or "N/A", + ) + for i, (qa_pair, result) in enumerate(zip(qa_pairs, results)) + ]) + + return report + + +def parse_headers(header_list: list[str]) -> dict[str, str]: + """Parse header strings in format 'Key: Value' into a dictionary.""" + headers = {} + if not header_list: + return headers + + for header in header_list: + if ":" in header: + key, value = header.split(":", 1) + headers[key.strip()] = value.strip() + else: + print(f"Warning: Ignoring malformed header: {header}") + return headers + + +def parse_env_vars(env_list: list[str]) -> dict[str, str]: + """Parse environment variable strings in format 'KEY=VALUE' into a dictionary.""" + env = {} + if not env_list: + return env + + for env_var in env_list: + if "=" in env_var: + key, value = env_var.split("=", 1) + env[key.strip()] = value.strip() + else: + print(f"Warning: Ignoring malformed environment variable: {env_var}") + return env + + +async def main(): + parser = argparse.ArgumentParser( + description="Evaluate MCP servers using test questions", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +Examples: + # Evaluate a local stdio MCP server + python evaluation.py -t stdio -c python -a my_server.py eval.xml + + # Evaluate an SSE MCP server + python evaluation.py -t sse -u https://example.com/mcp -H "Authorization: Bearer token" eval.xml + + # Evaluate an HTTP MCP server with custom model + python evaluation.py -t http -u https://example.com/mcp -m claude-3-5-sonnet-20241022 eval.xml + """, + ) + + parser.add_argument("eval_file", type=Path, help="Path to evaluation XML file") + parser.add_argument("-t", "--transport", choices=["stdio", "sse", "http"], default="stdio", help="Transport type (default: stdio)") + parser.add_argument("-m", "--model", default="claude-3-7-sonnet-20250219", help="Claude model to use (default: claude-3-7-sonnet-20250219)") + + stdio_group = parser.add_argument_group("stdio options") + stdio_group.add_argument("-c", "--command", help="Command to run MCP server (stdio only)") + stdio_group.add_argument("-a", "--args", nargs="+", help="Arguments for the command (stdio only)") + stdio_group.add_argument("-e", "--env", nargs="+", help="Environment variables in KEY=VALUE format (stdio only)") + + remote_group = parser.add_argument_group("sse/http options") + remote_group.add_argument("-u", "--url", help="MCP server URL (sse/http only)") + remote_group.add_argument("-H", "--header", nargs="+", dest="headers", help="HTTP headers in 'Key: Value' format (sse/http only)") + + parser.add_argument("-o", "--output", type=Path, help="Output file for evaluation report (default: stdout)") + + args = parser.parse_args() + + if not args.eval_file.exists(): + print(f"Error: Evaluation file not found: {args.eval_file}") + sys.exit(1) + + headers = parse_headers(args.headers) if args.headers else None + env_vars = parse_env_vars(args.env) if args.env else None + + try: + connection = create_connection( + transport=args.transport, + command=args.command, + args=args.args, + env=env_vars, + url=args.url, + headers=headers, + ) + except ValueError as e: + print(f"Error: {e}") + sys.exit(1) + + print(f"🔗 Connecting to MCP server via {args.transport}...") + + async with connection: + print("✅ Connected successfully") + report = await run_evaluation(args.eval_file, connection, args.model) + + if args.output: + args.output.write_text(report) + print(f"\n✅ Report saved to {args.output}") + else: + print("\n" + report) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/.claude/skills/mcp-builder/scripts/example_evaluation.xml b/.claude/skills/mcp-builder/scripts/example_evaluation.xml new file mode 100644 index 0000000..41e4459 --- /dev/null +++ b/.claude/skills/mcp-builder/scripts/example_evaluation.xml @@ -0,0 +1,22 @@ + + + Calculate the compound interest on $10,000 invested at 5% annual interest rate, compounded monthly for 3 years. What is the final amount in dollars (rounded to 2 decimal places)? + 11614.72 + + + A projectile is launched at a 45-degree angle with an initial velocity of 50 m/s. Calculate the total distance (in meters) it has traveled from the launch point after 2 seconds, assuming g=9.8 m/s². Round to 2 decimal places. + 87.25 + + + A sphere has a volume of 500 cubic meters. Calculate its surface area in square meters. Round to 2 decimal places. + 304.65 + + + Calculate the population standard deviation of this dataset: [12, 15, 18, 22, 25, 30, 35]. Round to 2 decimal places. + 7.61 + + + Calculate the pH of a solution with a hydrogen ion concentration of 3.5 × 10^-5 M. Round to 2 decimal places. + 4.46 + + diff --git a/.claude/skills/mcp-builder/scripts/requirements.txt b/.claude/skills/mcp-builder/scripts/requirements.txt new file mode 100644 index 0000000..e73e5d1 --- /dev/null +++ b/.claude/skills/mcp-builder/scripts/requirements.txt @@ -0,0 +1,2 @@ +anthropic>=0.39.0 +mcp>=1.1.0 diff --git a/.claude/skills/pdf/.openskills.json b/.claude/skills/pdf/.openskills.json new file mode 100644 index 0000000..a8062f6 --- /dev/null +++ b/.claude/skills/pdf/.openskills.json @@ -0,0 +1,7 @@ +{ + "source": "anthropics/skills", + "sourceType": "git", + "repoUrl": "https://github.com/anthropics/skills", + "subpath": "skills\\pdf", + "installedAt": "2026-03-02T09:19:50.119Z" +} \ No newline at end of file diff --git a/.claude/skills/pdf/LICENSE.txt b/.claude/skills/pdf/LICENSE.txt new file mode 100644 index 0000000..c55ab42 --- /dev/null +++ b/.claude/skills/pdf/LICENSE.txt @@ -0,0 +1,30 @@ +© 2025 Anthropic, PBC. All rights reserved. + +LICENSE: Use of these materials (including all code, prompts, assets, files, +and other components of this Skill) is governed by your agreement with +Anthropic regarding use of Anthropic's services. If no separate agreement +exists, use is governed by Anthropic's Consumer Terms of Service or +Commercial Terms of Service, as applicable: +https://www.anthropic.com/legal/consumer-terms +https://www.anthropic.com/legal/commercial-terms +Your applicable agreement is referred to as the "Agreement." "Services" are +as defined in the Agreement. + +ADDITIONAL RESTRICTIONS: Notwithstanding anything in the Agreement to the +contrary, users may not: + +- Extract these materials from the Services or retain copies of these + materials outside the Services +- Reproduce or copy these materials, except for temporary copies created + automatically during authorized use of the Services +- Create derivative works based on these materials +- Distribute, sublicense, or transfer these materials to any third party +- Make, offer to sell, sell, or import any inventions embodied in these + materials +- Reverse engineer, decompile, or disassemble these materials + +The receipt, viewing, or possession of these materials does not convey or +imply any license or right beyond those expressly granted above. + +Anthropic retains all right, title, and interest in these materials, +including all copyrights, patents, and other intellectual property rights. diff --git a/.claude/skills/pdf/SKILL.md b/.claude/skills/pdf/SKILL.md new file mode 100644 index 0000000..d3e046a --- /dev/null +++ b/.claude/skills/pdf/SKILL.md @@ -0,0 +1,314 @@ +--- +name: pdf +description: Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill. +license: Proprietary. LICENSE.txt has complete terms +--- + +# PDF Processing Guide + +## Overview + +This guide covers essential PDF processing operations using Python libraries and command-line tools. For advanced features, JavaScript libraries, and detailed examples, see REFERENCE.md. If you need to fill out a PDF form, read FORMS.md and follow its instructions. + +## Quick Start + +```python +from pypdf import PdfReader, PdfWriter + +# Read a PDF +reader = PdfReader("document.pdf") +print(f"Pages: {len(reader.pages)}") + +# Extract text +text = "" +for page in reader.pages: + text += page.extract_text() +``` + +## Python Libraries + +### pypdf - Basic Operations + +#### Merge PDFs +```python +from pypdf import PdfWriter, PdfReader + +writer = PdfWriter() +for pdf_file in ["doc1.pdf", "doc2.pdf", "doc3.pdf"]: + reader = PdfReader(pdf_file) + for page in reader.pages: + writer.add_page(page) + +with open("merged.pdf", "wb") as output: + writer.write(output) +``` + +#### Split PDF +```python +reader = PdfReader("input.pdf") +for i, page in enumerate(reader.pages): + writer = PdfWriter() + writer.add_page(page) + with open(f"page_{i+1}.pdf", "wb") as output: + writer.write(output) +``` + +#### Extract Metadata +```python +reader = PdfReader("document.pdf") +meta = reader.metadata +print(f"Title: {meta.title}") +print(f"Author: {meta.author}") +print(f"Subject: {meta.subject}") +print(f"Creator: {meta.creator}") +``` + +#### Rotate Pages +```python +reader = PdfReader("input.pdf") +writer = PdfWriter() + +page = reader.pages[0] +page.rotate(90) # Rotate 90 degrees clockwise +writer.add_page(page) + +with open("rotated.pdf", "wb") as output: + writer.write(output) +``` + +### pdfplumber - Text and Table Extraction + +#### Extract Text with Layout +```python +import pdfplumber + +with pdfplumber.open("document.pdf") as pdf: + for page in pdf.pages: + text = page.extract_text() + print(text) +``` + +#### Extract Tables +```python +with pdfplumber.open("document.pdf") as pdf: + for i, page in enumerate(pdf.pages): + tables = page.extract_tables() + for j, table in enumerate(tables): + print(f"Table {j+1} on page {i+1}:") + for row in table: + print(row) +``` + +#### Advanced Table Extraction +```python +import pandas as pd + +with pdfplumber.open("document.pdf") as pdf: + all_tables = [] + for page in pdf.pages: + tables = page.extract_tables() + for table in tables: + if table: # Check if table is not empty + df = pd.DataFrame(table[1:], columns=table[0]) + all_tables.append(df) + +# Combine all tables +if all_tables: + combined_df = pd.concat(all_tables, ignore_index=True) + combined_df.to_excel("extracted_tables.xlsx", index=False) +``` + +### reportlab - Create PDFs + +#### Basic PDF Creation +```python +from reportlab.lib.pagesizes import letter +from reportlab.pdfgen import canvas + +c = canvas.Canvas("hello.pdf", pagesize=letter) +width, height = letter + +# Add text +c.drawString(100, height - 100, "Hello World!") +c.drawString(100, height - 120, "This is a PDF created with reportlab") + +# Add a line +c.line(100, height - 140, 400, height - 140) + +# Save +c.save() +``` + +#### Create PDF with Multiple Pages +```python +from reportlab.lib.pagesizes import letter +from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak +from reportlab.lib.styles import getSampleStyleSheet + +doc = SimpleDocTemplate("report.pdf", pagesize=letter) +styles = getSampleStyleSheet() +story = [] + +# Add content +title = Paragraph("Report Title", styles['Title']) +story.append(title) +story.append(Spacer(1, 12)) + +body = Paragraph("This is the body of the report. " * 20, styles['Normal']) +story.append(body) +story.append(PageBreak()) + +# Page 2 +story.append(Paragraph("Page 2", styles['Heading1'])) +story.append(Paragraph("Content for page 2", styles['Normal'])) + +# Build PDF +doc.build(story) +``` + +#### Subscripts and Superscripts + +**IMPORTANT**: Never use Unicode subscript/superscript characters (₀₁₂₃₄₅₆₇₈₉, ⁰¹²³⁴⁵⁶⁷⁸⁹) in ReportLab PDFs. The built-in fonts do not include these glyphs, causing them to render as solid black boxes. + +Instead, use ReportLab's XML markup tags in Paragraph objects: +```python +from reportlab.platypus import Paragraph +from reportlab.lib.styles import getSampleStyleSheet + +styles = getSampleStyleSheet() + +# Subscripts: use tag +chemical = Paragraph("H2O", styles['Normal']) + +# Superscripts: use tag +squared = Paragraph("x2 + y2", styles['Normal']) +``` + +For canvas-drawn text (not Paragraph objects), manually adjust font the size and position rather than using Unicode subscripts/superscripts. + +## Command-Line Tools + +### pdftotext (poppler-utils) +```bash +# Extract text +pdftotext input.pdf output.txt + +# Extract text preserving layout +pdftotext -layout input.pdf output.txt + +# Extract specific pages +pdftotext -f 1 -l 5 input.pdf output.txt # Pages 1-5 +``` + +### qpdf +```bash +# Merge PDFs +qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf + +# Split pages +qpdf input.pdf --pages . 1-5 -- pages1-5.pdf +qpdf input.pdf --pages . 6-10 -- pages6-10.pdf + +# Rotate pages +qpdf input.pdf output.pdf --rotate=+90:1 # Rotate page 1 by 90 degrees + +# Remove password +qpdf --password=mypassword --decrypt encrypted.pdf decrypted.pdf +``` + +### pdftk (if available) +```bash +# Merge +pdftk file1.pdf file2.pdf cat output merged.pdf + +# Split +pdftk input.pdf burst + +# Rotate +pdftk input.pdf rotate 1east output rotated.pdf +``` + +## Common Tasks + +### Extract Text from Scanned PDFs +```python +# Requires: pip install pytesseract pdf2image +import pytesseract +from pdf2image import convert_from_path + +# Convert PDF to images +images = convert_from_path('scanned.pdf') + +# OCR each page +text = "" +for i, image in enumerate(images): + text += f"Page {i+1}:\n" + text += pytesseract.image_to_string(image) + text += "\n\n" + +print(text) +``` + +### Add Watermark +```python +from pypdf import PdfReader, PdfWriter + +# Create watermark (or load existing) +watermark = PdfReader("watermark.pdf").pages[0] + +# Apply to all pages +reader = PdfReader("document.pdf") +writer = PdfWriter() + +for page in reader.pages: + page.merge_page(watermark) + writer.add_page(page) + +with open("watermarked.pdf", "wb") as output: + writer.write(output) +``` + +### Extract Images +```bash +# Using pdfimages (poppler-utils) +pdfimages -j input.pdf output_prefix + +# This extracts all images as output_prefix-000.jpg, output_prefix-001.jpg, etc. +``` + +### Password Protection +```python +from pypdf import PdfReader, PdfWriter + +reader = PdfReader("input.pdf") +writer = PdfWriter() + +for page in reader.pages: + writer.add_page(page) + +# Add password +writer.encrypt("userpassword", "ownerpassword") + +with open("encrypted.pdf", "wb") as output: + writer.write(output) +``` + +## Quick Reference + +| Task | Best Tool | Command/Code | +|------|-----------|--------------| +| Merge PDFs | pypdf | `writer.add_page(page)` | +| Split PDFs | pypdf | One page per file | +| Extract text | pdfplumber | `page.extract_text()` | +| Extract tables | pdfplumber | `page.extract_tables()` | +| Create PDFs | reportlab | Canvas or Platypus | +| Command line merge | qpdf | `qpdf --empty --pages ...` | +| OCR scanned PDFs | pytesseract | Convert to image first | +| Fill PDF forms | pdf-lib or pypdf (see FORMS.md) | See FORMS.md | + +## Next Steps + +- For advanced pypdfium2 usage, see REFERENCE.md +- For JavaScript libraries (pdf-lib), see REFERENCE.md +- If you need to fill out a PDF form, follow the instructions in FORMS.md +- For troubleshooting guides, see REFERENCE.md diff --git a/.claude/skills/pdf/forms.md b/.claude/skills/pdf/forms.md new file mode 100644 index 0000000..6e7e1e0 --- /dev/null +++ b/.claude/skills/pdf/forms.md @@ -0,0 +1,294 @@ +**CRITICAL: You MUST complete these steps in order. Do not skip ahead to writing code.** + +If you need to fill out a PDF form, first check to see if the PDF has fillable form fields. Run this script from this file's directory: + `python scripts/check_fillable_fields `, and depending on the result go to either the "Fillable fields" or "Non-fillable fields" and follow those instructions. + +# Fillable fields +If the PDF has fillable form fields: +- Run this script from this file's directory: `python scripts/extract_form_field_info.py `. It will create a JSON file with a list of fields in this format: +``` +[ + { + "field_id": (unique ID for the field), + "page": (page number, 1-based), + "rect": ([left, bottom, right, top] bounding box in PDF coordinates, y=0 is the bottom of the page), + "type": ("text", "checkbox", "radio_group", or "choice"), + }, + // Checkboxes have "checked_value" and "unchecked_value" properties: + { + "field_id": (unique ID for the field), + "page": (page number, 1-based), + "type": "checkbox", + "checked_value": (Set the field to this value to check the checkbox), + "unchecked_value": (Set the field to this value to uncheck the checkbox), + }, + // Radio groups have a "radio_options" list with the possible choices. + { + "field_id": (unique ID for the field), + "page": (page number, 1-based), + "type": "radio_group", + "radio_options": [ + { + "value": (set the field to this value to select this radio option), + "rect": (bounding box for the radio button for this option) + }, + // Other radio options + ] + }, + // Multiple choice fields have a "choice_options" list with the possible choices: + { + "field_id": (unique ID for the field), + "page": (page number, 1-based), + "type": "choice", + "choice_options": [ + { + "value": (set the field to this value to select this option), + "text": (display text of the option) + }, + // Other choice options + ], + } +] +``` +- Convert the PDF to PNGs (one image for each page) with this script (run from this file's directory): +`python scripts/convert_pdf_to_images.py ` +Then analyze the images to determine the purpose of each form field (make sure to convert the bounding box PDF coordinates to image coordinates). +- Create a `field_values.json` file in this format with the values to be entered for each field: +``` +[ + { + "field_id": "last_name", // Must match the field_id from `extract_form_field_info.py` + "description": "The user's last name", + "page": 1, // Must match the "page" value in field_info.json + "value": "Simpson" + }, + { + "field_id": "Checkbox12", + "description": "Checkbox to be checked if the user is 18 or over", + "page": 1, + "value": "/On" // If this is a checkbox, use its "checked_value" value to check it. If it's a radio button group, use one of the "value" values in "radio_options". + }, + // more fields +] +``` +- Run the `fill_fillable_fields.py` script from this file's directory to create a filled-in PDF: +`python scripts/fill_fillable_fields.py ` +This script will verify that the field IDs and values you provide are valid; if it prints error messages, correct the appropriate fields and try again. + +# Non-fillable fields +If the PDF doesn't have fillable form fields, you'll add text annotations. First try to extract coordinates from the PDF structure (more accurate), then fall back to visual estimation if needed. + +## Step 1: Try Structure Extraction First + +Run this script to extract text labels, lines, and checkboxes with their exact PDF coordinates: +`python scripts/extract_form_structure.py form_structure.json` + +This creates a JSON file containing: +- **labels**: Every text element with exact coordinates (x0, top, x1, bottom in PDF points) +- **lines**: Horizontal lines that define row boundaries +- **checkboxes**: Small square rectangles that are checkboxes (with center coordinates) +- **row_boundaries**: Row top/bottom positions calculated from horizontal lines + +**Check the results**: If `form_structure.json` has meaningful labels (text elements that correspond to form fields), use **Approach A: Structure-Based Coordinates**. If the PDF is scanned/image-based and has few or no labels, use **Approach B: Visual Estimation**. + +--- + +## Approach A: Structure-Based Coordinates (Preferred) + +Use this when `extract_form_structure.py` found text labels in the PDF. + +### A.1: Analyze the Structure + +Read form_structure.json and identify: + +1. **Label groups**: Adjacent text elements that form a single label (e.g., "Last" + "Name") +2. **Row structure**: Labels with similar `top` values are in the same row +3. **Field columns**: Entry areas start after label ends (x0 = label.x1 + gap) +4. **Checkboxes**: Use the checkbox coordinates directly from the structure + +**Coordinate system**: PDF coordinates where y=0 is at TOP of page, y increases downward. + +### A.2: Check for Missing Elements + +The structure extraction may not detect all form elements. Common cases: +- **Circular checkboxes**: Only square rectangles are detected as checkboxes +- **Complex graphics**: Decorative elements or non-standard form controls +- **Faded or light-colored elements**: May not be extracted + +If you see form fields in the PDF images that aren't in form_structure.json, you'll need to use **visual analysis** for those specific fields (see "Hybrid Approach" below). + +### A.3: Create fields.json with PDF Coordinates + +For each field, calculate entry coordinates from the extracted structure: + +**Text fields:** +- entry x0 = label x1 + 5 (small gap after label) +- entry x1 = next label's x0, or row boundary +- entry top = same as label top +- entry bottom = row boundary line below, or label bottom + row_height + +**Checkboxes:** +- Use the checkbox rectangle coordinates directly from form_structure.json +- entry_bounding_box = [checkbox.x0, checkbox.top, checkbox.x1, checkbox.bottom] + +Create fields.json using `pdf_width` and `pdf_height` (signals PDF coordinates): +```json +{ + "pages": [ + {"page_number": 1, "pdf_width": 612, "pdf_height": 792} + ], + "form_fields": [ + { + "page_number": 1, + "description": "Last name entry field", + "field_label": "Last Name", + "label_bounding_box": [43, 63, 87, 73], + "entry_bounding_box": [92, 63, 260, 79], + "entry_text": {"text": "Smith", "font_size": 10} + }, + { + "page_number": 1, + "description": "US Citizen Yes checkbox", + "field_label": "Yes", + "label_bounding_box": [260, 200, 280, 210], + "entry_bounding_box": [285, 197, 292, 205], + "entry_text": {"text": "X"} + } + ] +} +``` + +**Important**: Use `pdf_width`/`pdf_height` and coordinates directly from form_structure.json. + +### A.4: Validate Bounding Boxes + +Before filling, check your bounding boxes for errors: +`python scripts/check_bounding_boxes.py fields.json` + +This checks for intersecting bounding boxes and entry boxes that are too small for the font size. Fix any reported errors before filling. + +--- + +## Approach B: Visual Estimation (Fallback) + +Use this when the PDF is scanned/image-based and structure extraction found no usable text labels (e.g., all text shows as "(cid:X)" patterns). + +### B.1: Convert PDF to Images + +`python scripts/convert_pdf_to_images.py ` + +### B.2: Initial Field Identification + +Examine each page image to identify form sections and get **rough estimates** of field locations: +- Form field labels and their approximate positions +- Entry areas (lines, boxes, or blank spaces for text input) +- Checkboxes and their approximate locations + +For each field, note approximate pixel coordinates (they don't need to be precise yet). + +### B.3: Zoom Refinement (CRITICAL for accuracy) + +For each field, crop a region around the estimated position to refine coordinates precisely. + +**Create a zoomed crop using ImageMagick:** +```bash +magick -crop x++ +repage +``` + +Where: +- `, ` = top-left corner of crop region (use your rough estimate minus padding) +- `, ` = size of crop region (field area plus ~50px padding on each side) + +**Example:** To refine a "Name" field estimated around (100, 150): +```bash +magick images_dir/page_1.png -crop 300x80+50+120 +repage crops/name_field.png +``` + +(Note: if the `magick` command isn't available, try `convert` with the same arguments). + +**Examine the cropped image** to determine precise coordinates: +1. Identify the exact pixel where the entry area begins (after the label) +2. Identify where the entry area ends (before next field or edge) +3. Identify the top and bottom of the entry line/box + +**Convert crop coordinates back to full image coordinates:** +- full_x = crop_x + crop_offset_x +- full_y = crop_y + crop_offset_y + +Example: If the crop started at (50, 120) and the entry box starts at (52, 18) within the crop: +- entry_x0 = 52 + 50 = 102 +- entry_top = 18 + 120 = 138 + +**Repeat for each field**, grouping nearby fields into single crops when possible. + +### B.4: Create fields.json with Refined Coordinates + +Create fields.json using `image_width` and `image_height` (signals image coordinates): +```json +{ + "pages": [ + {"page_number": 1, "image_width": 1700, "image_height": 2200} + ], + "form_fields": [ + { + "page_number": 1, + "description": "Last name entry field", + "field_label": "Last Name", + "label_bounding_box": [120, 175, 242, 198], + "entry_bounding_box": [255, 175, 720, 218], + "entry_text": {"text": "Smith", "font_size": 10} + } + ] +} +``` + +**Important**: Use `image_width`/`image_height` and the refined pixel coordinates from the zoom analysis. + +### B.5: Validate Bounding Boxes + +Before filling, check your bounding boxes for errors: +`python scripts/check_bounding_boxes.py fields.json` + +This checks for intersecting bounding boxes and entry boxes that are too small for the font size. Fix any reported errors before filling. + +--- + +## Hybrid Approach: Structure + Visual + +Use this when structure extraction works for most fields but misses some elements (e.g., circular checkboxes, unusual form controls). + +1. **Use Approach A** for fields that were detected in form_structure.json +2. **Convert PDF to images** for visual analysis of missing fields +3. **Use zoom refinement** (from Approach B) for the missing fields +4. **Combine coordinates**: For fields from structure extraction, use `pdf_width`/`pdf_height`. For visually-estimated fields, you must convert image coordinates to PDF coordinates: + - pdf_x = image_x * (pdf_width / image_width) + - pdf_y = image_y * (pdf_height / image_height) +5. **Use a single coordinate system** in fields.json - convert all to PDF coordinates with `pdf_width`/`pdf_height` + +--- + +## Step 2: Validate Before Filling + +**Always validate bounding boxes before filling:** +`python scripts/check_bounding_boxes.py fields.json` + +This checks for: +- Intersecting bounding boxes (which would cause overlapping text) +- Entry boxes that are too small for the specified font size + +Fix any reported errors in fields.json before proceeding. + +## Step 3: Fill the Form + +The fill script auto-detects the coordinate system and handles conversion: +`python scripts/fill_pdf_form_with_annotations.py fields.json ` + +## Step 4: Verify Output + +Convert the filled PDF to images and verify text placement: +`python scripts/convert_pdf_to_images.py ` + +If text is mispositioned: +- **Approach A**: Check that you're using PDF coordinates from form_structure.json with `pdf_width`/`pdf_height` +- **Approach B**: Check that image dimensions match and coordinates are accurate pixels +- **Hybrid**: Ensure coordinate conversions are correct for visually-estimated fields diff --git a/.claude/skills/pdf/reference.md b/.claude/skills/pdf/reference.md new file mode 100644 index 0000000..41400bf --- /dev/null +++ b/.claude/skills/pdf/reference.md @@ -0,0 +1,612 @@ +# PDF Processing Advanced Reference + +This document contains advanced PDF processing features, detailed examples, and additional libraries not covered in the main skill instructions. + +## pypdfium2 Library (Apache/BSD License) + +### Overview +pypdfium2 is a Python binding for PDFium (Chromium's PDF library). It's excellent for fast PDF rendering, image generation, and serves as a PyMuPDF replacement. + +### Render PDF to Images +```python +import pypdfium2 as pdfium +from PIL import Image + +# Load PDF +pdf = pdfium.PdfDocument("document.pdf") + +# Render page to image +page = pdf[0] # First page +bitmap = page.render( + scale=2.0, # Higher resolution + rotation=0 # No rotation +) + +# Convert to PIL Image +img = bitmap.to_pil() +img.save("page_1.png", "PNG") + +# Process multiple pages +for i, page in enumerate(pdf): + bitmap = page.render(scale=1.5) + img = bitmap.to_pil() + img.save(f"page_{i+1}.jpg", "JPEG", quality=90) +``` + +### Extract Text with pypdfium2 +```python +import pypdfium2 as pdfium + +pdf = pdfium.PdfDocument("document.pdf") +for i, page in enumerate(pdf): + text = page.get_text() + print(f"Page {i+1} text length: {len(text)} chars") +``` + +## JavaScript Libraries + +### pdf-lib (MIT License) + +pdf-lib is a powerful JavaScript library for creating and modifying PDF documents in any JavaScript environment. + +#### Load and Manipulate Existing PDF +```javascript +import { PDFDocument } from 'pdf-lib'; +import fs from 'fs'; + +async function manipulatePDF() { + // Load existing PDF + const existingPdfBytes = fs.readFileSync('input.pdf'); + const pdfDoc = await PDFDocument.load(existingPdfBytes); + + // Get page count + const pageCount = pdfDoc.getPageCount(); + console.log(`Document has ${pageCount} pages`); + + // Add new page + const newPage = pdfDoc.addPage([600, 400]); + newPage.drawText('Added by pdf-lib', { + x: 100, + y: 300, + size: 16 + }); + + // Save modified PDF + const pdfBytes = await pdfDoc.save(); + fs.writeFileSync('modified.pdf', pdfBytes); +} +``` + +#### Create Complex PDFs from Scratch +```javascript +import { PDFDocument, rgb, StandardFonts } from 'pdf-lib'; +import fs from 'fs'; + +async function createPDF() { + const pdfDoc = await PDFDocument.create(); + + // Add fonts + const helveticaFont = await pdfDoc.embedFont(StandardFonts.Helvetica); + const helveticaBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold); + + // Add page + const page = pdfDoc.addPage([595, 842]); // A4 size + const { width, height } = page.getSize(); + + // Add text with styling + page.drawText('Invoice #12345', { + x: 50, + y: height - 50, + size: 18, + font: helveticaBold, + color: rgb(0.2, 0.2, 0.8) + }); + + // Add rectangle (header background) + page.drawRectangle({ + x: 40, + y: height - 100, + width: width - 80, + height: 30, + color: rgb(0.9, 0.9, 0.9) + }); + + // Add table-like content + const items = [ + ['Item', 'Qty', 'Price', 'Total'], + ['Widget', '2', '$50', '$100'], + ['Gadget', '1', '$75', '$75'] + ]; + + let yPos = height - 150; + items.forEach(row => { + let xPos = 50; + row.forEach(cell => { + page.drawText(cell, { + x: xPos, + y: yPos, + size: 12, + font: helveticaFont + }); + xPos += 120; + }); + yPos -= 25; + }); + + const pdfBytes = await pdfDoc.save(); + fs.writeFileSync('created.pdf', pdfBytes); +} +``` + +#### Advanced Merge and Split Operations +```javascript +import { PDFDocument } from 'pdf-lib'; +import fs from 'fs'; + +async function mergePDFs() { + // Create new document + const mergedPdf = await PDFDocument.create(); + + // Load source PDFs + const pdf1Bytes = fs.readFileSync('doc1.pdf'); + const pdf2Bytes = fs.readFileSync('doc2.pdf'); + + const pdf1 = await PDFDocument.load(pdf1Bytes); + const pdf2 = await PDFDocument.load(pdf2Bytes); + + // Copy pages from first PDF + const pdf1Pages = await mergedPdf.copyPages(pdf1, pdf1.getPageIndices()); + pdf1Pages.forEach(page => mergedPdf.addPage(page)); + + // Copy specific pages from second PDF (pages 0, 2, 4) + const pdf2Pages = await mergedPdf.copyPages(pdf2, [0, 2, 4]); + pdf2Pages.forEach(page => mergedPdf.addPage(page)); + + const mergedPdfBytes = await mergedPdf.save(); + fs.writeFileSync('merged.pdf', mergedPdfBytes); +} +``` + +### pdfjs-dist (Apache License) + +PDF.js is Mozilla's JavaScript library for rendering PDFs in the browser. + +#### Basic PDF Loading and Rendering +```javascript +import * as pdfjsLib from 'pdfjs-dist'; + +// Configure worker (important for performance) +pdfjsLib.GlobalWorkerOptions.workerSrc = './pdf.worker.js'; + +async function renderPDF() { + // Load PDF + const loadingTask = pdfjsLib.getDocument('document.pdf'); + const pdf = await loadingTask.promise; + + console.log(`Loaded PDF with ${pdf.numPages} pages`); + + // Get first page + const page = await pdf.getPage(1); + const viewport = page.getViewport({ scale: 1.5 }); + + // Render to canvas + const canvas = document.createElement('canvas'); + const context = canvas.getContext('2d'); + canvas.height = viewport.height; + canvas.width = viewport.width; + + const renderContext = { + canvasContext: context, + viewport: viewport + }; + + await page.render(renderContext).promise; + document.body.appendChild(canvas); +} +``` + +#### Extract Text with Coordinates +```javascript +import * as pdfjsLib from 'pdfjs-dist'; + +async function extractText() { + const loadingTask = pdfjsLib.getDocument('document.pdf'); + const pdf = await loadingTask.promise; + + let fullText = ''; + + // Extract text from all pages + for (let i = 1; i <= pdf.numPages; i++) { + const page = await pdf.getPage(i); + const textContent = await page.getTextContent(); + + const pageText = textContent.items + .map(item => item.str) + .join(' '); + + fullText += `\n--- Page ${i} ---\n${pageText}`; + + // Get text with coordinates for advanced processing + const textWithCoords = textContent.items.map(item => ({ + text: item.str, + x: item.transform[4], + y: item.transform[5], + width: item.width, + height: item.height + })); + } + + console.log(fullText); + return fullText; +} +``` + +#### Extract Annotations and Forms +```javascript +import * as pdfjsLib from 'pdfjs-dist'; + +async function extractAnnotations() { + const loadingTask = pdfjsLib.getDocument('annotated.pdf'); + const pdf = await loadingTask.promise; + + for (let i = 1; i <= pdf.numPages; i++) { + const page = await pdf.getPage(i); + const annotations = await page.getAnnotations(); + + annotations.forEach(annotation => { + console.log(`Annotation type: ${annotation.subtype}`); + console.log(`Content: ${annotation.contents}`); + console.log(`Coordinates: ${JSON.stringify(annotation.rect)}`); + }); + } +} +``` + +## Advanced Command-Line Operations + +### poppler-utils Advanced Features + +#### Extract Text with Bounding Box Coordinates +```bash +# Extract text with bounding box coordinates (essential for structured data) +pdftotext -bbox-layout document.pdf output.xml + +# The XML output contains precise coordinates for each text element +``` + +#### Advanced Image Conversion +```bash +# Convert to PNG images with specific resolution +pdftoppm -png -r 300 document.pdf output_prefix + +# Convert specific page range with high resolution +pdftoppm -png -r 600 -f 1 -l 3 document.pdf high_res_pages + +# Convert to JPEG with quality setting +pdftoppm -jpeg -jpegopt quality=85 -r 200 document.pdf jpeg_output +``` + +#### Extract Embedded Images +```bash +# Extract all embedded images with metadata +pdfimages -j -p document.pdf page_images + +# List image info without extracting +pdfimages -list document.pdf + +# Extract images in their original format +pdfimages -all document.pdf images/img +``` + +### qpdf Advanced Features + +#### Complex Page Manipulation +```bash +# Split PDF into groups of pages +qpdf --split-pages=3 input.pdf output_group_%02d.pdf + +# Extract specific pages with complex ranges +qpdf input.pdf --pages input.pdf 1,3-5,8,10-end -- extracted.pdf + +# Merge specific pages from multiple PDFs +qpdf --empty --pages doc1.pdf 1-3 doc2.pdf 5-7 doc3.pdf 2,4 -- combined.pdf +``` + +#### PDF Optimization and Repair +```bash +# Optimize PDF for web (linearize for streaming) +qpdf --linearize input.pdf optimized.pdf + +# Remove unused objects and compress +qpdf --optimize-level=all input.pdf compressed.pdf + +# Attempt to repair corrupted PDF structure +qpdf --check input.pdf +qpdf --fix-qdf damaged.pdf repaired.pdf + +# Show detailed PDF structure for debugging +qpdf --show-all-pages input.pdf > structure.txt +``` + +#### Advanced Encryption +```bash +# Add password protection with specific permissions +qpdf --encrypt user_pass owner_pass 256 --print=none --modify=none -- input.pdf encrypted.pdf + +# Check encryption status +qpdf --show-encryption encrypted.pdf + +# Remove password protection (requires password) +qpdf --password=secret123 --decrypt encrypted.pdf decrypted.pdf +``` + +## Advanced Python Techniques + +### pdfplumber Advanced Features + +#### Extract Text with Precise Coordinates +```python +import pdfplumber + +with pdfplumber.open("document.pdf") as pdf: + page = pdf.pages[0] + + # Extract all text with coordinates + chars = page.chars + for char in chars[:10]: # First 10 characters + print(f"Char: '{char['text']}' at x:{char['x0']:.1f} y:{char['y0']:.1f}") + + # Extract text by bounding box (left, top, right, bottom) + bbox_text = page.within_bbox((100, 100, 400, 200)).extract_text() +``` + +#### Advanced Table Extraction with Custom Settings +```python +import pdfplumber +import pandas as pd + +with pdfplumber.open("complex_table.pdf") as pdf: + page = pdf.pages[0] + + # Extract tables with custom settings for complex layouts + table_settings = { + "vertical_strategy": "lines", + "horizontal_strategy": "lines", + "snap_tolerance": 3, + "intersection_tolerance": 15 + } + tables = page.extract_tables(table_settings) + + # Visual debugging for table extraction + img = page.to_image(resolution=150) + img.save("debug_layout.png") +``` + +### reportlab Advanced Features + +#### Create Professional Reports with Tables +```python +from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph +from reportlab.lib.styles import getSampleStyleSheet +from reportlab.lib import colors + +# Sample data +data = [ + ['Product', 'Q1', 'Q2', 'Q3', 'Q4'], + ['Widgets', '120', '135', '142', '158'], + ['Gadgets', '85', '92', '98', '105'] +] + +# Create PDF with table +doc = SimpleDocTemplate("report.pdf") +elements = [] + +# Add title +styles = getSampleStyleSheet() +title = Paragraph("Quarterly Sales Report", styles['Title']) +elements.append(title) + +# Add table with advanced styling +table = Table(data) +table.setStyle(TableStyle([ + ('BACKGROUND', (0, 0), (-1, 0), colors.grey), + ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke), + ('ALIGN', (0, 0), (-1, -1), 'CENTER'), + ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'), + ('FONTSIZE', (0, 0), (-1, 0), 14), + ('BOTTOMPADDING', (0, 0), (-1, 0), 12), + ('BACKGROUND', (0, 1), (-1, -1), colors.beige), + ('GRID', (0, 0), (-1, -1), 1, colors.black) +])) +elements.append(table) + +doc.build(elements) +``` + +## Complex Workflows + +### Extract Figures/Images from PDF + +#### Method 1: Using pdfimages (fastest) +```bash +# Extract all images with original quality +pdfimages -all document.pdf images/img +``` + +#### Method 2: Using pypdfium2 + Image Processing +```python +import pypdfium2 as pdfium +from PIL import Image +import numpy as np + +def extract_figures(pdf_path, output_dir): + pdf = pdfium.PdfDocument(pdf_path) + + for page_num, page in enumerate(pdf): + # Render high-resolution page + bitmap = page.render(scale=3.0) + img = bitmap.to_pil() + + # Convert to numpy for processing + img_array = np.array(img) + + # Simple figure detection (non-white regions) + mask = np.any(img_array != [255, 255, 255], axis=2) + + # Find contours and extract bounding boxes + # (This is simplified - real implementation would need more sophisticated detection) + + # Save detected figures + # ... implementation depends on specific needs +``` + +### Batch PDF Processing with Error Handling +```python +import os +import glob +from pypdf import PdfReader, PdfWriter +import logging + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +def batch_process_pdfs(input_dir, operation='merge'): + pdf_files = glob.glob(os.path.join(input_dir, "*.pdf")) + + if operation == 'merge': + writer = PdfWriter() + for pdf_file in pdf_files: + try: + reader = PdfReader(pdf_file) + for page in reader.pages: + writer.add_page(page) + logger.info(f"Processed: {pdf_file}") + except Exception as e: + logger.error(f"Failed to process {pdf_file}: {e}") + continue + + with open("batch_merged.pdf", "wb") as output: + writer.write(output) + + elif operation == 'extract_text': + for pdf_file in pdf_files: + try: + reader = PdfReader(pdf_file) + text = "" + for page in reader.pages: + text += page.extract_text() + + output_file = pdf_file.replace('.pdf', '.txt') + with open(output_file, 'w', encoding='utf-8') as f: + f.write(text) + logger.info(f"Extracted text from: {pdf_file}") + + except Exception as e: + logger.error(f"Failed to extract text from {pdf_file}: {e}") + continue +``` + +### Advanced PDF Cropping +```python +from pypdf import PdfWriter, PdfReader + +reader = PdfReader("input.pdf") +writer = PdfWriter() + +# Crop page (left, bottom, right, top in points) +page = reader.pages[0] +page.mediabox.left = 50 +page.mediabox.bottom = 50 +page.mediabox.right = 550 +page.mediabox.top = 750 + +writer.add_page(page) +with open("cropped.pdf", "wb") as output: + writer.write(output) +``` + +## Performance Optimization Tips + +### 1. For Large PDFs +- Use streaming approaches instead of loading entire PDF in memory +- Use `qpdf --split-pages` for splitting large files +- Process pages individually with pypdfium2 + +### 2. For Text Extraction +- `pdftotext -bbox-layout` is fastest for plain text extraction +- Use pdfplumber for structured data and tables +- Avoid `pypdf.extract_text()` for very large documents + +### 3. For Image Extraction +- `pdfimages` is much faster than rendering pages +- Use low resolution for previews, high resolution for final output + +### 4. For Form Filling +- pdf-lib maintains form structure better than most alternatives +- Pre-validate form fields before processing + +### 5. Memory Management +```python +# Process PDFs in chunks +def process_large_pdf(pdf_path, chunk_size=10): + reader = PdfReader(pdf_path) + total_pages = len(reader.pages) + + for start_idx in range(0, total_pages, chunk_size): + end_idx = min(start_idx + chunk_size, total_pages) + writer = PdfWriter() + + for i in range(start_idx, end_idx): + writer.add_page(reader.pages[i]) + + # Process chunk + with open(f"chunk_{start_idx//chunk_size}.pdf", "wb") as output: + writer.write(output) +``` + +## Troubleshooting Common Issues + +### Encrypted PDFs +```python +# Handle password-protected PDFs +from pypdf import PdfReader + +try: + reader = PdfReader("encrypted.pdf") + if reader.is_encrypted: + reader.decrypt("password") +except Exception as e: + print(f"Failed to decrypt: {e}") +``` + +### Corrupted PDFs +```bash +# Use qpdf to repair +qpdf --check corrupted.pdf +qpdf --replace-input corrupted.pdf +``` + +### Text Extraction Issues +```python +# Fallback to OCR for scanned PDFs +import pytesseract +from pdf2image import convert_from_path + +def extract_text_with_ocr(pdf_path): + images = convert_from_path(pdf_path) + text = "" + for i, image in enumerate(images): + text += pytesseract.image_to_string(image) + return text +``` + +## License Information + +- **pypdf**: BSD License +- **pdfplumber**: MIT License +- **pypdfium2**: Apache/BSD License +- **reportlab**: BSD License +- **poppler-utils**: GPL-2 License +- **qpdf**: Apache License +- **pdf-lib**: MIT License +- **pdfjs-dist**: Apache License \ No newline at end of file diff --git a/.claude/skills/pdf/scripts/check_bounding_boxes.py b/.claude/skills/pdf/scripts/check_bounding_boxes.py new file mode 100644 index 0000000..2cc5e34 --- /dev/null +++ b/.claude/skills/pdf/scripts/check_bounding_boxes.py @@ -0,0 +1,65 @@ +from dataclasses import dataclass +import json +import sys + + + + +@dataclass +class RectAndField: + rect: list[float] + rect_type: str + field: dict + + +def get_bounding_box_messages(fields_json_stream) -> list[str]: + messages = [] + fields = json.load(fields_json_stream) + messages.append(f"Read {len(fields['form_fields'])} fields") + + def rects_intersect(r1, r2): + disjoint_horizontal = r1[0] >= r2[2] or r1[2] <= r2[0] + disjoint_vertical = r1[1] >= r2[3] or r1[3] <= r2[1] + return not (disjoint_horizontal or disjoint_vertical) + + rects_and_fields = [] + for f in fields["form_fields"]: + rects_and_fields.append(RectAndField(f["label_bounding_box"], "label", f)) + rects_and_fields.append(RectAndField(f["entry_bounding_box"], "entry", f)) + + has_error = False + for i, ri in enumerate(rects_and_fields): + for j in range(i + 1, len(rects_and_fields)): + rj = rects_and_fields[j] + if ri.field["page_number"] == rj.field["page_number"] and rects_intersect(ri.rect, rj.rect): + has_error = True + if ri.field is rj.field: + messages.append(f"FAILURE: intersection between label and entry bounding boxes for `{ri.field['description']}` ({ri.rect}, {rj.rect})") + else: + messages.append(f"FAILURE: intersection between {ri.rect_type} bounding box for `{ri.field['description']}` ({ri.rect}) and {rj.rect_type} bounding box for `{rj.field['description']}` ({rj.rect})") + if len(messages) >= 20: + messages.append("Aborting further checks; fix bounding boxes and try again") + return messages + if ri.rect_type == "entry": + if "entry_text" in ri.field: + font_size = ri.field["entry_text"].get("font_size", 14) + entry_height = ri.rect[3] - ri.rect[1] + if entry_height < font_size: + has_error = True + messages.append(f"FAILURE: entry bounding box height ({entry_height}) for `{ri.field['description']}` is too short for the text content (font size: {font_size}). Increase the box height or decrease the font size.") + if len(messages) >= 20: + messages.append("Aborting further checks; fix bounding boxes and try again") + return messages + + if not has_error: + messages.append("SUCCESS: All bounding boxes are valid") + return messages + +if __name__ == "__main__": + if len(sys.argv) != 2: + print("Usage: check_bounding_boxes.py [fields.json]") + sys.exit(1) + with open(sys.argv[1]) as f: + messages = get_bounding_box_messages(f) + for msg in messages: + print(msg) diff --git a/.claude/skills/pdf/scripts/check_fillable_fields.py b/.claude/skills/pdf/scripts/check_fillable_fields.py new file mode 100644 index 0000000..36dfb95 --- /dev/null +++ b/.claude/skills/pdf/scripts/check_fillable_fields.py @@ -0,0 +1,11 @@ +import sys +from pypdf import PdfReader + + + + +reader = PdfReader(sys.argv[1]) +if (reader.get_fields()): + print("This PDF has fillable form fields") +else: + print("This PDF does not have fillable form fields; you will need to visually determine where to enter data") diff --git a/.claude/skills/pdf/scripts/convert_pdf_to_images.py b/.claude/skills/pdf/scripts/convert_pdf_to_images.py new file mode 100644 index 0000000..7939cef --- /dev/null +++ b/.claude/skills/pdf/scripts/convert_pdf_to_images.py @@ -0,0 +1,33 @@ +import os +import sys + +from pdf2image import convert_from_path + + + + +def convert(pdf_path, output_dir, max_dim=1000): + images = convert_from_path(pdf_path, dpi=200) + + for i, image in enumerate(images): + width, height = image.size + if width > max_dim or height > max_dim: + scale_factor = min(max_dim / width, max_dim / height) + new_width = int(width * scale_factor) + new_height = int(height * scale_factor) + image = image.resize((new_width, new_height)) + + image_path = os.path.join(output_dir, f"page_{i+1}.png") + image.save(image_path) + print(f"Saved page {i+1} as {image_path} (size: {image.size})") + + print(f"Converted {len(images)} pages to PNG images") + + +if __name__ == "__main__": + if len(sys.argv) != 3: + print("Usage: convert_pdf_to_images.py [input pdf] [output directory]") + sys.exit(1) + pdf_path = sys.argv[1] + output_directory = sys.argv[2] + convert(pdf_path, output_directory) diff --git a/.claude/skills/pdf/scripts/create_validation_image.py b/.claude/skills/pdf/scripts/create_validation_image.py new file mode 100644 index 0000000..10eadd8 --- /dev/null +++ b/.claude/skills/pdf/scripts/create_validation_image.py @@ -0,0 +1,37 @@ +import json +import sys + +from PIL import Image, ImageDraw + + + + +def create_validation_image(page_number, fields_json_path, input_path, output_path): + with open(fields_json_path, 'r') as f: + data = json.load(f) + + img = Image.open(input_path) + draw = ImageDraw.Draw(img) + num_boxes = 0 + + for field in data["form_fields"]: + if field["page_number"] == page_number: + entry_box = field['entry_bounding_box'] + label_box = field['label_bounding_box'] + draw.rectangle(entry_box, outline='red', width=2) + draw.rectangle(label_box, outline='blue', width=2) + num_boxes += 2 + + img.save(output_path) + print(f"Created validation image at {output_path} with {num_boxes} bounding boxes") + + +if __name__ == "__main__": + if len(sys.argv) != 5: + print("Usage: create_validation_image.py [page number] [fields.json file] [input image path] [output image path]") + sys.exit(1) + page_number = int(sys.argv[1]) + fields_json_path = sys.argv[2] + input_image_path = sys.argv[3] + output_image_path = sys.argv[4] + create_validation_image(page_number, fields_json_path, input_image_path, output_image_path) diff --git a/.claude/skills/pdf/scripts/extract_form_field_info.py b/.claude/skills/pdf/scripts/extract_form_field_info.py new file mode 100644 index 0000000..64cd470 --- /dev/null +++ b/.claude/skills/pdf/scripts/extract_form_field_info.py @@ -0,0 +1,122 @@ +import json +import sys + +from pypdf import PdfReader + + + + +def get_full_annotation_field_id(annotation): + components = [] + while annotation: + field_name = annotation.get('/T') + if field_name: + components.append(field_name) + annotation = annotation.get('/Parent') + return ".".join(reversed(components)) if components else None + + +def make_field_dict(field, field_id): + field_dict = {"field_id": field_id} + ft = field.get('/FT') + if ft == "/Tx": + field_dict["type"] = "text" + elif ft == "/Btn": + field_dict["type"] = "checkbox" + states = field.get("/_States_", []) + if len(states) == 2: + if "/Off" in states: + field_dict["checked_value"] = states[0] if states[0] != "/Off" else states[1] + field_dict["unchecked_value"] = "/Off" + else: + print(f"Unexpected state values for checkbox `${field_id}`. Its checked and unchecked values may not be correct; if you're trying to check it, visually verify the results.") + field_dict["checked_value"] = states[0] + field_dict["unchecked_value"] = states[1] + elif ft == "/Ch": + field_dict["type"] = "choice" + states = field.get("/_States_", []) + field_dict["choice_options"] = [{ + "value": state[0], + "text": state[1], + } for state in states] + else: + field_dict["type"] = f"unknown ({ft})" + return field_dict + + +def get_field_info(reader: PdfReader): + fields = reader.get_fields() + + field_info_by_id = {} + possible_radio_names = set() + + for field_id, field in fields.items(): + if field.get("/Kids"): + if field.get("/FT") == "/Btn": + possible_radio_names.add(field_id) + continue + field_info_by_id[field_id] = make_field_dict(field, field_id) + + + radio_fields_by_id = {} + + for page_index, page in enumerate(reader.pages): + annotations = page.get('/Annots', []) + for ann in annotations: + field_id = get_full_annotation_field_id(ann) + if field_id in field_info_by_id: + field_info_by_id[field_id]["page"] = page_index + 1 + field_info_by_id[field_id]["rect"] = ann.get('/Rect') + elif field_id in possible_radio_names: + try: + on_values = [v for v in ann["/AP"]["/N"] if v != "/Off"] + except KeyError: + continue + if len(on_values) == 1: + rect = ann.get("/Rect") + if field_id not in radio_fields_by_id: + radio_fields_by_id[field_id] = { + "field_id": field_id, + "type": "radio_group", + "page": page_index + 1, + "radio_options": [], + } + radio_fields_by_id[field_id]["radio_options"].append({ + "value": on_values[0], + "rect": rect, + }) + + fields_with_location = [] + for field_info in field_info_by_id.values(): + if "page" in field_info: + fields_with_location.append(field_info) + else: + print(f"Unable to determine location for field id: {field_info.get('field_id')}, ignoring") + + def sort_key(f): + if "radio_options" in f: + rect = f["radio_options"][0]["rect"] or [0, 0, 0, 0] + else: + rect = f.get("rect") or [0, 0, 0, 0] + adjusted_position = [-rect[1], rect[0]] + return [f.get("page"), adjusted_position] + + sorted_fields = fields_with_location + list(radio_fields_by_id.values()) + sorted_fields.sort(key=sort_key) + + return sorted_fields + + +def write_field_info(pdf_path: str, json_output_path: str): + reader = PdfReader(pdf_path) + field_info = get_field_info(reader) + with open(json_output_path, "w") as f: + json.dump(field_info, f, indent=2) + print(f"Wrote {len(field_info)} fields to {json_output_path}") + + +if __name__ == "__main__": + if len(sys.argv) != 3: + print("Usage: extract_form_field_info.py [input pdf] [output json]") + sys.exit(1) + write_field_info(sys.argv[1], sys.argv[2]) diff --git a/.claude/skills/pdf/scripts/extract_form_structure.py b/.claude/skills/pdf/scripts/extract_form_structure.py new file mode 100644 index 0000000..f219e7d --- /dev/null +++ b/.claude/skills/pdf/scripts/extract_form_structure.py @@ -0,0 +1,115 @@ +""" +Extract form structure from a non-fillable PDF. + +This script analyzes the PDF to find: +- Text labels with their exact coordinates +- Horizontal lines (row boundaries) +- Checkboxes (small rectangles) + +Output: A JSON file with the form structure that can be used to generate +accurate field coordinates for filling. + +Usage: python extract_form_structure.py +""" + +import json +import sys +import pdfplumber + + +def extract_form_structure(pdf_path): + structure = { + "pages": [], + "labels": [], + "lines": [], + "checkboxes": [], + "row_boundaries": [] + } + + with pdfplumber.open(pdf_path) as pdf: + for page_num, page in enumerate(pdf.pages, 1): + structure["pages"].append({ + "page_number": page_num, + "width": float(page.width), + "height": float(page.height) + }) + + words = page.extract_words() + for word in words: + structure["labels"].append({ + "page": page_num, + "text": word["text"], + "x0": round(float(word["x0"]), 1), + "top": round(float(word["top"]), 1), + "x1": round(float(word["x1"]), 1), + "bottom": round(float(word["bottom"]), 1) + }) + + for line in page.lines: + if abs(float(line["x1"]) - float(line["x0"])) > page.width * 0.5: + structure["lines"].append({ + "page": page_num, + "y": round(float(line["top"]), 1), + "x0": round(float(line["x0"]), 1), + "x1": round(float(line["x1"]), 1) + }) + + for rect in page.rects: + width = float(rect["x1"]) - float(rect["x0"]) + height = float(rect["bottom"]) - float(rect["top"]) + if 5 <= width <= 15 and 5 <= height <= 15 and abs(width - height) < 2: + structure["checkboxes"].append({ + "page": page_num, + "x0": round(float(rect["x0"]), 1), + "top": round(float(rect["top"]), 1), + "x1": round(float(rect["x1"]), 1), + "bottom": round(float(rect["bottom"]), 1), + "center_x": round((float(rect["x0"]) + float(rect["x1"])) / 2, 1), + "center_y": round((float(rect["top"]) + float(rect["bottom"])) / 2, 1) + }) + + lines_by_page = {} + for line in structure["lines"]: + page = line["page"] + if page not in lines_by_page: + lines_by_page[page] = [] + lines_by_page[page].append(line["y"]) + + for page, y_coords in lines_by_page.items(): + y_coords = sorted(set(y_coords)) + for i in range(len(y_coords) - 1): + structure["row_boundaries"].append({ + "page": page, + "row_top": y_coords[i], + "row_bottom": y_coords[i + 1], + "row_height": round(y_coords[i + 1] - y_coords[i], 1) + }) + + return structure + + +def main(): + if len(sys.argv) != 3: + print("Usage: extract_form_structure.py ") + sys.exit(1) + + pdf_path = sys.argv[1] + output_path = sys.argv[2] + + print(f"Extracting structure from {pdf_path}...") + structure = extract_form_structure(pdf_path) + + with open(output_path, "w") as f: + json.dump(structure, f, indent=2) + + print(f"Found:") + print(f" - {len(structure['pages'])} pages") + print(f" - {len(structure['labels'])} text labels") + print(f" - {len(structure['lines'])} horizontal lines") + print(f" - {len(structure['checkboxes'])} checkboxes") + print(f" - {len(structure['row_boundaries'])} row boundaries") + print(f"Saved to {output_path}") + + +if __name__ == "__main__": + main() diff --git a/.claude/skills/pdf/scripts/fill_fillable_fields.py b/.claude/skills/pdf/scripts/fill_fillable_fields.py new file mode 100644 index 0000000..51c2600 --- /dev/null +++ b/.claude/skills/pdf/scripts/fill_fillable_fields.py @@ -0,0 +1,98 @@ +import json +import sys + +from pypdf import PdfReader, PdfWriter + +from extract_form_field_info import get_field_info + + + + +def fill_pdf_fields(input_pdf_path: str, fields_json_path: str, output_pdf_path: str): + with open(fields_json_path) as f: + fields = json.load(f) + fields_by_page = {} + for field in fields: + if "value" in field: + field_id = field["field_id"] + page = field["page"] + if page not in fields_by_page: + fields_by_page[page] = {} + fields_by_page[page][field_id] = field["value"] + + reader = PdfReader(input_pdf_path) + + has_error = False + field_info = get_field_info(reader) + fields_by_ids = {f["field_id"]: f for f in field_info} + for field in fields: + existing_field = fields_by_ids.get(field["field_id"]) + if not existing_field: + has_error = True + print(f"ERROR: `{field['field_id']}` is not a valid field ID") + elif field["page"] != existing_field["page"]: + has_error = True + print(f"ERROR: Incorrect page number for `{field['field_id']}` (got {field['page']}, expected {existing_field['page']})") + else: + if "value" in field: + err = validation_error_for_field_value(existing_field, field["value"]) + if err: + print(err) + has_error = True + if has_error: + sys.exit(1) + + writer = PdfWriter(clone_from=reader) + for page, field_values in fields_by_page.items(): + writer.update_page_form_field_values(writer.pages[page - 1], field_values, auto_regenerate=False) + + writer.set_need_appearances_writer(True) + + with open(output_pdf_path, "wb") as f: + writer.write(f) + + +def validation_error_for_field_value(field_info, field_value): + field_type = field_info["type"] + field_id = field_info["field_id"] + if field_type == "checkbox": + checked_val = field_info["checked_value"] + unchecked_val = field_info["unchecked_value"] + if field_value != checked_val and field_value != unchecked_val: + return f'ERROR: Invalid value "{field_value}" for checkbox field "{field_id}". The checked value is "{checked_val}" and the unchecked value is "{unchecked_val}"' + elif field_type == "radio_group": + option_values = [opt["value"] for opt in field_info["radio_options"]] + if field_value not in option_values: + return f'ERROR: Invalid value "{field_value}" for radio group field "{field_id}". Valid values are: {option_values}' + elif field_type == "choice": + choice_values = [opt["value"] for opt in field_info["choice_options"]] + if field_value not in choice_values: + return f'ERROR: Invalid value "{field_value}" for choice field "{field_id}". Valid values are: {choice_values}' + return None + + +def monkeypatch_pydpf_method(): + from pypdf.generic import DictionaryObject + from pypdf.constants import FieldDictionaryAttributes + + original_get_inherited = DictionaryObject.get_inherited + + def patched_get_inherited(self, key: str, default = None): + result = original_get_inherited(self, key, default) + if key == FieldDictionaryAttributes.Opt: + if isinstance(result, list) and all(isinstance(v, list) and len(v) == 2 for v in result): + result = [r[0] for r in result] + return result + + DictionaryObject.get_inherited = patched_get_inherited + + +if __name__ == "__main__": + if len(sys.argv) != 4: + print("Usage: fill_fillable_fields.py [input pdf] [field_values.json] [output pdf]") + sys.exit(1) + monkeypatch_pydpf_method() + input_pdf = sys.argv[1] + fields_json = sys.argv[2] + output_pdf = sys.argv[3] + fill_pdf_fields(input_pdf, fields_json, output_pdf) diff --git a/.claude/skills/pdf/scripts/fill_pdf_form_with_annotations.py b/.claude/skills/pdf/scripts/fill_pdf_form_with_annotations.py new file mode 100644 index 0000000..b430069 --- /dev/null +++ b/.claude/skills/pdf/scripts/fill_pdf_form_with_annotations.py @@ -0,0 +1,107 @@ +import json +import sys + +from pypdf import PdfReader, PdfWriter +from pypdf.annotations import FreeText + + + + +def transform_from_image_coords(bbox, image_width, image_height, pdf_width, pdf_height): + x_scale = pdf_width / image_width + y_scale = pdf_height / image_height + + left = bbox[0] * x_scale + right = bbox[2] * x_scale + + top = pdf_height - (bbox[1] * y_scale) + bottom = pdf_height - (bbox[3] * y_scale) + + return left, bottom, right, top + + +def transform_from_pdf_coords(bbox, pdf_height): + left = bbox[0] + right = bbox[2] + + pypdf_top = pdf_height - bbox[1] + pypdf_bottom = pdf_height - bbox[3] + + return left, pypdf_bottom, right, pypdf_top + + +def fill_pdf_form(input_pdf_path, fields_json_path, output_pdf_path): + + with open(fields_json_path, "r") as f: + fields_data = json.load(f) + + reader = PdfReader(input_pdf_path) + writer = PdfWriter() + + writer.append(reader) + + pdf_dimensions = {} + for i, page in enumerate(reader.pages): + mediabox = page.mediabox + pdf_dimensions[i + 1] = [mediabox.width, mediabox.height] + + annotations = [] + for field in fields_data["form_fields"]: + page_num = field["page_number"] + + page_info = next(p for p in fields_data["pages"] if p["page_number"] == page_num) + pdf_width, pdf_height = pdf_dimensions[page_num] + + if "pdf_width" in page_info: + transformed_entry_box = transform_from_pdf_coords( + field["entry_bounding_box"], + float(pdf_height) + ) + else: + image_width = page_info["image_width"] + image_height = page_info["image_height"] + transformed_entry_box = transform_from_image_coords( + field["entry_bounding_box"], + image_width, image_height, + float(pdf_width), float(pdf_height) + ) + + if "entry_text" not in field or "text" not in field["entry_text"]: + continue + entry_text = field["entry_text"] + text = entry_text["text"] + if not text: + continue + + font_name = entry_text.get("font", "Arial") + font_size = str(entry_text.get("font_size", 14)) + "pt" + font_color = entry_text.get("font_color", "000000") + + annotation = FreeText( + text=text, + rect=transformed_entry_box, + font=font_name, + font_size=font_size, + font_color=font_color, + border_color=None, + background_color=None, + ) + annotations.append(annotation) + writer.add_annotation(page_number=page_num - 1, annotation=annotation) + + with open(output_pdf_path, "wb") as output: + writer.write(output) + + print(f"Successfully filled PDF form and saved to {output_pdf_path}") + print(f"Added {len(annotations)} text annotations") + + +if __name__ == "__main__": + if len(sys.argv) != 4: + print("Usage: fill_pdf_form_with_annotations.py [input pdf] [fields.json] [output pdf]") + sys.exit(1) + input_pdf = sys.argv[1] + fields_json = sys.argv[2] + output_pdf = sys.argv[3] + + fill_pdf_form(input_pdf, fields_json, output_pdf) diff --git a/.claude/skills/pptx/.openskills.json b/.claude/skills/pptx/.openskills.json new file mode 100644 index 0000000..784bccb --- /dev/null +++ b/.claude/skills/pptx/.openskills.json @@ -0,0 +1,7 @@ +{ + "source": "anthropics/skills", + "sourceType": "git", + "repoUrl": "https://github.com/anthropics/skills", + "subpath": "skills\\pptx", + "installedAt": "2026-03-02T09:19:50.145Z" +} \ No newline at end of file diff --git a/.claude/skills/pptx/LICENSE.txt b/.claude/skills/pptx/LICENSE.txt new file mode 100644 index 0000000..c55ab42 --- /dev/null +++ b/.claude/skills/pptx/LICENSE.txt @@ -0,0 +1,30 @@ +© 2025 Anthropic, PBC. All rights reserved. + +LICENSE: Use of these materials (including all code, prompts, assets, files, +and other components of this Skill) is governed by your agreement with +Anthropic regarding use of Anthropic's services. If no separate agreement +exists, use is governed by Anthropic's Consumer Terms of Service or +Commercial Terms of Service, as applicable: +https://www.anthropic.com/legal/consumer-terms +https://www.anthropic.com/legal/commercial-terms +Your applicable agreement is referred to as the "Agreement." "Services" are +as defined in the Agreement. + +ADDITIONAL RESTRICTIONS: Notwithstanding anything in the Agreement to the +contrary, users may not: + +- Extract these materials from the Services or retain copies of these + materials outside the Services +- Reproduce or copy these materials, except for temporary copies created + automatically during authorized use of the Services +- Create derivative works based on these materials +- Distribute, sublicense, or transfer these materials to any third party +- Make, offer to sell, sell, or import any inventions embodied in these + materials +- Reverse engineer, decompile, or disassemble these materials + +The receipt, viewing, or possession of these materials does not convey or +imply any license or right beyond those expressly granted above. + +Anthropic retains all right, title, and interest in these materials, +including all copyrights, patents, and other intellectual property rights. diff --git a/.claude/skills/pptx/SKILL.md b/.claude/skills/pptx/SKILL.md new file mode 100644 index 0000000..df5000e --- /dev/null +++ b/.claude/skills/pptx/SKILL.md @@ -0,0 +1,232 @@ +--- +name: pptx +description: "Use this skill any time a .pptx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates, layouts, speaker notes, or comments. Trigger whenever the user mentions \"deck,\" \"slides,\" \"presentation,\" or references a .pptx filename, regardless of what they plan to do with the content afterward. If a .pptx file needs to be opened, created, or touched, use this skill." +license: Proprietary. LICENSE.txt has complete terms +--- + +# PPTX Skill + +## Quick Reference + +| Task | Guide | +|------|-------| +| Read/analyze content | `python -m markitdown presentation.pptx` | +| Edit or create from template | Read [editing.md](editing.md) | +| Create from scratch | Read [pptxgenjs.md](pptxgenjs.md) | + +--- + +## Reading Content + +```bash +# Text extraction +python -m markitdown presentation.pptx + +# Visual overview +python scripts/thumbnail.py presentation.pptx + +# Raw XML +python scripts/office/unpack.py presentation.pptx unpacked/ +``` + +--- + +## Editing Workflow + +**Read [editing.md](editing.md) for full details.** + +1. Analyze template with `thumbnail.py` +2. Unpack → manipulate slides → edit content → clean → pack + +--- + +## Creating from Scratch + +**Read [pptxgenjs.md](pptxgenjs.md) for full details.** + +Use when no template or reference presentation is available. + +--- + +## Design Ideas + +**Don't create boring slides.** Plain bullets on a white background won't impress anyone. Consider ideas from this list for each slide. + +### Before Starting + +- **Pick a bold, content-informed color palette**: The palette should feel designed for THIS topic. If swapping your colors into a completely different presentation would still "work," you haven't made specific enough choices. +- **Dominance over equality**: One color should dominate (60-70% visual weight), with 1-2 supporting tones and one sharp accent. Never give all colors equal weight. +- **Dark/light contrast**: Dark backgrounds for title + conclusion slides, light for content ("sandwich" structure). Or commit to dark throughout for a premium feel. +- **Commit to a visual motif**: Pick ONE distinctive element and repeat it — rounded image frames, icons in colored circles, thick single-side borders. Carry it across every slide. + +### Color Palettes + +Choose colors that match your topic — don't default to generic blue. Use these palettes as inspiration: + +| Theme | Primary | Secondary | Accent | +|-------|---------|-----------|--------| +| **Midnight Executive** | `1E2761` (navy) | `CADCFC` (ice blue) | `FFFFFF` (white) | +| **Forest & Moss** | `2C5F2D` (forest) | `97BC62` (moss) | `F5F5F5` (cream) | +| **Coral Energy** | `F96167` (coral) | `F9E795` (gold) | `2F3C7E` (navy) | +| **Warm Terracotta** | `B85042` (terracotta) | `E7E8D1` (sand) | `A7BEAE` (sage) | +| **Ocean Gradient** | `065A82` (deep blue) | `1C7293` (teal) | `21295C` (midnight) | +| **Charcoal Minimal** | `36454F` (charcoal) | `F2F2F2` (off-white) | `212121` (black) | +| **Teal Trust** | `028090` (teal) | `00A896` (seafoam) | `02C39A` (mint) | +| **Berry & Cream** | `6D2E46` (berry) | `A26769` (dusty rose) | `ECE2D0` (cream) | +| **Sage Calm** | `84B59F` (sage) | `69A297` (eucalyptus) | `50808E` (slate) | +| **Cherry Bold** | `990011` (cherry) | `FCF6F5` (off-white) | `2F3C7E` (navy) | + +### For Each Slide + +**Every slide needs a visual element** — image, chart, icon, or shape. Text-only slides are forgettable. + +**Layout options:** +- Two-column (text left, illustration on right) +- Icon + text rows (icon in colored circle, bold header, description below) +- 2x2 or 2x3 grid (image on one side, grid of content blocks on other) +- Half-bleed image (full left or right side) with content overlay + +**Data display:** +- Large stat callouts (big numbers 60-72pt with small labels below) +- Comparison columns (before/after, pros/cons, side-by-side options) +- Timeline or process flow (numbered steps, arrows) + +**Visual polish:** +- Icons in small colored circles next to section headers +- Italic accent text for key stats or taglines + +### Typography + +**Choose an interesting font pairing** — don't default to Arial. Pick a header font with personality and pair it with a clean body font. + +| Header Font | Body Font | +|-------------|-----------| +| Georgia | Calibri | +| Arial Black | Arial | +| Calibri | Calibri Light | +| Cambria | Calibri | +| Trebuchet MS | Calibri | +| Impact | Arial | +| Palatino | Garamond | +| Consolas | Calibri | + +| Element | Size | +|---------|------| +| Slide title | 36-44pt bold | +| Section header | 20-24pt bold | +| Body text | 14-16pt | +| Captions | 10-12pt muted | + +### Spacing + +- 0.5" minimum margins +- 0.3-0.5" between content blocks +- Leave breathing room—don't fill every inch + +### Avoid (Common Mistakes) + +- **Don't repeat the same layout** — vary columns, cards, and callouts across slides +- **Don't center body text** — left-align paragraphs and lists; center only titles +- **Don't skimp on size contrast** — titles need 36pt+ to stand out from 14-16pt body +- **Don't default to blue** — pick colors that reflect the specific topic +- **Don't mix spacing randomly** — choose 0.3" or 0.5" gaps and use consistently +- **Don't style one slide and leave the rest plain** — commit fully or keep it simple throughout +- **Don't create text-only slides** — add images, icons, charts, or visual elements; avoid plain title + bullets +- **Don't forget text box padding** — when aligning lines or shapes with text edges, set `margin: 0` on the text box or offset the shape to account for padding +- **Don't use low-contrast elements** — icons AND text need strong contrast against the background; avoid light text on light backgrounds or dark text on dark backgrounds +- **NEVER use accent lines under titles** — these are a hallmark of AI-generated slides; use whitespace or background color instead + +--- + +## QA (Required) + +**Assume there are problems. Your job is to find them.** + +Your first render is almost never correct. Approach QA as a bug hunt, not a confirmation step. If you found zero issues on first inspection, you weren't looking hard enough. + +### Content QA + +```bash +python -m markitdown output.pptx +``` + +Check for missing content, typos, wrong order. + +**When using templates, check for leftover placeholder text:** + +```bash +python -m markitdown output.pptx | grep -iE "xxxx|lorem|ipsum|this.*(page|slide).*layout" +``` + +If grep returns results, fix them before declaring success. + +### Visual QA + +**⚠️ USE SUBAGENTS** — even for 2-3 slides. You've been staring at the code and will see what you expect, not what's there. Subagents have fresh eyes. + +Convert slides to images (see [Converting to Images](#converting-to-images)), then use this prompt: + +``` +Visually inspect these slides. Assume there are issues — find them. + +Look for: +- Overlapping elements (text through shapes, lines through words, stacked elements) +- Text overflow or cut off at edges/box boundaries +- Decorative lines positioned for single-line text but title wrapped to two lines +- Source citations or footers colliding with content above +- Elements too close (< 0.3" gaps) or cards/sections nearly touching +- Uneven gaps (large empty area in one place, cramped in another) +- Insufficient margin from slide edges (< 0.5") +- Columns or similar elements not aligned consistently +- Low-contrast text (e.g., light gray text on cream-colored background) +- Low-contrast icons (e.g., dark icons on dark backgrounds without a contrasting circle) +- Text boxes too narrow causing excessive wrapping +- Leftover placeholder content + +For each slide, list issues or areas of concern, even if minor. + +Read and analyze these images: +1. /path/to/slide-01.jpg (Expected: [brief description]) +2. /path/to/slide-02.jpg (Expected: [brief description]) + +Report ALL issues found, including minor ones. +``` + +### Verification Loop + +1. Generate slides → Convert to images → Inspect +2. **List issues found** (if none found, look again more critically) +3. Fix issues +4. **Re-verify affected slides** — one fix often creates another problem +5. Repeat until a full pass reveals no new issues + +**Do not declare success until you've completed at least one fix-and-verify cycle.** + +--- + +## Converting to Images + +Convert presentations to individual slide images for visual inspection: + +```bash +python scripts/office/soffice.py --headless --convert-to pdf output.pptx +pdftoppm -jpeg -r 150 output.pdf slide +``` + +This creates `slide-01.jpg`, `slide-02.jpg`, etc. + +To re-render specific slides after fixes: + +```bash +pdftoppm -jpeg -r 150 -f N -l N output.pdf slide-fixed +``` + +--- + +## Dependencies + +- `pip install "markitdown[pptx]"` - text extraction +- `pip install Pillow` - thumbnail grids +- `npm install -g pptxgenjs` - creating from scratch +- LibreOffice (`soffice`) - PDF conversion (auto-configured for sandboxed environments via `scripts/office/soffice.py`) +- Poppler (`pdftoppm`) - PDF to images diff --git a/.claude/skills/pptx/editing.md b/.claude/skills/pptx/editing.md new file mode 100644 index 0000000..f873e8a --- /dev/null +++ b/.claude/skills/pptx/editing.md @@ -0,0 +1,205 @@ +# Editing Presentations + +## Template-Based Workflow + +When using an existing presentation as a template: + +1. **Analyze existing slides**: + ```bash + python scripts/thumbnail.py template.pptx + python -m markitdown template.pptx + ``` + Review `thumbnails.jpg` to see layouts, and markitdown output to see placeholder text. + +2. **Plan slide mapping**: For each content section, choose a template slide. + + ⚠️ **USE VARIED LAYOUTS** — monotonous presentations are a common failure mode. Don't default to basic title + bullet slides. Actively seek out: + - Multi-column layouts (2-column, 3-column) + - Image + text combinations + - Full-bleed images with text overlay + - Quote or callout slides + - Section dividers + - Stat/number callouts + - Icon grids or icon + text rows + + **Avoid:** Repeating the same text-heavy layout for every slide. + + Match content type to layout style (e.g., key points → bullet slide, team info → multi-column, testimonials → quote slide). + +3. **Unpack**: `python scripts/office/unpack.py template.pptx unpacked/` + +4. **Build presentation** (do this yourself, not with subagents): + - Delete unwanted slides (remove from ``) + - Duplicate slides you want to reuse (`add_slide.py`) + - Reorder slides in `` + - **Complete all structural changes before step 5** + +5. **Edit content**: Update text in each `slide{N}.xml`. + **Use subagents here if available** — slides are separate XML files, so subagents can edit in parallel. + +6. **Clean**: `python scripts/clean.py unpacked/` + +7. **Pack**: `python scripts/office/pack.py unpacked/ output.pptx --original template.pptx` + +--- + +## Scripts + +| Script | Purpose | +|--------|---------| +| `unpack.py` | Extract and pretty-print PPTX | +| `add_slide.py` | Duplicate slide or create from layout | +| `clean.py` | Remove orphaned files | +| `pack.py` | Repack with validation | +| `thumbnail.py` | Create visual grid of slides | + +### unpack.py + +```bash +python scripts/office/unpack.py input.pptx unpacked/ +``` + +Extracts PPTX, pretty-prints XML, escapes smart quotes. + +### add_slide.py + +```bash +python scripts/add_slide.py unpacked/ slide2.xml # Duplicate slide +python scripts/add_slide.py unpacked/ slideLayout2.xml # From layout +``` + +Prints `` to add to `` at desired position. + +### clean.py + +```bash +python scripts/clean.py unpacked/ +``` + +Removes slides not in ``, unreferenced media, orphaned rels. + +### pack.py + +```bash +python scripts/office/pack.py unpacked/ output.pptx --original input.pptx +``` + +Validates, repairs, condenses XML, re-encodes smart quotes. + +### thumbnail.py + +```bash +python scripts/thumbnail.py input.pptx [output_prefix] [--cols N] +``` + +Creates `thumbnails.jpg` with slide filenames as labels. Default 3 columns, max 12 per grid. + +**Use for template analysis only** (choosing layouts). For visual QA, use `soffice` + `pdftoppm` to create full-resolution individual slide images—see SKILL.md. + +--- + +## Slide Operations + +Slide order is in `ppt/presentation.xml` → ``. + +**Reorder**: Rearrange `` elements. + +**Delete**: Remove ``, then run `clean.py`. + +**Add**: Use `add_slide.py`. Never manually copy slide files—the script handles notes references, Content_Types.xml, and relationship IDs that manual copying misses. + +--- + +## Editing Content + +**Subagents:** If available, use them here (after completing step 4). Each slide is a separate XML file, so subagents can edit in parallel. In your prompt to subagents, include: +- The slide file path(s) to edit +- **"Use the Edit tool for all changes"** +- The formatting rules and common pitfalls below + +For each slide: +1. Read the slide's XML +2. Identify ALL placeholder content—text, images, charts, icons, captions +3. Replace each placeholder with final content + +**Use the Edit tool, not sed or Python scripts.** The Edit tool forces specificity about what to replace and where, yielding better reliability. + +### Formatting Rules + +- **Bold all headers, subheadings, and inline labels**: Use `b="1"` on ``. This includes: + - Slide titles + - Section headers within a slide + - Inline labels like (e.g.: "Status:", "Description:") at the start of a line +- **Never use unicode bullets (•)**: Use proper list formatting with `` or `` +- **Bullet consistency**: Let bullets inherit from the layout. Only specify `` or ``. + +--- + +## Common Pitfalls + +### Template Adaptation + +When source content has fewer items than the template: +- **Remove excess elements entirely** (images, shapes, text boxes), don't just clear text +- Check for orphaned visuals after clearing text content +- Run visual QA to catch mismatched counts + +When replacing text with different length content: +- **Shorter replacements**: Usually safe +- **Longer replacements**: May overflow or wrap unexpectedly +- Test with visual QA after text changes +- Consider truncating or splitting content to fit the template's design constraints + +**Template slots ≠ Source items**: If template has 4 team members but source has 3 users, delete the 4th member's entire group (image + text boxes), not just the text. + +### Multi-Item Content + +If source has multiple items (numbered lists, multiple sections), create separate `` elements for each — **never concatenate into one string**. + +**❌ WRONG** — all items in one paragraph: +```xml + + Step 1: Do the first thing. Step 2: Do the second thing. + +``` + +**✅ CORRECT** — separate paragraphs with bold headers: +```xml + + + Step 1 + + + + Do the first thing. + + + + Step 2 + + +``` + +Copy `` from the original paragraph to preserve line spacing. Use `b="1"` on headers. + +### Smart Quotes + +Handled automatically by unpack/pack. But the Edit tool converts smart quotes to ASCII. + +**When adding new text with quotes, use XML entities:** + +```xml +the “Agreement” +``` + +| Character | Name | Unicode | XML Entity | +|-----------|------|---------|------------| +| `“` | Left double quote | U+201C | `“` | +| `”` | Right double quote | U+201D | `”` | +| `‘` | Left single quote | U+2018 | `‘` | +| `’` | Right single quote | U+2019 | `’` | + +### Other + +- **Whitespace**: Use `xml:space="preserve"` on `` with leading/trailing spaces +- **XML parsing**: Use `defusedxml.minidom`, not `xml.etree.ElementTree` (corrupts namespaces) diff --git a/.claude/skills/pptx/pptxgenjs.md b/.claude/skills/pptx/pptxgenjs.md new file mode 100644 index 0000000..6bfed90 --- /dev/null +++ b/.claude/skills/pptx/pptxgenjs.md @@ -0,0 +1,420 @@ +# PptxGenJS Tutorial + +## Setup & Basic Structure + +```javascript +const pptxgen = require("pptxgenjs"); + +let pres = new pptxgen(); +pres.layout = 'LAYOUT_16x9'; // or 'LAYOUT_16x10', 'LAYOUT_4x3', 'LAYOUT_WIDE' +pres.author = 'Your Name'; +pres.title = 'Presentation Title'; + +let slide = pres.addSlide(); +slide.addText("Hello World!", { x: 0.5, y: 0.5, fontSize: 36, color: "363636" }); + +pres.writeFile({ fileName: "Presentation.pptx" }); +``` + +## Layout Dimensions + +Slide dimensions (coordinates in inches): +- `LAYOUT_16x9`: 10" × 5.625" (default) +- `LAYOUT_16x10`: 10" × 6.25" +- `LAYOUT_4x3`: 10" × 7.5" +- `LAYOUT_WIDE`: 13.3" × 7.5" + +--- + +## Text & Formatting + +```javascript +// Basic text +slide.addText("Simple Text", { + x: 1, y: 1, w: 8, h: 2, fontSize: 24, fontFace: "Arial", + color: "363636", bold: true, align: "center", valign: "middle" +}); + +// Character spacing (use charSpacing, not letterSpacing which is silently ignored) +slide.addText("SPACED TEXT", { x: 1, y: 1, w: 8, h: 1, charSpacing: 6 }); + +// Rich text arrays +slide.addText([ + { text: "Bold ", options: { bold: true } }, + { text: "Italic ", options: { italic: true } } +], { x: 1, y: 3, w: 8, h: 1 }); + +// Multi-line text (requires breakLine: true) +slide.addText([ + { text: "Line 1", options: { breakLine: true } }, + { text: "Line 2", options: { breakLine: true } }, + { text: "Line 3" } // Last item doesn't need breakLine +], { x: 0.5, y: 0.5, w: 8, h: 2 }); + +// Text box margin (internal padding) +slide.addText("Title", { + x: 0.5, y: 0.3, w: 9, h: 0.6, + margin: 0 // Use 0 when aligning text with other elements like shapes or icons +}); +``` + +**Tip:** Text boxes have internal margin by default. Set `margin: 0` when you need text to align precisely with shapes, lines, or icons at the same x-position. + +--- + +## Lists & Bullets + +```javascript +// ✅ CORRECT: Multiple bullets +slide.addText([ + { text: "First item", options: { bullet: true, breakLine: true } }, + { text: "Second item", options: { bullet: true, breakLine: true } }, + { text: "Third item", options: { bullet: true } } +], { x: 0.5, y: 0.5, w: 8, h: 3 }); + +// ❌ WRONG: Never use unicode bullets +slide.addText("• First item", { ... }); // Creates double bullets + +// Sub-items and numbered lists +{ text: "Sub-item", options: { bullet: true, indentLevel: 1 } } +{ text: "First", options: { bullet: { type: "number" }, breakLine: true } } +``` + +--- + +## Shapes + +```javascript +slide.addShape(pres.shapes.RECTANGLE, { + x: 0.5, y: 0.8, w: 1.5, h: 3.0, + fill: { color: "FF0000" }, line: { color: "000000", width: 2 } +}); + +slide.addShape(pres.shapes.OVAL, { x: 4, y: 1, w: 2, h: 2, fill: { color: "0000FF" } }); + +slide.addShape(pres.shapes.LINE, { + x: 1, y: 3, w: 5, h: 0, line: { color: "FF0000", width: 3, dashType: "dash" } +}); + +// With transparency +slide.addShape(pres.shapes.RECTANGLE, { + x: 1, y: 1, w: 3, h: 2, + fill: { color: "0088CC", transparency: 50 } +}); + +// Rounded rectangle (rectRadius only works with ROUNDED_RECTANGLE, not RECTANGLE) +// ⚠️ Don't pair with rectangular accent overlays — they won't cover rounded corners. Use RECTANGLE instead. +slide.addShape(pres.shapes.ROUNDED_RECTANGLE, { + x: 1, y: 1, w: 3, h: 2, + fill: { color: "FFFFFF" }, rectRadius: 0.1 +}); + +// With shadow +slide.addShape(pres.shapes.RECTANGLE, { + x: 1, y: 1, w: 3, h: 2, + fill: { color: "FFFFFF" }, + shadow: { type: "outer", color: "000000", blur: 6, offset: 2, angle: 135, opacity: 0.15 } +}); +``` + +Shadow options: + +| Property | Type | Range | Notes | +|----------|------|-------|-------| +| `type` | string | `"outer"`, `"inner"` | | +| `color` | string | 6-char hex (e.g. `"000000"`) | No `#` prefix, no 8-char hex — see Common Pitfalls | +| `blur` | number | 0-100 pt | | +| `offset` | number | 0-200 pt | **Must be non-negative** — negative values corrupt the file | +| `angle` | number | 0-359 degrees | Direction the shadow falls (135 = bottom-right, 270 = upward) | +| `opacity` | number | 0.0-1.0 | Use this for transparency, never encode in color string | + +To cast a shadow upward (e.g. on a footer bar), use `angle: 270` with a positive offset — do **not** use a negative offset. + +**Note**: Gradient fills are not natively supported. Use a gradient image as a background instead. + +--- + +## Images + +### Image Sources + +```javascript +// From file path +slide.addImage({ path: "images/chart.png", x: 1, y: 1, w: 5, h: 3 }); + +// From URL +slide.addImage({ path: "https://example.com/image.jpg", x: 1, y: 1, w: 5, h: 3 }); + +// From base64 (faster, no file I/O) +slide.addImage({ data: "image/png;base64,iVBORw0KGgo...", x: 1, y: 1, w: 5, h: 3 }); +``` + +### Image Options + +```javascript +slide.addImage({ + path: "image.png", + x: 1, y: 1, w: 5, h: 3, + rotate: 45, // 0-359 degrees + rounding: true, // Circular crop + transparency: 50, // 0-100 + flipH: true, // Horizontal flip + flipV: false, // Vertical flip + altText: "Description", // Accessibility + hyperlink: { url: "https://example.com" } +}); +``` + +### Image Sizing Modes + +```javascript +// Contain - fit inside, preserve ratio +{ sizing: { type: 'contain', w: 4, h: 3 } } + +// Cover - fill area, preserve ratio (may crop) +{ sizing: { type: 'cover', w: 4, h: 3 } } + +// Crop - cut specific portion +{ sizing: { type: 'crop', x: 0.5, y: 0.5, w: 2, h: 2 } } +``` + +### Calculate Dimensions (preserve aspect ratio) + +```javascript +const origWidth = 1978, origHeight = 923, maxHeight = 3.0; +const calcWidth = maxHeight * (origWidth / origHeight); +const centerX = (10 - calcWidth) / 2; + +slide.addImage({ path: "image.png", x: centerX, y: 1.2, w: calcWidth, h: maxHeight }); +``` + +### Supported Formats + +- **Standard**: PNG, JPG, GIF (animated GIFs work in Microsoft 365) +- **SVG**: Works in modern PowerPoint/Microsoft 365 + +--- + +## Icons + +Use react-icons to generate SVG icons, then rasterize to PNG for universal compatibility. + +### Setup + +```javascript +const React = require("react"); +const ReactDOMServer = require("react-dom/server"); +const sharp = require("sharp"); +const { FaCheckCircle, FaChartLine } = require("react-icons/fa"); + +function renderIconSvg(IconComponent, color = "#000000", size = 256) { + return ReactDOMServer.renderToStaticMarkup( + React.createElement(IconComponent, { color, size: String(size) }) + ); +} + +async function iconToBase64Png(IconComponent, color, size = 256) { + const svg = renderIconSvg(IconComponent, color, size); + const pngBuffer = await sharp(Buffer.from(svg)).png().toBuffer(); + return "image/png;base64," + pngBuffer.toString("base64"); +} +``` + +### Add Icon to Slide + +```javascript +const iconData = await iconToBase64Png(FaCheckCircle, "#4472C4", 256); + +slide.addImage({ + data: iconData, + x: 1, y: 1, w: 0.5, h: 0.5 // Size in inches +}); +``` + +**Note**: Use size 256 or higher for crisp icons. The size parameter controls the rasterization resolution, not the display size on the slide (which is set by `w` and `h` in inches). + +### Icon Libraries + +Install: `npm install -g react-icons react react-dom sharp` + +Popular icon sets in react-icons: +- `react-icons/fa` - Font Awesome +- `react-icons/md` - Material Design +- `react-icons/hi` - Heroicons +- `react-icons/bi` - Bootstrap Icons + +--- + +## Slide Backgrounds + +```javascript +// Solid color +slide.background = { color: "F1F1F1" }; + +// Color with transparency +slide.background = { color: "FF3399", transparency: 50 }; + +// Image from URL +slide.background = { path: "https://example.com/bg.jpg" }; + +// Image from base64 +slide.background = { data: "image/png;base64,iVBORw0KGgo..." }; +``` + +--- + +## Tables + +```javascript +slide.addTable([ + ["Header 1", "Header 2"], + ["Cell 1", "Cell 2"] +], { + x: 1, y: 1, w: 8, h: 2, + border: { pt: 1, color: "999999" }, fill: { color: "F1F1F1" } +}); + +// Advanced with merged cells +let tableData = [ + [{ text: "Header", options: { fill: { color: "6699CC" }, color: "FFFFFF", bold: true } }, "Cell"], + [{ text: "Merged", options: { colspan: 2 } }] +]; +slide.addTable(tableData, { x: 1, y: 3.5, w: 8, colW: [4, 4] }); +``` + +--- + +## Charts + +```javascript +// Bar chart +slide.addChart(pres.charts.BAR, [{ + name: "Sales", labels: ["Q1", "Q2", "Q3", "Q4"], values: [4500, 5500, 6200, 7100] +}], { + x: 0.5, y: 0.6, w: 6, h: 3, barDir: 'col', + showTitle: true, title: 'Quarterly Sales' +}); + +// Line chart +slide.addChart(pres.charts.LINE, [{ + name: "Temp", labels: ["Jan", "Feb", "Mar"], values: [32, 35, 42] +}], { x: 0.5, y: 4, w: 6, h: 3, lineSize: 3, lineSmooth: true }); + +// Pie chart +slide.addChart(pres.charts.PIE, [{ + name: "Share", labels: ["A", "B", "Other"], values: [35, 45, 20] +}], { x: 7, y: 1, w: 5, h: 4, showPercent: true }); +``` + +### Better-Looking Charts + +Default charts look dated. Apply these options for a modern, clean appearance: + +```javascript +slide.addChart(pres.charts.BAR, chartData, { + x: 0.5, y: 1, w: 9, h: 4, barDir: "col", + + // Custom colors (match your presentation palette) + chartColors: ["0D9488", "14B8A6", "5EEAD4"], + + // Clean background + chartArea: { fill: { color: "FFFFFF" }, roundedCorners: true }, + + // Muted axis labels + catAxisLabelColor: "64748B", + valAxisLabelColor: "64748B", + + // Subtle grid (value axis only) + valGridLine: { color: "E2E8F0", size: 0.5 }, + catGridLine: { style: "none" }, + + // Data labels on bars + showValue: true, + dataLabelPosition: "outEnd", + dataLabelColor: "1E293B", + + // Hide legend for single series + showLegend: false, +}); +``` + +**Key styling options:** +- `chartColors: [...]` - hex colors for series/segments +- `chartArea: { fill, border, roundedCorners }` - chart background +- `catGridLine/valGridLine: { color, style, size }` - grid lines (`style: "none"` to hide) +- `lineSmooth: true` - curved lines (line charts) +- `legendPos: "r"` - legend position: "b", "t", "l", "r", "tr" + +--- + +## Slide Masters + +```javascript +pres.defineSlideMaster({ + title: 'TITLE_SLIDE', background: { color: '283A5E' }, + objects: [{ + placeholder: { options: { name: 'title', type: 'title', x: 1, y: 2, w: 8, h: 2 } } + }] +}); + +let titleSlide = pres.addSlide({ masterName: "TITLE_SLIDE" }); +titleSlide.addText("My Title", { placeholder: "title" }); +``` + +--- + +## Common Pitfalls + +⚠️ These issues cause file corruption, visual bugs, or broken output. Avoid them. + +1. **NEVER use "#" with hex colors** - causes file corruption + ```javascript + color: "FF0000" // ✅ CORRECT + color: "#FF0000" // ❌ WRONG + ``` + +2. **NEVER encode opacity in hex color strings** - 8-char colors (e.g., `"00000020"`) corrupt the file. Use the `opacity` property instead. + ```javascript + shadow: { type: "outer", blur: 6, offset: 2, color: "00000020" } // ❌ CORRUPTS FILE + shadow: { type: "outer", blur: 6, offset: 2, color: "000000", opacity: 0.12 } // ✅ CORRECT + ``` + +3. **Use `bullet: true`** - NEVER unicode symbols like "•" (creates double bullets) + +4. **Use `breakLine: true`** between array items or text runs together + +5. **Avoid `lineSpacing` with bullets** - causes excessive gaps; use `paraSpaceAfter` instead + +6. **Each presentation needs fresh instance** - don't reuse `pptxgen()` objects + +7. **NEVER reuse option objects across calls** - PptxGenJS mutates objects in-place (e.g. converting shadow values to EMU). Sharing one object between multiple calls corrupts the second shape. + ```javascript + const shadow = { type: "outer", blur: 6, offset: 2, color: "000000", opacity: 0.15 }; + slide.addShape(pres.shapes.RECTANGLE, { shadow, ... }); // ❌ second call gets already-converted values + slide.addShape(pres.shapes.RECTANGLE, { shadow, ... }); + + const makeShadow = () => ({ type: "outer", blur: 6, offset: 2, color: "000000", opacity: 0.15 }); + slide.addShape(pres.shapes.RECTANGLE, { shadow: makeShadow(), ... }); // ✅ fresh object each time + slide.addShape(pres.shapes.RECTANGLE, { shadow: makeShadow(), ... }); + ``` + +8. **Don't use `ROUNDED_RECTANGLE` with accent borders** - rectangular overlay bars won't cover rounded corners. Use `RECTANGLE` instead. + ```javascript + // ❌ WRONG: Accent bar doesn't cover rounded corners + slide.addShape(pres.shapes.ROUNDED_RECTANGLE, { x: 1, y: 1, w: 3, h: 1.5, fill: { color: "FFFFFF" } }); + slide.addShape(pres.shapes.RECTANGLE, { x: 1, y: 1, w: 0.08, h: 1.5, fill: { color: "0891B2" } }); + + // ✅ CORRECT: Use RECTANGLE for clean alignment + slide.addShape(pres.shapes.RECTANGLE, { x: 1, y: 1, w: 3, h: 1.5, fill: { color: "FFFFFF" } }); + slide.addShape(pres.shapes.RECTANGLE, { x: 1, y: 1, w: 0.08, h: 1.5, fill: { color: "0891B2" } }); + ``` + +--- + +## Quick Reference + +- **Shapes**: RECTANGLE, OVAL, LINE, ROUNDED_RECTANGLE +- **Charts**: BAR, LINE, PIE, DOUGHNUT, SCATTER, BUBBLE, RADAR +- **Layouts**: LAYOUT_16x9 (10"×5.625"), LAYOUT_16x10, LAYOUT_4x3, LAYOUT_WIDE +- **Alignment**: "left", "center", "right" +- **Chart data labels**: "outEnd", "inEnd", "center" diff --git a/.claude/skills/pptx/scripts/__init__.py b/.claude/skills/pptx/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/.claude/skills/pptx/scripts/add_slide.py b/.claude/skills/pptx/scripts/add_slide.py new file mode 100644 index 0000000..13700df --- /dev/null +++ b/.claude/skills/pptx/scripts/add_slide.py @@ -0,0 +1,195 @@ +"""Add a new slide to an unpacked PPTX directory. + +Usage: python add_slide.py + +The source can be: + - A slide file (e.g., slide2.xml) - duplicates the slide + - A layout file (e.g., slideLayout2.xml) - creates from layout + +Examples: + python add_slide.py unpacked/ slide2.xml + # Duplicates slide2, creates slide5.xml + + python add_slide.py unpacked/ slideLayout2.xml + # Creates slide5.xml from slideLayout2.xml + +To see available layouts: ls unpacked/ppt/slideLayouts/ + +Prints the element to add to presentation.xml. +""" + +import re +import shutil +import sys +from pathlib import Path + + +def get_next_slide_number(slides_dir: Path) -> int: + existing = [int(m.group(1)) for f in slides_dir.glob("slide*.xml") + if (m := re.match(r"slide(\d+)\.xml", f.name))] + return max(existing) + 1 if existing else 1 + + +def create_slide_from_layout(unpacked_dir: Path, layout_file: str) -> None: + slides_dir = unpacked_dir / "ppt" / "slides" + rels_dir = slides_dir / "_rels" + layouts_dir = unpacked_dir / "ppt" / "slideLayouts" + + layout_path = layouts_dir / layout_file + if not layout_path.exists(): + print(f"Error: {layout_path} not found", file=sys.stderr) + sys.exit(1) + + next_num = get_next_slide_number(slides_dir) + dest = f"slide{next_num}.xml" + dest_slide = slides_dir / dest + dest_rels = rels_dir / f"{dest}.rels" + + slide_xml = ''' + + + + + + + + + + + + + + + + + + + + + +''' + dest_slide.write_text(slide_xml, encoding="utf-8") + + rels_dir.mkdir(exist_ok=True) + rels_xml = f''' + + +''' + dest_rels.write_text(rels_xml, encoding="utf-8") + + _add_to_content_types(unpacked_dir, dest) + + rid = _add_to_presentation_rels(unpacked_dir, dest) + + next_slide_id = _get_next_slide_id(unpacked_dir) + + print(f"Created {dest} from {layout_file}") + print(f'Add to presentation.xml : ') + + +def duplicate_slide(unpacked_dir: Path, source: str) -> None: + slides_dir = unpacked_dir / "ppt" / "slides" + rels_dir = slides_dir / "_rels" + + source_slide = slides_dir / source + + if not source_slide.exists(): + print(f"Error: {source_slide} not found", file=sys.stderr) + sys.exit(1) + + next_num = get_next_slide_number(slides_dir) + dest = f"slide{next_num}.xml" + dest_slide = slides_dir / dest + + source_rels = rels_dir / f"{source}.rels" + dest_rels = rels_dir / f"{dest}.rels" + + shutil.copy2(source_slide, dest_slide) + + if source_rels.exists(): + shutil.copy2(source_rels, dest_rels) + + rels_content = dest_rels.read_text(encoding="utf-8") + rels_content = re.sub( + r'\s*]*Type="[^"]*notesSlide"[^>]*/>\s*', + "\n", + rels_content, + ) + dest_rels.write_text(rels_content, encoding="utf-8") + + _add_to_content_types(unpacked_dir, dest) + + rid = _add_to_presentation_rels(unpacked_dir, dest) + + next_slide_id = _get_next_slide_id(unpacked_dir) + + print(f"Created {dest} from {source}") + print(f'Add to presentation.xml : ') + + +def _add_to_content_types(unpacked_dir: Path, dest: str) -> None: + content_types_path = unpacked_dir / "[Content_Types].xml" + content_types = content_types_path.read_text(encoding="utf-8") + + new_override = f'' + + if f"/ppt/slides/{dest}" not in content_types: + content_types = content_types.replace("", f" {new_override}\n") + content_types_path.write_text(content_types, encoding="utf-8") + + +def _add_to_presentation_rels(unpacked_dir: Path, dest: str) -> str: + pres_rels_path = unpacked_dir / "ppt" / "_rels" / "presentation.xml.rels" + pres_rels = pres_rels_path.read_text(encoding="utf-8") + + rids = [int(m) for m in re.findall(r'Id="rId(\d+)"', pres_rels)] + next_rid = max(rids) + 1 if rids else 1 + rid = f"rId{next_rid}" + + new_rel = f'' + + if f"slides/{dest}" not in pres_rels: + pres_rels = pres_rels.replace("", f" {new_rel}\n") + pres_rels_path.write_text(pres_rels, encoding="utf-8") + + return rid + + +def _get_next_slide_id(unpacked_dir: Path) -> int: + pres_path = unpacked_dir / "ppt" / "presentation.xml" + pres_content = pres_path.read_text(encoding="utf-8") + slide_ids = [int(m) for m in re.findall(r']*id="(\d+)"', pres_content)] + return max(slide_ids) + 1 if slide_ids else 256 + + +def parse_source(source: str) -> tuple[str, str | None]: + if source.startswith("slideLayout") and source.endswith(".xml"): + return ("layout", source) + + return ("slide", None) + + +if __name__ == "__main__": + if len(sys.argv) != 3: + print("Usage: python add_slide.py ", file=sys.stderr) + print("", file=sys.stderr) + print("Source can be:", file=sys.stderr) + print(" slide2.xml - duplicate an existing slide", file=sys.stderr) + print(" slideLayout2.xml - create from a layout template", file=sys.stderr) + print("", file=sys.stderr) + print("To see available layouts: ls /ppt/slideLayouts/", file=sys.stderr) + sys.exit(1) + + unpacked_dir = Path(sys.argv[1]) + source = sys.argv[2] + + if not unpacked_dir.exists(): + print(f"Error: {unpacked_dir} not found", file=sys.stderr) + sys.exit(1) + + source_type, layout_file = parse_source(source) + + if source_type == "layout" and layout_file is not None: + create_slide_from_layout(unpacked_dir, layout_file) + else: + duplicate_slide(unpacked_dir, source) diff --git a/.claude/skills/pptx/scripts/clean.py b/.claude/skills/pptx/scripts/clean.py new file mode 100644 index 0000000..3d13994 --- /dev/null +++ b/.claude/skills/pptx/scripts/clean.py @@ -0,0 +1,286 @@ +"""Remove unreferenced files from an unpacked PPTX directory. + +Usage: python clean.py + +Example: + python clean.py unpacked/ + +This script removes: +- Orphaned slides (not in sldIdLst) and their relationships +- [trash] directory (unreferenced files) +- Orphaned .rels files for deleted resources +- Unreferenced media, embeddings, charts, diagrams, drawings, ink files +- Unreferenced theme files +- Unreferenced notes slides +- Content-Type overrides for deleted files +""" + +import sys +from pathlib import Path + +import defusedxml.minidom + + +import re + + +def get_slides_in_sldidlst(unpacked_dir: Path) -> set[str]: + pres_path = unpacked_dir / "ppt" / "presentation.xml" + pres_rels_path = unpacked_dir / "ppt" / "_rels" / "presentation.xml.rels" + + if not pres_path.exists() or not pres_rels_path.exists(): + return set() + + rels_dom = defusedxml.minidom.parse(str(pres_rels_path)) + rid_to_slide = {} + for rel in rels_dom.getElementsByTagName("Relationship"): + rid = rel.getAttribute("Id") + target = rel.getAttribute("Target") + rel_type = rel.getAttribute("Type") + if "slide" in rel_type and target.startswith("slides/"): + rid_to_slide[rid] = target.replace("slides/", "") + + pres_content = pres_path.read_text(encoding="utf-8") + referenced_rids = set(re.findall(r']*r:id="([^"]+)"', pres_content)) + + return {rid_to_slide[rid] for rid in referenced_rids if rid in rid_to_slide} + + +def remove_orphaned_slides(unpacked_dir: Path) -> list[str]: + slides_dir = unpacked_dir / "ppt" / "slides" + slides_rels_dir = slides_dir / "_rels" + pres_rels_path = unpacked_dir / "ppt" / "_rels" / "presentation.xml.rels" + + if not slides_dir.exists(): + return [] + + referenced_slides = get_slides_in_sldidlst(unpacked_dir) + removed = [] + + for slide_file in slides_dir.glob("slide*.xml"): + if slide_file.name not in referenced_slides: + rel_path = slide_file.relative_to(unpacked_dir) + slide_file.unlink() + removed.append(str(rel_path)) + + rels_file = slides_rels_dir / f"{slide_file.name}.rels" + if rels_file.exists(): + rels_file.unlink() + removed.append(str(rels_file.relative_to(unpacked_dir))) + + if removed and pres_rels_path.exists(): + rels_dom = defusedxml.minidom.parse(str(pres_rels_path)) + changed = False + + for rel in list(rels_dom.getElementsByTagName("Relationship")): + target = rel.getAttribute("Target") + if target.startswith("slides/"): + slide_name = target.replace("slides/", "") + if slide_name not in referenced_slides: + if rel.parentNode: + rel.parentNode.removeChild(rel) + changed = True + + if changed: + with open(pres_rels_path, "wb") as f: + f.write(rels_dom.toxml(encoding="utf-8")) + + return removed + + +def remove_trash_directory(unpacked_dir: Path) -> list[str]: + trash_dir = unpacked_dir / "[trash]" + removed = [] + + if trash_dir.exists() and trash_dir.is_dir(): + for file_path in trash_dir.iterdir(): + if file_path.is_file(): + rel_path = file_path.relative_to(unpacked_dir) + removed.append(str(rel_path)) + file_path.unlink() + trash_dir.rmdir() + + return removed + + +def get_slide_referenced_files(unpacked_dir: Path) -> set: + referenced = set() + slides_rels_dir = unpacked_dir / "ppt" / "slides" / "_rels" + + if not slides_rels_dir.exists(): + return referenced + + for rels_file in slides_rels_dir.glob("*.rels"): + dom = defusedxml.minidom.parse(str(rels_file)) + for rel in dom.getElementsByTagName("Relationship"): + target = rel.getAttribute("Target") + if not target: + continue + target_path = (rels_file.parent.parent / target).resolve() + try: + referenced.add(target_path.relative_to(unpacked_dir.resolve())) + except ValueError: + pass + + return referenced + + +def remove_orphaned_rels_files(unpacked_dir: Path) -> list[str]: + resource_dirs = ["charts", "diagrams", "drawings"] + removed = [] + slide_referenced = get_slide_referenced_files(unpacked_dir) + + for dir_name in resource_dirs: + rels_dir = unpacked_dir / "ppt" / dir_name / "_rels" + if not rels_dir.exists(): + continue + + for rels_file in rels_dir.glob("*.rels"): + resource_file = rels_dir.parent / rels_file.name.replace(".rels", "") + try: + resource_rel_path = resource_file.resolve().relative_to(unpacked_dir.resolve()) + except ValueError: + continue + + if not resource_file.exists() or resource_rel_path not in slide_referenced: + rels_file.unlink() + rel_path = rels_file.relative_to(unpacked_dir) + removed.append(str(rel_path)) + + return removed + + +def get_referenced_files(unpacked_dir: Path) -> set: + referenced = set() + + for rels_file in unpacked_dir.rglob("*.rels"): + dom = defusedxml.minidom.parse(str(rels_file)) + for rel in dom.getElementsByTagName("Relationship"): + target = rel.getAttribute("Target") + if not target: + continue + target_path = (rels_file.parent.parent / target).resolve() + try: + referenced.add(target_path.relative_to(unpacked_dir.resolve())) + except ValueError: + pass + + return referenced + + +def remove_orphaned_files(unpacked_dir: Path, referenced: set) -> list[str]: + resource_dirs = ["media", "embeddings", "charts", "diagrams", "tags", "drawings", "ink"] + removed = [] + + for dir_name in resource_dirs: + dir_path = unpacked_dir / "ppt" / dir_name + if not dir_path.exists(): + continue + + for file_path in dir_path.glob("*"): + if not file_path.is_file(): + continue + rel_path = file_path.relative_to(unpacked_dir) + if rel_path not in referenced: + file_path.unlink() + removed.append(str(rel_path)) + + theme_dir = unpacked_dir / "ppt" / "theme" + if theme_dir.exists(): + for file_path in theme_dir.glob("theme*.xml"): + rel_path = file_path.relative_to(unpacked_dir) + if rel_path not in referenced: + file_path.unlink() + removed.append(str(rel_path)) + theme_rels = theme_dir / "_rels" / f"{file_path.name}.rels" + if theme_rels.exists(): + theme_rels.unlink() + removed.append(str(theme_rels.relative_to(unpacked_dir))) + + notes_dir = unpacked_dir / "ppt" / "notesSlides" + if notes_dir.exists(): + for file_path in notes_dir.glob("*.xml"): + if not file_path.is_file(): + continue + rel_path = file_path.relative_to(unpacked_dir) + if rel_path not in referenced: + file_path.unlink() + removed.append(str(rel_path)) + + notes_rels_dir = notes_dir / "_rels" + if notes_rels_dir.exists(): + for file_path in notes_rels_dir.glob("*.rels"): + notes_file = notes_dir / file_path.name.replace(".rels", "") + if not notes_file.exists(): + file_path.unlink() + removed.append(str(file_path.relative_to(unpacked_dir))) + + return removed + + +def update_content_types(unpacked_dir: Path, removed_files: list[str]) -> None: + ct_path = unpacked_dir / "[Content_Types].xml" + if not ct_path.exists(): + return + + dom = defusedxml.minidom.parse(str(ct_path)) + changed = False + + for override in list(dom.getElementsByTagName("Override")): + part_name = override.getAttribute("PartName").lstrip("/") + if part_name in removed_files: + if override.parentNode: + override.parentNode.removeChild(override) + changed = True + + if changed: + with open(ct_path, "wb") as f: + f.write(dom.toxml(encoding="utf-8")) + + +def clean_unused_files(unpacked_dir: Path) -> list[str]: + all_removed = [] + + slides_removed = remove_orphaned_slides(unpacked_dir) + all_removed.extend(slides_removed) + + trash_removed = remove_trash_directory(unpacked_dir) + all_removed.extend(trash_removed) + + while True: + removed_rels = remove_orphaned_rels_files(unpacked_dir) + referenced = get_referenced_files(unpacked_dir) + removed_files = remove_orphaned_files(unpacked_dir, referenced) + + total_removed = removed_rels + removed_files + if not total_removed: + break + + all_removed.extend(total_removed) + + if all_removed: + update_content_types(unpacked_dir, all_removed) + + return all_removed + + +if __name__ == "__main__": + if len(sys.argv) != 2: + print("Usage: python clean.py ", file=sys.stderr) + print("Example: python clean.py unpacked/", file=sys.stderr) + sys.exit(1) + + unpacked_dir = Path(sys.argv[1]) + + if not unpacked_dir.exists(): + print(f"Error: {unpacked_dir} not found", file=sys.stderr) + sys.exit(1) + + removed = clean_unused_files(unpacked_dir) + + if removed: + print(f"Removed {len(removed)} unreferenced files:") + for f in removed: + print(f" {f}") + else: + print("No unreferenced files found") diff --git a/.claude/skills/pptx/scripts/office/helpers/__init__.py b/.claude/skills/pptx/scripts/office/helpers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/.claude/skills/pptx/scripts/office/helpers/merge_runs.py b/.claude/skills/pptx/scripts/office/helpers/merge_runs.py new file mode 100644 index 0000000..ad7c25e --- /dev/null +++ b/.claude/skills/pptx/scripts/office/helpers/merge_runs.py @@ -0,0 +1,199 @@ +"""Merge adjacent runs with identical formatting in DOCX. + +Merges adjacent elements that have identical properties. +Works on runs in paragraphs and inside tracked changes (, ). + +Also: +- Removes rsid attributes from runs (revision metadata that doesn't affect rendering) +- Removes proofErr elements (spell/grammar markers that block merging) +""" + +from pathlib import Path + +import defusedxml.minidom + + +def merge_runs(input_dir: str) -> tuple[int, str]: + doc_xml = Path(input_dir) / "word" / "document.xml" + + if not doc_xml.exists(): + return 0, f"Error: {doc_xml} not found" + + try: + dom = defusedxml.minidom.parseString(doc_xml.read_text(encoding="utf-8")) + root = dom.documentElement + + _remove_elements(root, "proofErr") + _strip_run_rsid_attrs(root) + + containers = {run.parentNode for run in _find_elements(root, "r")} + + merge_count = 0 + for container in containers: + merge_count += _merge_runs_in(container) + + doc_xml.write_bytes(dom.toxml(encoding="UTF-8")) + return merge_count, f"Merged {merge_count} runs" + + except Exception as e: + return 0, f"Error: {e}" + + + + +def _find_elements(root, tag: str) -> list: + results = [] + + def traverse(node): + if node.nodeType == node.ELEMENT_NODE: + name = node.localName or node.tagName + if name == tag or name.endswith(f":{tag}"): + results.append(node) + for child in node.childNodes: + traverse(child) + + traverse(root) + return results + + +def _get_child(parent, tag: str): + for child in parent.childNodes: + if child.nodeType == child.ELEMENT_NODE: + name = child.localName or child.tagName + if name == tag or name.endswith(f":{tag}"): + return child + return None + + +def _get_children(parent, tag: str) -> list: + results = [] + for child in parent.childNodes: + if child.nodeType == child.ELEMENT_NODE: + name = child.localName or child.tagName + if name == tag or name.endswith(f":{tag}"): + results.append(child) + return results + + +def _is_adjacent(elem1, elem2) -> bool: + node = elem1.nextSibling + while node: + if node == elem2: + return True + if node.nodeType == node.ELEMENT_NODE: + return False + if node.nodeType == node.TEXT_NODE and node.data.strip(): + return False + node = node.nextSibling + return False + + + + +def _remove_elements(root, tag: str): + for elem in _find_elements(root, tag): + if elem.parentNode: + elem.parentNode.removeChild(elem) + + +def _strip_run_rsid_attrs(root): + for run in _find_elements(root, "r"): + for attr in list(run.attributes.values()): + if "rsid" in attr.name.lower(): + run.removeAttribute(attr.name) + + + + +def _merge_runs_in(container) -> int: + merge_count = 0 + run = _first_child_run(container) + + while run: + while True: + next_elem = _next_element_sibling(run) + if next_elem and _is_run(next_elem) and _can_merge(run, next_elem): + _merge_run_content(run, next_elem) + container.removeChild(next_elem) + merge_count += 1 + else: + break + + _consolidate_text(run) + run = _next_sibling_run(run) + + return merge_count + + +def _first_child_run(container): + for child in container.childNodes: + if child.nodeType == child.ELEMENT_NODE and _is_run(child): + return child + return None + + +def _next_element_sibling(node): + sibling = node.nextSibling + while sibling: + if sibling.nodeType == sibling.ELEMENT_NODE: + return sibling + sibling = sibling.nextSibling + return None + + +def _next_sibling_run(node): + sibling = node.nextSibling + while sibling: + if sibling.nodeType == sibling.ELEMENT_NODE: + if _is_run(sibling): + return sibling + sibling = sibling.nextSibling + return None + + +def _is_run(node) -> bool: + name = node.localName or node.tagName + return name == "r" or name.endswith(":r") + + +def _can_merge(run1, run2) -> bool: + rpr1 = _get_child(run1, "rPr") + rpr2 = _get_child(run2, "rPr") + + if (rpr1 is None) != (rpr2 is None): + return False + if rpr1 is None: + return True + return rpr1.toxml() == rpr2.toxml() + + +def _merge_run_content(target, source): + for child in list(source.childNodes): + if child.nodeType == child.ELEMENT_NODE: + name = child.localName or child.tagName + if name != "rPr" and not name.endswith(":rPr"): + target.appendChild(child) + + +def _consolidate_text(run): + t_elements = _get_children(run, "t") + + for i in range(len(t_elements) - 1, 0, -1): + curr, prev = t_elements[i], t_elements[i - 1] + + if _is_adjacent(prev, curr): + prev_text = prev.firstChild.data if prev.firstChild else "" + curr_text = curr.firstChild.data if curr.firstChild else "" + merged = prev_text + curr_text + + if prev.firstChild: + prev.firstChild.data = merged + else: + prev.appendChild(run.ownerDocument.createTextNode(merged)) + + if merged.startswith(" ") or merged.endswith(" "): + prev.setAttribute("xml:space", "preserve") + elif prev.hasAttribute("xml:space"): + prev.removeAttribute("xml:space") + + run.removeChild(curr) diff --git a/.claude/skills/pptx/scripts/office/helpers/simplify_redlines.py b/.claude/skills/pptx/scripts/office/helpers/simplify_redlines.py new file mode 100644 index 0000000..db963bb --- /dev/null +++ b/.claude/skills/pptx/scripts/office/helpers/simplify_redlines.py @@ -0,0 +1,197 @@ +"""Simplify tracked changes by merging adjacent w:ins or w:del elements. + +Merges adjacent elements from the same author into a single element. +Same for elements. This makes heavily-redlined documents easier to +work with by reducing the number of tracked change wrappers. + +Rules: +- Only merges w:ins with w:ins, w:del with w:del (same element type) +- Only merges if same author (ignores timestamp differences) +- Only merges if truly adjacent (only whitespace between them) +""" + +import xml.etree.ElementTree as ET +import zipfile +from pathlib import Path + +import defusedxml.minidom + +WORD_NS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main" + + +def simplify_redlines(input_dir: str) -> tuple[int, str]: + doc_xml = Path(input_dir) / "word" / "document.xml" + + if not doc_xml.exists(): + return 0, f"Error: {doc_xml} not found" + + try: + dom = defusedxml.minidom.parseString(doc_xml.read_text(encoding="utf-8")) + root = dom.documentElement + + merge_count = 0 + + containers = _find_elements(root, "p") + _find_elements(root, "tc") + + for container in containers: + merge_count += _merge_tracked_changes_in(container, "ins") + merge_count += _merge_tracked_changes_in(container, "del") + + doc_xml.write_bytes(dom.toxml(encoding="UTF-8")) + return merge_count, f"Simplified {merge_count} tracked changes" + + except Exception as e: + return 0, f"Error: {e}" + + +def _merge_tracked_changes_in(container, tag: str) -> int: + merge_count = 0 + + tracked = [ + child + for child in container.childNodes + if child.nodeType == child.ELEMENT_NODE and _is_element(child, tag) + ] + + if len(tracked) < 2: + return 0 + + i = 0 + while i < len(tracked) - 1: + curr = tracked[i] + next_elem = tracked[i + 1] + + if _can_merge_tracked(curr, next_elem): + _merge_tracked_content(curr, next_elem) + container.removeChild(next_elem) + tracked.pop(i + 1) + merge_count += 1 + else: + i += 1 + + return merge_count + + +def _is_element(node, tag: str) -> bool: + name = node.localName or node.tagName + return name == tag or name.endswith(f":{tag}") + + +def _get_author(elem) -> str: + author = elem.getAttribute("w:author") + if not author: + for attr in elem.attributes.values(): + if attr.localName == "author" or attr.name.endswith(":author"): + return attr.value + return author + + +def _can_merge_tracked(elem1, elem2) -> bool: + if _get_author(elem1) != _get_author(elem2): + return False + + node = elem1.nextSibling + while node and node != elem2: + if node.nodeType == node.ELEMENT_NODE: + return False + if node.nodeType == node.TEXT_NODE and node.data.strip(): + return False + node = node.nextSibling + + return True + + +def _merge_tracked_content(target, source): + while source.firstChild: + child = source.firstChild + source.removeChild(child) + target.appendChild(child) + + +def _find_elements(root, tag: str) -> list: + results = [] + + def traverse(node): + if node.nodeType == node.ELEMENT_NODE: + name = node.localName or node.tagName + if name == tag or name.endswith(f":{tag}"): + results.append(node) + for child in node.childNodes: + traverse(child) + + traverse(root) + return results + + +def get_tracked_change_authors(doc_xml_path: Path) -> dict[str, int]: + if not doc_xml_path.exists(): + return {} + + try: + tree = ET.parse(doc_xml_path) + root = tree.getroot() + except ET.ParseError: + return {} + + namespaces = {"w": WORD_NS} + author_attr = f"{{{WORD_NS}}}author" + + authors: dict[str, int] = {} + for tag in ["ins", "del"]: + for elem in root.findall(f".//w:{tag}", namespaces): + author = elem.get(author_attr) + if author: + authors[author] = authors.get(author, 0) + 1 + + return authors + + +def _get_authors_from_docx(docx_path: Path) -> dict[str, int]: + try: + with zipfile.ZipFile(docx_path, "r") as zf: + if "word/document.xml" not in zf.namelist(): + return {} + with zf.open("word/document.xml") as f: + tree = ET.parse(f) + root = tree.getroot() + + namespaces = {"w": WORD_NS} + author_attr = f"{{{WORD_NS}}}author" + + authors: dict[str, int] = {} + for tag in ["ins", "del"]: + for elem in root.findall(f".//w:{tag}", namespaces): + author = elem.get(author_attr) + if author: + authors[author] = authors.get(author, 0) + 1 + return authors + except (zipfile.BadZipFile, ET.ParseError): + return {} + + +def infer_author(modified_dir: Path, original_docx: Path, default: str = "Claude") -> str: + modified_xml = modified_dir / "word" / "document.xml" + modified_authors = get_tracked_change_authors(modified_xml) + + if not modified_authors: + return default + + original_authors = _get_authors_from_docx(original_docx) + + new_changes: dict[str, int] = {} + for author, count in modified_authors.items(): + original_count = original_authors.get(author, 0) + diff = count - original_count + if diff > 0: + new_changes[author] = diff + + if not new_changes: + return default + + if len(new_changes) == 1: + return next(iter(new_changes)) + + raise ValueError( + f"Multiple authors added new changes: {new_changes}. " + "Cannot infer which author to validate." + ) diff --git a/.claude/skills/pptx/scripts/office/pack.py b/.claude/skills/pptx/scripts/office/pack.py new file mode 100644 index 0000000..db29ed8 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/pack.py @@ -0,0 +1,159 @@ +"""Pack a directory into a DOCX, PPTX, or XLSX file. + +Validates with auto-repair, condenses XML formatting, and creates the Office file. + +Usage: + python pack.py [--original ] [--validate true|false] + +Examples: + python pack.py unpacked/ output.docx --original input.docx + python pack.py unpacked/ output.pptx --validate false +""" + +import argparse +import sys +import shutil +import tempfile +import zipfile +from pathlib import Path + +import defusedxml.minidom + +from validators import DOCXSchemaValidator, PPTXSchemaValidator, RedliningValidator + +def pack( + input_directory: str, + output_file: str, + original_file: str | None = None, + validate: bool = True, + infer_author_func=None, +) -> tuple[None, str]: + input_dir = Path(input_directory) + output_path = Path(output_file) + suffix = output_path.suffix.lower() + + if not input_dir.is_dir(): + return None, f"Error: {input_dir} is not a directory" + + if suffix not in {".docx", ".pptx", ".xlsx"}: + return None, f"Error: {output_file} must be a .docx, .pptx, or .xlsx file" + + if validate and original_file: + original_path = Path(original_file) + if original_path.exists(): + success, output = _run_validation( + input_dir, original_path, suffix, infer_author_func + ) + if output: + print(output) + if not success: + return None, f"Error: Validation failed for {input_dir}" + + with tempfile.TemporaryDirectory() as temp_dir: + temp_content_dir = Path(temp_dir) / "content" + shutil.copytree(input_dir, temp_content_dir) + + for pattern in ["*.xml", "*.rels"]: + for xml_file in temp_content_dir.rglob(pattern): + _condense_xml(xml_file) + + output_path.parent.mkdir(parents=True, exist_ok=True) + with zipfile.ZipFile(output_path, "w", zipfile.ZIP_DEFLATED) as zf: + for f in temp_content_dir.rglob("*"): + if f.is_file(): + zf.write(f, f.relative_to(temp_content_dir)) + + return None, f"Successfully packed {input_dir} to {output_file}" + + +def _run_validation( + unpacked_dir: Path, + original_file: Path, + suffix: str, + infer_author_func=None, +) -> tuple[bool, str | None]: + output_lines = [] + validators = [] + + if suffix == ".docx": + author = "Claude" + if infer_author_func: + try: + author = infer_author_func(unpacked_dir, original_file) + except ValueError as e: + print(f"Warning: {e} Using default author 'Claude'.", file=sys.stderr) + + validators = [ + DOCXSchemaValidator(unpacked_dir, original_file), + RedliningValidator(unpacked_dir, original_file, author=author), + ] + elif suffix == ".pptx": + validators = [PPTXSchemaValidator(unpacked_dir, original_file)] + + if not validators: + return True, None + + total_repairs = sum(v.repair() for v in validators) + if total_repairs: + output_lines.append(f"Auto-repaired {total_repairs} issue(s)") + + success = all(v.validate() for v in validators) + + if success: + output_lines.append("All validations PASSED!") + + return success, "\n".join(output_lines) if output_lines else None + + +def _condense_xml(xml_file: Path) -> None: + try: + with open(xml_file, encoding="utf-8") as f: + dom = defusedxml.minidom.parse(f) + + for element in dom.getElementsByTagName("*"): + if element.tagName.endswith(":t"): + continue + + for child in list(element.childNodes): + if ( + child.nodeType == child.TEXT_NODE + and child.nodeValue + and child.nodeValue.strip() == "" + ) or child.nodeType == child.COMMENT_NODE: + element.removeChild(child) + + xml_file.write_bytes(dom.toxml(encoding="UTF-8")) + except Exception as e: + print(f"ERROR: Failed to parse {xml_file.name}: {e}", file=sys.stderr) + raise + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Pack a directory into a DOCX, PPTX, or XLSX file" + ) + parser.add_argument("input_directory", help="Unpacked Office document directory") + parser.add_argument("output_file", help="Output Office file (.docx/.pptx/.xlsx)") + parser.add_argument( + "--original", + help="Original file for validation comparison", + ) + parser.add_argument( + "--validate", + type=lambda x: x.lower() == "true", + default=True, + metavar="true|false", + help="Run validation with auto-repair (default: true)", + ) + args = parser.parse_args() + + _, message = pack( + args.input_directory, + args.output_file, + original_file=args.original, + validate=args.validate, + ) + print(message) + + if "Error" in message: + sys.exit(1) diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd new file mode 100644 index 0000000..6454ef9 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd @@ -0,0 +1,1499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd new file mode 100644 index 0000000..afa4f46 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd new file mode 100644 index 0000000..64e66b8 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd @@ -0,0 +1,1085 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd new file mode 100644 index 0000000..687eea8 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd @@ -0,0 +1,11 @@ + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd new file mode 100644 index 0000000..6ac81b0 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd @@ -0,0 +1,3081 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd new file mode 100644 index 0000000..1dbf051 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd new file mode 100644 index 0000000..f1af17d --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd new file mode 100644 index 0000000..0a185ab --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd @@ -0,0 +1,287 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd new file mode 100644 index 0000000..14ef488 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd @@ -0,0 +1,1676 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd new file mode 100644 index 0000000..c20f3bf --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd new file mode 100644 index 0000000..ac60252 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd new file mode 100644 index 0000000..424b8ba --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd new file mode 100644 index 0000000..2bddce2 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd new file mode 100644 index 0000000..8a8c18b --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd new file mode 100644 index 0000000..5c42706 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd new file mode 100644 index 0000000..853c341 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd new file mode 100644 index 0000000..da835ee --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd new file mode 100644 index 0000000..87ad265 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd @@ -0,0 +1,582 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd new file mode 100644 index 0000000..9e86f1b --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd new file mode 100644 index 0000000..d0be42e --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd @@ -0,0 +1,4439 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd new file mode 100644 index 0000000..8821dd1 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd @@ -0,0 +1,570 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd new file mode 100644 index 0000000..ca2575c --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd @@ -0,0 +1,509 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd new file mode 100644 index 0000000..dd079e6 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd new file mode 100644 index 0000000..3dd6cf6 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd new file mode 100644 index 0000000..f1041e3 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd new file mode 100644 index 0000000..9c5b7a6 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd @@ -0,0 +1,3646 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd new file mode 100644 index 0000000..0f13678 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd @@ -0,0 +1,116 @@ + + + + + + See http://www.w3.org/XML/1998/namespace.html and + http://www.w3.org/TR/REC-xml for information about this namespace. + + This schema document describes the XML namespace, in a form + suitable for import by other schema documents. + + Note that local names in this namespace are intended to be defined + only by the World Wide Web Consortium or its subgroups. The + following names are currently defined in this namespace and should + not be used with conflicting semantics by any Working Group, + specification, or document instance: + + base (as an attribute name): denotes an attribute whose value + provides a URI to be used as the base for interpreting any + relative URIs in the scope of the element on which it + appears; its value is inherited. This name is reserved + by virtue of its definition in the XML Base specification. + + lang (as an attribute name): denotes an attribute whose value + is a language code for the natural language of the content of + any element; its value is inherited. This name is reserved + by virtue of its definition in the XML specification. + + space (as an attribute name): denotes an attribute whose + value is a keyword indicating what whitespace processing + discipline is intended for the content of the element; its + value is inherited. This name is reserved by virtue of its + definition in the XML specification. + + Father (in any context at all): denotes Jon Bosak, the chair of + the original XML Working Group. This name is reserved by + the following decision of the W3C XML Plenary and + XML Coordination groups: + + In appreciation for his vision, leadership and dedication + the W3C XML Plenary on this 10th day of February, 2000 + reserves for Jon Bosak in perpetuity the XML name + xml:Father + + + + + This schema defines attributes and an attribute group + suitable for use by + schemas wishing to allow xml:base, xml:lang or xml:space attributes + on elements they define. + + To enable this, such a schema must import this schema + for the XML namespace, e.g. as follows: + <schema . . .> + . . . + <import namespace="http://www.w3.org/XML/1998/namespace" + schemaLocation="http://www.w3.org/2001/03/xml.xsd"/> + + Subsequently, qualified reference to any of the attributes + or the group defined below will have the desired effect, e.g. + + <type . . .> + . . . + <attributeGroup ref="xml:specialAttrs"/> + + will define a type which will schema-validate an instance + element with any of those attributes + + + + In keeping with the XML Schema WG's standard versioning + policy, this schema document will persist at + http://www.w3.org/2001/03/xml.xsd. + At the date of issue it can also be found at + http://www.w3.org/2001/xml.xsd. + The schema document at that URI may however change in the future, + in order to remain compatible with the latest version of XML Schema + itself. In other words, if the XML Schema namespace changes, the version + of this document at + http://www.w3.org/2001/xml.xsd will change + accordingly; the version at + http://www.w3.org/2001/03/xml.xsd will not change. + + + + + + In due course, we should install the relevant ISO 2- and 3-letter + codes as the enumerated possible values . . . + + + + + + + + + + + + + + + See http://www.w3.org/TR/xmlbase/ for + information about this attribute. + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd b/.claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd new file mode 100644 index 0000000..a6de9d2 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd b/.claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd new file mode 100644 index 0000000..10e978b --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd b/.claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd new file mode 100644 index 0000000..4248bf7 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd b/.claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd new file mode 100644 index 0000000..5649746 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/mce/mc.xsd b/.claude/skills/pptx/scripts/office/schemas/mce/mc.xsd new file mode 100644 index 0000000..ef72545 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/mce/mc.xsd @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd b/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd new file mode 100644 index 0000000..f65f777 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd @@ -0,0 +1,560 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd b/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd new file mode 100644 index 0000000..6b00755 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd b/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd new file mode 100644 index 0000000..f321d33 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd b/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd new file mode 100644 index 0000000..364c6a9 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd b/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd new file mode 100644 index 0000000..fed9d15 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd b/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd new file mode 100644 index 0000000..680cf15 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd @@ -0,0 +1,4 @@ + + + + diff --git a/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd b/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd new file mode 100644 index 0000000..89ada90 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/.claude/skills/pptx/scripts/office/soffice.py b/.claude/skills/pptx/scripts/office/soffice.py new file mode 100644 index 0000000..c7f7e32 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/soffice.py @@ -0,0 +1,183 @@ +""" +Helper for running LibreOffice (soffice) in environments where AF_UNIX +sockets may be blocked (e.g., sandboxed VMs). Detects the restriction +at runtime and applies an LD_PRELOAD shim if needed. + +Usage: + from office.soffice import run_soffice, get_soffice_env + + # Option 1 – run soffice directly + result = run_soffice(["--headless", "--convert-to", "pdf", "input.docx"]) + + # Option 2 – get env dict for your own subprocess calls + env = get_soffice_env() + subprocess.run(["soffice", ...], env=env) +""" + +import os +import socket +import subprocess +import tempfile +from pathlib import Path + + +def get_soffice_env() -> dict: + env = os.environ.copy() + env["SAL_USE_VCLPLUGIN"] = "svp" + + if _needs_shim(): + shim = _ensure_shim() + env["LD_PRELOAD"] = str(shim) + + return env + + +def run_soffice(args: list[str], **kwargs) -> subprocess.CompletedProcess: + env = get_soffice_env() + return subprocess.run(["soffice"] + args, env=env, **kwargs) + + + +_SHIM_SO = Path(tempfile.gettempdir()) / "lo_socket_shim.so" + + +def _needs_shim() -> bool: + try: + s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + s.close() + return False + except OSError: + return True + + +def _ensure_shim() -> Path: + if _SHIM_SO.exists(): + return _SHIM_SO + + src = Path(tempfile.gettempdir()) / "lo_socket_shim.c" + src.write_text(_SHIM_SOURCE) + subprocess.run( + ["gcc", "-shared", "-fPIC", "-o", str(_SHIM_SO), str(src), "-ldl"], + check=True, + capture_output=True, + ) + src.unlink() + return _SHIM_SO + + + +_SHIM_SOURCE = r""" +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include + +static int (*real_socket)(int, int, int); +static int (*real_socketpair)(int, int, int, int[2]); +static int (*real_listen)(int, int); +static int (*real_accept)(int, struct sockaddr *, socklen_t *); +static int (*real_close)(int); +static int (*real_read)(int, void *, size_t); + +/* Per-FD bookkeeping (FDs >= 1024 are passed through unshimmed). */ +static int is_shimmed[1024]; +static int peer_of[1024]; +static int wake_r[1024]; /* accept() blocks reading this */ +static int wake_w[1024]; /* close() writes to this */ +static int listener_fd = -1; /* FD that received listen() */ + +__attribute__((constructor)) +static void init(void) { + real_socket = dlsym(RTLD_NEXT, "socket"); + real_socketpair = dlsym(RTLD_NEXT, "socketpair"); + real_listen = dlsym(RTLD_NEXT, "listen"); + real_accept = dlsym(RTLD_NEXT, "accept"); + real_close = dlsym(RTLD_NEXT, "close"); + real_read = dlsym(RTLD_NEXT, "read"); + for (int i = 0; i < 1024; i++) { + peer_of[i] = -1; + wake_r[i] = -1; + wake_w[i] = -1; + } +} + +/* ---- socket ---------------------------------------------------------- */ +int socket(int domain, int type, int protocol) { + if (domain == AF_UNIX) { + int fd = real_socket(domain, type, protocol); + if (fd >= 0) return fd; + /* socket(AF_UNIX) blocked – fall back to socketpair(). */ + int sv[2]; + if (real_socketpair(domain, type, protocol, sv) == 0) { + if (sv[0] >= 0 && sv[0] < 1024) { + is_shimmed[sv[0]] = 1; + peer_of[sv[0]] = sv[1]; + int wp[2]; + if (pipe(wp) == 0) { + wake_r[sv[0]] = wp[0]; + wake_w[sv[0]] = wp[1]; + } + } + return sv[0]; + } + errno = EPERM; + return -1; + } + return real_socket(domain, type, protocol); +} + +/* ---- listen ---------------------------------------------------------- */ +int listen(int sockfd, int backlog) { + if (sockfd >= 0 && sockfd < 1024 && is_shimmed[sockfd]) { + listener_fd = sockfd; + return 0; + } + return real_listen(sockfd, backlog); +} + +/* ---- accept ---------------------------------------------------------- */ +int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) { + if (sockfd >= 0 && sockfd < 1024 && is_shimmed[sockfd]) { + /* Block until close() writes to the wake pipe. */ + if (wake_r[sockfd] >= 0) { + char buf; + real_read(wake_r[sockfd], &buf, 1); + } + errno = ECONNABORTED; + return -1; + } + return real_accept(sockfd, addr, addrlen); +} + +/* ---- close ----------------------------------------------------------- */ +int close(int fd) { + if (fd >= 0 && fd < 1024 && is_shimmed[fd]) { + int was_listener = (fd == listener_fd); + is_shimmed[fd] = 0; + + if (wake_w[fd] >= 0) { /* unblock accept() */ + char c = 0; + write(wake_w[fd], &c, 1); + real_close(wake_w[fd]); + wake_w[fd] = -1; + } + if (wake_r[fd] >= 0) { real_close(wake_r[fd]); wake_r[fd] = -1; } + if (peer_of[fd] >= 0) { real_close(peer_of[fd]); peer_of[fd] = -1; } + + if (was_listener) + _exit(0); /* conversion done – exit */ + } + return real_close(fd); +} +""" + + + +if __name__ == "__main__": + import sys + result = run_soffice(sys.argv[1:]) + sys.exit(result.returncode) diff --git a/.claude/skills/pptx/scripts/office/unpack.py b/.claude/skills/pptx/scripts/office/unpack.py new file mode 100644 index 0000000..0015253 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/unpack.py @@ -0,0 +1,132 @@ +"""Unpack Office files (DOCX, PPTX, XLSX) for editing. + +Extracts the ZIP archive, pretty-prints XML files, and optionally: +- Merges adjacent runs with identical formatting (DOCX only) +- Simplifies adjacent tracked changes from same author (DOCX only) + +Usage: + python unpack.py [options] + +Examples: + python unpack.py document.docx unpacked/ + python unpack.py presentation.pptx unpacked/ + python unpack.py document.docx unpacked/ --merge-runs false +""" + +import argparse +import sys +import zipfile +from pathlib import Path + +import defusedxml.minidom + +from helpers.merge_runs import merge_runs as do_merge_runs +from helpers.simplify_redlines import simplify_redlines as do_simplify_redlines + +SMART_QUOTE_REPLACEMENTS = { + "\u201c": "“", + "\u201d": "”", + "\u2018": "‘", + "\u2019": "’", +} + + +def unpack( + input_file: str, + output_directory: str, + merge_runs: bool = True, + simplify_redlines: bool = True, +) -> tuple[None, str]: + input_path = Path(input_file) + output_path = Path(output_directory) + suffix = input_path.suffix.lower() + + if not input_path.exists(): + return None, f"Error: {input_file} does not exist" + + if suffix not in {".docx", ".pptx", ".xlsx"}: + return None, f"Error: {input_file} must be a .docx, .pptx, or .xlsx file" + + try: + output_path.mkdir(parents=True, exist_ok=True) + + with zipfile.ZipFile(input_path, "r") as zf: + zf.extractall(output_path) + + xml_files = list(output_path.rglob("*.xml")) + list(output_path.rglob("*.rels")) + for xml_file in xml_files: + _pretty_print_xml(xml_file) + + message = f"Unpacked {input_file} ({len(xml_files)} XML files)" + + if suffix == ".docx": + if simplify_redlines: + simplify_count, _ = do_simplify_redlines(str(output_path)) + message += f", simplified {simplify_count} tracked changes" + + if merge_runs: + merge_count, _ = do_merge_runs(str(output_path)) + message += f", merged {merge_count} runs" + + for xml_file in xml_files: + _escape_smart_quotes(xml_file) + + return None, message + + except zipfile.BadZipFile: + return None, f"Error: {input_file} is not a valid Office file" + except Exception as e: + return None, f"Error unpacking: {e}" + + +def _pretty_print_xml(xml_file: Path) -> None: + try: + content = xml_file.read_text(encoding="utf-8") + dom = defusedxml.minidom.parseString(content) + xml_file.write_bytes(dom.toprettyxml(indent=" ", encoding="utf-8")) + except Exception: + pass + + +def _escape_smart_quotes(xml_file: Path) -> None: + try: + content = xml_file.read_text(encoding="utf-8") + for char, entity in SMART_QUOTE_REPLACEMENTS.items(): + content = content.replace(char, entity) + xml_file.write_text(content, encoding="utf-8") + except Exception: + pass + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Unpack an Office file (DOCX, PPTX, XLSX) for editing" + ) + parser.add_argument("input_file", help="Office file to unpack") + parser.add_argument("output_directory", help="Output directory") + parser.add_argument( + "--merge-runs", + type=lambda x: x.lower() == "true", + default=True, + metavar="true|false", + help="Merge adjacent runs with identical formatting (DOCX only, default: true)", + ) + parser.add_argument( + "--simplify-redlines", + type=lambda x: x.lower() == "true", + default=True, + metavar="true|false", + help="Merge adjacent tracked changes from same author (DOCX only, default: true)", + ) + args = parser.parse_args() + + _, message = unpack( + args.input_file, + args.output_directory, + merge_runs=args.merge_runs, + simplify_redlines=args.simplify_redlines, + ) + print(message) + + if "Error" in message: + sys.exit(1) diff --git a/.claude/skills/pptx/scripts/office/validate.py b/.claude/skills/pptx/scripts/office/validate.py new file mode 100644 index 0000000..03b01f6 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/validate.py @@ -0,0 +1,111 @@ +""" +Command line tool to validate Office document XML files against XSD schemas and tracked changes. + +Usage: + python validate.py [--original ] [--auto-repair] [--author NAME] + +The first argument can be either: +- An unpacked directory containing the Office document XML files +- A packed Office file (.docx/.pptx/.xlsx) which will be unpacked to a temp directory + +Auto-repair fixes: +- paraId/durableId values that exceed OOXML limits +- Missing xml:space="preserve" on w:t elements with whitespace +""" + +import argparse +import sys +import tempfile +import zipfile +from pathlib import Path + +from validators import DOCXSchemaValidator, PPTXSchemaValidator, RedliningValidator + + +def main(): + parser = argparse.ArgumentParser(description="Validate Office document XML files") + parser.add_argument( + "path", + help="Path to unpacked directory or packed Office file (.docx/.pptx/.xlsx)", + ) + parser.add_argument( + "--original", + required=False, + default=None, + help="Path to original file (.docx/.pptx/.xlsx). If omitted, all XSD errors are reported and redlining validation is skipped.", + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + help="Enable verbose output", + ) + parser.add_argument( + "--auto-repair", + action="store_true", + help="Automatically repair common issues (hex IDs, whitespace preservation)", + ) + parser.add_argument( + "--author", + default="Claude", + help="Author name for redlining validation (default: Claude)", + ) + args = parser.parse_args() + + path = Path(args.path) + assert path.exists(), f"Error: {path} does not exist" + + original_file = None + if args.original: + original_file = Path(args.original) + assert original_file.is_file(), f"Error: {original_file} is not a file" + assert original_file.suffix.lower() in [".docx", ".pptx", ".xlsx"], ( + f"Error: {original_file} must be a .docx, .pptx, or .xlsx file" + ) + + file_extension = (original_file or path).suffix.lower() + assert file_extension in [".docx", ".pptx", ".xlsx"], ( + f"Error: Cannot determine file type from {path}. Use --original or provide a .docx/.pptx/.xlsx file." + ) + + if path.is_file() and path.suffix.lower() in [".docx", ".pptx", ".xlsx"]: + temp_dir = tempfile.mkdtemp() + with zipfile.ZipFile(path, "r") as zf: + zf.extractall(temp_dir) + unpacked_dir = Path(temp_dir) + else: + assert path.is_dir(), f"Error: {path} is not a directory or Office file" + unpacked_dir = path + + match file_extension: + case ".docx": + validators = [ + DOCXSchemaValidator(unpacked_dir, original_file, verbose=args.verbose), + ] + if original_file: + validators.append( + RedliningValidator(unpacked_dir, original_file, verbose=args.verbose, author=args.author) + ) + case ".pptx": + validators = [ + PPTXSchemaValidator(unpacked_dir, original_file, verbose=args.verbose), + ] + case _: + print(f"Error: Validation not supported for file type {file_extension}") + sys.exit(1) + + if args.auto_repair: + total_repairs = sum(v.repair() for v in validators) + if total_repairs: + print(f"Auto-repaired {total_repairs} issue(s)") + + success = all(v.validate() for v in validators) + + if success: + print("All validations PASSED!") + + sys.exit(0 if success else 1) + + +if __name__ == "__main__": + main() diff --git a/.claude/skills/pptx/scripts/office/validators/__init__.py b/.claude/skills/pptx/scripts/office/validators/__init__.py new file mode 100644 index 0000000..db092ec --- /dev/null +++ b/.claude/skills/pptx/scripts/office/validators/__init__.py @@ -0,0 +1,15 @@ +""" +Validation modules for Word document processing. +""" + +from .base import BaseSchemaValidator +from .docx import DOCXSchemaValidator +from .pptx import PPTXSchemaValidator +from .redlining import RedliningValidator + +__all__ = [ + "BaseSchemaValidator", + "DOCXSchemaValidator", + "PPTXSchemaValidator", + "RedliningValidator", +] diff --git a/.claude/skills/pptx/scripts/office/validators/base.py b/.claude/skills/pptx/scripts/office/validators/base.py new file mode 100644 index 0000000..db4a06a --- /dev/null +++ b/.claude/skills/pptx/scripts/office/validators/base.py @@ -0,0 +1,847 @@ +""" +Base validator with common validation logic for document files. +""" + +import re +from pathlib import Path + +import defusedxml.minidom +import lxml.etree + + +class BaseSchemaValidator: + + IGNORED_VALIDATION_ERRORS = [ + "hyphenationZone", + "purl.org/dc/terms", + ] + + UNIQUE_ID_REQUIREMENTS = { + "comment": ("id", "file"), + "commentrangestart": ("id", "file"), + "commentrangeend": ("id", "file"), + "bookmarkstart": ("id", "file"), + "bookmarkend": ("id", "file"), + "sldid": ("id", "file"), + "sldmasterid": ("id", "global"), + "sldlayoutid": ("id", "global"), + "cm": ("authorid", "file"), + "sheet": ("sheetid", "file"), + "definedname": ("id", "file"), + "cxnsp": ("id", "file"), + "sp": ("id", "file"), + "pic": ("id", "file"), + "grpsp": ("id", "file"), + } + + EXCLUDED_ID_CONTAINERS = { + "sectionlst", + } + + ELEMENT_RELATIONSHIP_TYPES = {} + + SCHEMA_MAPPINGS = { + "word": "ISO-IEC29500-4_2016/wml.xsd", + "ppt": "ISO-IEC29500-4_2016/pml.xsd", + "xl": "ISO-IEC29500-4_2016/sml.xsd", + "[Content_Types].xml": "ecma/fouth-edition/opc-contentTypes.xsd", + "app.xml": "ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd", + "core.xml": "ecma/fouth-edition/opc-coreProperties.xsd", + "custom.xml": "ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd", + ".rels": "ecma/fouth-edition/opc-relationships.xsd", + "people.xml": "microsoft/wml-2012.xsd", + "commentsIds.xml": "microsoft/wml-cid-2016.xsd", + "commentsExtensible.xml": "microsoft/wml-cex-2018.xsd", + "commentsExtended.xml": "microsoft/wml-2012.xsd", + "chart": "ISO-IEC29500-4_2016/dml-chart.xsd", + "theme": "ISO-IEC29500-4_2016/dml-main.xsd", + "drawing": "ISO-IEC29500-4_2016/dml-main.xsd", + } + + MC_NAMESPACE = "http://schemas.openxmlformats.org/markup-compatibility/2006" + XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace" + + PACKAGE_RELATIONSHIPS_NAMESPACE = ( + "http://schemas.openxmlformats.org/package/2006/relationships" + ) + OFFICE_RELATIONSHIPS_NAMESPACE = ( + "http://schemas.openxmlformats.org/officeDocument/2006/relationships" + ) + CONTENT_TYPES_NAMESPACE = ( + "http://schemas.openxmlformats.org/package/2006/content-types" + ) + + MAIN_CONTENT_FOLDERS = {"word", "ppt", "xl"} + + OOXML_NAMESPACES = { + "http://schemas.openxmlformats.org/officeDocument/2006/math", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships", + "http://schemas.openxmlformats.org/schemaLibrary/2006/main", + "http://schemas.openxmlformats.org/drawingml/2006/main", + "http://schemas.openxmlformats.org/drawingml/2006/chart", + "http://schemas.openxmlformats.org/drawingml/2006/chartDrawing", + "http://schemas.openxmlformats.org/drawingml/2006/diagram", + "http://schemas.openxmlformats.org/drawingml/2006/picture", + "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing", + "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing", + "http://schemas.openxmlformats.org/wordprocessingml/2006/main", + "http://schemas.openxmlformats.org/presentationml/2006/main", + "http://schemas.openxmlformats.org/spreadsheetml/2006/main", + "http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes", + "http://www.w3.org/XML/1998/namespace", + } + + def __init__(self, unpacked_dir, original_file=None, verbose=False): + self.unpacked_dir = Path(unpacked_dir).resolve() + self.original_file = Path(original_file) if original_file else None + self.verbose = verbose + + self.schemas_dir = Path(__file__).parent.parent / "schemas" + + patterns = ["*.xml", "*.rels"] + self.xml_files = [ + f for pattern in patterns for f in self.unpacked_dir.rglob(pattern) + ] + + if not self.xml_files: + print(f"Warning: No XML files found in {self.unpacked_dir}") + + def validate(self): + raise NotImplementedError("Subclasses must implement the validate method") + + def repair(self) -> int: + return self.repair_whitespace_preservation() + + def repair_whitespace_preservation(self) -> int: + repairs = 0 + + for xml_file in self.xml_files: + try: + content = xml_file.read_text(encoding="utf-8") + dom = defusedxml.minidom.parseString(content) + modified = False + + for elem in dom.getElementsByTagName("*"): + if elem.tagName.endswith(":t") and elem.firstChild: + text = elem.firstChild.nodeValue + if text and (text.startswith((' ', '\t')) or text.endswith((' ', '\t'))): + if elem.getAttribute("xml:space") != "preserve": + elem.setAttribute("xml:space", "preserve") + text_preview = repr(text[:30]) + "..." if len(text) > 30 else repr(text) + print(f" Repaired: {xml_file.name}: Added xml:space='preserve' to {elem.tagName}: {text_preview}") + repairs += 1 + modified = True + + if modified: + xml_file.write_bytes(dom.toxml(encoding="UTF-8")) + + except Exception: + pass + + return repairs + + def validate_xml(self): + errors = [] + + for xml_file in self.xml_files: + try: + lxml.etree.parse(str(xml_file)) + except lxml.etree.XMLSyntaxError as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {e.lineno}: {e.msg}" + ) + except Exception as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Unexpected error: {str(e)}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} XML violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All XML files are well-formed") + return True + + def validate_namespaces(self): + errors = [] + + for xml_file in self.xml_files: + try: + root = lxml.etree.parse(str(xml_file)).getroot() + declared = set(root.nsmap.keys()) - {None} + + for attr_val in [ + v for k, v in root.attrib.items() if k.endswith("Ignorable") + ]: + undeclared = set(attr_val.split()) - declared + errors.extend( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Namespace '{ns}' in Ignorable but not declared" + for ns in undeclared + ) + except lxml.etree.XMLSyntaxError: + continue + + if errors: + print(f"FAILED - {len(errors)} namespace issues:") + for error in errors: + print(error) + return False + if self.verbose: + print("PASSED - All namespace prefixes properly declared") + return True + + def validate_unique_ids(self): + errors = [] + global_ids = {} + + for xml_file in self.xml_files: + try: + root = lxml.etree.parse(str(xml_file)).getroot() + file_ids = {} + + mc_elements = root.xpath( + ".//mc:AlternateContent", namespaces={"mc": self.MC_NAMESPACE} + ) + for elem in mc_elements: + elem.getparent().remove(elem) + + for elem in root.iter(): + tag = ( + elem.tag.split("}")[-1].lower() + if "}" in elem.tag + else elem.tag.lower() + ) + + if tag in self.UNIQUE_ID_REQUIREMENTS: + in_excluded_container = any( + ancestor.tag.split("}")[-1].lower() in self.EXCLUDED_ID_CONTAINERS + for ancestor in elem.iterancestors() + ) + if in_excluded_container: + continue + + attr_name, scope = self.UNIQUE_ID_REQUIREMENTS[tag] + + id_value = None + for attr, value in elem.attrib.items(): + attr_local = ( + attr.split("}")[-1].lower() + if "}" in attr + else attr.lower() + ) + if attr_local == attr_name: + id_value = value + break + + if id_value is not None: + if scope == "global": + if id_value in global_ids: + prev_file, prev_line, prev_tag = global_ids[ + id_value + ] + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {elem.sourceline}: Global ID '{id_value}' in <{tag}> " + f"already used in {prev_file} at line {prev_line} in <{prev_tag}>" + ) + else: + global_ids[id_value] = ( + xml_file.relative_to(self.unpacked_dir), + elem.sourceline, + tag, + ) + elif scope == "file": + key = (tag, attr_name) + if key not in file_ids: + file_ids[key] = {} + + if id_value in file_ids[key]: + prev_line = file_ids[key][id_value] + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {elem.sourceline}: Duplicate {attr_name}='{id_value}' in <{tag}> " + f"(first occurrence at line {prev_line})" + ) + else: + file_ids[key][id_value] = elem.sourceline + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} ID uniqueness violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All required IDs are unique") + return True + + def validate_file_references(self): + errors = [] + + rels_files = list(self.unpacked_dir.rglob("*.rels")) + + if not rels_files: + if self.verbose: + print("PASSED - No .rels files found") + return True + + all_files = [] + for file_path in self.unpacked_dir.rglob("*"): + if ( + file_path.is_file() + and file_path.name != "[Content_Types].xml" + and not file_path.name.endswith(".rels") + ): + all_files.append(file_path.resolve()) + + all_referenced_files = set() + + if self.verbose: + print( + f"Found {len(rels_files)} .rels files and {len(all_files)} target files" + ) + + for rels_file in rels_files: + try: + rels_root = lxml.etree.parse(str(rels_file)).getroot() + + rels_dir = rels_file.parent + + referenced_files = set() + broken_refs = [] + + for rel in rels_root.findall( + ".//ns:Relationship", + namespaces={"ns": self.PACKAGE_RELATIONSHIPS_NAMESPACE}, + ): + target = rel.get("Target") + if target and not target.startswith( + ("http", "mailto:") + ): + if target.startswith("/"): + target_path = self.unpacked_dir / target.lstrip("/") + elif rels_file.name == ".rels": + target_path = self.unpacked_dir / target + else: + base_dir = rels_dir.parent + target_path = base_dir / target + + try: + target_path = target_path.resolve() + if target_path.exists() and target_path.is_file(): + referenced_files.add(target_path) + all_referenced_files.add(target_path) + else: + broken_refs.append((target, rel.sourceline)) + except (OSError, ValueError): + broken_refs.append((target, rel.sourceline)) + + if broken_refs: + rel_path = rels_file.relative_to(self.unpacked_dir) + for broken_ref, line_num in broken_refs: + errors.append( + f" {rel_path}: Line {line_num}: Broken reference to {broken_ref}" + ) + + except Exception as e: + rel_path = rels_file.relative_to(self.unpacked_dir) + errors.append(f" Error parsing {rel_path}: {e}") + + unreferenced_files = set(all_files) - all_referenced_files + + if unreferenced_files: + for unref_file in sorted(unreferenced_files): + unref_rel_path = unref_file.relative_to(self.unpacked_dir) + errors.append(f" Unreferenced file: {unref_rel_path}") + + if errors: + print(f"FAILED - Found {len(errors)} relationship validation errors:") + for error in errors: + print(error) + print( + "CRITICAL: These errors will cause the document to appear corrupt. " + + "Broken references MUST be fixed, " + + "and unreferenced files MUST be referenced or removed." + ) + return False + else: + if self.verbose: + print( + "PASSED - All references are valid and all files are properly referenced" + ) + return True + + def validate_all_relationship_ids(self): + import lxml.etree + + errors = [] + + for xml_file in self.xml_files: + if xml_file.suffix == ".rels": + continue + + rels_dir = xml_file.parent / "_rels" + rels_file = rels_dir / f"{xml_file.name}.rels" + + if not rels_file.exists(): + continue + + try: + rels_root = lxml.etree.parse(str(rels_file)).getroot() + rid_to_type = {} + + for rel in rels_root.findall( + f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship" + ): + rid = rel.get("Id") + rel_type = rel.get("Type", "") + if rid: + if rid in rid_to_type: + rels_rel_path = rels_file.relative_to(self.unpacked_dir) + errors.append( + f" {rels_rel_path}: Line {rel.sourceline}: " + f"Duplicate relationship ID '{rid}' (IDs must be unique)" + ) + type_name = ( + rel_type.split("/")[-1] if "/" in rel_type else rel_type + ) + rid_to_type[rid] = type_name + + xml_root = lxml.etree.parse(str(xml_file)).getroot() + + r_ns = self.OFFICE_RELATIONSHIPS_NAMESPACE + rid_attrs_to_check = ["id", "embed", "link"] + for elem in xml_root.iter(): + for attr_name in rid_attrs_to_check: + rid_attr = elem.get(f"{{{r_ns}}}{attr_name}") + if not rid_attr: + continue + xml_rel_path = xml_file.relative_to(self.unpacked_dir) + elem_name = ( + elem.tag.split("}")[-1] if "}" in elem.tag else elem.tag + ) + + if rid_attr not in rid_to_type: + errors.append( + f" {xml_rel_path}: Line {elem.sourceline}: " + f"<{elem_name}> r:{attr_name} references non-existent relationship '{rid_attr}' " + f"(valid IDs: {', '.join(sorted(rid_to_type.keys())[:5])}{'...' if len(rid_to_type) > 5 else ''})" + ) + elif attr_name == "id" and self.ELEMENT_RELATIONSHIP_TYPES: + expected_type = self._get_expected_relationship_type( + elem_name + ) + if expected_type: + actual_type = rid_to_type[rid_attr] + if expected_type not in actual_type.lower(): + errors.append( + f" {xml_rel_path}: Line {elem.sourceline}: " + f"<{elem_name}> references '{rid_attr}' which points to '{actual_type}' " + f"but should point to a '{expected_type}' relationship" + ) + + except Exception as e: + xml_rel_path = xml_file.relative_to(self.unpacked_dir) + errors.append(f" Error processing {xml_rel_path}: {e}") + + if errors: + print(f"FAILED - Found {len(errors)} relationship ID reference errors:") + for error in errors: + print(error) + print("\nThese ID mismatches will cause the document to appear corrupt!") + return False + else: + if self.verbose: + print("PASSED - All relationship ID references are valid") + return True + + def _get_expected_relationship_type(self, element_name): + elem_lower = element_name.lower() + + if elem_lower in self.ELEMENT_RELATIONSHIP_TYPES: + return self.ELEMENT_RELATIONSHIP_TYPES[elem_lower] + + if elem_lower.endswith("id") and len(elem_lower) > 2: + prefix = elem_lower[:-2] + if prefix.endswith("master"): + return prefix.lower() + elif prefix.endswith("layout"): + return prefix.lower() + else: + if prefix == "sld": + return "slide" + return prefix.lower() + + if elem_lower.endswith("reference") and len(elem_lower) > 9: + prefix = elem_lower[:-9] + return prefix.lower() + + return None + + def validate_content_types(self): + errors = [] + + content_types_file = self.unpacked_dir / "[Content_Types].xml" + if not content_types_file.exists(): + print("FAILED - [Content_Types].xml file not found") + return False + + try: + root = lxml.etree.parse(str(content_types_file)).getroot() + declared_parts = set() + declared_extensions = set() + + for override in root.findall( + f".//{{{self.CONTENT_TYPES_NAMESPACE}}}Override" + ): + part_name = override.get("PartName") + if part_name is not None: + declared_parts.add(part_name.lstrip("/")) + + for default in root.findall( + f".//{{{self.CONTENT_TYPES_NAMESPACE}}}Default" + ): + extension = default.get("Extension") + if extension is not None: + declared_extensions.add(extension.lower()) + + declarable_roots = { + "sld", + "sldLayout", + "sldMaster", + "presentation", + "document", + "workbook", + "worksheet", + "theme", + } + + media_extensions = { + "png": "image/png", + "jpg": "image/jpeg", + "jpeg": "image/jpeg", + "gif": "image/gif", + "bmp": "image/bmp", + "tiff": "image/tiff", + "wmf": "image/x-wmf", + "emf": "image/x-emf", + } + + all_files = list(self.unpacked_dir.rglob("*")) + all_files = [f for f in all_files if f.is_file()] + + for xml_file in self.xml_files: + path_str = str(xml_file.relative_to(self.unpacked_dir)).replace( + "\\", "/" + ) + + if any( + skip in path_str + for skip in [".rels", "[Content_Types]", "docProps/", "_rels/"] + ): + continue + + try: + root_tag = lxml.etree.parse(str(xml_file)).getroot().tag + root_name = root_tag.split("}")[-1] if "}" in root_tag else root_tag + + if root_name in declarable_roots and path_str not in declared_parts: + errors.append( + f" {path_str}: File with <{root_name}> root not declared in [Content_Types].xml" + ) + + except Exception: + continue + + for file_path in all_files: + if file_path.suffix.lower() in {".xml", ".rels"}: + continue + if file_path.name == "[Content_Types].xml": + continue + if "_rels" in file_path.parts or "docProps" in file_path.parts: + continue + + extension = file_path.suffix.lstrip(".").lower() + if extension and extension not in declared_extensions: + if extension in media_extensions: + relative_path = file_path.relative_to(self.unpacked_dir) + errors.append( + f' {relative_path}: File with extension \'{extension}\' not declared in [Content_Types].xml - should add: ' + ) + + except Exception as e: + errors.append(f" Error parsing [Content_Types].xml: {e}") + + if errors: + print(f"FAILED - Found {len(errors)} content type declaration errors:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print( + "PASSED - All content files are properly declared in [Content_Types].xml" + ) + return True + + def validate_file_against_xsd(self, xml_file, verbose=False): + xml_file = Path(xml_file).resolve() + unpacked_dir = self.unpacked_dir.resolve() + + is_valid, current_errors = self._validate_single_file_xsd( + xml_file, unpacked_dir + ) + + if is_valid is None: + return None, set() + elif is_valid: + return True, set() + + original_errors = self._get_original_file_errors(xml_file) + + assert current_errors is not None + new_errors = current_errors - original_errors + + new_errors = { + e for e in new_errors + if not any(pattern in e for pattern in self.IGNORED_VALIDATION_ERRORS) + } + + if new_errors: + if verbose: + relative_path = xml_file.relative_to(unpacked_dir) + print(f"FAILED - {relative_path}: {len(new_errors)} new error(s)") + for error in list(new_errors)[:3]: + truncated = error[:250] + "..." if len(error) > 250 else error + print(f" - {truncated}") + return False, new_errors + else: + if verbose: + print( + f"PASSED - No new errors (original had {len(current_errors)} errors)" + ) + return True, set() + + def validate_against_xsd(self): + new_errors = [] + original_error_count = 0 + valid_count = 0 + skipped_count = 0 + + for xml_file in self.xml_files: + relative_path = str(xml_file.relative_to(self.unpacked_dir)) + is_valid, new_file_errors = self.validate_file_against_xsd( + xml_file, verbose=False + ) + + if is_valid is None: + skipped_count += 1 + continue + elif is_valid and not new_file_errors: + valid_count += 1 + continue + elif is_valid: + original_error_count += 1 + valid_count += 1 + continue + + new_errors.append(f" {relative_path}: {len(new_file_errors)} new error(s)") + for error in list(new_file_errors)[:3]: + new_errors.append( + f" - {error[:250]}..." if len(error) > 250 else f" - {error}" + ) + + if self.verbose: + print(f"Validated {len(self.xml_files)} files:") + print(f" - Valid: {valid_count}") + print(f" - Skipped (no schema): {skipped_count}") + if original_error_count: + print(f" - With original errors (ignored): {original_error_count}") + print( + f" - With NEW errors: {len(new_errors) > 0 and len([e for e in new_errors if not e.startswith(' ')]) or 0}" + ) + + if new_errors: + print("\nFAILED - Found NEW validation errors:") + for error in new_errors: + print(error) + return False + else: + if self.verbose: + print("\nPASSED - No new XSD validation errors introduced") + return True + + def _get_schema_path(self, xml_file): + if xml_file.name in self.SCHEMA_MAPPINGS: + return self.schemas_dir / self.SCHEMA_MAPPINGS[xml_file.name] + + if xml_file.suffix == ".rels": + return self.schemas_dir / self.SCHEMA_MAPPINGS[".rels"] + + if "charts/" in str(xml_file) and xml_file.name.startswith("chart"): + return self.schemas_dir / self.SCHEMA_MAPPINGS["chart"] + + if "theme/" in str(xml_file) and xml_file.name.startswith("theme"): + return self.schemas_dir / self.SCHEMA_MAPPINGS["theme"] + + if xml_file.parent.name in self.MAIN_CONTENT_FOLDERS: + return self.schemas_dir / self.SCHEMA_MAPPINGS[xml_file.parent.name] + + return None + + def _clean_ignorable_namespaces(self, xml_doc): + xml_string = lxml.etree.tostring(xml_doc, encoding="unicode") + xml_copy = lxml.etree.fromstring(xml_string) + + for elem in xml_copy.iter(): + attrs_to_remove = [] + + for attr in elem.attrib: + if "{" in attr: + ns = attr.split("}")[0][1:] + if ns not in self.OOXML_NAMESPACES: + attrs_to_remove.append(attr) + + for attr in attrs_to_remove: + del elem.attrib[attr] + + self._remove_ignorable_elements(xml_copy) + + return lxml.etree.ElementTree(xml_copy) + + def _remove_ignorable_elements(self, root): + elements_to_remove = [] + + for elem in list(root): + if not hasattr(elem, "tag") or callable(elem.tag): + continue + + tag_str = str(elem.tag) + if tag_str.startswith("{"): + ns = tag_str.split("}")[0][1:] + if ns not in self.OOXML_NAMESPACES: + elements_to_remove.append(elem) + continue + + self._remove_ignorable_elements(elem) + + for elem in elements_to_remove: + root.remove(elem) + + def _preprocess_for_mc_ignorable(self, xml_doc): + root = xml_doc.getroot() + + if f"{{{self.MC_NAMESPACE}}}Ignorable" in root.attrib: + del root.attrib[f"{{{self.MC_NAMESPACE}}}Ignorable"] + + return xml_doc + + def _validate_single_file_xsd(self, xml_file, base_path): + schema_path = self._get_schema_path(xml_file) + if not schema_path: + return None, None + + try: + with open(schema_path, "rb") as xsd_file: + parser = lxml.etree.XMLParser() + xsd_doc = lxml.etree.parse( + xsd_file, parser=parser, base_url=str(schema_path) + ) + schema = lxml.etree.XMLSchema(xsd_doc) + + with open(xml_file, "r") as f: + xml_doc = lxml.etree.parse(f) + + xml_doc, _ = self._remove_template_tags_from_text_nodes(xml_doc) + xml_doc = self._preprocess_for_mc_ignorable(xml_doc) + + relative_path = xml_file.relative_to(base_path) + if ( + relative_path.parts + and relative_path.parts[0] in self.MAIN_CONTENT_FOLDERS + ): + xml_doc = self._clean_ignorable_namespaces(xml_doc) + + if schema.validate(xml_doc): + return True, set() + else: + errors = set() + for error in schema.error_log: + errors.add(error.message) + return False, errors + + except Exception as e: + return False, {str(e)} + + def _get_original_file_errors(self, xml_file): + if self.original_file is None: + return set() + + import tempfile + import zipfile + + xml_file = Path(xml_file).resolve() + unpacked_dir = self.unpacked_dir.resolve() + relative_path = xml_file.relative_to(unpacked_dir) + + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + with zipfile.ZipFile(self.original_file, "r") as zip_ref: + zip_ref.extractall(temp_path) + + original_xml_file = temp_path / relative_path + + if not original_xml_file.exists(): + return set() + + is_valid, errors = self._validate_single_file_xsd( + original_xml_file, temp_path + ) + return errors if errors else set() + + def _remove_template_tags_from_text_nodes(self, xml_doc): + warnings = [] + template_pattern = re.compile(r"\{\{[^}]*\}\}") + + xml_string = lxml.etree.tostring(xml_doc, encoding="unicode") + xml_copy = lxml.etree.fromstring(xml_string) + + def process_text_content(text, content_type): + if not text: + return text + matches = list(template_pattern.finditer(text)) + if matches: + for match in matches: + warnings.append( + f"Found template tag in {content_type}: {match.group()}" + ) + return template_pattern.sub("", text) + return text + + for elem in xml_copy.iter(): + if not hasattr(elem, "tag") or callable(elem.tag): + continue + tag_str = str(elem.tag) + if tag_str.endswith("}t") or tag_str == "t": + continue + + elem.text = process_text_content(elem.text, "text content") + elem.tail = process_text_content(elem.tail, "tail content") + + return lxml.etree.ElementTree(xml_copy), warnings + + +if __name__ == "__main__": + raise RuntimeError("This module should not be run directly.") diff --git a/.claude/skills/pptx/scripts/office/validators/docx.py b/.claude/skills/pptx/scripts/office/validators/docx.py new file mode 100644 index 0000000..fec405e --- /dev/null +++ b/.claude/skills/pptx/scripts/office/validators/docx.py @@ -0,0 +1,446 @@ +""" +Validator for Word document XML files against XSD schemas. +""" + +import random +import re +import tempfile +import zipfile + +import defusedxml.minidom +import lxml.etree + +from .base import BaseSchemaValidator + + +class DOCXSchemaValidator(BaseSchemaValidator): + + WORD_2006_NAMESPACE = "http://schemas.openxmlformats.org/wordprocessingml/2006/main" + W14_NAMESPACE = "http://schemas.microsoft.com/office/word/2010/wordml" + W16CID_NAMESPACE = "http://schemas.microsoft.com/office/word/2016/wordml/cid" + + ELEMENT_RELATIONSHIP_TYPES = {} + + def validate(self): + if not self.validate_xml(): + return False + + all_valid = True + if not self.validate_namespaces(): + all_valid = False + + if not self.validate_unique_ids(): + all_valid = False + + if not self.validate_file_references(): + all_valid = False + + if not self.validate_content_types(): + all_valid = False + + if not self.validate_against_xsd(): + all_valid = False + + if not self.validate_whitespace_preservation(): + all_valid = False + + if not self.validate_deletions(): + all_valid = False + + if not self.validate_insertions(): + all_valid = False + + if not self.validate_all_relationship_ids(): + all_valid = False + + if not self.validate_id_constraints(): + all_valid = False + + if not self.validate_comment_markers(): + all_valid = False + + self.compare_paragraph_counts() + + return all_valid + + def validate_whitespace_preservation(self): + errors = [] + + for xml_file in self.xml_files: + if xml_file.name != "document.xml": + continue + + try: + root = lxml.etree.parse(str(xml_file)).getroot() + + for elem in root.iter(f"{{{self.WORD_2006_NAMESPACE}}}t"): + if elem.text: + text = elem.text + if re.search(r"^[ \t\n\r]", text) or re.search( + r"[ \t\n\r]$", text + ): + xml_space_attr = f"{{{self.XML_NAMESPACE}}}space" + if ( + xml_space_attr not in elem.attrib + or elem.attrib[xml_space_attr] != "preserve" + ): + text_preview = ( + repr(text)[:50] + "..." + if len(repr(text)) > 50 + else repr(text) + ) + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {elem.sourceline}: w:t element with whitespace missing xml:space='preserve': {text_preview}" + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} whitespace preservation violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All whitespace is properly preserved") + return True + + def validate_deletions(self): + errors = [] + + for xml_file in self.xml_files: + if xml_file.name != "document.xml": + continue + + try: + root = lxml.etree.parse(str(xml_file)).getroot() + namespaces = {"w": self.WORD_2006_NAMESPACE} + + for t_elem in root.xpath(".//w:del//w:t", namespaces=namespaces): + if t_elem.text: + text_preview = ( + repr(t_elem.text)[:50] + "..." + if len(repr(t_elem.text)) > 50 + else repr(t_elem.text) + ) + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {t_elem.sourceline}: found within : {text_preview}" + ) + + for instr_elem in root.xpath( + ".//w:del//w:instrText", namespaces=namespaces + ): + text_preview = ( + repr(instr_elem.text or "")[:50] + "..." + if len(repr(instr_elem.text or "")) > 50 + else repr(instr_elem.text or "") + ) + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {instr_elem.sourceline}: found within (use ): {text_preview}" + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} deletion validation violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - No w:t elements found within w:del elements") + return True + + def count_paragraphs_in_unpacked(self): + count = 0 + + for xml_file in self.xml_files: + if xml_file.name != "document.xml": + continue + + try: + root = lxml.etree.parse(str(xml_file)).getroot() + paragraphs = root.findall(f".//{{{self.WORD_2006_NAMESPACE}}}p") + count = len(paragraphs) + except Exception as e: + print(f"Error counting paragraphs in unpacked document: {e}") + + return count + + def count_paragraphs_in_original(self): + original = self.original_file + if original is None: + return 0 + + count = 0 + + try: + with tempfile.TemporaryDirectory() as temp_dir: + with zipfile.ZipFile(original, "r") as zip_ref: + zip_ref.extractall(temp_dir) + + doc_xml_path = temp_dir + "/word/document.xml" + root = lxml.etree.parse(doc_xml_path).getroot() + + paragraphs = root.findall(f".//{{{self.WORD_2006_NAMESPACE}}}p") + count = len(paragraphs) + + except Exception as e: + print(f"Error counting paragraphs in original document: {e}") + + return count + + def validate_insertions(self): + errors = [] + + for xml_file in self.xml_files: + if xml_file.name != "document.xml": + continue + + try: + root = lxml.etree.parse(str(xml_file)).getroot() + namespaces = {"w": self.WORD_2006_NAMESPACE} + + invalid_elements = root.xpath( + ".//w:ins//w:delText[not(ancestor::w:del)]", namespaces=namespaces + ) + + for elem in invalid_elements: + text_preview = ( + repr(elem.text or "")[:50] + "..." + if len(repr(elem.text or "")) > 50 + else repr(elem.text or "") + ) + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {elem.sourceline}: within : {text_preview}" + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} insertion validation violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - No w:delText elements within w:ins elements") + return True + + def compare_paragraph_counts(self): + original_count = self.count_paragraphs_in_original() + new_count = self.count_paragraphs_in_unpacked() + + diff = new_count - original_count + diff_str = f"+{diff}" if diff > 0 else str(diff) + print(f"\nParagraphs: {original_count} → {new_count} ({diff_str})") + + def _parse_id_value(self, val: str, base: int = 16) -> int: + return int(val, base) + + def validate_id_constraints(self): + errors = [] + para_id_attr = f"{{{self.W14_NAMESPACE}}}paraId" + durable_id_attr = f"{{{self.W16CID_NAMESPACE}}}durableId" + + for xml_file in self.xml_files: + try: + for elem in lxml.etree.parse(str(xml_file)).iter(): + if val := elem.get(para_id_attr): + if self._parse_id_value(val, base=16) >= 0x80000000: + errors.append( + f" {xml_file.name}:{elem.sourceline}: paraId={val} >= 0x80000000" + ) + + if val := elem.get(durable_id_attr): + if xml_file.name == "numbering.xml": + try: + if self._parse_id_value(val, base=10) >= 0x7FFFFFFF: + errors.append( + f" {xml_file.name}:{elem.sourceline}: " + f"durableId={val} >= 0x7FFFFFFF" + ) + except ValueError: + errors.append( + f" {xml_file.name}:{elem.sourceline}: " + f"durableId={val} must be decimal in numbering.xml" + ) + else: + if self._parse_id_value(val, base=16) >= 0x7FFFFFFF: + errors.append( + f" {xml_file.name}:{elem.sourceline}: " + f"durableId={val} >= 0x7FFFFFFF" + ) + except Exception: + pass + + if errors: + print(f"FAILED - {len(errors)} ID constraint violations:") + for e in errors: + print(e) + elif self.verbose: + print("PASSED - All paraId/durableId values within constraints") + return not errors + + def validate_comment_markers(self): + errors = [] + + document_xml = None + comments_xml = None + for xml_file in self.xml_files: + if xml_file.name == "document.xml" and "word" in str(xml_file): + document_xml = xml_file + elif xml_file.name == "comments.xml": + comments_xml = xml_file + + if not document_xml: + if self.verbose: + print("PASSED - No document.xml found (skipping comment validation)") + return True + + try: + doc_root = lxml.etree.parse(str(document_xml)).getroot() + namespaces = {"w": self.WORD_2006_NAMESPACE} + + range_starts = { + elem.get(f"{{{self.WORD_2006_NAMESPACE}}}id") + for elem in doc_root.xpath( + ".//w:commentRangeStart", namespaces=namespaces + ) + } + range_ends = { + elem.get(f"{{{self.WORD_2006_NAMESPACE}}}id") + for elem in doc_root.xpath( + ".//w:commentRangeEnd", namespaces=namespaces + ) + } + references = { + elem.get(f"{{{self.WORD_2006_NAMESPACE}}}id") + for elem in doc_root.xpath( + ".//w:commentReference", namespaces=namespaces + ) + } + + orphaned_ends = range_ends - range_starts + for comment_id in sorted( + orphaned_ends, key=lambda x: int(x) if x and x.isdigit() else 0 + ): + errors.append( + f' document.xml: commentRangeEnd id="{comment_id}" has no matching commentRangeStart' + ) + + orphaned_starts = range_starts - range_ends + for comment_id in sorted( + orphaned_starts, key=lambda x: int(x) if x and x.isdigit() else 0 + ): + errors.append( + f' document.xml: commentRangeStart id="{comment_id}" has no matching commentRangeEnd' + ) + + comment_ids = set() + if comments_xml and comments_xml.exists(): + comments_root = lxml.etree.parse(str(comments_xml)).getroot() + comment_ids = { + elem.get(f"{{{self.WORD_2006_NAMESPACE}}}id") + for elem in comments_root.xpath( + ".//w:comment", namespaces=namespaces + ) + } + + marker_ids = range_starts | range_ends | references + invalid_refs = marker_ids - comment_ids + for comment_id in sorted( + invalid_refs, key=lambda x: int(x) if x and x.isdigit() else 0 + ): + if comment_id: + errors.append( + f' document.xml: marker id="{comment_id}" references non-existent comment' + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append(f" Error parsing XML: {e}") + + if errors: + print(f"FAILED - {len(errors)} comment marker violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All comment markers properly paired") + return True + + def repair(self) -> int: + repairs = super().repair() + repairs += self.repair_durableId() + return repairs + + def repair_durableId(self) -> int: + repairs = 0 + + for xml_file in self.xml_files: + try: + content = xml_file.read_text(encoding="utf-8") + dom = defusedxml.minidom.parseString(content) + modified = False + + for elem in dom.getElementsByTagName("*"): + if not elem.hasAttribute("w16cid:durableId"): + continue + + durable_id = elem.getAttribute("w16cid:durableId") + needs_repair = False + + if xml_file.name == "numbering.xml": + try: + needs_repair = ( + self._parse_id_value(durable_id, base=10) >= 0x7FFFFFFF + ) + except ValueError: + needs_repair = True + else: + try: + needs_repair = ( + self._parse_id_value(durable_id, base=16) >= 0x7FFFFFFF + ) + except ValueError: + needs_repair = True + + if needs_repair: + value = random.randint(1, 0x7FFFFFFE) + if xml_file.name == "numbering.xml": + new_id = str(value) + else: + new_id = f"{value:08X}" + + elem.setAttribute("w16cid:durableId", new_id) + print( + f" Repaired: {xml_file.name}: durableId {durable_id} → {new_id}" + ) + repairs += 1 + modified = True + + if modified: + xml_file.write_bytes(dom.toxml(encoding="UTF-8")) + + except Exception: + pass + + return repairs + + +if __name__ == "__main__": + raise RuntimeError("This module should not be run directly.") diff --git a/.claude/skills/pptx/scripts/office/validators/pptx.py b/.claude/skills/pptx/scripts/office/validators/pptx.py new file mode 100644 index 0000000..09842aa --- /dev/null +++ b/.claude/skills/pptx/scripts/office/validators/pptx.py @@ -0,0 +1,275 @@ +""" +Validator for PowerPoint presentation XML files against XSD schemas. +""" + +import re + +from .base import BaseSchemaValidator + + +class PPTXSchemaValidator(BaseSchemaValidator): + + PRESENTATIONML_NAMESPACE = ( + "http://schemas.openxmlformats.org/presentationml/2006/main" + ) + + ELEMENT_RELATIONSHIP_TYPES = { + "sldid": "slide", + "sldmasterid": "slidemaster", + "notesmasterid": "notesmaster", + "sldlayoutid": "slidelayout", + "themeid": "theme", + "tablestyleid": "tablestyles", + } + + def validate(self): + if not self.validate_xml(): + return False + + all_valid = True + if not self.validate_namespaces(): + all_valid = False + + if not self.validate_unique_ids(): + all_valid = False + + if not self.validate_uuid_ids(): + all_valid = False + + if not self.validate_file_references(): + all_valid = False + + if not self.validate_slide_layout_ids(): + all_valid = False + + if not self.validate_content_types(): + all_valid = False + + if not self.validate_against_xsd(): + all_valid = False + + if not self.validate_notes_slide_references(): + all_valid = False + + if not self.validate_all_relationship_ids(): + all_valid = False + + if not self.validate_no_duplicate_slide_layouts(): + all_valid = False + + return all_valid + + def validate_uuid_ids(self): + import lxml.etree + + errors = [] + uuid_pattern = re.compile( + r"^[\{\(]?[0-9A-Fa-f]{8}-?[0-9A-Fa-f]{4}-?[0-9A-Fa-f]{4}-?[0-9A-Fa-f]{4}-?[0-9A-Fa-f]{12}[\}\)]?$" + ) + + for xml_file in self.xml_files: + try: + root = lxml.etree.parse(str(xml_file)).getroot() + + for elem in root.iter(): + for attr, value in elem.attrib.items(): + attr_name = attr.split("}")[-1].lower() + if attr_name == "id" or attr_name.endswith("id"): + if self._looks_like_uuid(value): + if not uuid_pattern.match(value): + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {elem.sourceline}: ID '{value}' appears to be a UUID but contains invalid hex characters" + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} UUID ID validation errors:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All UUID-like IDs contain valid hex values") + return True + + def _looks_like_uuid(self, value): + clean_value = value.strip("{}()").replace("-", "") + return len(clean_value) == 32 and all(c.isalnum() for c in clean_value) + + def validate_slide_layout_ids(self): + import lxml.etree + + errors = [] + + slide_masters = list(self.unpacked_dir.glob("ppt/slideMasters/*.xml")) + + if not slide_masters: + if self.verbose: + print("PASSED - No slide masters found") + return True + + for slide_master in slide_masters: + try: + root = lxml.etree.parse(str(slide_master)).getroot() + + rels_file = slide_master.parent / "_rels" / f"{slide_master.name}.rels" + + if not rels_file.exists(): + errors.append( + f" {slide_master.relative_to(self.unpacked_dir)}: " + f"Missing relationships file: {rels_file.relative_to(self.unpacked_dir)}" + ) + continue + + rels_root = lxml.etree.parse(str(rels_file)).getroot() + + valid_layout_rids = set() + for rel in rels_root.findall( + f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship" + ): + rel_type = rel.get("Type", "") + if "slideLayout" in rel_type: + valid_layout_rids.add(rel.get("Id")) + + for sld_layout_id in root.findall( + f".//{{{self.PRESENTATIONML_NAMESPACE}}}sldLayoutId" + ): + r_id = sld_layout_id.get( + f"{{{self.OFFICE_RELATIONSHIPS_NAMESPACE}}}id" + ) + layout_id = sld_layout_id.get("id") + + if r_id and r_id not in valid_layout_rids: + errors.append( + f" {slide_master.relative_to(self.unpacked_dir)}: " + f"Line {sld_layout_id.sourceline}: sldLayoutId with id='{layout_id}' " + f"references r:id='{r_id}' which is not found in slide layout relationships" + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {slide_master.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} slide layout ID validation errors:") + for error in errors: + print(error) + print( + "Remove invalid references or add missing slide layouts to the relationships file." + ) + return False + else: + if self.verbose: + print("PASSED - All slide layout IDs reference valid slide layouts") + return True + + def validate_no_duplicate_slide_layouts(self): + import lxml.etree + + errors = [] + slide_rels_files = list(self.unpacked_dir.glob("ppt/slides/_rels/*.xml.rels")) + + for rels_file in slide_rels_files: + try: + root = lxml.etree.parse(str(rels_file)).getroot() + + layout_rels = [ + rel + for rel in root.findall( + f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship" + ) + if "slideLayout" in rel.get("Type", "") + ] + + if len(layout_rels) > 1: + errors.append( + f" {rels_file.relative_to(self.unpacked_dir)}: has {len(layout_rels)} slideLayout references" + ) + + except Exception as e: + errors.append( + f" {rels_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print("FAILED - Found slides with duplicate slideLayout references:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All slides have exactly one slideLayout reference") + return True + + def validate_notes_slide_references(self): + import lxml.etree + + errors = [] + notes_slide_references = {} + + slide_rels_files = list(self.unpacked_dir.glob("ppt/slides/_rels/*.xml.rels")) + + if not slide_rels_files: + if self.verbose: + print("PASSED - No slide relationship files found") + return True + + for rels_file in slide_rels_files: + try: + root = lxml.etree.parse(str(rels_file)).getroot() + + for rel in root.findall( + f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship" + ): + rel_type = rel.get("Type", "") + if "notesSlide" in rel_type: + target = rel.get("Target", "") + if target: + normalized_target = target.replace("../", "") + + slide_name = rels_file.stem.replace( + ".xml", "" + ) + + if normalized_target not in notes_slide_references: + notes_slide_references[normalized_target] = [] + notes_slide_references[normalized_target].append( + (slide_name, rels_file) + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {rels_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + for target, references in notes_slide_references.items(): + if len(references) > 1: + slide_names = [ref[0] for ref in references] + errors.append( + f" Notes slide '{target}' is referenced by multiple slides: {', '.join(slide_names)}" + ) + for slide_name, rels_file in references: + errors.append(f" - {rels_file.relative_to(self.unpacked_dir)}") + + if errors: + print( + f"FAILED - Found {len([e for e in errors if not e.startswith(' ')])} notes slide reference validation errors:" + ) + for error in errors: + print(error) + print("Each slide may optionally have its own slide file.") + return False + else: + if self.verbose: + print("PASSED - All notes slide references are unique") + return True + + +if __name__ == "__main__": + raise RuntimeError("This module should not be run directly.") diff --git a/.claude/skills/pptx/scripts/office/validators/redlining.py b/.claude/skills/pptx/scripts/office/validators/redlining.py new file mode 100644 index 0000000..71c81b6 --- /dev/null +++ b/.claude/skills/pptx/scripts/office/validators/redlining.py @@ -0,0 +1,247 @@ +""" +Validator for tracked changes in Word documents. +""" + +import subprocess +import tempfile +import zipfile +from pathlib import Path + + +class RedliningValidator: + + def __init__(self, unpacked_dir, original_docx, verbose=False, author="Claude"): + self.unpacked_dir = Path(unpacked_dir) + self.original_docx = Path(original_docx) + self.verbose = verbose + self.author = author + self.namespaces = { + "w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main" + } + + def repair(self) -> int: + return 0 + + def validate(self): + modified_file = self.unpacked_dir / "word" / "document.xml" + if not modified_file.exists(): + print(f"FAILED - Modified document.xml not found at {modified_file}") + return False + + try: + import xml.etree.ElementTree as ET + + tree = ET.parse(modified_file) + root = tree.getroot() + + del_elements = root.findall(".//w:del", self.namespaces) + ins_elements = root.findall(".//w:ins", self.namespaces) + + author_del_elements = [ + elem + for elem in del_elements + if elem.get(f"{{{self.namespaces['w']}}}author") == self.author + ] + author_ins_elements = [ + elem + for elem in ins_elements + if elem.get(f"{{{self.namespaces['w']}}}author") == self.author + ] + + if not author_del_elements and not author_ins_elements: + if self.verbose: + print(f"PASSED - No tracked changes by {self.author} found.") + return True + + except Exception: + pass + + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + try: + with zipfile.ZipFile(self.original_docx, "r") as zip_ref: + zip_ref.extractall(temp_path) + except Exception as e: + print(f"FAILED - Error unpacking original docx: {e}") + return False + + original_file = temp_path / "word" / "document.xml" + if not original_file.exists(): + print( + f"FAILED - Original document.xml not found in {self.original_docx}" + ) + return False + + try: + import xml.etree.ElementTree as ET + + modified_tree = ET.parse(modified_file) + modified_root = modified_tree.getroot() + original_tree = ET.parse(original_file) + original_root = original_tree.getroot() + except ET.ParseError as e: + print(f"FAILED - Error parsing XML files: {e}") + return False + + self._remove_author_tracked_changes(original_root) + self._remove_author_tracked_changes(modified_root) + + modified_text = self._extract_text_content(modified_root) + original_text = self._extract_text_content(original_root) + + if modified_text != original_text: + error_message = self._generate_detailed_diff( + original_text, modified_text + ) + print(error_message) + return False + + if self.verbose: + print(f"PASSED - All changes by {self.author} are properly tracked") + return True + + def _generate_detailed_diff(self, original_text, modified_text): + error_parts = [ + f"FAILED - Document text doesn't match after removing {self.author}'s tracked changes", + "", + "Likely causes:", + " 1. Modified text inside another author's or tags", + " 2. Made edits without proper tracked changes", + " 3. Didn't nest inside when deleting another's insertion", + "", + "For pre-redlined documents, use correct patterns:", + " - To reject another's INSERTION: Nest inside their ", + " - To restore another's DELETION: Add new AFTER their ", + "", + ] + + git_diff = self._get_git_word_diff(original_text, modified_text) + if git_diff: + error_parts.extend(["Differences:", "============", git_diff]) + else: + error_parts.append("Unable to generate word diff (git not available)") + + return "\n".join(error_parts) + + def _get_git_word_diff(self, original_text, modified_text): + try: + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + original_file = temp_path / "original.txt" + modified_file = temp_path / "modified.txt" + + original_file.write_text(original_text, encoding="utf-8") + modified_file.write_text(modified_text, encoding="utf-8") + + result = subprocess.run( + [ + "git", + "diff", + "--word-diff=plain", + "--word-diff-regex=.", + "-U0", + "--no-index", + str(original_file), + str(modified_file), + ], + capture_output=True, + text=True, + ) + + if result.stdout.strip(): + lines = result.stdout.split("\n") + content_lines = [] + in_content = False + for line in lines: + if line.startswith("@@"): + in_content = True + continue + if in_content and line.strip(): + content_lines.append(line) + + if content_lines: + return "\n".join(content_lines) + + result = subprocess.run( + [ + "git", + "diff", + "--word-diff=plain", + "-U0", + "--no-index", + str(original_file), + str(modified_file), + ], + capture_output=True, + text=True, + ) + + if result.stdout.strip(): + lines = result.stdout.split("\n") + content_lines = [] + in_content = False + for line in lines: + if line.startswith("@@"): + in_content = True + continue + if in_content and line.strip(): + content_lines.append(line) + return "\n".join(content_lines) + + except (subprocess.CalledProcessError, FileNotFoundError, Exception): + pass + + return None + + def _remove_author_tracked_changes(self, root): + ins_tag = f"{{{self.namespaces['w']}}}ins" + del_tag = f"{{{self.namespaces['w']}}}del" + author_attr = f"{{{self.namespaces['w']}}}author" + + for parent in root.iter(): + to_remove = [] + for child in parent: + if child.tag == ins_tag and child.get(author_attr) == self.author: + to_remove.append(child) + for elem in to_remove: + parent.remove(elem) + + deltext_tag = f"{{{self.namespaces['w']}}}delText" + t_tag = f"{{{self.namespaces['w']}}}t" + + for parent in root.iter(): + to_process = [] + for child in parent: + if child.tag == del_tag and child.get(author_attr) == self.author: + to_process.append((child, list(parent).index(child))) + + for del_elem, del_index in reversed(to_process): + for elem in del_elem.iter(): + if elem.tag == deltext_tag: + elem.tag = t_tag + + for child in reversed(list(del_elem)): + parent.insert(del_index, child) + parent.remove(del_elem) + + def _extract_text_content(self, root): + p_tag = f"{{{self.namespaces['w']}}}p" + t_tag = f"{{{self.namespaces['w']}}}t" + + paragraphs = [] + for p_elem in root.findall(f".//{p_tag}"): + text_parts = [] + for t_elem in p_elem.findall(f".//{t_tag}"): + if t_elem.text: + text_parts.append(t_elem.text) + paragraph_text = "".join(text_parts) + if paragraph_text: + paragraphs.append(paragraph_text) + + return "\n".join(paragraphs) + + +if __name__ == "__main__": + raise RuntimeError("This module should not be run directly.") diff --git a/.claude/skills/pptx/scripts/thumbnail.py b/.claude/skills/pptx/scripts/thumbnail.py new file mode 100644 index 0000000..edcbdc0 --- /dev/null +++ b/.claude/skills/pptx/scripts/thumbnail.py @@ -0,0 +1,289 @@ +"""Create thumbnail grids from PowerPoint presentation slides. + +Creates a grid layout of slide thumbnails for quick visual analysis. +Labels each thumbnail with its XML filename (e.g., slide1.xml). +Hidden slides are shown with a placeholder pattern. + +Usage: + python thumbnail.py input.pptx [output_prefix] [--cols N] + +Examples: + python thumbnail.py presentation.pptx + # Creates: thumbnails.jpg + + python thumbnail.py template.pptx grid --cols 4 + # Creates: grid.jpg (or grid-1.jpg, grid-2.jpg for large decks) +""" + +import argparse +import subprocess +import sys +import tempfile +import zipfile +from pathlib import Path + +import defusedxml.minidom +from office.soffice import get_soffice_env +from PIL import Image, ImageDraw, ImageFont + +THUMBNAIL_WIDTH = 300 +CONVERSION_DPI = 100 +MAX_COLS = 6 +DEFAULT_COLS = 3 +JPEG_QUALITY = 95 +GRID_PADDING = 20 +BORDER_WIDTH = 2 +FONT_SIZE_RATIO = 0.10 +LABEL_PADDING_RATIO = 0.4 + + +def main(): + parser = argparse.ArgumentParser( + description="Create thumbnail grids from PowerPoint slides." + ) + parser.add_argument("input", help="Input PowerPoint file (.pptx)") + parser.add_argument( + "output_prefix", + nargs="?", + default="thumbnails", + help="Output prefix for image files (default: thumbnails)", + ) + parser.add_argument( + "--cols", + type=int, + default=DEFAULT_COLS, + help=f"Number of columns (default: {DEFAULT_COLS}, max: {MAX_COLS})", + ) + + args = parser.parse_args() + + cols = min(args.cols, MAX_COLS) + if args.cols > MAX_COLS: + print(f"Warning: Columns limited to {MAX_COLS}") + + input_path = Path(args.input) + if not input_path.exists() or input_path.suffix.lower() != ".pptx": + print(f"Error: Invalid PowerPoint file: {args.input}", file=sys.stderr) + sys.exit(1) + + output_path = Path(f"{args.output_prefix}.jpg") + + try: + slide_info = get_slide_info(input_path) + + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + visible_images = convert_to_images(input_path, temp_path) + + if not visible_images and not any(s["hidden"] for s in slide_info): + print("Error: No slides found", file=sys.stderr) + sys.exit(1) + + slides = build_slide_list(slide_info, visible_images, temp_path) + + grid_files = create_grids(slides, cols, THUMBNAIL_WIDTH, output_path) + + print(f"Created {len(grid_files)} grid(s):") + for grid_file in grid_files: + print(f" {grid_file}") + + except Exception as e: + print(f"Error: {e}", file=sys.stderr) + sys.exit(1) + + +def get_slide_info(pptx_path: Path) -> list[dict]: + with zipfile.ZipFile(pptx_path, "r") as zf: + rels_content = zf.read("ppt/_rels/presentation.xml.rels").decode("utf-8") + rels_dom = defusedxml.minidom.parseString(rels_content) + + rid_to_slide = {} + for rel in rels_dom.getElementsByTagName("Relationship"): + rid = rel.getAttribute("Id") + target = rel.getAttribute("Target") + rel_type = rel.getAttribute("Type") + if "slide" in rel_type and target.startswith("slides/"): + rid_to_slide[rid] = target.replace("slides/", "") + + pres_content = zf.read("ppt/presentation.xml").decode("utf-8") + pres_dom = defusedxml.minidom.parseString(pres_content) + + slides = [] + for sld_id in pres_dom.getElementsByTagName("p:sldId"): + rid = sld_id.getAttribute("r:id") + if rid in rid_to_slide: + hidden = sld_id.getAttribute("show") == "0" + slides.append({"name": rid_to_slide[rid], "hidden": hidden}) + + return slides + + +def build_slide_list( + slide_info: list[dict], + visible_images: list[Path], + temp_dir: Path, +) -> list[tuple[Path, str]]: + if visible_images: + with Image.open(visible_images[0]) as img: + placeholder_size = img.size + else: + placeholder_size = (1920, 1080) + + slides = [] + visible_idx = 0 + + for info in slide_info: + if info["hidden"]: + placeholder_path = temp_dir / f"hidden-{info['name']}.jpg" + placeholder_img = create_hidden_placeholder(placeholder_size) + placeholder_img.save(placeholder_path, "JPEG") + slides.append((placeholder_path, f"{info['name']} (hidden)")) + else: + if visible_idx < len(visible_images): + slides.append((visible_images[visible_idx], info["name"])) + visible_idx += 1 + + return slides + + +def create_hidden_placeholder(size: tuple[int, int]) -> Image.Image: + img = Image.new("RGB", size, color="#F0F0F0") + draw = ImageDraw.Draw(img) + line_width = max(5, min(size) // 100) + draw.line([(0, 0), size], fill="#CCCCCC", width=line_width) + draw.line([(size[0], 0), (0, size[1])], fill="#CCCCCC", width=line_width) + return img + + +def convert_to_images(pptx_path: Path, temp_dir: Path) -> list[Path]: + pdf_path = temp_dir / f"{pptx_path.stem}.pdf" + + result = subprocess.run( + [ + "soffice", + "--headless", + "--convert-to", + "pdf", + "--outdir", + str(temp_dir), + str(pptx_path), + ], + capture_output=True, + text=True, + env=get_soffice_env(), + ) + if result.returncode != 0 or not pdf_path.exists(): + raise RuntimeError("PDF conversion failed") + + result = subprocess.run( + [ + "pdftoppm", + "-jpeg", + "-r", + str(CONVERSION_DPI), + str(pdf_path), + str(temp_dir / "slide"), + ], + capture_output=True, + text=True, + ) + if result.returncode != 0: + raise RuntimeError("Image conversion failed") + + return sorted(temp_dir.glob("slide-*.jpg")) + + +def create_grids( + slides: list[tuple[Path, str]], + cols: int, + width: int, + output_path: Path, +) -> list[str]: + max_per_grid = cols * (cols + 1) + grid_files = [] + + for chunk_idx, start_idx in enumerate(range(0, len(slides), max_per_grid)): + end_idx = min(start_idx + max_per_grid, len(slides)) + chunk_slides = slides[start_idx:end_idx] + + grid = create_grid(chunk_slides, cols, width) + + if len(slides) <= max_per_grid: + grid_filename = output_path + else: + stem = output_path.stem + suffix = output_path.suffix + grid_filename = output_path.parent / f"{stem}-{chunk_idx + 1}{suffix}" + + grid_filename.parent.mkdir(parents=True, exist_ok=True) + grid.save(str(grid_filename), quality=JPEG_QUALITY) + grid_files.append(str(grid_filename)) + + return grid_files + + +def create_grid( + slides: list[tuple[Path, str]], + cols: int, + width: int, +) -> Image.Image: + font_size = int(width * FONT_SIZE_RATIO) + label_padding = int(font_size * LABEL_PADDING_RATIO) + + with Image.open(slides[0][0]) as img: + aspect = img.height / img.width + height = int(width * aspect) + + rows = (len(slides) + cols - 1) // cols + grid_w = cols * width + (cols + 1) * GRID_PADDING + grid_h = rows * (height + font_size + label_padding * 2) + (rows + 1) * GRID_PADDING + + grid = Image.new("RGB", (grid_w, grid_h), "white") + draw = ImageDraw.Draw(grid) + + try: + font = ImageFont.load_default(size=font_size) + except Exception: + font = ImageFont.load_default() + + for i, (img_path, slide_name) in enumerate(slides): + row, col = i // cols, i % cols + x = col * width + (col + 1) * GRID_PADDING + y_base = ( + row * (height + font_size + label_padding * 2) + (row + 1) * GRID_PADDING + ) + + label = slide_name + bbox = draw.textbbox((0, 0), label, font=font) + text_w = bbox[2] - bbox[0] + draw.text( + (x + (width - text_w) // 2, y_base + label_padding), + label, + fill="black", + font=font, + ) + + y_thumbnail = y_base + label_padding + font_size + label_padding + + with Image.open(img_path) as img: + img.thumbnail((width, height), Image.Resampling.LANCZOS) + w, h = img.size + tx = x + (width - w) // 2 + ty = y_thumbnail + (height - h) // 2 + grid.paste(img, (tx, ty)) + + if BORDER_WIDTH > 0: + draw.rectangle( + [ + (tx - BORDER_WIDTH, ty - BORDER_WIDTH), + (tx + w + BORDER_WIDTH - 1, ty + h + BORDER_WIDTH - 1), + ], + outline="gray", + width=BORDER_WIDTH, + ) + + return grid + + +if __name__ == "__main__": + main() diff --git a/.claude/skills/skill-creator/.openskills.json b/.claude/skills/skill-creator/.openskills.json new file mode 100644 index 0000000..f180be0 --- /dev/null +++ b/.claude/skills/skill-creator/.openskills.json @@ -0,0 +1,7 @@ +{ + "source": "anthropics/skills", + "sourceType": "git", + "repoUrl": "https://github.com/anthropics/skills", + "subpath": "skills\\skill-creator", + "installedAt": "2026-03-02T09:19:50.154Z" +} \ No newline at end of file diff --git a/.claude/skills/skill-creator/LICENSE.txt b/.claude/skills/skill-creator/LICENSE.txt new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/.claude/skills/skill-creator/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/.claude/skills/skill-creator/SKILL.md b/.claude/skills/skill-creator/SKILL.md new file mode 100644 index 0000000..942bfe8 --- /dev/null +++ b/.claude/skills/skill-creator/SKILL.md @@ -0,0 +1,479 @@ +--- +name: skill-creator +description: Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, update or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. +--- + +# Skill Creator + +A skill for creating new skills and iteratively improving them. + +At a high level, the process of creating a skill goes like this: + +- Decide what you want the skill to do and roughly how it should do it +- Write a draft of the skill +- Create a few test prompts and run claude-with-access-to-the-skill on them +- Help the user evaluate the results both qualitatively and quantitatively + - While the runs happen in the background, draft some quantitative evals if there aren't any (if there are some, you can either use as is or modify if you feel something needs to change about them). Then explain them to the user (or if they already existed, explain the ones that already exist) + - Use the `eval-viewer/generate_review.py` script to show the user the results for them to look at, and also let them look at the quantitative metrics +- Rewrite the skill based on feedback from the user's evaluation of the results (and also if there are any glaring flaws that become apparent from the quantitative benchmarks) +- Repeat until you're satisfied +- Expand the test set and try again at larger scale + +Your job when using this skill is to figure out where the user is in this process and then jump in and help them progress through these stages. So for instance, maybe they're like "I want to make a skill for X". You can help narrow down what they mean, write a draft, write the test cases, figure out how they want to evaluate, run all the prompts, and repeat. + +On the other hand, maybe they already have a draft of the skill. In this case you can go straight to the eval/iterate part of the loop. + +Of course, you should always be flexible and if the user is like "I don't need to run a bunch of evaluations, just vibe with me", you can do that instead. + +Then after the skill is done (but again, the order is flexible), you can also run the skill description improver, which we have a whole separate script for, to optimize the triggering of the skill. + +Cool? Cool. + +## Communicating with the user + +The skill creator is liable to be used by people across a wide range of familiarity with coding jargon. If you haven't heard (and how could you, it's only very recently that it started), there's a trend now where the power of Claude is inspiring plumbers to open up their terminals, parents and grandparents to google "how to install npm". On the other hand, the bulk of users are probably fairly computer-literate. + +So please pay attention to context cues to understand how to phrase your communication! In the default case, just to give you some idea: + +- "evaluation" and "benchmark" are borderline, but OK +- for "JSON" and "assertion" you want to see serious cues from the user that they know what those things are before using them without explaining them + +It's OK to briefly explain terms if you're in doubt, and feel free to clarify terms with a short definition if you're unsure if the user will get it. + +--- + +## Creating a skill + +### Capture Intent + +Start by understanding the user's intent. The current conversation might already contain a workflow the user wants to capture (e.g., they say "turn this into a skill"). If so, extract answers from the conversation history first — the tools used, the sequence of steps, corrections the user made, input/output formats observed. The user may need to fill the gaps, and should confirm before proceeding to the next step. + +1. What should this skill enable Claude to do? +2. When should this skill trigger? (what user phrases/contexts) +3. What's the expected output format? +4. Should we set up test cases to verify the skill works? Skills with objectively verifiable outputs (file transforms, data extraction, code generation, fixed workflow steps) benefit from test cases. Skills with subjective outputs (writing style, art) often don't need them. Suggest the appropriate default based on the skill type, but let the user decide. + +### Interview and Research + +Proactively ask questions about edge cases, input/output formats, example files, success criteria, and dependencies. Wait to write test prompts until you've got this part ironed out. + +Check available MCPs - if useful for research (searching docs, finding similar skills, looking up best practices), research in parallel via subagents if available, otherwise inline. Come prepared with context to reduce burden on the user. + +### Write the SKILL.md + +Based on the user interview, fill in these components: + +- **name**: Skill identifier +- **description**: When to trigger, what it does. This is the primary triggering mechanism - include both what the skill does AND specific contexts for when to use it. All "when to use" info goes here, not in the body. Note: currently Claude has a tendency to "undertrigger" skills -- to not use them when they'd be useful. To combat this, please make the skill descriptions a little bit "pushy". So for instance, instead of "How to build a simple fast dashboard to display internal Anthropic data.", you might write "How to build a simple fast dashboard to display internal Anthropic data. Make sure to use this skill whenever the user mentions dashboards, data visualization, internal metrics, or wants to display any kind of company data, even if they don't explicitly ask for a 'dashboard.'" +- **compatibility**: Required tools, dependencies (optional, rarely needed) +- **the rest of the skill :)** + +### Skill Writing Guide + +#### Anatomy of a Skill + +``` +skill-name/ +├── SKILL.md (required) +│ ├── YAML frontmatter (name, description required) +│ └── Markdown instructions +└── Bundled Resources (optional) + ├── scripts/ - Executable code for deterministic/repetitive tasks + ├── references/ - Docs loaded into context as needed + └── assets/ - Files used in output (templates, icons, fonts) +``` + +#### Progressive Disclosure + +Skills use a three-level loading system: +1. **Metadata** (name + description) - Always in context (~100 words) +2. **SKILL.md body** - In context whenever skill triggers (<500 lines ideal) +3. **Bundled resources** - As needed (unlimited, scripts can execute without loading) + +These word counts are approximate and you can feel free to go longer if needed. + +**Key patterns:** +- Keep SKILL.md under 500 lines; if you're approaching this limit, add an additional layer of hierarchy along with clear pointers about where the model using the skill should go next to follow up. +- Reference files clearly from SKILL.md with guidance on when to read them +- For large reference files (>300 lines), include a table of contents + +**Domain organization**: When a skill supports multiple domains/frameworks, organize by variant: +``` +cloud-deploy/ +├── SKILL.md (workflow + selection) +└── references/ + ├── aws.md + ├── gcp.md + └── azure.md +``` +Claude reads only the relevant reference file. + +#### Principle of Lack of Surprise + +This goes without saying, but skills must not contain malware, exploit code, or any content that could compromise system security. A skill's contents should not surprise the user in their intent if described. Don't go along with requests to create misleading skills or skills designed to facilitate unauthorized access, data exfiltration, or other malicious activities. Things like a "roleplay as an XYZ" are OK though. + +#### Writing Patterns + +Prefer using the imperative form in instructions. + +**Defining output formats** - You can do it like this: +```markdown +## Report structure +ALWAYS use this exact template: +# [Title] +## Executive summary +## Key findings +## Recommendations +``` + +**Examples pattern** - It's useful to include examples. You can format them like this (but if "Input" and "Output" are in the examples you might want to deviate a little): +```markdown +## Commit message format +**Example 1:** +Input: Added user authentication with JWT tokens +Output: feat(auth): implement JWT-based authentication +``` + +### Writing Style + +Try to explain to the model why things are important in lieu of heavy-handed musty MUSTs. Use theory of mind and try to make the skill general and not super-narrow to specific examples. Start by writing a draft and then look at it with fresh eyes and improve it. + +### Test Cases + +After writing the skill draft, come up with 2-3 realistic test prompts — the kind of thing a real user would actually say. Share them with the user: [you don't have to use this exact language] "Here are a few test cases I'd like to try. Do these look right, or do you want to add more?" Then run them. + +Save test cases to `evals/evals.json`. Don't write assertions yet — just the prompts. You'll draft assertions in the next step while the runs are in progress. + +```json +{ + "skill_name": "example-skill", + "evals": [ + { + "id": 1, + "prompt": "User's task prompt", + "expected_output": "Description of expected result", + "files": [] + } + ] +} +``` + +See `references/schemas.md` for the full schema (including the `assertions` field, which you'll add later). + +## Running and evaluating test cases + +This section is one continuous sequence — don't stop partway through. Do NOT use `/skill-test` or any other testing skill. + +Put results in `-workspace/` as a sibling to the skill directory. Within the workspace, organize results by iteration (`iteration-1/`, `iteration-2/`, etc.) and within that, each test case gets a directory (`eval-0/`, `eval-1/`, etc.). Don't create all of this upfront — just create directories as you go. + +### Step 1: Spawn all runs (with-skill AND baseline) in the same turn + +For each test case, spawn two subagents in the same turn — one with the skill, one without. This is important: don't spawn the with-skill runs first and then come back for baselines later. Launch everything at once so it all finishes around the same time. + +**With-skill run:** + +``` +Execute this task: +- Skill path: +- Task: +- Input files: +- Save outputs to: /iteration-/eval-/with_skill/outputs/ +- Outputs to save: +``` + +**Baseline run** (same prompt, but the baseline depends on context): +- **Creating a new skill**: no skill at all. Same prompt, no skill path, save to `without_skill/outputs/`. +- **Improving an existing skill**: the old version. Before editing, snapshot the skill (`cp -r /skill-snapshot/`), then point the baseline subagent at the snapshot. Save to `old_skill/outputs/`. + +Write an `eval_metadata.json` for each test case (assertions can be empty for now). Give each eval a descriptive name based on what it's testing — not just "eval-0". Use this name for the directory too. If this iteration uses new or modified eval prompts, create these files for each new eval directory — don't assume they carry over from previous iterations. + +```json +{ + "eval_id": 0, + "eval_name": "descriptive-name-here", + "prompt": "The user's task prompt", + "assertions": [] +} +``` + +### Step 2: While runs are in progress, draft assertions + +Don't just wait for the runs to finish — you can use this time productively. Draft quantitative assertions for each test case and explain them to the user. If assertions already exist in `evals/evals.json`, review them and explain what they check. + +Good assertions are objectively verifiable and have descriptive names — they should read clearly in the benchmark viewer so someone glancing at the results immediately understands what each one checks. Subjective skills (writing style, design quality) are better evaluated qualitatively — don't force assertions onto things that need human judgment. + +Update the `eval_metadata.json` files and `evals/evals.json` with the assertions once drafted. Also explain to the user what they'll see in the viewer — both the qualitative outputs and the quantitative benchmark. + +### Step 3: As runs complete, capture timing data + +When each subagent task completes, you receive a notification containing `total_tokens` and `duration_ms`. Save this data immediately to `timing.json` in the run directory: + +```json +{ + "total_tokens": 84852, + "duration_ms": 23332, + "total_duration_seconds": 23.3 +} +``` + +This is the only opportunity to capture this data — it comes through the task notification and isn't persisted elsewhere. Process each notification as it arrives rather than trying to batch them. + +### Step 4: Grade, aggregate, and launch the viewer + +Once all runs are done: + +1. **Grade each run** — spawn a grader subagent (or grade inline) that reads `agents/grader.md` and evaluates each assertion against the outputs. Save results to `grading.json` in each run directory. The grading.json expectations array must use the fields `text`, `passed`, and `evidence` (not `name`/`met`/`details` or other variants) — the viewer depends on these exact field names. For assertions that can be checked programmatically, write and run a script rather than eyeballing it — scripts are faster, more reliable, and can be reused across iterations. + +2. **Aggregate into benchmark** — run the aggregation script from the skill-creator directory: + ```bash + python -m scripts.aggregate_benchmark /iteration-N --skill-name + ``` + This produces `benchmark.json` and `benchmark.md` with pass_rate, time, and tokens for each configuration, with mean ± stddev and the delta. If generating benchmark.json manually, see `references/schemas.md` for the exact schema the viewer expects. +Put each with_skill version before its baseline counterpart. + +3. **Do an analyst pass** — read the benchmark data and surface patterns the aggregate stats might hide. See `agents/analyzer.md` (the "Analyzing Benchmark Results" section) for what to look for — things like assertions that always pass regardless of skill (non-discriminating), high-variance evals (possibly flaky), and time/token tradeoffs. + +4. **Launch the viewer** with both qualitative outputs and quantitative data: + ```bash + nohup python /eval-viewer/generate_review.py \ + /iteration-N \ + --skill-name "my-skill" \ + --benchmark /iteration-N/benchmark.json \ + > /dev/null 2>&1 & + VIEWER_PID=$! + ``` + For iteration 2+, also pass `--previous-workspace /iteration-`. + + **Cowork / headless environments:** If `webbrowser.open()` is not available or the environment has no display, use `--static ` to write a standalone HTML file instead of starting a server. Feedback will be downloaded as a `feedback.json` file when the user clicks "Submit All Reviews". After download, copy `feedback.json` into the workspace directory for the next iteration to pick up. + +Note: please use generate_review.py to create the viewer; there's no need to write custom HTML. + +5. **Tell the user** something like: "I've opened the results in your browser. There are two tabs — 'Outputs' lets you click through each test case and leave feedback, 'Benchmark' shows the quantitative comparison. When you're done, come back here and let me know." + +### What the user sees in the viewer + +The "Outputs" tab shows one test case at a time: +- **Prompt**: the task that was given +- **Output**: the files the skill produced, rendered inline where possible +- **Previous Output** (iteration 2+): collapsed section showing last iteration's output +- **Formal Grades** (if grading was run): collapsed section showing assertion pass/fail +- **Feedback**: a textbox that auto-saves as they type +- **Previous Feedback** (iteration 2+): their comments from last time, shown below the textbox + +The "Benchmark" tab shows the stats summary: pass rates, timing, and token usage for each configuration, with per-eval breakdowns and analyst observations. + +Navigation is via prev/next buttons or arrow keys. When done, they click "Submit All Reviews" which saves all feedback to `feedback.json`. + +### Step 5: Read the feedback + +When the user tells you they're done, read `feedback.json`: + +```json +{ + "reviews": [ + {"run_id": "eval-0-with_skill", "feedback": "the chart is missing axis labels", "timestamp": "..."}, + {"run_id": "eval-1-with_skill", "feedback": "", "timestamp": "..."}, + {"run_id": "eval-2-with_skill", "feedback": "perfect, love this", "timestamp": "..."} + ], + "status": "complete" +} +``` + +Empty feedback means the user thought it was fine. Focus your improvements on the test cases where the user had specific complaints. + +Kill the viewer server when you're done with it: + +```bash +kill $VIEWER_PID 2>/dev/null +``` + +--- + +## Improving the skill + +This is the heart of the loop. You've run the test cases, the user has reviewed the results, and now you need to make the skill better based on their feedback. + +### How to think about improvements + +1. **Generalize from the feedback.** The big picture thing that's happening here is that we're trying to create skills that can be used a million times (maybe literally, maybe even more who knows) across many different prompts. Here you and the user are iterating on only a few examples over and over again because it helps move faster. The user knows these examples in and out and it's quick for them to assess new outputs. But if the skill you and the user are codeveloping works only for those examples, it's useless. Rather than put in fiddly overfitty changes, or oppressively constrictive MUSTs, if there's some stubborn issue, you might try branching out and using different metaphors, or recommending different patterns of working. It's relatively cheap to try and maybe you'll land on something great. + +2. **Keep the prompt lean.** Remove things that aren't pulling their weight. Make sure to read the transcripts, not just the final outputs — if it looks like the skill is making the model waste a bunch of time doing things that are unproductive, you can try getting rid of the parts of the skill that are making it do that and seeing what happens. + +3. **Explain the why.** Try hard to explain the **why** behind everything you're asking the model to do. Today's LLMs are *smart*. They have good theory of mind and when given a good harness can go beyond rote instructions and really make things happen. Even if the feedback from the user is terse or frustrated, try to actually understand the task and why the user is writing what they wrote, and what they actually wrote, and then transmit this understanding into the instructions. If you find yourself writing ALWAYS or NEVER in all caps, or using super rigid structures, that's a yellow flag — if possible, reframe and explain the reasoning so that the model understands why the thing you're asking for is important. That's a more humane, powerful, and effective approach. + +4. **Look for repeated work across test cases.** Read the transcripts from the test runs and notice if the subagents all independently wrote similar helper scripts or took the same multi-step approach to something. If all 3 test cases resulted in the subagent writing a `create_docx.py` or a `build_chart.py`, that's a strong signal the skill should bundle that script. Write it once, put it in `scripts/`, and tell the skill to use it. This saves every future invocation from reinventing the wheel. + +This task is pretty important (we are trying to create billions a year in economic value here!) and your thinking time is not the blocker; take your time and really mull things over. I'd suggest writing a draft revision and then looking at it anew and making improvements. Really do your best to get into the head of the user and understand what they want and need. + +### The iteration loop + +After improving the skill: + +1. Apply your improvements to the skill +2. Rerun all test cases into a new `iteration-/` directory, including baseline runs. If you're creating a new skill, the baseline is always `without_skill` (no skill) — that stays the same across iterations. If you're improving an existing skill, use your judgment on what makes sense as the baseline: the original version the user came in with, or the previous iteration. +3. Launch the reviewer with `--previous-workspace` pointing at the previous iteration +4. Wait for the user to review and tell you they're done +5. Read the new feedback, improve again, repeat + +Keep going until: +- The user says they're happy +- The feedback is all empty (everything looks good) +- You're not making meaningful progress + +--- + +## Advanced: Blind comparison + +For situations where you want a more rigorous comparison between two versions of a skill (e.g., the user asks "is the new version actually better?"), there's a blind comparison system. Read `agents/comparator.md` and `agents/analyzer.md` for the details. The basic idea is: give two outputs to an independent agent without telling it which is which, and let it judge quality. Then analyze why the winner won. + +This is optional, requires subagents, and most users won't need it. The human review loop is usually sufficient. + +--- + +## Description Optimization + +The description field in SKILL.md frontmatter is the primary mechanism that determines whether Claude invokes a skill. After creating or improving a skill, offer to optimize the description for better triggering accuracy. + +### Step 1: Generate trigger eval queries + +Create 20 eval queries — a mix of should-trigger and should-not-trigger. Save as JSON: + +```json +[ + {"query": "the user prompt", "should_trigger": true}, + {"query": "another prompt", "should_trigger": false} +] +``` + +The queries must be realistic and something a Claude Code or Claude.ai user would actually type. Not abstract requests, but requests that are concrete and specific and have a good amount of detail. For instance, file paths, personal context about the user's job or situation, column names and values, company names, URLs. A little bit of backstory. Some might be in lowercase or contain abbreviations or typos or casual speech. Use a mix of different lengths, and focus on edge cases rather than making them clear-cut (the user will get a chance to sign off on them). + +Bad: `"Format this data"`, `"Extract text from PDF"`, `"Create a chart"` + +Good: `"ok so my boss just sent me this xlsx file (its in my downloads, called something like 'Q4 sales final FINAL v2.xlsx') and she wants me to add a column that shows the profit margin as a percentage. The revenue is in column C and costs are in column D i think"` + +For the **should-trigger** queries (8-10), think about coverage. You want different phrasings of the same intent — some formal, some casual. Include cases where the user doesn't explicitly name the skill or file type but clearly needs it. Throw in some uncommon use cases and cases where this skill competes with another but should win. + +For the **should-not-trigger** queries (8-10), the most valuable ones are the near-misses — queries that share keywords or concepts with the skill but actually need something different. Think adjacent domains, ambiguous phrasing where a naive keyword match would trigger but shouldn't, and cases where the query touches on something the skill does but in a context where another tool is more appropriate. + +The key thing to avoid: don't make should-not-trigger queries obviously irrelevant. "Write a fibonacci function" as a negative test for a PDF skill is too easy — it doesn't test anything. The negative cases should be genuinely tricky. + +### Step 2: Review with user + +Present the eval set to the user for review using the HTML template: + +1. Read the template from `assets/eval_review.html` +2. Replace the placeholders: + - `__EVAL_DATA_PLACEHOLDER__` → the JSON array of eval items (no quotes around it — it's a JS variable assignment) + - `__SKILL_NAME_PLACEHOLDER__` → the skill's name + - `__SKILL_DESCRIPTION_PLACEHOLDER__` → the skill's current description +3. Write to a temp file (e.g., `/tmp/eval_review_.html`) and open it: `open /tmp/eval_review_.html` +4. The user can edit queries, toggle should-trigger, add/remove entries, then click "Export Eval Set" +5. The file downloads to `~/Downloads/eval_set.json` — check the Downloads folder for the most recent version in case there are multiple (e.g., `eval_set (1).json`) + +This step matters — bad eval queries lead to bad descriptions. + +### Step 3: Run the optimization loop + +Tell the user: "This will take some time — I'll run the optimization loop in the background and check on it periodically." + +Save the eval set to the workspace, then run in the background: + +```bash +python -m scripts.run_loop \ + --eval-set \ + --skill-path \ + --model \ + --max-iterations 5 \ + --verbose +``` + +Use the model ID from your system prompt (the one powering the current session) so the triggering test matches what the user actually experiences. + +While it runs, periodically tail the output to give the user updates on which iteration it's on and what the scores look like. + +This handles the full optimization loop automatically. It splits the eval set into 60% train and 40% held-out test, evaluates the current description (running each query 3 times to get a reliable trigger rate), then calls Claude with extended thinking to propose improvements based on what failed. It re-evaluates each new description on both train and test, iterating up to 5 times. When it's done, it opens an HTML report in the browser showing the results per iteration and returns JSON with `best_description` — selected by test score rather than train score to avoid overfitting. + +### How skill triggering works + +Understanding the triggering mechanism helps design better eval queries. Skills appear in Claude's `available_skills` list with their name + description, and Claude decides whether to consult a skill based on that description. The important thing to know is that Claude only consults skills for tasks it can't easily handle on its own — simple, one-step queries like "read this PDF" may not trigger a skill even if the description matches perfectly, because Claude can handle them directly with basic tools. Complex, multi-step, or specialized queries reliably trigger skills when the description matches. + +This means your eval queries should be substantive enough that Claude would actually benefit from consulting a skill. Simple queries like "read file X" are poor test cases — they won't trigger skills regardless of description quality. + +### Step 4: Apply the result + +Take `best_description` from the JSON output and update the skill's SKILL.md frontmatter. Show the user before/after and report the scores. + +--- + +### Package and Present (only if `present_files` tool is available) + +Check whether you have access to the `present_files` tool. If you don't, skip this step. If you do, package the skill and present the .skill file to the user: + +```bash +python -m scripts.package_skill +``` + +After packaging, direct the user to the resulting `.skill` file path so they can install it. + +--- + +## Claude.ai-specific instructions + +In Claude.ai, the core workflow is the same (draft → test → review → improve → repeat), but because Claude.ai doesn't have subagents, some mechanics change. Here's what to adapt: + +**Running test cases**: No subagents means no parallel execution. For each test case, read the skill's SKILL.md, then follow its instructions to accomplish the test prompt yourself. Do them one at a time. This is less rigorous than independent subagents (you wrote the skill and you're also running it, so you have full context), but it's a useful sanity check — and the human review step compensates. Skip the baseline runs — just use the skill to complete the task as requested. + +**Reviewing results**: If you can't open a browser (e.g., Claude.ai's VM has no display, or you're on a remote server), skip the browser reviewer entirely. Instead, present results directly in the conversation. For each test case, show the prompt and the output. If the output is a file the user needs to see (like a .docx or .xlsx), save it to the filesystem and tell them where it is so they can download and inspect it. Ask for feedback inline: "How does this look? Anything you'd change?" + +**Benchmarking**: Skip the quantitative benchmarking — it relies on baseline comparisons which aren't meaningful without subagents. Focus on qualitative feedback from the user. + +**The iteration loop**: Same as before — improve the skill, rerun the test cases, ask for feedback — just without the browser reviewer in the middle. You can still organize results into iteration directories on the filesystem if you have one. + +**Description optimization**: This section requires the `claude` CLI tool (specifically `claude -p`) which is only available in Claude Code. Skip it if you're on Claude.ai. + +**Blind comparison**: Requires subagents. Skip it. + +**Packaging**: The `package_skill.py` script works anywhere with Python and a filesystem. On Claude.ai, you can run it and the user can download the resulting `.skill` file. + +--- + +## Cowork-Specific Instructions + +If you're in Cowork, the main things to know are: + +- You have subagents, so the main workflow (spawn test cases in parallel, run baselines, grade, etc.) all works. (However, if you run into severe problems with timeouts, it's OK to run the test prompts in series rather than parallel.) +- You don't have a browser or display, so when generating the eval viewer, use `--static ` to write a standalone HTML file instead of starting a server. Then proffer a link that the user can click to open the HTML in their browser. +- For whatever reason, the Cowork setup seems to disincline Claude from generating the eval viewer after running the tests, so just to reiterate: whether you're in Cowork or in Claude Code, after running tests, you should always generate the eval viewer for the human to look at examples before revising the skill yourself and trying to make corrections, using `generate_review.py` (not writing your own boutique html code). Sorry in advance but I'm gonna go all caps here: GENERATE THE EVAL VIEWER *BEFORE* evaluating inputs yourself. You want to get them in front of the human ASAP! +- Feedback works differently: since there's no running server, the viewer's "Submit All Reviews" button will download `feedback.json` as a file. You can then read it from there (you may have to request access first). +- Packaging works — `package_skill.py` just needs Python and a filesystem. +- Description optimization (`run_loop.py` / `run_eval.py`) should work in Cowork just fine since it uses `claude -p` via subprocess, not a browser, but please save it until you've fully finished making the skill and the user agrees it's in good shape. + +--- + +## Reference files + +The agents/ directory contains instructions for specialized subagents. Read them when you need to spawn the relevant subagent. + +- `agents/grader.md` — How to evaluate assertions against outputs +- `agents/comparator.md` — How to do blind A/B comparison between two outputs +- `agents/analyzer.md` — How to analyze why one version beat another + +The references/ directory has additional documentation: +- `references/schemas.md` — JSON structures for evals.json, grading.json, etc. + +--- + +Repeating one more time the core loop here for emphasis: + +- Figure out what the skill is about +- Draft or edit the skill +- Run claude-with-access-to-the-skill on test prompts +- With the user, evaluate the outputs: + - Create benchmark.json and run `eval-viewer/generate_review.py` to help the user review them + - Run quantitative evals +- Repeat until you and the user are satisfied +- Package the final skill and return it to the user. + +Please add steps to your TodoList, if you have such a thing, to make sure you don't forget. If you're in Cowork, please specifically put "Create evals JSON and run `eval-viewer/generate_review.py` so human can review test cases" in your TodoList to make sure it happens. + +Good luck! diff --git a/.claude/skills/skill-creator/agents/analyzer.md b/.claude/skills/skill-creator/agents/analyzer.md new file mode 100644 index 0000000..14e41d6 --- /dev/null +++ b/.claude/skills/skill-creator/agents/analyzer.md @@ -0,0 +1,274 @@ +# Post-hoc Analyzer Agent + +Analyze blind comparison results to understand WHY the winner won and generate improvement suggestions. + +## Role + +After the blind comparator determines a winner, the Post-hoc Analyzer "unblids" the results by examining the skills and transcripts. The goal is to extract actionable insights: what made the winner better, and how can the loser be improved? + +## Inputs + +You receive these parameters in your prompt: + +- **winner**: "A" or "B" (from blind comparison) +- **winner_skill_path**: Path to the skill that produced the winning output +- **winner_transcript_path**: Path to the execution transcript for the winner +- **loser_skill_path**: Path to the skill that produced the losing output +- **loser_transcript_path**: Path to the execution transcript for the loser +- **comparison_result_path**: Path to the blind comparator's output JSON +- **output_path**: Where to save the analysis results + +## Process + +### Step 1: Read Comparison Result + +1. Read the blind comparator's output at comparison_result_path +2. Note the winning side (A or B), the reasoning, and any scores +3. Understand what the comparator valued in the winning output + +### Step 2: Read Both Skills + +1. Read the winner skill's SKILL.md and key referenced files +2. Read the loser skill's SKILL.md and key referenced files +3. Identify structural differences: + - Instructions clarity and specificity + - Script/tool usage patterns + - Example coverage + - Edge case handling + +### Step 3: Read Both Transcripts + +1. Read the winner's transcript +2. Read the loser's transcript +3. Compare execution patterns: + - How closely did each follow their skill's instructions? + - What tools were used differently? + - Where did the loser diverge from optimal behavior? + - Did either encounter errors or make recovery attempts? + +### Step 4: Analyze Instruction Following + +For each transcript, evaluate: +- Did the agent follow the skill's explicit instructions? +- Did the agent use the skill's provided tools/scripts? +- Were there missed opportunities to leverage skill content? +- Did the agent add unnecessary steps not in the skill? + +Score instruction following 1-10 and note specific issues. + +### Step 5: Identify Winner Strengths + +Determine what made the winner better: +- Clearer instructions that led to better behavior? +- Better scripts/tools that produced better output? +- More comprehensive examples that guided edge cases? +- Better error handling guidance? + +Be specific. Quote from skills/transcripts where relevant. + +### Step 6: Identify Loser Weaknesses + +Determine what held the loser back: +- Ambiguous instructions that led to suboptimal choices? +- Missing tools/scripts that forced workarounds? +- Gaps in edge case coverage? +- Poor error handling that caused failures? + +### Step 7: Generate Improvement Suggestions + +Based on the analysis, produce actionable suggestions for improving the loser skill: +- Specific instruction changes to make +- Tools/scripts to add or modify +- Examples to include +- Edge cases to address + +Prioritize by impact. Focus on changes that would have changed the outcome. + +### Step 8: Write Analysis Results + +Save structured analysis to `{output_path}`. + +## Output Format + +Write a JSON file with this structure: + +```json +{ + "comparison_summary": { + "winner": "A", + "winner_skill": "path/to/winner/skill", + "loser_skill": "path/to/loser/skill", + "comparator_reasoning": "Brief summary of why comparator chose winner" + }, + "winner_strengths": [ + "Clear step-by-step instructions for handling multi-page documents", + "Included validation script that caught formatting errors", + "Explicit guidance on fallback behavior when OCR fails" + ], + "loser_weaknesses": [ + "Vague instruction 'process the document appropriately' led to inconsistent behavior", + "No script for validation, agent had to improvise and made errors", + "No guidance on OCR failure, agent gave up instead of trying alternatives" + ], + "instruction_following": { + "winner": { + "score": 9, + "issues": [ + "Minor: skipped optional logging step" + ] + }, + "loser": { + "score": 6, + "issues": [ + "Did not use the skill's formatting template", + "Invented own approach instead of following step 3", + "Missed the 'always validate output' instruction" + ] + } + }, + "improvement_suggestions": [ + { + "priority": "high", + "category": "instructions", + "suggestion": "Replace 'process the document appropriately' with explicit steps: 1) Extract text, 2) Identify sections, 3) Format per template", + "expected_impact": "Would eliminate ambiguity that caused inconsistent behavior" + }, + { + "priority": "high", + "category": "tools", + "suggestion": "Add validate_output.py script similar to winner skill's validation approach", + "expected_impact": "Would catch formatting errors before final output" + }, + { + "priority": "medium", + "category": "error_handling", + "suggestion": "Add fallback instructions: 'If OCR fails, try: 1) different resolution, 2) image preprocessing, 3) manual extraction'", + "expected_impact": "Would prevent early failure on difficult documents" + } + ], + "transcript_insights": { + "winner_execution_pattern": "Read skill -> Followed 5-step process -> Used validation script -> Fixed 2 issues -> Produced output", + "loser_execution_pattern": "Read skill -> Unclear on approach -> Tried 3 different methods -> No validation -> Output had errors" + } +} +``` + +## Guidelines + +- **Be specific**: Quote from skills and transcripts, don't just say "instructions were unclear" +- **Be actionable**: Suggestions should be concrete changes, not vague advice +- **Focus on skill improvements**: The goal is to improve the losing skill, not critique the agent +- **Prioritize by impact**: Which changes would most likely have changed the outcome? +- **Consider causation**: Did the skill weakness actually cause the worse output, or is it incidental? +- **Stay objective**: Analyze what happened, don't editorialize +- **Think about generalization**: Would this improvement help on other evals too? + +## Categories for Suggestions + +Use these categories to organize improvement suggestions: + +| Category | Description | +|----------|-------------| +| `instructions` | Changes to the skill's prose instructions | +| `tools` | Scripts, templates, or utilities to add/modify | +| `examples` | Example inputs/outputs to include | +| `error_handling` | Guidance for handling failures | +| `structure` | Reorganization of skill content | +| `references` | External docs or resources to add | + +## Priority Levels + +- **high**: Would likely change the outcome of this comparison +- **medium**: Would improve quality but may not change win/loss +- **low**: Nice to have, marginal improvement + +--- + +# Analyzing Benchmark Results + +When analyzing benchmark results, the analyzer's purpose is to **surface patterns and anomalies** across multiple runs, not suggest skill improvements. + +## Role + +Review all benchmark run results and generate freeform notes that help the user understand skill performance. Focus on patterns that wouldn't be visible from aggregate metrics alone. + +## Inputs + +You receive these parameters in your prompt: + +- **benchmark_data_path**: Path to the in-progress benchmark.json with all run results +- **skill_path**: Path to the skill being benchmarked +- **output_path**: Where to save the notes (as JSON array of strings) + +## Process + +### Step 1: Read Benchmark Data + +1. Read the benchmark.json containing all run results +2. Note the configurations tested (with_skill, without_skill) +3. Understand the run_summary aggregates already calculated + +### Step 2: Analyze Per-Assertion Patterns + +For each expectation across all runs: +- Does it **always pass** in both configurations? (may not differentiate skill value) +- Does it **always fail** in both configurations? (may be broken or beyond capability) +- Does it **always pass with skill but fail without**? (skill clearly adds value here) +- Does it **always fail with skill but pass without**? (skill may be hurting) +- Is it **highly variable**? (flaky expectation or non-deterministic behavior) + +### Step 3: Analyze Cross-Eval Patterns + +Look for patterns across evals: +- Are certain eval types consistently harder/easier? +- Do some evals show high variance while others are stable? +- Are there surprising results that contradict expectations? + +### Step 4: Analyze Metrics Patterns + +Look at time_seconds, tokens, tool_calls: +- Does the skill significantly increase execution time? +- Is there high variance in resource usage? +- Are there outlier runs that skew the aggregates? + +### Step 5: Generate Notes + +Write freeform observations as a list of strings. Each note should: +- State a specific observation +- Be grounded in the data (not speculation) +- Help the user understand something the aggregate metrics don't show + +Examples: +- "Assertion 'Output is a PDF file' passes 100% in both configurations - may not differentiate skill value" +- "Eval 3 shows high variance (50% ± 40%) - run 2 had an unusual failure that may be flaky" +- "Without-skill runs consistently fail on table extraction expectations (0% pass rate)" +- "Skill adds 13s average execution time but improves pass rate by 50%" +- "Token usage is 80% higher with skill, primarily due to script output parsing" +- "All 3 without-skill runs for eval 1 produced empty output" + +### Step 6: Write Notes + +Save notes to `{output_path}` as a JSON array of strings: + +```json +[ + "Assertion 'Output is a PDF file' passes 100% in both configurations - may not differentiate skill value", + "Eval 3 shows high variance (50% ± 40%) - run 2 had an unusual failure", + "Without-skill runs consistently fail on table extraction expectations", + "Skill adds 13s average execution time but improves pass rate by 50%" +] +``` + +## Guidelines + +**DO:** +- Report what you observe in the data +- Be specific about which evals, expectations, or runs you're referring to +- Note patterns that aggregate metrics would hide +- Provide context that helps interpret the numbers + +**DO NOT:** +- Suggest improvements to the skill (that's for the improvement step, not benchmarking) +- Make subjective quality judgments ("the output was good/bad") +- Speculate about causes without evidence +- Repeat information already in the run_summary aggregates diff --git a/.claude/skills/skill-creator/agents/comparator.md b/.claude/skills/skill-creator/agents/comparator.md new file mode 100644 index 0000000..80e00eb --- /dev/null +++ b/.claude/skills/skill-creator/agents/comparator.md @@ -0,0 +1,202 @@ +# Blind Comparator Agent + +Compare two outputs WITHOUT knowing which skill produced them. + +## Role + +The Blind Comparator judges which output better accomplishes the eval task. You receive two outputs labeled A and B, but you do NOT know which skill produced which. This prevents bias toward a particular skill or approach. + +Your judgment is based purely on output quality and task completion. + +## Inputs + +You receive these parameters in your prompt: + +- **output_a_path**: Path to the first output file or directory +- **output_b_path**: Path to the second output file or directory +- **eval_prompt**: The original task/prompt that was executed +- **expectations**: List of expectations to check (optional - may be empty) + +## Process + +### Step 1: Read Both Outputs + +1. Examine output A (file or directory) +2. Examine output B (file or directory) +3. Note the type, structure, and content of each +4. If outputs are directories, examine all relevant files inside + +### Step 2: Understand the Task + +1. Read the eval_prompt carefully +2. Identify what the task requires: + - What should be produced? + - What qualities matter (accuracy, completeness, format)? + - What would distinguish a good output from a poor one? + +### Step 3: Generate Evaluation Rubric + +Based on the task, generate a rubric with two dimensions: + +**Content Rubric** (what the output contains): +| Criterion | 1 (Poor) | 3 (Acceptable) | 5 (Excellent) | +|-----------|----------|----------------|---------------| +| Correctness | Major errors | Minor errors | Fully correct | +| Completeness | Missing key elements | Mostly complete | All elements present | +| Accuracy | Significant inaccuracies | Minor inaccuracies | Accurate throughout | + +**Structure Rubric** (how the output is organized): +| Criterion | 1 (Poor) | 3 (Acceptable) | 5 (Excellent) | +|-----------|----------|----------------|---------------| +| Organization | Disorganized | Reasonably organized | Clear, logical structure | +| Formatting | Inconsistent/broken | Mostly consistent | Professional, polished | +| Usability | Difficult to use | Usable with effort | Easy to use | + +Adapt criteria to the specific task. For example: +- PDF form → "Field alignment", "Text readability", "Data placement" +- Document → "Section structure", "Heading hierarchy", "Paragraph flow" +- Data output → "Schema correctness", "Data types", "Completeness" + +### Step 4: Evaluate Each Output Against the Rubric + +For each output (A and B): + +1. **Score each criterion** on the rubric (1-5 scale) +2. **Calculate dimension totals**: Content score, Structure score +3. **Calculate overall score**: Average of dimension scores, scaled to 1-10 + +### Step 5: Check Assertions (if provided) + +If expectations are provided: + +1. Check each expectation against output A +2. Check each expectation against output B +3. Count pass rates for each output +4. Use expectation scores as secondary evidence (not the primary decision factor) + +### Step 6: Determine the Winner + +Compare A and B based on (in priority order): + +1. **Primary**: Overall rubric score (content + structure) +2. **Secondary**: Assertion pass rates (if applicable) +3. **Tiebreaker**: If truly equal, declare a TIE + +Be decisive - ties should be rare. One output is usually better, even if marginally. + +### Step 7: Write Comparison Results + +Save results to a JSON file at the path specified (or `comparison.json` if not specified). + +## Output Format + +Write a JSON file with this structure: + +```json +{ + "winner": "A", + "reasoning": "Output A provides a complete solution with proper formatting and all required fields. Output B is missing the date field and has formatting inconsistencies.", + "rubric": { + "A": { + "content": { + "correctness": 5, + "completeness": 5, + "accuracy": 4 + }, + "structure": { + "organization": 4, + "formatting": 5, + "usability": 4 + }, + "content_score": 4.7, + "structure_score": 4.3, + "overall_score": 9.0 + }, + "B": { + "content": { + "correctness": 3, + "completeness": 2, + "accuracy": 3 + }, + "structure": { + "organization": 3, + "formatting": 2, + "usability": 3 + }, + "content_score": 2.7, + "structure_score": 2.7, + "overall_score": 5.4 + } + }, + "output_quality": { + "A": { + "score": 9, + "strengths": ["Complete solution", "Well-formatted", "All fields present"], + "weaknesses": ["Minor style inconsistency in header"] + }, + "B": { + "score": 5, + "strengths": ["Readable output", "Correct basic structure"], + "weaknesses": ["Missing date field", "Formatting inconsistencies", "Partial data extraction"] + } + }, + "expectation_results": { + "A": { + "passed": 4, + "total": 5, + "pass_rate": 0.80, + "details": [ + {"text": "Output includes name", "passed": true}, + {"text": "Output includes date", "passed": true}, + {"text": "Format is PDF", "passed": true}, + {"text": "Contains signature", "passed": false}, + {"text": "Readable text", "passed": true} + ] + }, + "B": { + "passed": 3, + "total": 5, + "pass_rate": 0.60, + "details": [ + {"text": "Output includes name", "passed": true}, + {"text": "Output includes date", "passed": false}, + {"text": "Format is PDF", "passed": true}, + {"text": "Contains signature", "passed": false}, + {"text": "Readable text", "passed": true} + ] + } + } +} +``` + +If no expectations were provided, omit the `expectation_results` field entirely. + +## Field Descriptions + +- **winner**: "A", "B", or "TIE" +- **reasoning**: Clear explanation of why the winner was chosen (or why it's a tie) +- **rubric**: Structured rubric evaluation for each output + - **content**: Scores for content criteria (correctness, completeness, accuracy) + - **structure**: Scores for structure criteria (organization, formatting, usability) + - **content_score**: Average of content criteria (1-5) + - **structure_score**: Average of structure criteria (1-5) + - **overall_score**: Combined score scaled to 1-10 +- **output_quality**: Summary quality assessment + - **score**: 1-10 rating (should match rubric overall_score) + - **strengths**: List of positive aspects + - **weaknesses**: List of issues or shortcomings +- **expectation_results**: (Only if expectations provided) + - **passed**: Number of expectations that passed + - **total**: Total number of expectations + - **pass_rate**: Fraction passed (0.0 to 1.0) + - **details**: Individual expectation results + +## Guidelines + +- **Stay blind**: DO NOT try to infer which skill produced which output. Judge purely on output quality. +- **Be specific**: Cite specific examples when explaining strengths and weaknesses. +- **Be decisive**: Choose a winner unless outputs are genuinely equivalent. +- **Output quality first**: Assertion scores are secondary to overall task completion. +- **Be objective**: Don't favor outputs based on style preferences; focus on correctness and completeness. +- **Explain your reasoning**: The reasoning field should make it clear why you chose the winner. +- **Handle edge cases**: If both outputs fail, pick the one that fails less badly. If both are excellent, pick the one that's marginally better. diff --git a/.claude/skills/skill-creator/agents/grader.md b/.claude/skills/skill-creator/agents/grader.md new file mode 100644 index 0000000..558ab05 --- /dev/null +++ b/.claude/skills/skill-creator/agents/grader.md @@ -0,0 +1,223 @@ +# Grader Agent + +Evaluate expectations against an execution transcript and outputs. + +## Role + +The Grader reviews a transcript and output files, then determines whether each expectation passes or fails. Provide clear evidence for each judgment. + +You have two jobs: grade the outputs, and critique the evals themselves. A passing grade on a weak assertion is worse than useless — it creates false confidence. When you notice an assertion that's trivially satisfied, or an important outcome that no assertion checks, say so. + +## Inputs + +You receive these parameters in your prompt: + +- **expectations**: List of expectations to evaluate (strings) +- **transcript_path**: Path to the execution transcript (markdown file) +- **outputs_dir**: Directory containing output files from execution + +## Process + +### Step 1: Read the Transcript + +1. Read the transcript file completely +2. Note the eval prompt, execution steps, and final result +3. Identify any issues or errors documented + +### Step 2: Examine Output Files + +1. List files in outputs_dir +2. Read/examine each file relevant to the expectations. If outputs aren't plain text, use the inspection tools provided in your prompt — don't rely solely on what the transcript says the executor produced. +3. Note contents, structure, and quality + +### Step 3: Evaluate Each Assertion + +For each expectation: + +1. **Search for evidence** in the transcript and outputs +2. **Determine verdict**: + - **PASS**: Clear evidence the expectation is true AND the evidence reflects genuine task completion, not just surface-level compliance + - **FAIL**: No evidence, or evidence contradicts the expectation, or the evidence is superficial (e.g., correct filename but empty/wrong content) +3. **Cite the evidence**: Quote the specific text or describe what you found + +### Step 4: Extract and Verify Claims + +Beyond the predefined expectations, extract implicit claims from the outputs and verify them: + +1. **Extract claims** from the transcript and outputs: + - Factual statements ("The form has 12 fields") + - Process claims ("Used pypdf to fill the form") + - Quality claims ("All fields were filled correctly") + +2. **Verify each claim**: + - **Factual claims**: Can be checked against the outputs or external sources + - **Process claims**: Can be verified from the transcript + - **Quality claims**: Evaluate whether the claim is justified + +3. **Flag unverifiable claims**: Note claims that cannot be verified with available information + +This catches issues that predefined expectations might miss. + +### Step 5: Read User Notes + +If `{outputs_dir}/user_notes.md` exists: +1. Read it and note any uncertainties or issues flagged by the executor +2. Include relevant concerns in the grading output +3. These may reveal problems even when expectations pass + +### Step 6: Critique the Evals + +After grading, consider whether the evals themselves could be improved. Only surface suggestions when there's a clear gap. + +Good suggestions test meaningful outcomes — assertions that are hard to satisfy without actually doing the work correctly. Think about what makes an assertion *discriminating*: it passes when the skill genuinely succeeds and fails when it doesn't. + +Suggestions worth raising: +- An assertion that passed but would also pass for a clearly wrong output (e.g., checking filename existence but not file content) +- An important outcome you observed — good or bad — that no assertion covers at all +- An assertion that can't actually be verified from the available outputs + +Keep the bar high. The goal is to flag things the eval author would say "good catch" about, not to nitpick every assertion. + +### Step 7: Write Grading Results + +Save results to `{outputs_dir}/../grading.json` (sibling to outputs_dir). + +## Grading Criteria + +**PASS when**: +- The transcript or outputs clearly demonstrate the expectation is true +- Specific evidence can be cited +- The evidence reflects genuine substance, not just surface compliance (e.g., a file exists AND contains correct content, not just the right filename) + +**FAIL when**: +- No evidence found for the expectation +- Evidence contradicts the expectation +- The expectation cannot be verified from available information +- The evidence is superficial — the assertion is technically satisfied but the underlying task outcome is wrong or incomplete +- The output appears to meet the assertion by coincidence rather than by actually doing the work + +**When uncertain**: The burden of proof to pass is on the expectation. + +### Step 8: Read Executor Metrics and Timing + +1. If `{outputs_dir}/metrics.json` exists, read it and include in grading output +2. If `{outputs_dir}/../timing.json` exists, read it and include timing data + +## Output Format + +Write a JSON file with this structure: + +```json +{ + "expectations": [ + { + "text": "The output includes the name 'John Smith'", + "passed": true, + "evidence": "Found in transcript Step 3: 'Extracted names: John Smith, Sarah Johnson'" + }, + { + "text": "The spreadsheet has a SUM formula in cell B10", + "passed": false, + "evidence": "No spreadsheet was created. The output was a text file." + }, + { + "text": "The assistant used the skill's OCR script", + "passed": true, + "evidence": "Transcript Step 2 shows: 'Tool: Bash - python ocr_script.py image.png'" + } + ], + "summary": { + "passed": 2, + "failed": 1, + "total": 3, + "pass_rate": 0.67 + }, + "execution_metrics": { + "tool_calls": { + "Read": 5, + "Write": 2, + "Bash": 8 + }, + "total_tool_calls": 15, + "total_steps": 6, + "errors_encountered": 0, + "output_chars": 12450, + "transcript_chars": 3200 + }, + "timing": { + "executor_duration_seconds": 165.0, + "grader_duration_seconds": 26.0, + "total_duration_seconds": 191.0 + }, + "claims": [ + { + "claim": "The form has 12 fillable fields", + "type": "factual", + "verified": true, + "evidence": "Counted 12 fields in field_info.json" + }, + { + "claim": "All required fields were populated", + "type": "quality", + "verified": false, + "evidence": "Reference section was left blank despite data being available" + } + ], + "user_notes_summary": { + "uncertainties": ["Used 2023 data, may be stale"], + "needs_review": [], + "workarounds": ["Fell back to text overlay for non-fillable fields"] + }, + "eval_feedback": { + "suggestions": [ + { + "assertion": "The output includes the name 'John Smith'", + "reason": "A hallucinated document that mentions the name would also pass — consider checking it appears as the primary contact with matching phone and email from the input" + }, + { + "reason": "No assertion checks whether the extracted phone numbers match the input — I observed incorrect numbers in the output that went uncaught" + } + ], + "overall": "Assertions check presence but not correctness. Consider adding content verification." + } +} +``` + +## Field Descriptions + +- **expectations**: Array of graded expectations + - **text**: The original expectation text + - **passed**: Boolean - true if expectation passes + - **evidence**: Specific quote or description supporting the verdict +- **summary**: Aggregate statistics + - **passed**: Count of passed expectations + - **failed**: Count of failed expectations + - **total**: Total expectations evaluated + - **pass_rate**: Fraction passed (0.0 to 1.0) +- **execution_metrics**: Copied from executor's metrics.json (if available) + - **output_chars**: Total character count of output files (proxy for tokens) + - **transcript_chars**: Character count of transcript +- **timing**: Wall clock timing from timing.json (if available) + - **executor_duration_seconds**: Time spent in executor subagent + - **total_duration_seconds**: Total elapsed time for the run +- **claims**: Extracted and verified claims from the output + - **claim**: The statement being verified + - **type**: "factual", "process", or "quality" + - **verified**: Boolean - whether the claim holds + - **evidence**: Supporting or contradicting evidence +- **user_notes_summary**: Issues flagged by the executor + - **uncertainties**: Things the executor wasn't sure about + - **needs_review**: Items requiring human attention + - **workarounds**: Places where the skill didn't work as expected +- **eval_feedback**: Improvement suggestions for the evals (only when warranted) + - **suggestions**: List of concrete suggestions, each with a `reason` and optionally an `assertion` it relates to + - **overall**: Brief assessment — can be "No suggestions, evals look solid" if nothing to flag + +## Guidelines + +- **Be objective**: Base verdicts on evidence, not assumptions +- **Be specific**: Quote the exact text that supports your verdict +- **Be thorough**: Check both transcript and output files +- **Be consistent**: Apply the same standard to each expectation +- **Explain failures**: Make it clear why evidence was insufficient +- **No partial credit**: Each expectation is pass or fail, not partial diff --git a/.claude/skills/skill-creator/assets/eval_review.html b/.claude/skills/skill-creator/assets/eval_review.html new file mode 100644 index 0000000..938ff32 --- /dev/null +++ b/.claude/skills/skill-creator/assets/eval_review.html @@ -0,0 +1,146 @@ + + + + + + Eval Set Review - __SKILL_NAME_PLACEHOLDER__ + + + + + + +

    Eval Set Review: __SKILL_NAME_PLACEHOLDER__

    +

    Current description: __SKILL_DESCRIPTION_PLACEHOLDER__

    + +
    + + +
    + + + + + + + + + + +
    QueryShould TriggerActions
    + +

    + + + + diff --git a/.claude/skills/skill-creator/eval-viewer/generate_review.py b/.claude/skills/skill-creator/eval-viewer/generate_review.py new file mode 100644 index 0000000..7fa5978 --- /dev/null +++ b/.claude/skills/skill-creator/eval-viewer/generate_review.py @@ -0,0 +1,471 @@ +#!/usr/bin/env python3 +"""Generate and serve a review page for eval results. + +Reads the workspace directory, discovers runs (directories with outputs/), +embeds all output data into a self-contained HTML page, and serves it via +a tiny HTTP server. Feedback auto-saves to feedback.json in the workspace. + +Usage: + python generate_review.py [--port PORT] [--skill-name NAME] + python generate_review.py --previous-feedback /path/to/old/feedback.json + +No dependencies beyond the Python stdlib are required. +""" + +import argparse +import base64 +import json +import mimetypes +import os +import re +import signal +import subprocess +import sys +import time +import webbrowser +from functools import partial +from http.server import HTTPServer, BaseHTTPRequestHandler +from pathlib import Path + +# Files to exclude from output listings +METADATA_FILES = {"transcript.md", "user_notes.md", "metrics.json"} + +# Extensions we render as inline text +TEXT_EXTENSIONS = { + ".txt", ".md", ".json", ".csv", ".py", ".js", ".ts", ".tsx", ".jsx", + ".yaml", ".yml", ".xml", ".html", ".css", ".sh", ".rb", ".go", ".rs", + ".java", ".c", ".cpp", ".h", ".hpp", ".sql", ".r", ".toml", +} + +# Extensions we render as inline images +IMAGE_EXTENSIONS = {".png", ".jpg", ".jpeg", ".gif", ".svg", ".webp"} + +# MIME type overrides for common types +MIME_OVERRIDES = { + ".svg": "image/svg+xml", + ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", +} + + +def get_mime_type(path: Path) -> str: + ext = path.suffix.lower() + if ext in MIME_OVERRIDES: + return MIME_OVERRIDES[ext] + mime, _ = mimetypes.guess_type(str(path)) + return mime or "application/octet-stream" + + +def find_runs(workspace: Path) -> list[dict]: + """Recursively find directories that contain an outputs/ subdirectory.""" + runs: list[dict] = [] + _find_runs_recursive(workspace, workspace, runs) + runs.sort(key=lambda r: (r.get("eval_id", float("inf")), r["id"])) + return runs + + +def _find_runs_recursive(root: Path, current: Path, runs: list[dict]) -> None: + if not current.is_dir(): + return + + outputs_dir = current / "outputs" + if outputs_dir.is_dir(): + run = build_run(root, current) + if run: + runs.append(run) + return + + skip = {"node_modules", ".git", "__pycache__", "skill", "inputs"} + for child in sorted(current.iterdir()): + if child.is_dir() and child.name not in skip: + _find_runs_recursive(root, child, runs) + + +def build_run(root: Path, run_dir: Path) -> dict | None: + """Build a run dict with prompt, outputs, and grading data.""" + prompt = "" + eval_id = None + + # Try eval_metadata.json + for candidate in [run_dir / "eval_metadata.json", run_dir.parent / "eval_metadata.json"]: + if candidate.exists(): + try: + metadata = json.loads(candidate.read_text()) + prompt = metadata.get("prompt", "") + eval_id = metadata.get("eval_id") + except (json.JSONDecodeError, OSError): + pass + if prompt: + break + + # Fall back to transcript.md + if not prompt: + for candidate in [run_dir / "transcript.md", run_dir / "outputs" / "transcript.md"]: + if candidate.exists(): + try: + text = candidate.read_text() + match = re.search(r"## Eval Prompt\n\n([\s\S]*?)(?=\n##|$)", text) + if match: + prompt = match.group(1).strip() + except OSError: + pass + if prompt: + break + + if not prompt: + prompt = "(No prompt found)" + + run_id = str(run_dir.relative_to(root)).replace("/", "-").replace("\\", "-") + + # Collect output files + outputs_dir = run_dir / "outputs" + output_files: list[dict] = [] + if outputs_dir.is_dir(): + for f in sorted(outputs_dir.iterdir()): + if f.is_file() and f.name not in METADATA_FILES: + output_files.append(embed_file(f)) + + # Load grading if present + grading = None + for candidate in [run_dir / "grading.json", run_dir.parent / "grading.json"]: + if candidate.exists(): + try: + grading = json.loads(candidate.read_text()) + except (json.JSONDecodeError, OSError): + pass + if grading: + break + + return { + "id": run_id, + "prompt": prompt, + "eval_id": eval_id, + "outputs": output_files, + "grading": grading, + } + + +def embed_file(path: Path) -> dict: + """Read a file and return an embedded representation.""" + ext = path.suffix.lower() + mime = get_mime_type(path) + + if ext in TEXT_EXTENSIONS: + try: + content = path.read_text(errors="replace") + except OSError: + content = "(Error reading file)" + return { + "name": path.name, + "type": "text", + "content": content, + } + elif ext in IMAGE_EXTENSIONS: + try: + raw = path.read_bytes() + b64 = base64.b64encode(raw).decode("ascii") + except OSError: + return {"name": path.name, "type": "error", "content": "(Error reading file)"} + return { + "name": path.name, + "type": "image", + "mime": mime, + "data_uri": f"data:{mime};base64,{b64}", + } + elif ext == ".pdf": + try: + raw = path.read_bytes() + b64 = base64.b64encode(raw).decode("ascii") + except OSError: + return {"name": path.name, "type": "error", "content": "(Error reading file)"} + return { + "name": path.name, + "type": "pdf", + "data_uri": f"data:{mime};base64,{b64}", + } + elif ext == ".xlsx": + try: + raw = path.read_bytes() + b64 = base64.b64encode(raw).decode("ascii") + except OSError: + return {"name": path.name, "type": "error", "content": "(Error reading file)"} + return { + "name": path.name, + "type": "xlsx", + "data_b64": b64, + } + else: + # Binary / unknown — base64 download link + try: + raw = path.read_bytes() + b64 = base64.b64encode(raw).decode("ascii") + except OSError: + return {"name": path.name, "type": "error", "content": "(Error reading file)"} + return { + "name": path.name, + "type": "binary", + "mime": mime, + "data_uri": f"data:{mime};base64,{b64}", + } + + +def load_previous_iteration(workspace: Path) -> dict[str, dict]: + """Load previous iteration's feedback and outputs. + + Returns a map of run_id -> {"feedback": str, "outputs": list[dict]}. + """ + result: dict[str, dict] = {} + + # Load feedback + feedback_map: dict[str, str] = {} + feedback_path = workspace / "feedback.json" + if feedback_path.exists(): + try: + data = json.loads(feedback_path.read_text()) + feedback_map = { + r["run_id"]: r["feedback"] + for r in data.get("reviews", []) + if r.get("feedback", "").strip() + } + except (json.JSONDecodeError, OSError, KeyError): + pass + + # Load runs (to get outputs) + prev_runs = find_runs(workspace) + for run in prev_runs: + result[run["id"]] = { + "feedback": feedback_map.get(run["id"], ""), + "outputs": run.get("outputs", []), + } + + # Also add feedback for run_ids that had feedback but no matching run + for run_id, fb in feedback_map.items(): + if run_id not in result: + result[run_id] = {"feedback": fb, "outputs": []} + + return result + + +def generate_html( + runs: list[dict], + skill_name: str, + previous: dict[str, dict] | None = None, + benchmark: dict | None = None, +) -> str: + """Generate the complete standalone HTML page with embedded data.""" + template_path = Path(__file__).parent / "viewer.html" + template = template_path.read_text() + + # Build previous_feedback and previous_outputs maps for the template + previous_feedback: dict[str, str] = {} + previous_outputs: dict[str, list[dict]] = {} + if previous: + for run_id, data in previous.items(): + if data.get("feedback"): + previous_feedback[run_id] = data["feedback"] + if data.get("outputs"): + previous_outputs[run_id] = data["outputs"] + + embedded = { + "skill_name": skill_name, + "runs": runs, + "previous_feedback": previous_feedback, + "previous_outputs": previous_outputs, + } + if benchmark: + embedded["benchmark"] = benchmark + + data_json = json.dumps(embedded) + + return template.replace("/*__EMBEDDED_DATA__*/", f"const EMBEDDED_DATA = {data_json};") + + +# --------------------------------------------------------------------------- +# HTTP server (stdlib only, zero dependencies) +# --------------------------------------------------------------------------- + +def _kill_port(port: int) -> None: + """Kill any process listening on the given port.""" + try: + result = subprocess.run( + ["lsof", "-ti", f":{port}"], + capture_output=True, text=True, timeout=5, + ) + for pid_str in result.stdout.strip().split("\n"): + if pid_str.strip(): + try: + os.kill(int(pid_str.strip()), signal.SIGTERM) + except (ProcessLookupError, ValueError): + pass + if result.stdout.strip(): + time.sleep(0.5) + except subprocess.TimeoutExpired: + pass + except FileNotFoundError: + print("Note: lsof not found, cannot check if port is in use", file=sys.stderr) + +class ReviewHandler(BaseHTTPRequestHandler): + """Serves the review HTML and handles feedback saves. + + Regenerates the HTML on each page load so that refreshing the browser + picks up new eval outputs without restarting the server. + """ + + def __init__( + self, + workspace: Path, + skill_name: str, + feedback_path: Path, + previous: dict[str, dict], + benchmark_path: Path | None, + *args, + **kwargs, + ): + self.workspace = workspace + self.skill_name = skill_name + self.feedback_path = feedback_path + self.previous = previous + self.benchmark_path = benchmark_path + super().__init__(*args, **kwargs) + + def do_GET(self) -> None: + if self.path == "/" or self.path == "/index.html": + # Regenerate HTML on each request (re-scans workspace for new outputs) + runs = find_runs(self.workspace) + benchmark = None + if self.benchmark_path and self.benchmark_path.exists(): + try: + benchmark = json.loads(self.benchmark_path.read_text()) + except (json.JSONDecodeError, OSError): + pass + html = generate_html(runs, self.skill_name, self.previous, benchmark) + content = html.encode("utf-8") + self.send_response(200) + self.send_header("Content-Type", "text/html; charset=utf-8") + self.send_header("Content-Length", str(len(content))) + self.end_headers() + self.wfile.write(content) + elif self.path == "/api/feedback": + data = b"{}" + if self.feedback_path.exists(): + data = self.feedback_path.read_bytes() + self.send_response(200) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(data))) + self.end_headers() + self.wfile.write(data) + else: + self.send_error(404) + + def do_POST(self) -> None: + if self.path == "/api/feedback": + length = int(self.headers.get("Content-Length", 0)) + body = self.rfile.read(length) + try: + data = json.loads(body) + if not isinstance(data, dict) or "reviews" not in data: + raise ValueError("Expected JSON object with 'reviews' key") + self.feedback_path.write_text(json.dumps(data, indent=2) + "\n") + resp = b'{"ok":true}' + self.send_response(200) + except (json.JSONDecodeError, OSError, ValueError) as e: + resp = json.dumps({"error": str(e)}).encode() + self.send_response(500) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(resp))) + self.end_headers() + self.wfile.write(resp) + else: + self.send_error(404) + + def log_message(self, format: str, *args: object) -> None: + # Suppress request logging to keep terminal clean + pass + + +def main() -> None: + parser = argparse.ArgumentParser(description="Generate and serve eval review") + parser.add_argument("workspace", type=Path, help="Path to workspace directory") + parser.add_argument("--port", "-p", type=int, default=3117, help="Server port (default: 3117)") + parser.add_argument("--skill-name", "-n", type=str, default=None, help="Skill name for header") + parser.add_argument( + "--previous-workspace", type=Path, default=None, + help="Path to previous iteration's workspace (shows old outputs and feedback as context)", + ) + parser.add_argument( + "--benchmark", type=Path, default=None, + help="Path to benchmark.json to show in the Benchmark tab", + ) + parser.add_argument( + "--static", "-s", type=Path, default=None, + help="Write standalone HTML to this path instead of starting a server", + ) + args = parser.parse_args() + + workspace = args.workspace.resolve() + if not workspace.is_dir(): + print(f"Error: {workspace} is not a directory", file=sys.stderr) + sys.exit(1) + + runs = find_runs(workspace) + if not runs: + print(f"No runs found in {workspace}", file=sys.stderr) + sys.exit(1) + + skill_name = args.skill_name or workspace.name.replace("-workspace", "") + feedback_path = workspace / "feedback.json" + + previous: dict[str, dict] = {} + if args.previous_workspace: + previous = load_previous_iteration(args.previous_workspace.resolve()) + + benchmark_path = args.benchmark.resolve() if args.benchmark else None + benchmark = None + if benchmark_path and benchmark_path.exists(): + try: + benchmark = json.loads(benchmark_path.read_text()) + except (json.JSONDecodeError, OSError): + pass + + if args.static: + html = generate_html(runs, skill_name, previous, benchmark) + args.static.parent.mkdir(parents=True, exist_ok=True) + args.static.write_text(html) + print(f"\n Static viewer written to: {args.static}\n") + sys.exit(0) + + # Kill any existing process on the target port + port = args.port + _kill_port(port) + handler = partial(ReviewHandler, workspace, skill_name, feedback_path, previous, benchmark_path) + try: + server = HTTPServer(("127.0.0.1", port), handler) + except OSError: + # Port still in use after kill attempt — find a free one + server = HTTPServer(("127.0.0.1", 0), handler) + port = server.server_address[1] + + url = f"http://localhost:{port}" + print(f"\n Eval Viewer") + print(f" ─────────────────────────────────") + print(f" URL: {url}") + print(f" Workspace: {workspace}") + print(f" Feedback: {feedback_path}") + if previous: + print(f" Previous: {args.previous_workspace} ({len(previous)} runs)") + if benchmark_path: + print(f" Benchmark: {benchmark_path}") + print(f"\n Press Ctrl+C to stop.\n") + + webbrowser.open(url) + + try: + server.serve_forever() + except KeyboardInterrupt: + print("\nStopped.") + server.server_close() + + +if __name__ == "__main__": + main() diff --git a/.claude/skills/skill-creator/eval-viewer/viewer.html b/.claude/skills/skill-creator/eval-viewer/viewer.html new file mode 100644 index 0000000..6d8e963 --- /dev/null +++ b/.claude/skills/skill-creator/eval-viewer/viewer.html @@ -0,0 +1,1325 @@ + + + + + + Eval Review + + + + + + + +
    +
    +
    +

    Eval Review:

    +
    Review each output and leave feedback below. Navigate with arrow keys or buttons. When done, copy feedback and paste into Claude Code.
    +
    +
    +
    + + + + + +
    +
    + +
    +
    Prompt
    +
    +
    +
    +
    + + +
    +
    Output
    +
    +
    No output files found
    +
    +
    + + + + + + + + +
    +
    Your Feedback
    +
    + + + +
    +
    +
    + + +
    + + +
    +
    +
    No benchmark data available. Run a benchmark to see quantitative results here.
    +
    +
    +
    + + +
    +
    +

    Review Complete

    +

    Your feedback has been saved. Go back to your Claude Code session and tell Claude you're done reviewing.

    +
    + +
    +
    +
    + + +
    + + + + diff --git a/.claude/skills/skill-creator/references/schemas.md b/.claude/skills/skill-creator/references/schemas.md new file mode 100644 index 0000000..b6eeaa2 --- /dev/null +++ b/.claude/skills/skill-creator/references/schemas.md @@ -0,0 +1,430 @@ +# JSON Schemas + +This document defines the JSON schemas used by skill-creator. + +--- + +## evals.json + +Defines the evals for a skill. Located at `evals/evals.json` within the skill directory. + +```json +{ + "skill_name": "example-skill", + "evals": [ + { + "id": 1, + "prompt": "User's example prompt", + "expected_output": "Description of expected result", + "files": ["evals/files/sample1.pdf"], + "expectations": [ + "The output includes X", + "The skill used script Y" + ] + } + ] +} +``` + +**Fields:** +- `skill_name`: Name matching the skill's frontmatter +- `evals[].id`: Unique integer identifier +- `evals[].prompt`: The task to execute +- `evals[].expected_output`: Human-readable description of success +- `evals[].files`: Optional list of input file paths (relative to skill root) +- `evals[].expectations`: List of verifiable statements + +--- + +## history.json + +Tracks version progression in Improve mode. Located at workspace root. + +```json +{ + "started_at": "2026-01-15T10:30:00Z", + "skill_name": "pdf", + "current_best": "v2", + "iterations": [ + { + "version": "v0", + "parent": null, + "expectation_pass_rate": 0.65, + "grading_result": "baseline", + "is_current_best": false + }, + { + "version": "v1", + "parent": "v0", + "expectation_pass_rate": 0.75, + "grading_result": "won", + "is_current_best": false + }, + { + "version": "v2", + "parent": "v1", + "expectation_pass_rate": 0.85, + "grading_result": "won", + "is_current_best": true + } + ] +} +``` + +**Fields:** +- `started_at`: ISO timestamp of when improvement started +- `skill_name`: Name of the skill being improved +- `current_best`: Version identifier of the best performer +- `iterations[].version`: Version identifier (v0, v1, ...) +- `iterations[].parent`: Parent version this was derived from +- `iterations[].expectation_pass_rate`: Pass rate from grading +- `iterations[].grading_result`: "baseline", "won", "lost", or "tie" +- `iterations[].is_current_best`: Whether this is the current best version + +--- + +## grading.json + +Output from the grader agent. Located at `/grading.json`. + +```json +{ + "expectations": [ + { + "text": "The output includes the name 'John Smith'", + "passed": true, + "evidence": "Found in transcript Step 3: 'Extracted names: John Smith, Sarah Johnson'" + }, + { + "text": "The spreadsheet has a SUM formula in cell B10", + "passed": false, + "evidence": "No spreadsheet was created. The output was a text file." + } + ], + "summary": { + "passed": 2, + "failed": 1, + "total": 3, + "pass_rate": 0.67 + }, + "execution_metrics": { + "tool_calls": { + "Read": 5, + "Write": 2, + "Bash": 8 + }, + "total_tool_calls": 15, + "total_steps": 6, + "errors_encountered": 0, + "output_chars": 12450, + "transcript_chars": 3200 + }, + "timing": { + "executor_duration_seconds": 165.0, + "grader_duration_seconds": 26.0, + "total_duration_seconds": 191.0 + }, + "claims": [ + { + "claim": "The form has 12 fillable fields", + "type": "factual", + "verified": true, + "evidence": "Counted 12 fields in field_info.json" + } + ], + "user_notes_summary": { + "uncertainties": ["Used 2023 data, may be stale"], + "needs_review": [], + "workarounds": ["Fell back to text overlay for non-fillable fields"] + }, + "eval_feedback": { + "suggestions": [ + { + "assertion": "The output includes the name 'John Smith'", + "reason": "A hallucinated document that mentions the name would also pass" + } + ], + "overall": "Assertions check presence but not correctness." + } +} +``` + +**Fields:** +- `expectations[]`: Graded expectations with evidence +- `summary`: Aggregate pass/fail counts +- `execution_metrics`: Tool usage and output size (from executor's metrics.json) +- `timing`: Wall clock timing (from timing.json) +- `claims`: Extracted and verified claims from the output +- `user_notes_summary`: Issues flagged by the executor +- `eval_feedback`: (optional) Improvement suggestions for the evals, only present when the grader identifies issues worth raising + +--- + +## metrics.json + +Output from the executor agent. Located at `/outputs/metrics.json`. + +```json +{ + "tool_calls": { + "Read": 5, + "Write": 2, + "Bash": 8, + "Edit": 1, + "Glob": 2, + "Grep": 0 + }, + "total_tool_calls": 18, + "total_steps": 6, + "files_created": ["filled_form.pdf", "field_values.json"], + "errors_encountered": 0, + "output_chars": 12450, + "transcript_chars": 3200 +} +``` + +**Fields:** +- `tool_calls`: Count per tool type +- `total_tool_calls`: Sum of all tool calls +- `total_steps`: Number of major execution steps +- `files_created`: List of output files created +- `errors_encountered`: Number of errors during execution +- `output_chars`: Total character count of output files +- `transcript_chars`: Character count of transcript + +--- + +## timing.json + +Wall clock timing for a run. Located at `/timing.json`. + +**How to capture:** When a subagent task completes, the task notification includes `total_tokens` and `duration_ms`. Save these immediately — they are not persisted anywhere else and cannot be recovered after the fact. + +```json +{ + "total_tokens": 84852, + "duration_ms": 23332, + "total_duration_seconds": 23.3, + "executor_start": "2026-01-15T10:30:00Z", + "executor_end": "2026-01-15T10:32:45Z", + "executor_duration_seconds": 165.0, + "grader_start": "2026-01-15T10:32:46Z", + "grader_end": "2026-01-15T10:33:12Z", + "grader_duration_seconds": 26.0 +} +``` + +--- + +## benchmark.json + +Output from Benchmark mode. Located at `benchmarks//benchmark.json`. + +```json +{ + "metadata": { + "skill_name": "pdf", + "skill_path": "/path/to/pdf", + "executor_model": "claude-sonnet-4-20250514", + "analyzer_model": "most-capable-model", + "timestamp": "2026-01-15T10:30:00Z", + "evals_run": [1, 2, 3], + "runs_per_configuration": 3 + }, + + "runs": [ + { + "eval_id": 1, + "eval_name": "Ocean", + "configuration": "with_skill", + "run_number": 1, + "result": { + "pass_rate": 0.85, + "passed": 6, + "failed": 1, + "total": 7, + "time_seconds": 42.5, + "tokens": 3800, + "tool_calls": 18, + "errors": 0 + }, + "expectations": [ + {"text": "...", "passed": true, "evidence": "..."} + ], + "notes": [ + "Used 2023 data, may be stale", + "Fell back to text overlay for non-fillable fields" + ] + } + ], + + "run_summary": { + "with_skill": { + "pass_rate": {"mean": 0.85, "stddev": 0.05, "min": 0.80, "max": 0.90}, + "time_seconds": {"mean": 45.0, "stddev": 12.0, "min": 32.0, "max": 58.0}, + "tokens": {"mean": 3800, "stddev": 400, "min": 3200, "max": 4100} + }, + "without_skill": { + "pass_rate": {"mean": 0.35, "stddev": 0.08, "min": 0.28, "max": 0.45}, + "time_seconds": {"mean": 32.0, "stddev": 8.0, "min": 24.0, "max": 42.0}, + "tokens": {"mean": 2100, "stddev": 300, "min": 1800, "max": 2500} + }, + "delta": { + "pass_rate": "+0.50", + "time_seconds": "+13.0", + "tokens": "+1700" + } + }, + + "notes": [ + "Assertion 'Output is a PDF file' passes 100% in both configurations - may not differentiate skill value", + "Eval 3 shows high variance (50% ± 40%) - may be flaky or model-dependent", + "Without-skill runs consistently fail on table extraction expectations", + "Skill adds 13s average execution time but improves pass rate by 50%" + ] +} +``` + +**Fields:** +- `metadata`: Information about the benchmark run + - `skill_name`: Name of the skill + - `timestamp`: When the benchmark was run + - `evals_run`: List of eval names or IDs + - `runs_per_configuration`: Number of runs per config (e.g. 3) +- `runs[]`: Individual run results + - `eval_id`: Numeric eval identifier + - `eval_name`: Human-readable eval name (used as section header in the viewer) + - `configuration`: Must be `"with_skill"` or `"without_skill"` (the viewer uses this exact string for grouping and color coding) + - `run_number`: Integer run number (1, 2, 3...) + - `result`: Nested object with `pass_rate`, `passed`, `total`, `time_seconds`, `tokens`, `errors` +- `run_summary`: Statistical aggregates per configuration + - `with_skill` / `without_skill`: Each contains `pass_rate`, `time_seconds`, `tokens` objects with `mean` and `stddev` fields + - `delta`: Difference strings like `"+0.50"`, `"+13.0"`, `"+1700"` +- `notes`: Freeform observations from the analyzer + +**Important:** The viewer reads these field names exactly. Using `config` instead of `configuration`, or putting `pass_rate` at the top level of a run instead of nested under `result`, will cause the viewer to show empty/zero values. Always reference this schema when generating benchmark.json manually. + +--- + +## comparison.json + +Output from blind comparator. Located at `/comparison-N.json`. + +```json +{ + "winner": "A", + "reasoning": "Output A provides a complete solution with proper formatting and all required fields. Output B is missing the date field and has formatting inconsistencies.", + "rubric": { + "A": { + "content": { + "correctness": 5, + "completeness": 5, + "accuracy": 4 + }, + "structure": { + "organization": 4, + "formatting": 5, + "usability": 4 + }, + "content_score": 4.7, + "structure_score": 4.3, + "overall_score": 9.0 + }, + "B": { + "content": { + "correctness": 3, + "completeness": 2, + "accuracy": 3 + }, + "structure": { + "organization": 3, + "formatting": 2, + "usability": 3 + }, + "content_score": 2.7, + "structure_score": 2.7, + "overall_score": 5.4 + } + }, + "output_quality": { + "A": { + "score": 9, + "strengths": ["Complete solution", "Well-formatted", "All fields present"], + "weaknesses": ["Minor style inconsistency in header"] + }, + "B": { + "score": 5, + "strengths": ["Readable output", "Correct basic structure"], + "weaknesses": ["Missing date field", "Formatting inconsistencies", "Partial data extraction"] + } + }, + "expectation_results": { + "A": { + "passed": 4, + "total": 5, + "pass_rate": 0.80, + "details": [ + {"text": "Output includes name", "passed": true} + ] + }, + "B": { + "passed": 3, + "total": 5, + "pass_rate": 0.60, + "details": [ + {"text": "Output includes name", "passed": true} + ] + } + } +} +``` + +--- + +## analysis.json + +Output from post-hoc analyzer. Located at `/analysis.json`. + +```json +{ + "comparison_summary": { + "winner": "A", + "winner_skill": "path/to/winner/skill", + "loser_skill": "path/to/loser/skill", + "comparator_reasoning": "Brief summary of why comparator chose winner" + }, + "winner_strengths": [ + "Clear step-by-step instructions for handling multi-page documents", + "Included validation script that caught formatting errors" + ], + "loser_weaknesses": [ + "Vague instruction 'process the document appropriately' led to inconsistent behavior", + "No script for validation, agent had to improvise" + ], + "instruction_following": { + "winner": { + "score": 9, + "issues": ["Minor: skipped optional logging step"] + }, + "loser": { + "score": 6, + "issues": [ + "Did not use the skill's formatting template", + "Invented own approach instead of following step 3" + ] + } + }, + "improvement_suggestions": [ + { + "priority": "high", + "category": "instructions", + "suggestion": "Replace 'process the document appropriately' with explicit steps", + "expected_impact": "Would eliminate ambiguity that caused inconsistent behavior" + } + ], + "transcript_insights": { + "winner_execution_pattern": "Read skill -> Followed 5-step process -> Used validation script", + "loser_execution_pattern": "Read skill -> Unclear on approach -> Tried 3 different methods" + } +} +``` diff --git a/.claude/skills/skill-creator/scripts/__init__.py b/.claude/skills/skill-creator/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/.claude/skills/skill-creator/scripts/aggregate_benchmark.py b/.claude/skills/skill-creator/scripts/aggregate_benchmark.py new file mode 100644 index 0000000..3e66e8c --- /dev/null +++ b/.claude/skills/skill-creator/scripts/aggregate_benchmark.py @@ -0,0 +1,401 @@ +#!/usr/bin/env python3 +""" +Aggregate individual run results into benchmark summary statistics. + +Reads grading.json files from run directories and produces: +- run_summary with mean, stddev, min, max for each metric +- delta between with_skill and without_skill configurations + +Usage: + python aggregate_benchmark.py + +Example: + python aggregate_benchmark.py benchmarks/2026-01-15T10-30-00/ + +The script supports two directory layouts: + + Workspace layout (from skill-creator iterations): + / + └── eval-N/ + ├── with_skill/ + │ ├── run-1/grading.json + │ └── run-2/grading.json + └── without_skill/ + ├── run-1/grading.json + └── run-2/grading.json + + Legacy layout (with runs/ subdirectory): + / + └── runs/ + └── eval-N/ + ├── with_skill/ + │ └── run-1/grading.json + └── without_skill/ + └── run-1/grading.json +""" + +import argparse +import json +import math +import sys +from datetime import datetime, timezone +from pathlib import Path + + +def calculate_stats(values: list[float]) -> dict: + """Calculate mean, stddev, min, max for a list of values.""" + if not values: + return {"mean": 0.0, "stddev": 0.0, "min": 0.0, "max": 0.0} + + n = len(values) + mean = sum(values) / n + + if n > 1: + variance = sum((x - mean) ** 2 for x in values) / (n - 1) + stddev = math.sqrt(variance) + else: + stddev = 0.0 + + return { + "mean": round(mean, 4), + "stddev": round(stddev, 4), + "min": round(min(values), 4), + "max": round(max(values), 4) + } + + +def load_run_results(benchmark_dir: Path) -> dict: + """ + Load all run results from a benchmark directory. + + Returns dict keyed by config name (e.g. "with_skill"/"without_skill", + or "new_skill"/"old_skill"), each containing a list of run results. + """ + # Support both layouts: eval dirs directly under benchmark_dir, or under runs/ + runs_dir = benchmark_dir / "runs" + if runs_dir.exists(): + search_dir = runs_dir + elif list(benchmark_dir.glob("eval-*")): + search_dir = benchmark_dir + else: + print(f"No eval directories found in {benchmark_dir} or {benchmark_dir / 'runs'}") + return {} + + results: dict[str, list] = {} + + for eval_idx, eval_dir in enumerate(sorted(search_dir.glob("eval-*"))): + metadata_path = eval_dir / "eval_metadata.json" + if metadata_path.exists(): + try: + with open(metadata_path) as mf: + eval_id = json.load(mf).get("eval_id", eval_idx) + except (json.JSONDecodeError, OSError): + eval_id = eval_idx + else: + try: + eval_id = int(eval_dir.name.split("-")[1]) + except ValueError: + eval_id = eval_idx + + # Discover config directories dynamically rather than hardcoding names + for config_dir in sorted(eval_dir.iterdir()): + if not config_dir.is_dir(): + continue + # Skip non-config directories (inputs, outputs, etc.) + if not list(config_dir.glob("run-*")): + continue + config = config_dir.name + if config not in results: + results[config] = [] + + for run_dir in sorted(config_dir.glob("run-*")): + run_number = int(run_dir.name.split("-")[1]) + grading_file = run_dir / "grading.json" + + if not grading_file.exists(): + print(f"Warning: grading.json not found in {run_dir}") + continue + + try: + with open(grading_file) as f: + grading = json.load(f) + except json.JSONDecodeError as e: + print(f"Warning: Invalid JSON in {grading_file}: {e}") + continue + + # Extract metrics + result = { + "eval_id": eval_id, + "run_number": run_number, + "pass_rate": grading.get("summary", {}).get("pass_rate", 0.0), + "passed": grading.get("summary", {}).get("passed", 0), + "failed": grading.get("summary", {}).get("failed", 0), + "total": grading.get("summary", {}).get("total", 0), + } + + # Extract timing — check grading.json first, then sibling timing.json + timing = grading.get("timing", {}) + result["time_seconds"] = timing.get("total_duration_seconds", 0.0) + timing_file = run_dir / "timing.json" + if result["time_seconds"] == 0.0 and timing_file.exists(): + try: + with open(timing_file) as tf: + timing_data = json.load(tf) + result["time_seconds"] = timing_data.get("total_duration_seconds", 0.0) + result["tokens"] = timing_data.get("total_tokens", 0) + except json.JSONDecodeError: + pass + + # Extract metrics if available + metrics = grading.get("execution_metrics", {}) + result["tool_calls"] = metrics.get("total_tool_calls", 0) + if not result.get("tokens"): + result["tokens"] = metrics.get("output_chars", 0) + result["errors"] = metrics.get("errors_encountered", 0) + + # Extract expectations — viewer requires fields: text, passed, evidence + raw_expectations = grading.get("expectations", []) + for exp in raw_expectations: + if "text" not in exp or "passed" not in exp: + print(f"Warning: expectation in {grading_file} missing required fields (text, passed, evidence): {exp}") + result["expectations"] = raw_expectations + + # Extract notes from user_notes_summary + notes_summary = grading.get("user_notes_summary", {}) + notes = [] + notes.extend(notes_summary.get("uncertainties", [])) + notes.extend(notes_summary.get("needs_review", [])) + notes.extend(notes_summary.get("workarounds", [])) + result["notes"] = notes + + results[config].append(result) + + return results + + +def aggregate_results(results: dict) -> dict: + """ + Aggregate run results into summary statistics. + + Returns run_summary with stats for each configuration and delta. + """ + run_summary = {} + configs = list(results.keys()) + + for config in configs: + runs = results.get(config, []) + + if not runs: + run_summary[config] = { + "pass_rate": {"mean": 0.0, "stddev": 0.0, "min": 0.0, "max": 0.0}, + "time_seconds": {"mean": 0.0, "stddev": 0.0, "min": 0.0, "max": 0.0}, + "tokens": {"mean": 0, "stddev": 0, "min": 0, "max": 0} + } + continue + + pass_rates = [r["pass_rate"] for r in runs] + times = [r["time_seconds"] for r in runs] + tokens = [r.get("tokens", 0) for r in runs] + + run_summary[config] = { + "pass_rate": calculate_stats(pass_rates), + "time_seconds": calculate_stats(times), + "tokens": calculate_stats(tokens) + } + + # Calculate delta between the first two configs (if two exist) + if len(configs) >= 2: + primary = run_summary.get(configs[0], {}) + baseline = run_summary.get(configs[1], {}) + else: + primary = run_summary.get(configs[0], {}) if configs else {} + baseline = {} + + delta_pass_rate = primary.get("pass_rate", {}).get("mean", 0) - baseline.get("pass_rate", {}).get("mean", 0) + delta_time = primary.get("time_seconds", {}).get("mean", 0) - baseline.get("time_seconds", {}).get("mean", 0) + delta_tokens = primary.get("tokens", {}).get("mean", 0) - baseline.get("tokens", {}).get("mean", 0) + + run_summary["delta"] = { + "pass_rate": f"{delta_pass_rate:+.2f}", + "time_seconds": f"{delta_time:+.1f}", + "tokens": f"{delta_tokens:+.0f}" + } + + return run_summary + + +def generate_benchmark(benchmark_dir: Path, skill_name: str = "", skill_path: str = "") -> dict: + """ + Generate complete benchmark.json from run results. + """ + results = load_run_results(benchmark_dir) + run_summary = aggregate_results(results) + + # Build runs array for benchmark.json + runs = [] + for config in results: + for result in results[config]: + runs.append({ + "eval_id": result["eval_id"], + "configuration": config, + "run_number": result["run_number"], + "result": { + "pass_rate": result["pass_rate"], + "passed": result["passed"], + "failed": result["failed"], + "total": result["total"], + "time_seconds": result["time_seconds"], + "tokens": result.get("tokens", 0), + "tool_calls": result.get("tool_calls", 0), + "errors": result.get("errors", 0) + }, + "expectations": result["expectations"], + "notes": result["notes"] + }) + + # Determine eval IDs from results + eval_ids = sorted(set( + r["eval_id"] + for config in results.values() + for r in config + )) + + benchmark = { + "metadata": { + "skill_name": skill_name or "", + "skill_path": skill_path or "", + "executor_model": "", + "analyzer_model": "", + "timestamp": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), + "evals_run": eval_ids, + "runs_per_configuration": 3 + }, + "runs": runs, + "run_summary": run_summary, + "notes": [] # To be filled by analyzer + } + + return benchmark + + +def generate_markdown(benchmark: dict) -> str: + """Generate human-readable benchmark.md from benchmark data.""" + metadata = benchmark["metadata"] + run_summary = benchmark["run_summary"] + + # Determine config names (excluding "delta") + configs = [k for k in run_summary if k != "delta"] + config_a = configs[0] if len(configs) >= 1 else "config_a" + config_b = configs[1] if len(configs) >= 2 else "config_b" + label_a = config_a.replace("_", " ").title() + label_b = config_b.replace("_", " ").title() + + lines = [ + f"# Skill Benchmark: {metadata['skill_name']}", + "", + f"**Model**: {metadata['executor_model']}", + f"**Date**: {metadata['timestamp']}", + f"**Evals**: {', '.join(map(str, metadata['evals_run']))} ({metadata['runs_per_configuration']} runs each per configuration)", + "", + "## Summary", + "", + f"| Metric | {label_a} | {label_b} | Delta |", + "|--------|------------|---------------|-------|", + ] + + a_summary = run_summary.get(config_a, {}) + b_summary = run_summary.get(config_b, {}) + delta = run_summary.get("delta", {}) + + # Format pass rate + a_pr = a_summary.get("pass_rate", {}) + b_pr = b_summary.get("pass_rate", {}) + lines.append(f"| Pass Rate | {a_pr.get('mean', 0)*100:.0f}% ± {a_pr.get('stddev', 0)*100:.0f}% | {b_pr.get('mean', 0)*100:.0f}% ± {b_pr.get('stddev', 0)*100:.0f}% | {delta.get('pass_rate', '—')} |") + + # Format time + a_time = a_summary.get("time_seconds", {}) + b_time = b_summary.get("time_seconds", {}) + lines.append(f"| Time | {a_time.get('mean', 0):.1f}s ± {a_time.get('stddev', 0):.1f}s | {b_time.get('mean', 0):.1f}s ± {b_time.get('stddev', 0):.1f}s | {delta.get('time_seconds', '—')}s |") + + # Format tokens + a_tokens = a_summary.get("tokens", {}) + b_tokens = b_summary.get("tokens", {}) + lines.append(f"| Tokens | {a_tokens.get('mean', 0):.0f} ± {a_tokens.get('stddev', 0):.0f} | {b_tokens.get('mean', 0):.0f} ± {b_tokens.get('stddev', 0):.0f} | {delta.get('tokens', '—')} |") + + # Notes section + if benchmark.get("notes"): + lines.extend([ + "", + "## Notes", + "" + ]) + for note in benchmark["notes"]: + lines.append(f"- {note}") + + return "\n".join(lines) + + +def main(): + parser = argparse.ArgumentParser( + description="Aggregate benchmark run results into summary statistics" + ) + parser.add_argument( + "benchmark_dir", + type=Path, + help="Path to the benchmark directory" + ) + parser.add_argument( + "--skill-name", + default="", + help="Name of the skill being benchmarked" + ) + parser.add_argument( + "--skill-path", + default="", + help="Path to the skill being benchmarked" + ) + parser.add_argument( + "--output", "-o", + type=Path, + help="Output path for benchmark.json (default: /benchmark.json)" + ) + + args = parser.parse_args() + + if not args.benchmark_dir.exists(): + print(f"Directory not found: {args.benchmark_dir}") + sys.exit(1) + + # Generate benchmark + benchmark = generate_benchmark(args.benchmark_dir, args.skill_name, args.skill_path) + + # Determine output paths + output_json = args.output or (args.benchmark_dir / "benchmark.json") + output_md = output_json.with_suffix(".md") + + # Write benchmark.json + with open(output_json, "w") as f: + json.dump(benchmark, f, indent=2) + print(f"Generated: {output_json}") + + # Write benchmark.md + markdown = generate_markdown(benchmark) + with open(output_md, "w") as f: + f.write(markdown) + print(f"Generated: {output_md}") + + # Print summary + run_summary = benchmark["run_summary"] + configs = [k for k in run_summary if k != "delta"] + delta = run_summary.get("delta", {}) + + print(f"\nSummary:") + for config in configs: + pr = run_summary[config]["pass_rate"]["mean"] + label = config.replace("_", " ").title() + print(f" {label}: {pr*100:.1f}% pass rate") + print(f" Delta: {delta.get('pass_rate', '—')}") + + +if __name__ == "__main__": + main() diff --git a/.claude/skills/skill-creator/scripts/generate_report.py b/.claude/skills/skill-creator/scripts/generate_report.py new file mode 100644 index 0000000..959e30a --- /dev/null +++ b/.claude/skills/skill-creator/scripts/generate_report.py @@ -0,0 +1,326 @@ +#!/usr/bin/env python3 +"""Generate an HTML report from run_loop.py output. + +Takes the JSON output from run_loop.py and generates a visual HTML report +showing each description attempt with check/x for each test case. +Distinguishes between train and test queries. +""" + +import argparse +import html +import json +import sys +from pathlib import Path + + +def generate_html(data: dict, auto_refresh: bool = False, skill_name: str = "") -> str: + """Generate HTML report from loop output data. If auto_refresh is True, adds a meta refresh tag.""" + history = data.get("history", []) + holdout = data.get("holdout", 0) + title_prefix = html.escape(skill_name + " \u2014 ") if skill_name else "" + + # Get all unique queries from train and test sets, with should_trigger info + train_queries: list[dict] = [] + test_queries: list[dict] = [] + if history: + for r in history[0].get("train_results", history[0].get("results", [])): + train_queries.append({"query": r["query"], "should_trigger": r.get("should_trigger", True)}) + if history[0].get("test_results"): + for r in history[0].get("test_results", []): + test_queries.append({"query": r["query"], "should_trigger": r.get("should_trigger", True)}) + + refresh_tag = ' \n' if auto_refresh else "" + + html_parts = [""" + + + +""" + refresh_tag + """ """ + title_prefix + """Skill Description Optimization + + + + + + +

    """ + title_prefix + """Skill Description Optimization

    +
    + Optimizing your skill's description. This page updates automatically as Claude tests different versions of your skill's description. Each row is an iteration — a new description attempt. The columns show test queries: green checkmarks mean the skill triggered correctly (or correctly didn't trigger), red crosses mean it got it wrong. The "Train" score shows performance on queries used to improve the description; the "Test" score shows performance on held-out queries the optimizer hasn't seen. When it's done, Claude will apply the best-performing description to your skill. +
    +"""] + + # Summary section + best_test_score = data.get('best_test_score') + best_train_score = data.get('best_train_score') + html_parts.append(f""" +
    +

    Original: {html.escape(data.get('original_description', 'N/A'))}

    +

    Best: {html.escape(data.get('best_description', 'N/A'))}

    +

    Best Score: {data.get('best_score', 'N/A')} {'(test)' if best_test_score else '(train)'}

    +

    Iterations: {data.get('iterations_run', 0)} | Train: {data.get('train_size', '?')} | Test: {data.get('test_size', '?')}

    +
    +""") + + # Legend + html_parts.append(""" +
    + Query columns: + Should trigger + Should NOT trigger + Train + Test +
    +""") + + # Table header + html_parts.append(""" +
    + + + + + + + +""") + + # Add column headers for train queries + for qinfo in train_queries: + polarity = "positive-col" if qinfo["should_trigger"] else "negative-col" + html_parts.append(f' \n') + + # Add column headers for test queries (different color) + for qinfo in test_queries: + polarity = "positive-col" if qinfo["should_trigger"] else "negative-col" + html_parts.append(f' \n') + + html_parts.append(""" + + +""") + + # Find best iteration for highlighting + if test_queries: + best_iter = max(history, key=lambda h: h.get("test_passed") or 0).get("iteration") + else: + best_iter = max(history, key=lambda h: h.get("train_passed", h.get("passed", 0))).get("iteration") + + # Add rows for each iteration + for h in history: + iteration = h.get("iteration", "?") + train_passed = h.get("train_passed", h.get("passed", 0)) + train_total = h.get("train_total", h.get("total", 0)) + test_passed = h.get("test_passed") + test_total = h.get("test_total") + description = h.get("description", "") + train_results = h.get("train_results", h.get("results", [])) + test_results = h.get("test_results", []) + + # Create lookups for results by query + train_by_query = {r["query"]: r for r in train_results} + test_by_query = {r["query"]: r for r in test_results} if test_results else {} + + # Compute aggregate correct/total runs across all retries + def aggregate_runs(results: list[dict]) -> tuple[int, int]: + correct = 0 + total = 0 + for r in results: + runs = r.get("runs", 0) + triggers = r.get("triggers", 0) + total += runs + if r.get("should_trigger", True): + correct += triggers + else: + correct += runs - triggers + return correct, total + + train_correct, train_runs = aggregate_runs(train_results) + test_correct, test_runs = aggregate_runs(test_results) + + # Determine score classes + def score_class(correct: int, total: int) -> str: + if total > 0: + ratio = correct / total + if ratio >= 0.8: + return "score-good" + elif ratio >= 0.5: + return "score-ok" + return "score-bad" + + train_class = score_class(train_correct, train_runs) + test_class = score_class(test_correct, test_runs) + + row_class = "best-row" if iteration == best_iter else "" + + html_parts.append(f""" + + + + +""") + + # Add result for each train query + for qinfo in train_queries: + r = train_by_query.get(qinfo["query"], {}) + did_pass = r.get("pass", False) + triggers = r.get("triggers", 0) + runs = r.get("runs", 0) + + icon = "✓" if did_pass else "✗" + css_class = "pass" if did_pass else "fail" + + html_parts.append(f' \n') + + # Add result for each test query (with different background) + for qinfo in test_queries: + r = test_by_query.get(qinfo["query"], {}) + did_pass = r.get("pass", False) + triggers = r.get("triggers", 0) + runs = r.get("runs", 0) + + icon = "✓" if did_pass else "✗" + css_class = "pass" if did_pass else "fail" + + html_parts.append(f' \n') + + html_parts.append(" \n") + + html_parts.append(""" +
    IterTrainTestDescription{html.escape(qinfo["query"])}{html.escape(qinfo["query"])}
    {iteration}{train_correct}/{train_runs}{test_correct}/{test_runs}{html.escape(description)}{icon}{triggers}/{runs}{icon}{triggers}/{runs}
    +
    +""") + + html_parts.append(""" + + +""") + + return "".join(html_parts) + + +def main(): + parser = argparse.ArgumentParser(description="Generate HTML report from run_loop output") + parser.add_argument("input", help="Path to JSON output from run_loop.py (or - for stdin)") + parser.add_argument("-o", "--output", default=None, help="Output HTML file (default: stdout)") + parser.add_argument("--skill-name", default="", help="Skill name to include in the report title") + args = parser.parse_args() + + if args.input == "-": + data = json.load(sys.stdin) + else: + data = json.loads(Path(args.input).read_text()) + + html_output = generate_html(data, skill_name=args.skill_name) + + if args.output: + Path(args.output).write_text(html_output) + print(f"Report written to {args.output}", file=sys.stderr) + else: + print(html_output) + + +if __name__ == "__main__": + main() diff --git a/.claude/skills/skill-creator/scripts/improve_description.py b/.claude/skills/skill-creator/scripts/improve_description.py new file mode 100644 index 0000000..a270777 --- /dev/null +++ b/.claude/skills/skill-creator/scripts/improve_description.py @@ -0,0 +1,248 @@ +#!/usr/bin/env python3 +"""Improve a skill description based on eval results. + +Takes eval results (from run_eval.py) and generates an improved description +using Claude with extended thinking. +""" + +import argparse +import json +import re +import sys +from pathlib import Path + +import anthropic + +from scripts.utils import parse_skill_md + + +def improve_description( + client: anthropic.Anthropic, + skill_name: str, + skill_content: str, + current_description: str, + eval_results: dict, + history: list[dict], + model: str, + test_results: dict | None = None, + log_dir: Path | None = None, + iteration: int | None = None, +) -> str: + """Call Claude to improve the description based on eval results.""" + failed_triggers = [ + r for r in eval_results["results"] + if r["should_trigger"] and not r["pass"] + ] + false_triggers = [ + r for r in eval_results["results"] + if not r["should_trigger"] and not r["pass"] + ] + + # Build scores summary + train_score = f"{eval_results['summary']['passed']}/{eval_results['summary']['total']}" + if test_results: + test_score = f"{test_results['summary']['passed']}/{test_results['summary']['total']}" + scores_summary = f"Train: {train_score}, Test: {test_score}" + else: + scores_summary = f"Train: {train_score}" + + prompt = f"""You are optimizing a skill description for a Claude Code skill called "{skill_name}". A "skill" is sort of like a prompt, but with progressive disclosure -- there's a title and description that Claude sees when deciding whether to use the skill, and then if it does use the skill, it reads the .md file which has lots more details and potentially links to other resources in the skill folder like helper files and scripts and additional documentation or examples. + +The description appears in Claude's "available_skills" list. When a user sends a query, Claude decides whether to invoke the skill based solely on the title and on this description. Your goal is to write a description that triggers for relevant queries, and doesn't trigger for irrelevant ones. + +Here's the current description: + +"{current_description}" + + +Current scores ({scores_summary}): + +""" + if failed_triggers: + prompt += "FAILED TO TRIGGER (should have triggered but didn't):\n" + for r in failed_triggers: + prompt += f' - "{r["query"]}" (triggered {r["triggers"]}/{r["runs"]} times)\n' + prompt += "\n" + + if false_triggers: + prompt += "FALSE TRIGGERS (triggered but shouldn't have):\n" + for r in false_triggers: + prompt += f' - "{r["query"]}" (triggered {r["triggers"]}/{r["runs"]} times)\n' + prompt += "\n" + + if history: + prompt += "PREVIOUS ATTEMPTS (do NOT repeat these — try something structurally different):\n\n" + for h in history: + train_s = f"{h.get('train_passed', h.get('passed', 0))}/{h.get('train_total', h.get('total', 0))}" + test_s = f"{h.get('test_passed', '?')}/{h.get('test_total', '?')}" if h.get('test_passed') is not None else None + score_str = f"train={train_s}" + (f", test={test_s}" if test_s else "") + prompt += f'\n' + prompt += f'Description: "{h["description"]}"\n' + if "results" in h: + prompt += "Train results:\n" + for r in h["results"]: + status = "PASS" if r["pass"] else "FAIL" + prompt += f' [{status}] "{r["query"][:80]}" (triggered {r["triggers"]}/{r["runs"]})\n' + if h.get("note"): + prompt += f'Note: {h["note"]}\n' + prompt += "\n\n" + + prompt += f""" + +Skill content (for context on what the skill does): + +{skill_content} + + +Based on the failures, write a new and improved description that is more likely to trigger correctly. When I say "based on the failures", it's a bit of a tricky line to walk because we don't want to overfit to the specific cases you're seeing. So what I DON'T want you to do is produce an ever-expanding list of specific queries that this skill should or shouldn't trigger for. Instead, try to generalize from the failures to broader categories of user intent and situations where this skill would be useful or not useful. The reason for this is twofold: + +1. Avoid overfitting +2. The list might get loooong and it's injected into ALL queries and there might be a lot of skills, so we don't want to blow too much space on any given description. + +Concretely, your description should not be more than about 100-200 words, even if that comes at the cost of accuracy. + +Here are some tips that we've found to work well in writing these descriptions: +- The skill should be phrased in the imperative -- "Use this skill for" rather than "this skill does" +- The skill description should focus on the user's intent, what they are trying to achieve, vs. the implementation details of how the skill works. +- The description competes with other skills for Claude's attention — make it distinctive and immediately recognizable. +- If you're getting lots of failures after repeated attempts, change things up. Try different sentence structures or wordings. + +I'd encourage you to be creative and mix up the style in different iterations since you'll have multiple opportunities to try different approaches and we'll just grab the highest-scoring one at the end. + +Please respond with only the new description text in tags, nothing else.""" + + response = client.messages.create( + model=model, + max_tokens=16000, + thinking={ + "type": "enabled", + "budget_tokens": 10000, + }, + messages=[{"role": "user", "content": prompt}], + ) + + # Extract thinking and text from response + thinking_text = "" + text = "" + for block in response.content: + if block.type == "thinking": + thinking_text = block.thinking + elif block.type == "text": + text = block.text + + # Parse out the tags + match = re.search(r"(.*?)", text, re.DOTALL) + description = match.group(1).strip().strip('"') if match else text.strip().strip('"') + + # Log the transcript + transcript: dict = { + "iteration": iteration, + "prompt": prompt, + "thinking": thinking_text, + "response": text, + "parsed_description": description, + "char_count": len(description), + "over_limit": len(description) > 1024, + } + + # If over 1024 chars, ask the model to shorten it + if len(description) > 1024: + shorten_prompt = f"Your description is {len(description)} characters, which exceeds the hard 1024 character limit. Please rewrite it to be under 1024 characters while preserving the most important trigger words and intent coverage. Respond with only the new description in tags." + shorten_response = client.messages.create( + model=model, + max_tokens=16000, + thinking={ + "type": "enabled", + "budget_tokens": 10000, + }, + messages=[ + {"role": "user", "content": prompt}, + {"role": "assistant", "content": text}, + {"role": "user", "content": shorten_prompt}, + ], + ) + + shorten_thinking = "" + shorten_text = "" + for block in shorten_response.content: + if block.type == "thinking": + shorten_thinking = block.thinking + elif block.type == "text": + shorten_text = block.text + + match = re.search(r"(.*?)", shorten_text, re.DOTALL) + shortened = match.group(1).strip().strip('"') if match else shorten_text.strip().strip('"') + + transcript["rewrite_prompt"] = shorten_prompt + transcript["rewrite_thinking"] = shorten_thinking + transcript["rewrite_response"] = shorten_text + transcript["rewrite_description"] = shortened + transcript["rewrite_char_count"] = len(shortened) + description = shortened + + transcript["final_description"] = description + + if log_dir: + log_dir.mkdir(parents=True, exist_ok=True) + log_file = log_dir / f"improve_iter_{iteration or 'unknown'}.json" + log_file.write_text(json.dumps(transcript, indent=2)) + + return description + + +def main(): + parser = argparse.ArgumentParser(description="Improve a skill description based on eval results") + parser.add_argument("--eval-results", required=True, help="Path to eval results JSON (from run_eval.py)") + parser.add_argument("--skill-path", required=True, help="Path to skill directory") + parser.add_argument("--history", default=None, help="Path to history JSON (previous attempts)") + parser.add_argument("--model", required=True, help="Model for improvement") + parser.add_argument("--verbose", action="store_true", help="Print thinking to stderr") + args = parser.parse_args() + + skill_path = Path(args.skill_path) + if not (skill_path / "SKILL.md").exists(): + print(f"Error: No SKILL.md found at {skill_path}", file=sys.stderr) + sys.exit(1) + + eval_results = json.loads(Path(args.eval_results).read_text()) + history = [] + if args.history: + history = json.loads(Path(args.history).read_text()) + + name, _, content = parse_skill_md(skill_path) + current_description = eval_results["description"] + + if args.verbose: + print(f"Current: {current_description}", file=sys.stderr) + print(f"Score: {eval_results['summary']['passed']}/{eval_results['summary']['total']}", file=sys.stderr) + + client = anthropic.Anthropic() + new_description = improve_description( + client=client, + skill_name=name, + skill_content=content, + current_description=current_description, + eval_results=eval_results, + history=history, + model=args.model, + ) + + if args.verbose: + print(f"Improved: {new_description}", file=sys.stderr) + + # Output as JSON with both the new description and updated history + output = { + "description": new_description, + "history": history + [{ + "description": current_description, + "passed": eval_results["summary"]["passed"], + "failed": eval_results["summary"]["failed"], + "total": eval_results["summary"]["total"], + "results": eval_results["results"], + }], + } + print(json.dumps(output, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/.claude/skills/skill-creator/scripts/package_skill.py b/.claude/skills/skill-creator/scripts/package_skill.py new file mode 100644 index 0000000..f48eac4 --- /dev/null +++ b/.claude/skills/skill-creator/scripts/package_skill.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 +""" +Skill Packager - Creates a distributable .skill file of a skill folder + +Usage: + python utils/package_skill.py [output-directory] + +Example: + python utils/package_skill.py skills/public/my-skill + python utils/package_skill.py skills/public/my-skill ./dist +""" + +import fnmatch +import sys +import zipfile +from pathlib import Path +from scripts.quick_validate import validate_skill + +# Patterns to exclude when packaging skills. +EXCLUDE_DIRS = {"__pycache__", "node_modules"} +EXCLUDE_GLOBS = {"*.pyc"} +EXCLUDE_FILES = {".DS_Store"} +# Directories excluded only at the skill root (not when nested deeper). +ROOT_EXCLUDE_DIRS = {"evals"} + + +def should_exclude(rel_path: Path) -> bool: + """Check if a path should be excluded from packaging.""" + parts = rel_path.parts + if any(part in EXCLUDE_DIRS for part in parts): + return True + # rel_path is relative to skill_path.parent, so parts[0] is the skill + # folder name and parts[1] (if present) is the first subdir. + if len(parts) > 1 and parts[1] in ROOT_EXCLUDE_DIRS: + return True + name = rel_path.name + if name in EXCLUDE_FILES: + return True + return any(fnmatch.fnmatch(name, pat) for pat in EXCLUDE_GLOBS) + + +def package_skill(skill_path, output_dir=None): + """ + Package a skill folder into a .skill file. + + Args: + skill_path: Path to the skill folder + output_dir: Optional output directory for the .skill file (defaults to current directory) + + Returns: + Path to the created .skill file, or None if error + """ + skill_path = Path(skill_path).resolve() + + # Validate skill folder exists + if not skill_path.exists(): + print(f"❌ Error: Skill folder not found: {skill_path}") + return None + + if not skill_path.is_dir(): + print(f"❌ Error: Path is not a directory: {skill_path}") + return None + + # Validate SKILL.md exists + skill_md = skill_path / "SKILL.md" + if not skill_md.exists(): + print(f"❌ Error: SKILL.md not found in {skill_path}") + return None + + # Run validation before packaging + print("🔍 Validating skill...") + valid, message = validate_skill(skill_path) + if not valid: + print(f"❌ Validation failed: {message}") + print(" Please fix the validation errors before packaging.") + return None + print(f"✅ {message}\n") + + # Determine output location + skill_name = skill_path.name + if output_dir: + output_path = Path(output_dir).resolve() + output_path.mkdir(parents=True, exist_ok=True) + else: + output_path = Path.cwd() + + skill_filename = output_path / f"{skill_name}.skill" + + # Create the .skill file (zip format) + try: + with zipfile.ZipFile(skill_filename, 'w', zipfile.ZIP_DEFLATED) as zipf: + # Walk through the skill directory, excluding build artifacts + for file_path in skill_path.rglob('*'): + if not file_path.is_file(): + continue + arcname = file_path.relative_to(skill_path.parent) + if should_exclude(arcname): + print(f" Skipped: {arcname}") + continue + zipf.write(file_path, arcname) + print(f" Added: {arcname}") + + print(f"\n✅ Successfully packaged skill to: {skill_filename}") + return skill_filename + + except Exception as e: + print(f"❌ Error creating .skill file: {e}") + return None + + +def main(): + if len(sys.argv) < 2: + print("Usage: python utils/package_skill.py [output-directory]") + print("\nExample:") + print(" python utils/package_skill.py skills/public/my-skill") + print(" python utils/package_skill.py skills/public/my-skill ./dist") + sys.exit(1) + + skill_path = sys.argv[1] + output_dir = sys.argv[2] if len(sys.argv) > 2 else None + + print(f"📦 Packaging skill: {skill_path}") + if output_dir: + print(f" Output directory: {output_dir}") + print() + + result = package_skill(skill_path, output_dir) + + if result: + sys.exit(0) + else: + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/.claude/skills/skill-creator/scripts/quick_validate.py b/.claude/skills/skill-creator/scripts/quick_validate.py new file mode 100644 index 0000000..ed8e1dd --- /dev/null +++ b/.claude/skills/skill-creator/scripts/quick_validate.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +""" +Quick validation script for skills - minimal version +""" + +import sys +import os +import re +import yaml +from pathlib import Path + +def validate_skill(skill_path): + """Basic validation of a skill""" + skill_path = Path(skill_path) + + # Check SKILL.md exists + skill_md = skill_path / 'SKILL.md' + if not skill_md.exists(): + return False, "SKILL.md not found" + + # Read and validate frontmatter + content = skill_md.read_text() + if not content.startswith('---'): + return False, "No YAML frontmatter found" + + # Extract frontmatter + match = re.match(r'^---\n(.*?)\n---', content, re.DOTALL) + if not match: + return False, "Invalid frontmatter format" + + frontmatter_text = match.group(1) + + # Parse YAML frontmatter + try: + frontmatter = yaml.safe_load(frontmatter_text) + if not isinstance(frontmatter, dict): + return False, "Frontmatter must be a YAML dictionary" + except yaml.YAMLError as e: + return False, f"Invalid YAML in frontmatter: {e}" + + # Define allowed properties + ALLOWED_PROPERTIES = {'name', 'description', 'license', 'allowed-tools', 'metadata', 'compatibility'} + + # Check for unexpected properties (excluding nested keys under metadata) + unexpected_keys = set(frontmatter.keys()) - ALLOWED_PROPERTIES + if unexpected_keys: + return False, ( + f"Unexpected key(s) in SKILL.md frontmatter: {', '.join(sorted(unexpected_keys))}. " + f"Allowed properties are: {', '.join(sorted(ALLOWED_PROPERTIES))}" + ) + + # Check required fields + if 'name' not in frontmatter: + return False, "Missing 'name' in frontmatter" + if 'description' not in frontmatter: + return False, "Missing 'description' in frontmatter" + + # Extract name for validation + name = frontmatter.get('name', '') + if not isinstance(name, str): + return False, f"Name must be a string, got {type(name).__name__}" + name = name.strip() + if name: + # Check naming convention (kebab-case: lowercase with hyphens) + if not re.match(r'^[a-z0-9-]+$', name): + return False, f"Name '{name}' should be kebab-case (lowercase letters, digits, and hyphens only)" + if name.startswith('-') or name.endswith('-') or '--' in name: + return False, f"Name '{name}' cannot start/end with hyphen or contain consecutive hyphens" + # Check name length (max 64 characters per spec) + if len(name) > 64: + return False, f"Name is too long ({len(name)} characters). Maximum is 64 characters." + + # Extract and validate description + description = frontmatter.get('description', '') + if not isinstance(description, str): + return False, f"Description must be a string, got {type(description).__name__}" + description = description.strip() + if description: + # Check for angle brackets + if '<' in description or '>' in description: + return False, "Description cannot contain angle brackets (< or >)" + # Check description length (max 1024 characters per spec) + if len(description) > 1024: + return False, f"Description is too long ({len(description)} characters). Maximum is 1024 characters." + + # Validate compatibility field if present (optional) + compatibility = frontmatter.get('compatibility', '') + if compatibility: + if not isinstance(compatibility, str): + return False, f"Compatibility must be a string, got {type(compatibility).__name__}" + if len(compatibility) > 500: + return False, f"Compatibility is too long ({len(compatibility)} characters). Maximum is 500 characters." + + return True, "Skill is valid!" + +if __name__ == "__main__": + if len(sys.argv) != 2: + print("Usage: python quick_validate.py ") + sys.exit(1) + + valid, message = validate_skill(sys.argv[1]) + print(message) + sys.exit(0 if valid else 1) \ No newline at end of file diff --git a/.claude/skills/skill-creator/scripts/run_eval.py b/.claude/skills/skill-creator/scripts/run_eval.py new file mode 100644 index 0000000..e58c70b --- /dev/null +++ b/.claude/skills/skill-creator/scripts/run_eval.py @@ -0,0 +1,310 @@ +#!/usr/bin/env python3 +"""Run trigger evaluation for a skill description. + +Tests whether a skill's description causes Claude to trigger (read the skill) +for a set of queries. Outputs results as JSON. +""" + +import argparse +import json +import os +import select +import subprocess +import sys +import time +import uuid +from concurrent.futures import ProcessPoolExecutor, as_completed +from pathlib import Path + +from scripts.utils import parse_skill_md + + +def find_project_root() -> Path: + """Find the project root by walking up from cwd looking for .claude/. + + Mimics how Claude Code discovers its project root, so the command file + we create ends up where claude -p will look for it. + """ + current = Path.cwd() + for parent in [current, *current.parents]: + if (parent / ".claude").is_dir(): + return parent + return current + + +def run_single_query( + query: str, + skill_name: str, + skill_description: str, + timeout: int, + project_root: str, + model: str | None = None, +) -> bool: + """Run a single query and return whether the skill was triggered. + + Creates a command file in .claude/commands/ so it appears in Claude's + available_skills list, then runs `claude -p` with the raw query. + Uses --include-partial-messages to detect triggering early from + stream events (content_block_start) rather than waiting for the + full assistant message, which only arrives after tool execution. + """ + unique_id = uuid.uuid4().hex[:8] + clean_name = f"{skill_name}-skill-{unique_id}" + project_commands_dir = Path(project_root) / ".claude" / "commands" + command_file = project_commands_dir / f"{clean_name}.md" + + try: + project_commands_dir.mkdir(parents=True, exist_ok=True) + # Use YAML block scalar to avoid breaking on quotes in description + indented_desc = "\n ".join(skill_description.split("\n")) + command_content = ( + f"---\n" + f"description: |\n" + f" {indented_desc}\n" + f"---\n\n" + f"# {skill_name}\n\n" + f"This skill handles: {skill_description}\n" + ) + command_file.write_text(command_content) + + cmd = [ + "claude", + "-p", query, + "--output-format", "stream-json", + "--verbose", + "--include-partial-messages", + ] + if model: + cmd.extend(["--model", model]) + + # Remove CLAUDECODE env var to allow nesting claude -p inside a + # Claude Code session. The guard is for interactive terminal conflicts; + # programmatic subprocess usage is safe. + env = {k: v for k, v in os.environ.items() if k != "CLAUDECODE"} + + process = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + cwd=project_root, + env=env, + ) + + triggered = False + start_time = time.time() + buffer = "" + # Track state for stream event detection + pending_tool_name = None + accumulated_json = "" + + try: + while time.time() - start_time < timeout: + if process.poll() is not None: + remaining = process.stdout.read() + if remaining: + buffer += remaining.decode("utf-8", errors="replace") + break + + ready, _, _ = select.select([process.stdout], [], [], 1.0) + if not ready: + continue + + chunk = os.read(process.stdout.fileno(), 8192) + if not chunk: + break + buffer += chunk.decode("utf-8", errors="replace") + + while "\n" in buffer: + line, buffer = buffer.split("\n", 1) + line = line.strip() + if not line: + continue + + try: + event = json.loads(line) + except json.JSONDecodeError: + continue + + # Early detection via stream events + if event.get("type") == "stream_event": + se = event.get("event", {}) + se_type = se.get("type", "") + + if se_type == "content_block_start": + cb = se.get("content_block", {}) + if cb.get("type") == "tool_use": + tool_name = cb.get("name", "") + if tool_name in ("Skill", "Read"): + pending_tool_name = tool_name + accumulated_json = "" + else: + return False + + elif se_type == "content_block_delta" and pending_tool_name: + delta = se.get("delta", {}) + if delta.get("type") == "input_json_delta": + accumulated_json += delta.get("partial_json", "") + if clean_name in accumulated_json: + return True + + elif se_type in ("content_block_stop", "message_stop"): + if pending_tool_name: + return clean_name in accumulated_json + if se_type == "message_stop": + return False + + # Fallback: full assistant message + elif event.get("type") == "assistant": + message = event.get("message", {}) + for content_item in message.get("content", []): + if content_item.get("type") != "tool_use": + continue + tool_name = content_item.get("name", "") + tool_input = content_item.get("input", {}) + if tool_name == "Skill" and clean_name in tool_input.get("skill", ""): + triggered = True + elif tool_name == "Read" and clean_name in tool_input.get("file_path", ""): + triggered = True + return triggered + + elif event.get("type") == "result": + return triggered + finally: + # Clean up process on any exit path (return, exception, timeout) + if process.poll() is None: + process.kill() + process.wait() + + return triggered + finally: + if command_file.exists(): + command_file.unlink() + + +def run_eval( + eval_set: list[dict], + skill_name: str, + description: str, + num_workers: int, + timeout: int, + project_root: Path, + runs_per_query: int = 1, + trigger_threshold: float = 0.5, + model: str | None = None, +) -> dict: + """Run the full eval set and return results.""" + results = [] + + with ProcessPoolExecutor(max_workers=num_workers) as executor: + future_to_info = {} + for item in eval_set: + for run_idx in range(runs_per_query): + future = executor.submit( + run_single_query, + item["query"], + skill_name, + description, + timeout, + str(project_root), + model, + ) + future_to_info[future] = (item, run_idx) + + query_triggers: dict[str, list[bool]] = {} + query_items: dict[str, dict] = {} + for future in as_completed(future_to_info): + item, _ = future_to_info[future] + query = item["query"] + query_items[query] = item + if query not in query_triggers: + query_triggers[query] = [] + try: + query_triggers[query].append(future.result()) + except Exception as e: + print(f"Warning: query failed: {e}", file=sys.stderr) + query_triggers[query].append(False) + + for query, triggers in query_triggers.items(): + item = query_items[query] + trigger_rate = sum(triggers) / len(triggers) + should_trigger = item["should_trigger"] + if should_trigger: + did_pass = trigger_rate >= trigger_threshold + else: + did_pass = trigger_rate < trigger_threshold + results.append({ + "query": query, + "should_trigger": should_trigger, + "trigger_rate": trigger_rate, + "triggers": sum(triggers), + "runs": len(triggers), + "pass": did_pass, + }) + + passed = sum(1 for r in results if r["pass"]) + total = len(results) + + return { + "skill_name": skill_name, + "description": description, + "results": results, + "summary": { + "total": total, + "passed": passed, + "failed": total - passed, + }, + } + + +def main(): + parser = argparse.ArgumentParser(description="Run trigger evaluation for a skill description") + parser.add_argument("--eval-set", required=True, help="Path to eval set JSON file") + parser.add_argument("--skill-path", required=True, help="Path to skill directory") + parser.add_argument("--description", default=None, help="Override description to test") + parser.add_argument("--num-workers", type=int, default=10, help="Number of parallel workers") + parser.add_argument("--timeout", type=int, default=30, help="Timeout per query in seconds") + parser.add_argument("--runs-per-query", type=int, default=3, help="Number of runs per query") + parser.add_argument("--trigger-threshold", type=float, default=0.5, help="Trigger rate threshold") + parser.add_argument("--model", default=None, help="Model to use for claude -p (default: user's configured model)") + parser.add_argument("--verbose", action="store_true", help="Print progress to stderr") + args = parser.parse_args() + + eval_set = json.loads(Path(args.eval_set).read_text()) + skill_path = Path(args.skill_path) + + if not (skill_path / "SKILL.md").exists(): + print(f"Error: No SKILL.md found at {skill_path}", file=sys.stderr) + sys.exit(1) + + name, original_description, content = parse_skill_md(skill_path) + description = args.description or original_description + project_root = find_project_root() + + if args.verbose: + print(f"Evaluating: {description}", file=sys.stderr) + + output = run_eval( + eval_set=eval_set, + skill_name=name, + description=description, + num_workers=args.num_workers, + timeout=args.timeout, + project_root=project_root, + runs_per_query=args.runs_per_query, + trigger_threshold=args.trigger_threshold, + model=args.model, + ) + + if args.verbose: + summary = output["summary"] + print(f"Results: {summary['passed']}/{summary['total']} passed", file=sys.stderr) + for r in output["results"]: + status = "PASS" if r["pass"] else "FAIL" + rate_str = f"{r['triggers']}/{r['runs']}" + print(f" [{status}] rate={rate_str} expected={r['should_trigger']}: {r['query'][:70]}", file=sys.stderr) + + print(json.dumps(output, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/.claude/skills/skill-creator/scripts/run_loop.py b/.claude/skills/skill-creator/scripts/run_loop.py new file mode 100644 index 0000000..36f9b4e --- /dev/null +++ b/.claude/skills/skill-creator/scripts/run_loop.py @@ -0,0 +1,332 @@ +#!/usr/bin/env python3 +"""Run the eval + improve loop until all pass or max iterations reached. + +Combines run_eval.py and improve_description.py in a loop, tracking history +and returning the best description found. Supports train/test split to prevent +overfitting. +""" + +import argparse +import json +import random +import sys +import tempfile +import time +import webbrowser +from pathlib import Path + +import anthropic + +from scripts.generate_report import generate_html +from scripts.improve_description import improve_description +from scripts.run_eval import find_project_root, run_eval +from scripts.utils import parse_skill_md + + +def split_eval_set(eval_set: list[dict], holdout: float, seed: int = 42) -> tuple[list[dict], list[dict]]: + """Split eval set into train and test sets, stratified by should_trigger.""" + random.seed(seed) + + # Separate by should_trigger + trigger = [e for e in eval_set if e["should_trigger"]] + no_trigger = [e for e in eval_set if not e["should_trigger"]] + + # Shuffle each group + random.shuffle(trigger) + random.shuffle(no_trigger) + + # Calculate split points + n_trigger_test = max(1, int(len(trigger) * holdout)) + n_no_trigger_test = max(1, int(len(no_trigger) * holdout)) + + # Split + test_set = trigger[:n_trigger_test] + no_trigger[:n_no_trigger_test] + train_set = trigger[n_trigger_test:] + no_trigger[n_no_trigger_test:] + + return train_set, test_set + + +def run_loop( + eval_set: list[dict], + skill_path: Path, + description_override: str | None, + num_workers: int, + timeout: int, + max_iterations: int, + runs_per_query: int, + trigger_threshold: float, + holdout: float, + model: str, + verbose: bool, + live_report_path: Path | None = None, + log_dir: Path | None = None, +) -> dict: + """Run the eval + improvement loop.""" + project_root = find_project_root() + name, original_description, content = parse_skill_md(skill_path) + current_description = description_override or original_description + + # Split into train/test if holdout > 0 + if holdout > 0: + train_set, test_set = split_eval_set(eval_set, holdout) + if verbose: + print(f"Split: {len(train_set)} train, {len(test_set)} test (holdout={holdout})", file=sys.stderr) + else: + train_set = eval_set + test_set = [] + + client = anthropic.Anthropic() + history = [] + exit_reason = "unknown" + + for iteration in range(1, max_iterations + 1): + if verbose: + print(f"\n{'='*60}", file=sys.stderr) + print(f"Iteration {iteration}/{max_iterations}", file=sys.stderr) + print(f"Description: {current_description}", file=sys.stderr) + print(f"{'='*60}", file=sys.stderr) + + # Evaluate train + test together in one batch for parallelism + all_queries = train_set + test_set + t0 = time.time() + all_results = run_eval( + eval_set=all_queries, + skill_name=name, + description=current_description, + num_workers=num_workers, + timeout=timeout, + project_root=project_root, + runs_per_query=runs_per_query, + trigger_threshold=trigger_threshold, + model=model, + ) + eval_elapsed = time.time() - t0 + + # Split results back into train/test by matching queries + train_queries_set = {q["query"] for q in train_set} + train_result_list = [r for r in all_results["results"] if r["query"] in train_queries_set] + test_result_list = [r for r in all_results["results"] if r["query"] not in train_queries_set] + + train_passed = sum(1 for r in train_result_list if r["pass"]) + train_total = len(train_result_list) + train_summary = {"passed": train_passed, "failed": train_total - train_passed, "total": train_total} + train_results = {"results": train_result_list, "summary": train_summary} + + if test_set: + test_passed = sum(1 for r in test_result_list if r["pass"]) + test_total = len(test_result_list) + test_summary = {"passed": test_passed, "failed": test_total - test_passed, "total": test_total} + test_results = {"results": test_result_list, "summary": test_summary} + else: + test_results = None + test_summary = None + + history.append({ + "iteration": iteration, + "description": current_description, + "train_passed": train_summary["passed"], + "train_failed": train_summary["failed"], + "train_total": train_summary["total"], + "train_results": train_results["results"], + "test_passed": test_summary["passed"] if test_summary else None, + "test_failed": test_summary["failed"] if test_summary else None, + "test_total": test_summary["total"] if test_summary else None, + "test_results": test_results["results"] if test_results else None, + # For backward compat with report generator + "passed": train_summary["passed"], + "failed": train_summary["failed"], + "total": train_summary["total"], + "results": train_results["results"], + }) + + # Write live report if path provided + if live_report_path: + partial_output = { + "original_description": original_description, + "best_description": current_description, + "best_score": "in progress", + "iterations_run": len(history), + "holdout": holdout, + "train_size": len(train_set), + "test_size": len(test_set), + "history": history, + } + live_report_path.write_text(generate_html(partial_output, auto_refresh=True, skill_name=name)) + + if verbose: + def print_eval_stats(label, results, elapsed): + pos = [r for r in results if r["should_trigger"]] + neg = [r for r in results if not r["should_trigger"]] + tp = sum(r["triggers"] for r in pos) + pos_runs = sum(r["runs"] for r in pos) + fn = pos_runs - tp + fp = sum(r["triggers"] for r in neg) + neg_runs = sum(r["runs"] for r in neg) + tn = neg_runs - fp + total = tp + tn + fp + fn + precision = tp / (tp + fp) if (tp + fp) > 0 else 1.0 + recall = tp / (tp + fn) if (tp + fn) > 0 else 1.0 + accuracy = (tp + tn) / total if total > 0 else 0.0 + print(f"{label}: {tp+tn}/{total} correct, precision={precision:.0%} recall={recall:.0%} accuracy={accuracy:.0%} ({elapsed:.1f}s)", file=sys.stderr) + for r in results: + status = "PASS" if r["pass"] else "FAIL" + rate_str = f"{r['triggers']}/{r['runs']}" + print(f" [{status}] rate={rate_str} expected={r['should_trigger']}: {r['query'][:60]}", file=sys.stderr) + + print_eval_stats("Train", train_results["results"], eval_elapsed) + if test_summary: + print_eval_stats("Test ", test_results["results"], 0) + + if train_summary["failed"] == 0: + exit_reason = f"all_passed (iteration {iteration})" + if verbose: + print(f"\nAll train queries passed on iteration {iteration}!", file=sys.stderr) + break + + if iteration == max_iterations: + exit_reason = f"max_iterations ({max_iterations})" + if verbose: + print(f"\nMax iterations reached ({max_iterations}).", file=sys.stderr) + break + + # Improve the description based on train results + if verbose: + print(f"\nImproving description...", file=sys.stderr) + + t0 = time.time() + # Strip test scores from history so improvement model can't see them + blinded_history = [ + {k: v for k, v in h.items() if not k.startswith("test_")} + for h in history + ] + new_description = improve_description( + client=client, + skill_name=name, + skill_content=content, + current_description=current_description, + eval_results=train_results, + history=blinded_history, + model=model, + log_dir=log_dir, + iteration=iteration, + ) + improve_elapsed = time.time() - t0 + + if verbose: + print(f"Proposed ({improve_elapsed:.1f}s): {new_description}", file=sys.stderr) + + current_description = new_description + + # Find the best iteration by TEST score (or train if no test set) + if test_set: + best = max(history, key=lambda h: h["test_passed"] or 0) + best_score = f"{best['test_passed']}/{best['test_total']}" + else: + best = max(history, key=lambda h: h["train_passed"]) + best_score = f"{best['train_passed']}/{best['train_total']}" + + if verbose: + print(f"\nExit reason: {exit_reason}", file=sys.stderr) + print(f"Best score: {best_score} (iteration {best['iteration']})", file=sys.stderr) + + return { + "exit_reason": exit_reason, + "original_description": original_description, + "best_description": best["description"], + "best_score": best_score, + "best_train_score": f"{best['train_passed']}/{best['train_total']}", + "best_test_score": f"{best['test_passed']}/{best['test_total']}" if test_set else None, + "final_description": current_description, + "iterations_run": len(history), + "holdout": holdout, + "train_size": len(train_set), + "test_size": len(test_set), + "history": history, + } + + +def main(): + parser = argparse.ArgumentParser(description="Run eval + improve loop") + parser.add_argument("--eval-set", required=True, help="Path to eval set JSON file") + parser.add_argument("--skill-path", required=True, help="Path to skill directory") + parser.add_argument("--description", default=None, help="Override starting description") + parser.add_argument("--num-workers", type=int, default=10, help="Number of parallel workers") + parser.add_argument("--timeout", type=int, default=30, help="Timeout per query in seconds") + parser.add_argument("--max-iterations", type=int, default=5, help="Max improvement iterations") + parser.add_argument("--runs-per-query", type=int, default=3, help="Number of runs per query") + parser.add_argument("--trigger-threshold", type=float, default=0.5, help="Trigger rate threshold") + parser.add_argument("--holdout", type=float, default=0.4, help="Fraction of eval set to hold out for testing (0 to disable)") + parser.add_argument("--model", required=True, help="Model for improvement") + parser.add_argument("--verbose", action="store_true", help="Print progress to stderr") + parser.add_argument("--report", default="auto", help="Generate HTML report at this path (default: 'auto' for temp file, 'none' to disable)") + parser.add_argument("--results-dir", default=None, help="Save all outputs (results.json, report.html, log.txt) to a timestamped subdirectory here") + args = parser.parse_args() + + eval_set = json.loads(Path(args.eval_set).read_text()) + skill_path = Path(args.skill_path) + + if not (skill_path / "SKILL.md").exists(): + print(f"Error: No SKILL.md found at {skill_path}", file=sys.stderr) + sys.exit(1) + + name, _, _ = parse_skill_md(skill_path) + + # Set up live report path + if args.report != "none": + if args.report == "auto": + timestamp = time.strftime("%Y%m%d_%H%M%S") + live_report_path = Path(tempfile.gettempdir()) / f"skill_description_report_{skill_path.name}_{timestamp}.html" + else: + live_report_path = Path(args.report) + # Open the report immediately so the user can watch + live_report_path.write_text("

    Starting optimization loop...

    ") + webbrowser.open(str(live_report_path)) + else: + live_report_path = None + + # Determine output directory (create before run_loop so logs can be written) + if args.results_dir: + timestamp = time.strftime("%Y-%m-%d_%H%M%S") + results_dir = Path(args.results_dir) / timestamp + results_dir.mkdir(parents=True, exist_ok=True) + else: + results_dir = None + + log_dir = results_dir / "logs" if results_dir else None + + output = run_loop( + eval_set=eval_set, + skill_path=skill_path, + description_override=args.description, + num_workers=args.num_workers, + timeout=args.timeout, + max_iterations=args.max_iterations, + runs_per_query=args.runs_per_query, + trigger_threshold=args.trigger_threshold, + holdout=args.holdout, + model=args.model, + verbose=args.verbose, + live_report_path=live_report_path, + log_dir=log_dir, + ) + + # Save JSON output + json_output = json.dumps(output, indent=2) + print(json_output) + if results_dir: + (results_dir / "results.json").write_text(json_output) + + # Write final HTML report (without auto-refresh) + if live_report_path: + live_report_path.write_text(generate_html(output, auto_refresh=False, skill_name=name)) + print(f"\nReport: {live_report_path}", file=sys.stderr) + + if results_dir and live_report_path: + (results_dir / "report.html").write_text(generate_html(output, auto_refresh=False, skill_name=name)) + + if results_dir: + print(f"Results saved to: {results_dir}", file=sys.stderr) + + +if __name__ == "__main__": + main() diff --git a/.claude/skills/skill-creator/scripts/utils.py b/.claude/skills/skill-creator/scripts/utils.py new file mode 100644 index 0000000..51b6a07 --- /dev/null +++ b/.claude/skills/skill-creator/scripts/utils.py @@ -0,0 +1,47 @@ +"""Shared utilities for skill-creator scripts.""" + +from pathlib import Path + + + +def parse_skill_md(skill_path: Path) -> tuple[str, str, str]: + """Parse a SKILL.md file, returning (name, description, full_content).""" + content = (skill_path / "SKILL.md").read_text() + lines = content.split("\n") + + if lines[0].strip() != "---": + raise ValueError("SKILL.md missing frontmatter (no opening ---)") + + end_idx = None + for i, line in enumerate(lines[1:], start=1): + if line.strip() == "---": + end_idx = i + break + + if end_idx is None: + raise ValueError("SKILL.md missing frontmatter (no closing ---)") + + name = "" + description = "" + frontmatter_lines = lines[1:end_idx] + i = 0 + while i < len(frontmatter_lines): + line = frontmatter_lines[i] + if line.startswith("name:"): + name = line[len("name:"):].strip().strip('"').strip("'") + elif line.startswith("description:"): + value = line[len("description:"):].strip() + # Handle YAML multiline indicators (>, |, >-, |-) + if value in (">", "|", ">-", "|-"): + continuation_lines: list[str] = [] + i += 1 + while i < len(frontmatter_lines) and (frontmatter_lines[i].startswith(" ") or frontmatter_lines[i].startswith("\t")): + continuation_lines.append(frontmatter_lines[i].strip()) + i += 1 + description = " ".join(continuation_lines) + continue + else: + description = value.strip('"').strip("'") + i += 1 + + return name, description, content diff --git a/.claude/skills/slack-gif-creator/.openskills.json b/.claude/skills/slack-gif-creator/.openskills.json new file mode 100644 index 0000000..2a64370 --- /dev/null +++ b/.claude/skills/slack-gif-creator/.openskills.json @@ -0,0 +1,7 @@ +{ + "source": "anthropics/skills", + "sourceType": "git", + "repoUrl": "https://github.com/anthropics/skills", + "subpath": "skills\\slack-gif-creator", + "installedAt": "2026-03-02T09:19:50.159Z" +} \ No newline at end of file diff --git a/.claude/skills/slack-gif-creator/LICENSE.txt b/.claude/skills/slack-gif-creator/LICENSE.txt new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/.claude/skills/slack-gif-creator/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/.claude/skills/slack-gif-creator/SKILL.md b/.claude/skills/slack-gif-creator/SKILL.md new file mode 100644 index 0000000..16660d8 --- /dev/null +++ b/.claude/skills/slack-gif-creator/SKILL.md @@ -0,0 +1,254 @@ +--- +name: slack-gif-creator +description: Knowledge and utilities for creating animated GIFs optimized for Slack. Provides constraints, validation tools, and animation concepts. Use when users request animated GIFs for Slack like "make me a GIF of X doing Y for Slack." +license: Complete terms in LICENSE.txt +--- + +# Slack GIF Creator + +A toolkit providing utilities and knowledge for creating animated GIFs optimized for Slack. + +## Slack Requirements + +**Dimensions:** +- Emoji GIFs: 128x128 (recommended) +- Message GIFs: 480x480 + +**Parameters:** +- FPS: 10-30 (lower is smaller file size) +- Colors: 48-128 (fewer = smaller file size) +- Duration: Keep under 3 seconds for emoji GIFs + +## Core Workflow + +```python +from core.gif_builder import GIFBuilder +from PIL import Image, ImageDraw + +# 1. Create builder +builder = GIFBuilder(width=128, height=128, fps=10) + +# 2. Generate frames +for i in range(12): + frame = Image.new('RGB', (128, 128), (240, 248, 255)) + draw = ImageDraw.Draw(frame) + + # Draw your animation using PIL primitives + # (circles, polygons, lines, etc.) + + builder.add_frame(frame) + +# 3. Save with optimization +builder.save('output.gif', num_colors=48, optimize_for_emoji=True) +``` + +## Drawing Graphics + +### Working with User-Uploaded Images +If a user uploads an image, consider whether they want to: +- **Use it directly** (e.g., "animate this", "split this into frames") +- **Use it as inspiration** (e.g., "make something like this") + +Load and work with images using PIL: +```python +from PIL import Image + +uploaded = Image.open('file.png') +# Use directly, or just as reference for colors/style +``` + +### Drawing from Scratch +When drawing graphics from scratch, use PIL ImageDraw primitives: + +```python +from PIL import ImageDraw + +draw = ImageDraw.Draw(frame) + +# Circles/ovals +draw.ellipse([x1, y1, x2, y2], fill=(r, g, b), outline=(r, g, b), width=3) + +# Stars, triangles, any polygon +points = [(x1, y1), (x2, y2), (x3, y3), ...] +draw.polygon(points, fill=(r, g, b), outline=(r, g, b), width=3) + +# Lines +draw.line([(x1, y1), (x2, y2)], fill=(r, g, b), width=5) + +# Rectangles +draw.rectangle([x1, y1, x2, y2], fill=(r, g, b), outline=(r, g, b), width=3) +``` + +**Don't use:** Emoji fonts (unreliable across platforms) or assume pre-packaged graphics exist in this skill. + +### Making Graphics Look Good + +Graphics should look polished and creative, not basic. Here's how: + +**Use thicker lines** - Always set `width=2` or higher for outlines and lines. Thin lines (width=1) look choppy and amateurish. + +**Add visual depth**: +- Use gradients for backgrounds (`create_gradient_background`) +- Layer multiple shapes for complexity (e.g., a star with a smaller star inside) + +**Make shapes more interesting**: +- Don't just draw a plain circle - add highlights, rings, or patterns +- Stars can have glows (draw larger, semi-transparent versions behind) +- Combine multiple shapes (stars + sparkles, circles + rings) + +**Pay attention to colors**: +- Use vibrant, complementary colors +- Add contrast (dark outlines on light shapes, light outlines on dark shapes) +- Consider the overall composition + +**For complex shapes** (hearts, snowflakes, etc.): +- Use combinations of polygons and ellipses +- Calculate points carefully for symmetry +- Add details (a heart can have a highlight curve, snowflakes have intricate branches) + +Be creative and detailed! A good Slack GIF should look polished, not like placeholder graphics. + +## Available Utilities + +### GIFBuilder (`core.gif_builder`) +Assembles frames and optimizes for Slack: +```python +builder = GIFBuilder(width=128, height=128, fps=10) +builder.add_frame(frame) # Add PIL Image +builder.add_frames(frames) # Add list of frames +builder.save('out.gif', num_colors=48, optimize_for_emoji=True, remove_duplicates=True) +``` + +### Validators (`core.validators`) +Check if GIF meets Slack requirements: +```python +from core.validators import validate_gif, is_slack_ready + +# Detailed validation +passes, info = validate_gif('my.gif', is_emoji=True, verbose=True) + +# Quick check +if is_slack_ready('my.gif'): + print("Ready!") +``` + +### Easing Functions (`core.easing`) +Smooth motion instead of linear: +```python +from core.easing import interpolate + +# Progress from 0.0 to 1.0 +t = i / (num_frames - 1) + +# Apply easing +y = interpolate(start=0, end=400, t=t, easing='ease_out') + +# Available: linear, ease_in, ease_out, ease_in_out, +# bounce_out, elastic_out, back_out +``` + +### Frame Helpers (`core.frame_composer`) +Convenience functions for common needs: +```python +from core.frame_composer import ( + create_blank_frame, # Solid color background + create_gradient_background, # Vertical gradient + draw_circle, # Helper for circles + draw_text, # Simple text rendering + draw_star # 5-pointed star +) +``` + +## Animation Concepts + +### Shake/Vibrate +Offset object position with oscillation: +- Use `math.sin()` or `math.cos()` with frame index +- Add small random variations for natural feel +- Apply to x and/or y position + +### Pulse/Heartbeat +Scale object size rhythmically: +- Use `math.sin(t * frequency * 2 * math.pi)` for smooth pulse +- For heartbeat: two quick pulses then pause (adjust sine wave) +- Scale between 0.8 and 1.2 of base size + +### Bounce +Object falls and bounces: +- Use `interpolate()` with `easing='bounce_out'` for landing +- Use `easing='ease_in'` for falling (accelerating) +- Apply gravity by increasing y velocity each frame + +### Spin/Rotate +Rotate object around center: +- PIL: `image.rotate(angle, resample=Image.BICUBIC)` +- For wobble: use sine wave for angle instead of linear + +### Fade In/Out +Gradually appear or disappear: +- Create RGBA image, adjust alpha channel +- Or use `Image.blend(image1, image2, alpha)` +- Fade in: alpha from 0 to 1 +- Fade out: alpha from 1 to 0 + +### Slide +Move object from off-screen to position: +- Start position: outside frame bounds +- End position: target location +- Use `interpolate()` with `easing='ease_out'` for smooth stop +- For overshoot: use `easing='back_out'` + +### Zoom +Scale and position for zoom effect: +- Zoom in: scale from 0.1 to 2.0, crop center +- Zoom out: scale from 2.0 to 1.0 +- Can add motion blur for drama (PIL filter) + +### Explode/Particle Burst +Create particles radiating outward: +- Generate particles with random angles and velocities +- Update each particle: `x += vx`, `y += vy` +- Add gravity: `vy += gravity_constant` +- Fade out particles over time (reduce alpha) + +## Optimization Strategies + +Only when asked to make the file size smaller, implement a few of the following methods: + +1. **Fewer frames** - Lower FPS (10 instead of 20) or shorter duration +2. **Fewer colors** - `num_colors=48` instead of 128 +3. **Smaller dimensions** - 128x128 instead of 480x480 +4. **Remove duplicates** - `remove_duplicates=True` in save() +5. **Emoji mode** - `optimize_for_emoji=True` auto-optimizes + +```python +# Maximum optimization for emoji +builder.save( + 'emoji.gif', + num_colors=48, + optimize_for_emoji=True, + remove_duplicates=True +) +``` + +## Philosophy + +This skill provides: +- **Knowledge**: Slack's requirements and animation concepts +- **Utilities**: GIFBuilder, validators, easing functions +- **Flexibility**: Create the animation logic using PIL primitives + +It does NOT provide: +- Rigid animation templates or pre-made functions +- Emoji font rendering (unreliable across platforms) +- A library of pre-packaged graphics built into the skill + +**Note on user uploads**: This skill doesn't include pre-built graphics, but if a user uploads an image, use PIL to load and work with it - interpret based on their request whether they want it used directly or just as inspiration. + +Be creative! Combine concepts (bouncing + rotating, pulsing + sliding, etc.) and use PIL's full capabilities. + +## Dependencies + +```bash +pip install pillow imageio numpy +``` diff --git a/.claude/skills/slack-gif-creator/core/easing.py b/.claude/skills/slack-gif-creator/core/easing.py new file mode 100644 index 0000000..772fa83 --- /dev/null +++ b/.claude/skills/slack-gif-creator/core/easing.py @@ -0,0 +1,234 @@ +#!/usr/bin/env python3 +""" +Easing Functions - Timing functions for smooth animations. + +Provides various easing functions for natural motion and timing. +All functions take a value t (0.0 to 1.0) and return eased value (0.0 to 1.0). +""" + +import math + + +def linear(t: float) -> float: + """Linear interpolation (no easing).""" + return t + + +def ease_in_quad(t: float) -> float: + """Quadratic ease-in (slow start, accelerating).""" + return t * t + + +def ease_out_quad(t: float) -> float: + """Quadratic ease-out (fast start, decelerating).""" + return t * (2 - t) + + +def ease_in_out_quad(t: float) -> float: + """Quadratic ease-in-out (slow start and end).""" + if t < 0.5: + return 2 * t * t + return -1 + (4 - 2 * t) * t + + +def ease_in_cubic(t: float) -> float: + """Cubic ease-in (slow start).""" + return t * t * t + + +def ease_out_cubic(t: float) -> float: + """Cubic ease-out (fast start).""" + return (t - 1) * (t - 1) * (t - 1) + 1 + + +def ease_in_out_cubic(t: float) -> float: + """Cubic ease-in-out.""" + if t < 0.5: + return 4 * t * t * t + return (t - 1) * (2 * t - 2) * (2 * t - 2) + 1 + + +def ease_in_bounce(t: float) -> float: + """Bounce ease-in (bouncy start).""" + return 1 - ease_out_bounce(1 - t) + + +def ease_out_bounce(t: float) -> float: + """Bounce ease-out (bouncy end).""" + if t < 1 / 2.75: + return 7.5625 * t * t + elif t < 2 / 2.75: + t -= 1.5 / 2.75 + return 7.5625 * t * t + 0.75 + elif t < 2.5 / 2.75: + t -= 2.25 / 2.75 + return 7.5625 * t * t + 0.9375 + else: + t -= 2.625 / 2.75 + return 7.5625 * t * t + 0.984375 + + +def ease_in_out_bounce(t: float) -> float: + """Bounce ease-in-out.""" + if t < 0.5: + return ease_in_bounce(t * 2) * 0.5 + return ease_out_bounce(t * 2 - 1) * 0.5 + 0.5 + + +def ease_in_elastic(t: float) -> float: + """Elastic ease-in (spring effect).""" + if t == 0 or t == 1: + return t + return -math.pow(2, 10 * (t - 1)) * math.sin((t - 1.1) * 5 * math.pi) + + +def ease_out_elastic(t: float) -> float: + """Elastic ease-out (spring effect).""" + if t == 0 or t == 1: + return t + return math.pow(2, -10 * t) * math.sin((t - 0.1) * 5 * math.pi) + 1 + + +def ease_in_out_elastic(t: float) -> float: + """Elastic ease-in-out.""" + if t == 0 or t == 1: + return t + t = t * 2 - 1 + if t < 0: + return -0.5 * math.pow(2, 10 * t) * math.sin((t - 0.1) * 5 * math.pi) + return math.pow(2, -10 * t) * math.sin((t - 0.1) * 5 * math.pi) * 0.5 + 1 + + +# Convenience mapping +EASING_FUNCTIONS = { + "linear": linear, + "ease_in": ease_in_quad, + "ease_out": ease_out_quad, + "ease_in_out": ease_in_out_quad, + "bounce_in": ease_in_bounce, + "bounce_out": ease_out_bounce, + "bounce": ease_in_out_bounce, + "elastic_in": ease_in_elastic, + "elastic_out": ease_out_elastic, + "elastic": ease_in_out_elastic, +} + + +def get_easing(name: str = "linear"): + """Get easing function by name.""" + return EASING_FUNCTIONS.get(name, linear) + + +def interpolate(start: float, end: float, t: float, easing: str = "linear") -> float: + """ + Interpolate between two values with easing. + + Args: + start: Start value + end: End value + t: Progress from 0.0 to 1.0 + easing: Name of easing function + + Returns: + Interpolated value + """ + ease_func = get_easing(easing) + eased_t = ease_func(t) + return start + (end - start) * eased_t + + +def ease_back_in(t: float) -> float: + """Back ease-in (slight overshoot backward before forward motion).""" + c1 = 1.70158 + c3 = c1 + 1 + return c3 * t * t * t - c1 * t * t + + +def ease_back_out(t: float) -> float: + """Back ease-out (overshoot forward then settle back).""" + c1 = 1.70158 + c3 = c1 + 1 + return 1 + c3 * pow(t - 1, 3) + c1 * pow(t - 1, 2) + + +def ease_back_in_out(t: float) -> float: + """Back ease-in-out (overshoot at both ends).""" + c1 = 1.70158 + c2 = c1 * 1.525 + if t < 0.5: + return (pow(2 * t, 2) * ((c2 + 1) * 2 * t - c2)) / 2 + return (pow(2 * t - 2, 2) * ((c2 + 1) * (t * 2 - 2) + c2) + 2) / 2 + + +def apply_squash_stretch( + base_scale: tuple[float, float], intensity: float, direction: str = "vertical" +) -> tuple[float, float]: + """ + Calculate squash and stretch scales for more dynamic animation. + + Args: + base_scale: (width_scale, height_scale) base scales + intensity: Squash/stretch intensity (0.0-1.0) + direction: 'vertical', 'horizontal', or 'both' + + Returns: + (width_scale, height_scale) with squash/stretch applied + """ + width_scale, height_scale = base_scale + + if direction == "vertical": + # Compress vertically, expand horizontally (preserve volume) + height_scale *= 1 - intensity * 0.5 + width_scale *= 1 + intensity * 0.5 + elif direction == "horizontal": + # Compress horizontally, expand vertically + width_scale *= 1 - intensity * 0.5 + height_scale *= 1 + intensity * 0.5 + elif direction == "both": + # General squash (both dimensions) + width_scale *= 1 - intensity * 0.3 + height_scale *= 1 - intensity * 0.3 + + return (width_scale, height_scale) + + +def calculate_arc_motion( + start: tuple[float, float], end: tuple[float, float], height: float, t: float +) -> tuple[float, float]: + """ + Calculate position along a parabolic arc (natural motion path). + + Args: + start: (x, y) starting position + end: (x, y) ending position + height: Arc height at midpoint (positive = upward) + t: Progress (0.0-1.0) + + Returns: + (x, y) position along arc + """ + x1, y1 = start + x2, y2 = end + + # Linear interpolation for x + x = x1 + (x2 - x1) * t + + # Parabolic interpolation for y + # y = start + progress * (end - start) + arc_offset + # Arc offset peaks at t=0.5 + arc_offset = 4 * height * t * (1 - t) + y = y1 + (y2 - y1) * t - arc_offset + + return (x, y) + + +# Add new easing functions to the convenience mapping +EASING_FUNCTIONS.update( + { + "back_in": ease_back_in, + "back_out": ease_back_out, + "back_in_out": ease_back_in_out, + "anticipate": ease_back_in, # Alias + "overshoot": ease_back_out, # Alias + } +) diff --git a/.claude/skills/slack-gif-creator/core/frame_composer.py b/.claude/skills/slack-gif-creator/core/frame_composer.py new file mode 100644 index 0000000..1afe434 --- /dev/null +++ b/.claude/skills/slack-gif-creator/core/frame_composer.py @@ -0,0 +1,176 @@ +#!/usr/bin/env python3 +""" +Frame Composer - Utilities for composing visual elements into frames. + +Provides functions for drawing shapes, text, emojis, and compositing elements +together to create animation frames. +""" + +from typing import Optional + +import numpy as np +from PIL import Image, ImageDraw, ImageFont + + +def create_blank_frame( + width: int, height: int, color: tuple[int, int, int] = (255, 255, 255) +) -> Image.Image: + """ + Create a blank frame with solid color background. + + Args: + width: Frame width + height: Frame height + color: RGB color tuple (default: white) + + Returns: + PIL Image + """ + return Image.new("RGB", (width, height), color) + + +def draw_circle( + frame: Image.Image, + center: tuple[int, int], + radius: int, + fill_color: Optional[tuple[int, int, int]] = None, + outline_color: Optional[tuple[int, int, int]] = None, + outline_width: int = 1, +) -> Image.Image: + """ + Draw a circle on a frame. + + Args: + frame: PIL Image to draw on + center: (x, y) center position + radius: Circle radius + fill_color: RGB fill color (None for no fill) + outline_color: RGB outline color (None for no outline) + outline_width: Outline width in pixels + + Returns: + Modified frame + """ + draw = ImageDraw.Draw(frame) + x, y = center + bbox = [x - radius, y - radius, x + radius, y + radius] + draw.ellipse(bbox, fill=fill_color, outline=outline_color, width=outline_width) + return frame + + +def draw_text( + frame: Image.Image, + text: str, + position: tuple[int, int], + color: tuple[int, int, int] = (0, 0, 0), + centered: bool = False, +) -> Image.Image: + """ + Draw text on a frame. + + Args: + frame: PIL Image to draw on + text: Text to draw + position: (x, y) position (top-left unless centered=True) + color: RGB text color + centered: If True, center text at position + + Returns: + Modified frame + """ + draw = ImageDraw.Draw(frame) + + # Uses Pillow's default font. + # If the font should be changed for the emoji, add additional logic here. + font = ImageFont.load_default() + + if centered: + bbox = draw.textbbox((0, 0), text, font=font) + text_width = bbox[2] - bbox[0] + text_height = bbox[3] - bbox[1] + x = position[0] - text_width // 2 + y = position[1] - text_height // 2 + position = (x, y) + + draw.text(position, text, fill=color, font=font) + return frame + + +def create_gradient_background( + width: int, + height: int, + top_color: tuple[int, int, int], + bottom_color: tuple[int, int, int], +) -> Image.Image: + """ + Create a vertical gradient background. + + Args: + width: Frame width + height: Frame height + top_color: RGB color at top + bottom_color: RGB color at bottom + + Returns: + PIL Image with gradient + """ + frame = Image.new("RGB", (width, height)) + draw = ImageDraw.Draw(frame) + + # Calculate color step for each row + r1, g1, b1 = top_color + r2, g2, b2 = bottom_color + + for y in range(height): + # Interpolate color + ratio = y / height + r = int(r1 * (1 - ratio) + r2 * ratio) + g = int(g1 * (1 - ratio) + g2 * ratio) + b = int(b1 * (1 - ratio) + b2 * ratio) + + # Draw horizontal line + draw.line([(0, y), (width, y)], fill=(r, g, b)) + + return frame + + +def draw_star( + frame: Image.Image, + center: tuple[int, int], + size: int, + fill_color: tuple[int, int, int], + outline_color: Optional[tuple[int, int, int]] = None, + outline_width: int = 1, +) -> Image.Image: + """ + Draw a 5-pointed star. + + Args: + frame: PIL Image to draw on + center: (x, y) center position + size: Star size (outer radius) + fill_color: RGB fill color + outline_color: RGB outline color (None for no outline) + outline_width: Outline width + + Returns: + Modified frame + """ + import math + + draw = ImageDraw.Draw(frame) + x, y = center + + # Calculate star points + points = [] + for i in range(10): + angle = (i * 36 - 90) * math.pi / 180 # 36 degrees per point, start at top + radius = size if i % 2 == 0 else size * 0.4 # Alternate between outer and inner + px = x + radius * math.cos(angle) + py = y + radius * math.sin(angle) + points.append((px, py)) + + # Draw star + draw.polygon(points, fill=fill_color, outline=outline_color, width=outline_width) + + return frame diff --git a/.claude/skills/slack-gif-creator/core/gif_builder.py b/.claude/skills/slack-gif-creator/core/gif_builder.py new file mode 100644 index 0000000..5759f14 --- /dev/null +++ b/.claude/skills/slack-gif-creator/core/gif_builder.py @@ -0,0 +1,269 @@ +#!/usr/bin/env python3 +""" +GIF Builder - Core module for assembling frames into GIFs optimized for Slack. + +This module provides the main interface for creating GIFs from programmatically +generated frames, with automatic optimization for Slack's requirements. +""" + +from pathlib import Path +from typing import Optional + +import imageio.v3 as imageio +import numpy as np +from PIL import Image + + +class GIFBuilder: + """Builder for creating optimized GIFs from frames.""" + + def __init__(self, width: int = 480, height: int = 480, fps: int = 15): + """ + Initialize GIF builder. + + Args: + width: Frame width in pixels + height: Frame height in pixels + fps: Frames per second + """ + self.width = width + self.height = height + self.fps = fps + self.frames: list[np.ndarray] = [] + + def add_frame(self, frame: np.ndarray | Image.Image): + """ + Add a frame to the GIF. + + Args: + frame: Frame as numpy array or PIL Image (will be converted to RGB) + """ + if isinstance(frame, Image.Image): + frame = np.array(frame.convert("RGB")) + + # Ensure frame is correct size + if frame.shape[:2] != (self.height, self.width): + pil_frame = Image.fromarray(frame) + pil_frame = pil_frame.resize( + (self.width, self.height), Image.Resampling.LANCZOS + ) + frame = np.array(pil_frame) + + self.frames.append(frame) + + def add_frames(self, frames: list[np.ndarray | Image.Image]): + """Add multiple frames at once.""" + for frame in frames: + self.add_frame(frame) + + def optimize_colors( + self, num_colors: int = 128, use_global_palette: bool = True + ) -> list[np.ndarray]: + """ + Reduce colors in all frames using quantization. + + Args: + num_colors: Target number of colors (8-256) + use_global_palette: Use a single palette for all frames (better compression) + + Returns: + List of color-optimized frames + """ + optimized = [] + + if use_global_palette and len(self.frames) > 1: + # Create a global palette from all frames + # Sample frames to build palette + sample_size = min(5, len(self.frames)) + sample_indices = [ + int(i * len(self.frames) / sample_size) for i in range(sample_size) + ] + sample_frames = [self.frames[i] for i in sample_indices] + + # Combine sample frames into a single image for palette generation + # Flatten each frame to get all pixels, then stack them + all_pixels = np.vstack( + [f.reshape(-1, 3) for f in sample_frames] + ) # (total_pixels, 3) + + # Create a properly-shaped RGB image from the pixel data + # We'll make a roughly square image from all the pixels + total_pixels = len(all_pixels) + width = min(512, int(np.sqrt(total_pixels))) # Reasonable width, max 512 + height = (total_pixels + width - 1) // width # Ceiling division + + # Pad if necessary to fill the rectangle + pixels_needed = width * height + if pixels_needed > total_pixels: + padding = np.zeros((pixels_needed - total_pixels, 3), dtype=np.uint8) + all_pixels = np.vstack([all_pixels, padding]) + + # Reshape to proper RGB image format (H, W, 3) + img_array = ( + all_pixels[:pixels_needed].reshape(height, width, 3).astype(np.uint8) + ) + combined_img = Image.fromarray(img_array, mode="RGB") + + # Generate global palette + global_palette = combined_img.quantize(colors=num_colors, method=2) + + # Apply global palette to all frames + for frame in self.frames: + pil_frame = Image.fromarray(frame) + quantized = pil_frame.quantize(palette=global_palette, dither=1) + optimized.append(np.array(quantized.convert("RGB"))) + else: + # Use per-frame quantization + for frame in self.frames: + pil_frame = Image.fromarray(frame) + quantized = pil_frame.quantize(colors=num_colors, method=2, dither=1) + optimized.append(np.array(quantized.convert("RGB"))) + + return optimized + + def deduplicate_frames(self, threshold: float = 0.9995) -> int: + """ + Remove duplicate or near-duplicate consecutive frames. + + Args: + threshold: Similarity threshold (0.0-1.0). Higher = more strict (0.9995 = nearly identical). + Use 0.9995+ to preserve subtle animations, 0.98 for aggressive removal. + + Returns: + Number of frames removed + """ + if len(self.frames) < 2: + return 0 + + deduplicated = [self.frames[0]] + removed_count = 0 + + for i in range(1, len(self.frames)): + # Compare with previous frame + prev_frame = np.array(deduplicated[-1], dtype=np.float32) + curr_frame = np.array(self.frames[i], dtype=np.float32) + + # Calculate similarity (normalized) + diff = np.abs(prev_frame - curr_frame) + similarity = 1.0 - (np.mean(diff) / 255.0) + + # Keep frame if sufficiently different + # High threshold (0.9995+) means only remove nearly identical frames + if similarity < threshold: + deduplicated.append(self.frames[i]) + else: + removed_count += 1 + + self.frames = deduplicated + return removed_count + + def save( + self, + output_path: str | Path, + num_colors: int = 128, + optimize_for_emoji: bool = False, + remove_duplicates: bool = False, + ) -> dict: + """ + Save frames as optimized GIF for Slack. + + Args: + output_path: Where to save the GIF + num_colors: Number of colors to use (fewer = smaller file) + optimize_for_emoji: If True, optimize for emoji size (128x128, fewer colors) + remove_duplicates: If True, remove duplicate consecutive frames (opt-in) + + Returns: + Dictionary with file info (path, size, dimensions, frame_count) + """ + if not self.frames: + raise ValueError("No frames to save. Add frames with add_frame() first.") + + output_path = Path(output_path) + + # Remove duplicate frames to reduce file size + if remove_duplicates: + removed = self.deduplicate_frames(threshold=0.9995) + if removed > 0: + print( + f" Removed {removed} nearly identical frames (preserved subtle animations)" + ) + + # Optimize for emoji if requested + if optimize_for_emoji: + if self.width > 128 or self.height > 128: + print( + f" Resizing from {self.width}x{self.height} to 128x128 for emoji" + ) + self.width = 128 + self.height = 128 + # Resize all frames + resized_frames = [] + for frame in self.frames: + pil_frame = Image.fromarray(frame) + pil_frame = pil_frame.resize((128, 128), Image.Resampling.LANCZOS) + resized_frames.append(np.array(pil_frame)) + self.frames = resized_frames + num_colors = min(num_colors, 48) # More aggressive color limit for emoji + + # More aggressive FPS reduction for emoji + if len(self.frames) > 12: + print( + f" Reducing frames from {len(self.frames)} to ~12 for emoji size" + ) + # Keep every nth frame to get close to 12 frames + keep_every = max(1, len(self.frames) // 12) + self.frames = [ + self.frames[i] for i in range(0, len(self.frames), keep_every) + ] + + # Optimize colors with global palette + optimized_frames = self.optimize_colors(num_colors, use_global_palette=True) + + # Calculate frame duration in milliseconds + frame_duration = 1000 / self.fps + + # Save GIF + imageio.imwrite( + output_path, + optimized_frames, + duration=frame_duration, + loop=0, # Infinite loop + ) + + # Get file info + file_size_kb = output_path.stat().st_size / 1024 + file_size_mb = file_size_kb / 1024 + + info = { + "path": str(output_path), + "size_kb": file_size_kb, + "size_mb": file_size_mb, + "dimensions": f"{self.width}x{self.height}", + "frame_count": len(optimized_frames), + "fps": self.fps, + "duration_seconds": len(optimized_frames) / self.fps, + "colors": num_colors, + } + + # Print info + print(f"\n✓ GIF created successfully!") + print(f" Path: {output_path}") + print(f" Size: {file_size_kb:.1f} KB ({file_size_mb:.2f} MB)") + print(f" Dimensions: {self.width}x{self.height}") + print(f" Frames: {len(optimized_frames)} @ {self.fps} fps") + print(f" Duration: {info['duration_seconds']:.1f}s") + print(f" Colors: {num_colors}") + + # Size info + if optimize_for_emoji: + print(f" Optimized for emoji (128x128, reduced colors)") + if file_size_mb > 1.0: + print(f"\n Note: Large file size ({file_size_kb:.1f} KB)") + print(" Consider: fewer frames, smaller dimensions, or fewer colors") + + return info + + def clear(self): + """Clear all frames (useful for creating multiple GIFs).""" + self.frames = [] diff --git a/.claude/skills/slack-gif-creator/core/validators.py b/.claude/skills/slack-gif-creator/core/validators.py new file mode 100644 index 0000000..a6f5bdf --- /dev/null +++ b/.claude/skills/slack-gif-creator/core/validators.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 +""" +Validators - Check if GIFs meet Slack's requirements. + +These validators help ensure your GIFs meet Slack's size and dimension constraints. +""" + +from pathlib import Path + + +def validate_gif( + gif_path: str | Path, is_emoji: bool = True, verbose: bool = True +) -> tuple[bool, dict]: + """ + Validate GIF for Slack (dimensions, size, frame count). + + Args: + gif_path: Path to GIF file + is_emoji: True for emoji (128x128 recommended), False for message GIF + verbose: Print validation details + + Returns: + Tuple of (passes: bool, results: dict with all details) + """ + from PIL import Image + + gif_path = Path(gif_path) + + if not gif_path.exists(): + return False, {"error": f"File not found: {gif_path}"} + + # Get file size + size_bytes = gif_path.stat().st_size + size_kb = size_bytes / 1024 + size_mb = size_kb / 1024 + + # Get dimensions and frame info + try: + with Image.open(gif_path) as img: + width, height = img.size + + # Count frames + frame_count = 0 + try: + while True: + img.seek(frame_count) + frame_count += 1 + except EOFError: + pass + + # Get duration + try: + duration_ms = img.info.get("duration", 100) + total_duration = (duration_ms * frame_count) / 1000 + fps = frame_count / total_duration if total_duration > 0 else 0 + except: + total_duration = None + fps = None + + except Exception as e: + return False, {"error": f"Failed to read GIF: {e}"} + + # Validate dimensions + if is_emoji: + optimal = width == height == 128 + acceptable = width == height and 64 <= width <= 128 + dim_pass = acceptable + else: + aspect_ratio = ( + max(width, height) / min(width, height) + if min(width, height) > 0 + else float("inf") + ) + dim_pass = aspect_ratio <= 2.0 and 320 <= min(width, height) <= 640 + + results = { + "file": str(gif_path), + "passes": dim_pass, + "width": width, + "height": height, + "size_kb": size_kb, + "size_mb": size_mb, + "frame_count": frame_count, + "duration_seconds": total_duration, + "fps": fps, + "is_emoji": is_emoji, + "optimal": optimal if is_emoji else None, + } + + # Print if verbose + if verbose: + print(f"\nValidating {gif_path.name}:") + print( + f" Dimensions: {width}x{height}" + + ( + f" ({'optimal' if optimal else 'acceptable'})" + if is_emoji and acceptable + else "" + ) + ) + print( + f" Size: {size_kb:.1f} KB" + + (f" ({size_mb:.2f} MB)" if size_mb >= 1.0 else "") + ) + print( + f" Frames: {frame_count}" + + (f" @ {fps:.1f} fps ({total_duration:.1f}s)" if fps else "") + ) + + if not dim_pass: + print( + f" Note: {'Emoji should be 128x128' if is_emoji else 'Unusual dimensions for Slack'}" + ) + + if size_mb > 5.0: + print(f" Note: Large file size - consider fewer frames/colors") + + return dim_pass, results + + +def is_slack_ready( + gif_path: str | Path, is_emoji: bool = True, verbose: bool = True +) -> bool: + """ + Quick check if GIF is ready for Slack. + + Args: + gif_path: Path to GIF file + is_emoji: True for emoji GIF, False for message GIF + verbose: Print feedback + + Returns: + True if dimensions are acceptable + """ + passes, _ = validate_gif(gif_path, is_emoji, verbose) + return passes diff --git a/.claude/skills/slack-gif-creator/requirements.txt b/.claude/skills/slack-gif-creator/requirements.txt new file mode 100644 index 0000000..8bc4493 --- /dev/null +++ b/.claude/skills/slack-gif-creator/requirements.txt @@ -0,0 +1,4 @@ +pillow>=10.0.0 +imageio>=2.31.0 +imageio-ffmpeg>=0.4.9 +numpy>=1.24.0 \ No newline at end of file diff --git a/.claude/skills/template/.openskills.json b/.claude/skills/template/.openskills.json new file mode 100644 index 0000000..58d5cbb --- /dev/null +++ b/.claude/skills/template/.openskills.json @@ -0,0 +1,7 @@ +{ + "source": "anthropics/skills", + "sourceType": "git", + "repoUrl": "https://github.com/anthropics/skills", + "subpath": "template", + "installedAt": "2026-03-02T09:19:50.198Z" +} \ No newline at end of file diff --git a/.claude/skills/template/SKILL.md b/.claude/skills/template/SKILL.md new file mode 100644 index 0000000..50a4f9b --- /dev/null +++ b/.claude/skills/template/SKILL.md @@ -0,0 +1,6 @@ +--- +name: template-skill +description: Replace with description of the skill and when Claude should use it. +--- + +# Insert instructions below diff --git a/.claude/skills/theme-factory/.openskills.json b/.claude/skills/theme-factory/.openskills.json new file mode 100644 index 0000000..a817fa9 --- /dev/null +++ b/.claude/skills/theme-factory/.openskills.json @@ -0,0 +1,7 @@ +{ + "source": "anthropics/skills", + "sourceType": "git", + "repoUrl": "https://github.com/anthropics/skills", + "subpath": "skills\\theme-factory", + "installedAt": "2026-03-02T09:19:50.165Z" +} \ No newline at end of file diff --git a/.claude/skills/theme-factory/LICENSE.txt b/.claude/skills/theme-factory/LICENSE.txt new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/.claude/skills/theme-factory/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/.claude/skills/theme-factory/SKILL.md b/.claude/skills/theme-factory/SKILL.md new file mode 100644 index 0000000..90dfcea --- /dev/null +++ b/.claude/skills/theme-factory/SKILL.md @@ -0,0 +1,59 @@ +--- +name: theme-factory +description: Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors/fonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly. +license: Complete terms in LICENSE.txt +--- + + +# Theme Factory Skill + +This skill provides a curated collection of professional font and color themes themes, each with carefully selected color palettes and font pairings. Once a theme is chosen, it can be applied to any artifact. + +## Purpose + +To apply consistent, professional styling to presentation slide decks, use this skill. Each theme includes: +- A cohesive color palette with hex codes +- Complementary font pairings for headers and body text +- A distinct visual identity suitable for different contexts and audiences + +## Usage Instructions + +To apply styling to a slide deck or other artifact: + +1. **Show the theme showcase**: Display the `theme-showcase.pdf` file to allow users to see all available themes visually. Do not make any modifications to it; simply show the file for viewing. +2. **Ask for their choice**: Ask which theme to apply to the deck +3. **Wait for selection**: Get explicit confirmation about the chosen theme +4. **Apply the theme**: Once a theme has been chosen, apply the selected theme's colors and fonts to the deck/artifact + +## Themes Available + +The following 10 themes are available, each showcased in `theme-showcase.pdf`: + +1. **Ocean Depths** - Professional and calming maritime theme +2. **Sunset Boulevard** - Warm and vibrant sunset colors +3. **Forest Canopy** - Natural and grounded earth tones +4. **Modern Minimalist** - Clean and contemporary grayscale +5. **Golden Hour** - Rich and warm autumnal palette +6. **Arctic Frost** - Cool and crisp winter-inspired theme +7. **Desert Rose** - Soft and sophisticated dusty tones +8. **Tech Innovation** - Bold and modern tech aesthetic +9. **Botanical Garden** - Fresh and organic garden colors +10. **Midnight Galaxy** - Dramatic and cosmic deep tones + +## Theme Details + +Each theme is defined in the `themes/` directory with complete specifications including: +- Cohesive color palette with hex codes +- Complementary font pairings for headers and body text +- Distinct visual identity suitable for different contexts and audiences + +## Application Process + +After a preferred theme is selected: +1. Read the corresponding theme file from the `themes/` directory +2. Apply the specified colors and fonts consistently throughout the deck +3. Ensure proper contrast and readability +4. Maintain the theme's visual identity across all slides + +## Create your Own Theme +To handle cases where none of the existing themes work for an artifact, create a custom theme. Based on provided inputs, generate a new theme similar to the ones above. Give the theme a similar name describing what the font/color combinations represent. Use any basic description provided to choose appropriate colors/fonts. After generating the theme, show it for review and verification. Following that, apply the theme as described above. diff --git a/.claude/skills/theme-factory/theme-showcase.pdf b/.claude/skills/theme-factory/theme-showcase.pdf new file mode 100644 index 0000000000000000000000000000000000000000..24495d145c95917aba3a3445f7105444b6f7cfcc GIT binary patch literal 124310 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%0AMi!tm*Dc0{z zDpGCQJiBVe$Td z%i2yrU^yO36oBb!cmeJGS8kJL4Z?<1y77+qAWcL-G1NE1Q#7)^dL=?+|2@(5n@{vI8s z;yr?*AUsf5c4J9sAPP$>tM zAz2%i!_6g<_DY)$(m@qDVxnQ>1d-0lB$sAFf5^#GLB2WJ1oDLzZ&YR;CS5PVkQhsd-?vcpdrw$Yuro=OiAkLN ze1Zy4{3|V%p**^{$;?+-98#Pl43JD)80lM+aD6uE)3qPn4WuW5&Vy;fP9CXsOdM;V zN227OSHccywhwZS{N9e!FPV*MxW29*tve&hLcf0KIgo#oz^wyKycqor@wB#tLK9~) zNrdbmkq{1Et%)42NqmUE1@=3=n@k*(3Bofd$i?x$Qha~wVE^#Z{=3NsK;M{HS=k6#SvUa{AE1Z+jhFq0 zFUG|N5Y_;O+TSK0fF}EkPGezYr)OdVv?ZWyRt}bbFX^8NHfCmeE>jC1?=QEI6EHUa8qOU5s23L}Ddshjq`WT-=X^3} z=Reg*K;dj$fG!R=j_~ijY=E}=t1|4YfFQC1C_ol=04WIQkc5Bd{2iXZN8Eq0`Plx` zMEZYk^D+Gwo6mJ|-3nU~b?C-B$B16rD{tLZN+=i?dqfOzp*vvKmio7%xO05V)$2Ry zYLc7avVYp@#FbsNJ;5dZ>qQyP7v^Jy7@upVZ4dsb;}>(K)ssd}^GB&n$Ag<|`$pCm zfaWt~of?Q--Y)~3FzLsd>AIiua_xbw*MYcvbTb7NZKFP2ZH#^cbj;k65w{z~pP!#uUPL{@r!t�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 G@BalGpB8EW literal 0 HcmV?d00001 diff --git a/.claude/skills/theme-factory/themes/arctic-frost.md b/.claude/skills/theme-factory/themes/arctic-frost.md new file mode 100644 index 0000000..e9f1eb0 --- /dev/null +++ b/.claude/skills/theme-factory/themes/arctic-frost.md @@ -0,0 +1,19 @@ +# Arctic Frost + +A cool and crisp winter-inspired theme that conveys clarity, precision, and professionalism. + +## Color Palette + +- **Ice Blue**: `#d4e4f7` - Light backgrounds and highlights +- **Steel Blue**: `#4a6fa5` - Primary accent color +- **Silver**: `#c0c0c0` - Metallic accent elements +- **Crisp White**: `#fafafa` - Clean backgrounds and text + +## Typography + +- **Headers**: DejaVu Sans Bold +- **Body Text**: DejaVu Sans + +## Best Used For + +Healthcare presentations, technology solutions, winter sports, clean tech, pharmaceutical content. diff --git a/.claude/skills/theme-factory/themes/botanical-garden.md b/.claude/skills/theme-factory/themes/botanical-garden.md new file mode 100644 index 0000000..0c95bf7 --- /dev/null +++ b/.claude/skills/theme-factory/themes/botanical-garden.md @@ -0,0 +1,19 @@ +# Botanical Garden + +A fresh and organic theme featuring vibrant garden-inspired colors for lively presentations. + +## Color Palette + +- **Fern Green**: `#4a7c59` - Rich natural green +- **Marigold**: `#f9a620` - Bright floral accent +- **Terracotta**: `#b7472a` - Earthy warm tone +- **Cream**: `#f5f3ed` - Soft neutral backgrounds + +## Typography + +- **Headers**: DejaVu Serif Bold +- **Body Text**: DejaVu Sans + +## Best Used For + +Garden centers, food presentations, farm-to-table content, botanical brands, natural products. diff --git a/.claude/skills/theme-factory/themes/desert-rose.md b/.claude/skills/theme-factory/themes/desert-rose.md new file mode 100644 index 0000000..ea7c74e --- /dev/null +++ b/.claude/skills/theme-factory/themes/desert-rose.md @@ -0,0 +1,19 @@ +# Desert Rose + +A soft and sophisticated theme with dusty, muted tones perfect for elegant presentations. + +## Color Palette + +- **Dusty Rose**: `#d4a5a5` - Soft primary color +- **Clay**: `#b87d6d` - Earthy accent +- **Sand**: `#e8d5c4` - Warm neutral backgrounds +- **Deep Burgundy**: `#5d2e46` - Rich dark contrast + +## Typography + +- **Headers**: FreeSans Bold +- **Body Text**: FreeSans + +## Best Used For + +Fashion presentations, beauty brands, wedding planning, interior design, boutique businesses. diff --git a/.claude/skills/theme-factory/themes/forest-canopy.md b/.claude/skills/theme-factory/themes/forest-canopy.md new file mode 100644 index 0000000..90c2b26 --- /dev/null +++ b/.claude/skills/theme-factory/themes/forest-canopy.md @@ -0,0 +1,19 @@ +# Forest Canopy + +A natural and grounded theme featuring earth tones inspired by dense forest environments. + +## Color Palette + +- **Forest Green**: `#2d4a2b` - Primary dark green +- **Sage**: `#7d8471` - Muted green accent +- **Olive**: `#a4ac86` - Light accent color +- **Ivory**: `#faf9f6` - Backgrounds and text + +## Typography + +- **Headers**: FreeSerif Bold +- **Body Text**: FreeSans + +## Best Used For + +Environmental presentations, sustainability reports, outdoor brands, wellness content, organic products. diff --git a/.claude/skills/theme-factory/themes/golden-hour.md b/.claude/skills/theme-factory/themes/golden-hour.md new file mode 100644 index 0000000..ed8fc25 --- /dev/null +++ b/.claude/skills/theme-factory/themes/golden-hour.md @@ -0,0 +1,19 @@ +# Golden Hour + +A rich and warm autumnal palette that creates an inviting and sophisticated atmosphere. + +## Color Palette + +- **Mustard Yellow**: `#f4a900` - Bold primary accent +- **Terracotta**: `#c1666b` - Warm secondary color +- **Warm Beige**: `#d4b896` - Neutral backgrounds +- **Chocolate Brown**: `#4a403a` - Dark text and anchors + +## Typography + +- **Headers**: FreeSans Bold +- **Body Text**: FreeSans + +## Best Used For + +Restaurant presentations, hospitality brands, fall campaigns, cozy lifestyle content, artisan products. diff --git a/.claude/skills/theme-factory/themes/midnight-galaxy.md b/.claude/skills/theme-factory/themes/midnight-galaxy.md new file mode 100644 index 0000000..97e1c5f --- /dev/null +++ b/.claude/skills/theme-factory/themes/midnight-galaxy.md @@ -0,0 +1,19 @@ +# Midnight Galaxy + +A dramatic and cosmic theme with deep purples and mystical tones for impactful presentations. + +## Color Palette + +- **Deep Purple**: `#2b1e3e` - Rich dark base +- **Cosmic Blue**: `#4a4e8f` - Mystical mid-tone +- **Lavender**: `#a490c2` - Soft accent color +- **Silver**: `#e6e6fa` - Light highlights and text + +## Typography + +- **Headers**: FreeSans Bold +- **Body Text**: FreeSans + +## Best Used For + +Entertainment industry, gaming presentations, nightlife venues, luxury brands, creative agencies. diff --git a/.claude/skills/theme-factory/themes/modern-minimalist.md b/.claude/skills/theme-factory/themes/modern-minimalist.md new file mode 100644 index 0000000..6bd26a2 --- /dev/null +++ b/.claude/skills/theme-factory/themes/modern-minimalist.md @@ -0,0 +1,19 @@ +# Modern Minimalist + +A clean and contemporary theme with a sophisticated grayscale palette for maximum versatility. + +## Color Palette + +- **Charcoal**: `#36454f` - Primary dark color +- **Slate Gray**: `#708090` - Medium gray for accents +- **Light Gray**: `#d3d3d3` - Backgrounds and dividers +- **White**: `#ffffff` - Text and clean backgrounds + +## Typography + +- **Headers**: DejaVu Sans Bold +- **Body Text**: DejaVu Sans + +## Best Used For + +Tech presentations, architecture portfolios, design showcases, modern business proposals, data visualization. diff --git a/.claude/skills/theme-factory/themes/ocean-depths.md b/.claude/skills/theme-factory/themes/ocean-depths.md new file mode 100644 index 0000000..b675126 --- /dev/null +++ b/.claude/skills/theme-factory/themes/ocean-depths.md @@ -0,0 +1,19 @@ +# Ocean Depths + +A professional and calming maritime theme that evokes the serenity of deep ocean waters. + +## Color Palette + +- **Deep Navy**: `#1a2332` - Primary background color +- **Teal**: `#2d8b8b` - Accent color for highlights and emphasis +- **Seafoam**: `#a8dadc` - Secondary accent for lighter elements +- **Cream**: `#f1faee` - Text and light backgrounds + +## Typography + +- **Headers**: DejaVu Sans Bold +- **Body Text**: DejaVu Sans + +## Best Used For + +Corporate presentations, financial reports, professional consulting decks, trust-building content. diff --git a/.claude/skills/theme-factory/themes/sunset-boulevard.md b/.claude/skills/theme-factory/themes/sunset-boulevard.md new file mode 100644 index 0000000..df799a0 --- /dev/null +++ b/.claude/skills/theme-factory/themes/sunset-boulevard.md @@ -0,0 +1,19 @@ +# Sunset Boulevard + +A warm and vibrant theme inspired by golden hour sunsets, perfect for energetic and creative presentations. + +## Color Palette + +- **Burnt Orange**: `#e76f51` - Primary accent color +- **Coral**: `#f4a261` - Secondary warm accent +- **Warm Sand**: `#e9c46a` - Highlighting and backgrounds +- **Deep Purple**: `#264653` - Dark contrast and text + +## Typography + +- **Headers**: DejaVu Serif Bold +- **Body Text**: DejaVu Sans + +## Best Used For + +Creative pitches, marketing presentations, lifestyle brands, event promotions, inspirational content. diff --git a/.claude/skills/theme-factory/themes/tech-innovation.md b/.claude/skills/theme-factory/themes/tech-innovation.md new file mode 100644 index 0000000..e029a43 --- /dev/null +++ b/.claude/skills/theme-factory/themes/tech-innovation.md @@ -0,0 +1,19 @@ +# Tech Innovation + +A bold and modern theme with high-contrast colors perfect for cutting-edge technology presentations. + +## Color Palette + +- **Electric Blue**: `#0066ff` - Vibrant primary accent +- **Neon Cyan**: `#00ffff` - Bright highlight color +- **Dark Gray**: `#1e1e1e` - Deep backgrounds +- **White**: `#ffffff` - Clean text and contrast + +## Typography + +- **Headers**: DejaVu Sans Bold +- **Body Text**: DejaVu Sans + +## Best Used For + +Tech startups, software launches, innovation showcases, AI/ML presentations, digital transformation content. diff --git a/.claude/skills/web-artifacts-builder/.openskills.json b/.claude/skills/web-artifacts-builder/.openskills.json new file mode 100644 index 0000000..52e986f --- /dev/null +++ b/.claude/skills/web-artifacts-builder/.openskills.json @@ -0,0 +1,7 @@ +{ + "source": "anthropics/skills", + "sourceType": "git", + "repoUrl": "https://github.com/anthropics/skills", + "subpath": "skills\\web-artifacts-builder", + "installedAt": "2026-03-02T09:19:50.169Z" +} \ No newline at end of file diff --git a/.claude/skills/web-artifacts-builder/LICENSE.txt b/.claude/skills/web-artifacts-builder/LICENSE.txt new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/.claude/skills/web-artifacts-builder/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/.claude/skills/web-artifacts-builder/SKILL.md b/.claude/skills/web-artifacts-builder/SKILL.md new file mode 100644 index 0000000..8b39b19 --- /dev/null +++ b/.claude/skills/web-artifacts-builder/SKILL.md @@ -0,0 +1,74 @@ +--- +name: web-artifacts-builder +description: Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts. +license: Complete terms in LICENSE.txt +--- + +# Web Artifacts Builder + +To build powerful frontend claude.ai artifacts, follow these steps: +1. Initialize the frontend repo using `scripts/init-artifact.sh` +2. Develop your artifact by editing the generated code +3. Bundle all code into a single HTML file using `scripts/bundle-artifact.sh` +4. Display artifact to user +5. (Optional) Test the artifact + +**Stack**: React 18 + TypeScript + Vite + Parcel (bundling) + Tailwind CSS + shadcn/ui + +## Design & Style Guidelines + +VERY IMPORTANT: To avoid what is often referred to as "AI slop", avoid using excessive centered layouts, purple gradients, uniform rounded corners, and Inter font. + +## Quick Start + +### Step 1: Initialize Project + +Run the initialization script to create a new React project: +```bash +bash scripts/init-artifact.sh +cd +``` + +This creates a fully configured project with: +- ✅ React + TypeScript (via Vite) +- ✅ Tailwind CSS 3.4.1 with shadcn/ui theming system +- ✅ Path aliases (`@/`) configured +- ✅ 40+ shadcn/ui components pre-installed +- ✅ All Radix UI dependencies included +- ✅ Parcel configured for bundling (via .parcelrc) +- ✅ Node 18+ compatibility (auto-detects and pins Vite version) + +### Step 2: Develop Your Artifact + +To build the artifact, edit the generated files. See **Common Development Tasks** below for guidance. + +### Step 3: Bundle to Single HTML File + +To bundle the React app into a single HTML artifact: +```bash +bash scripts/bundle-artifact.sh +``` + +This creates `bundle.html` - a self-contained artifact with all JavaScript, CSS, and dependencies inlined. This file can be directly shared in Claude conversations as an artifact. + +**Requirements**: Your project must have an `index.html` in the root directory. + +**What the script does**: +- Installs bundling dependencies (parcel, @parcel/config-default, parcel-resolver-tspaths, html-inline) +- Creates `.parcelrc` config with path alias support +- Builds with Parcel (no source maps) +- Inlines all assets into single HTML using html-inline + +### Step 4: Share Artifact with User + +Finally, share the bundled HTML file in conversation with the user so they can view it as an artifact. + +### Step 5: Testing/Visualizing the Artifact (Optional) + +Note: This is a completely optional step. Only perform if necessary or requested. + +To test/visualize the artifact, use available tools (including other Skills or built-in tools like Playwright or Puppeteer). In general, avoid testing the artifact upfront as it adds latency between the request and when the finished artifact can be seen. Test later, after presenting the artifact, if requested or if issues arise. + +## Reference + +- **shadcn/ui components**: https://ui.shadcn.com/docs/components \ No newline at end of file diff --git a/.claude/skills/web-artifacts-builder/scripts/bundle-artifact.sh b/.claude/skills/web-artifacts-builder/scripts/bundle-artifact.sh new file mode 100644 index 0000000..c13d229 --- /dev/null +++ b/.claude/skills/web-artifacts-builder/scripts/bundle-artifact.sh @@ -0,0 +1,54 @@ +#!/bin/bash +set -e + +echo "📦 Bundling React app to single HTML artifact..." + +# Check if we're in a project directory +if [ ! -f "package.json" ]; then + echo "❌ Error: No package.json found. Run this script from your project root." + exit 1 +fi + +# Check if index.html exists +if [ ! -f "index.html" ]; then + echo "❌ Error: No index.html found in project root." + echo " This script requires an index.html entry point." + exit 1 +fi + +# Install bundling dependencies +echo "📦 Installing bundling dependencies..." +pnpm add -D parcel @parcel/config-default parcel-resolver-tspaths html-inline + +# Create Parcel config with tspaths resolver +if [ ! -f ".parcelrc" ]; then + echo "🔧 Creating Parcel configuration with path alias support..." + cat > .parcelrc << 'EOF' +{ + "extends": "@parcel/config-default", + "resolvers": ["parcel-resolver-tspaths", "..."] +} +EOF +fi + +# Clean previous build +echo "🧹 Cleaning previous build..." +rm -rf dist bundle.html + +# Build with Parcel +echo "🔨 Building with Parcel..." +pnpm exec parcel build index.html --dist-dir dist --no-source-maps + +# Inline everything into single HTML +echo "🎯 Inlining all assets into single HTML file..." +pnpm exec html-inline dist/index.html > bundle.html + +# Get file size +FILE_SIZE=$(du -h bundle.html | cut -f1) + +echo "" +echo "✅ Bundle complete!" +echo "📄 Output: bundle.html ($FILE_SIZE)" +echo "" +echo "You can now use this single HTML file as an artifact in Claude conversations." +echo "To test locally: open bundle.html in your browser" \ No newline at end of file diff --git a/.claude/skills/web-artifacts-builder/scripts/init-artifact.sh b/.claude/skills/web-artifacts-builder/scripts/init-artifact.sh new file mode 100644 index 0000000..7d1022d --- /dev/null +++ b/.claude/skills/web-artifacts-builder/scripts/init-artifact.sh @@ -0,0 +1,322 @@ +#!/bin/bash + +# Exit on error +set -e + +# Detect Node version +NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1) + +echo "🔍 Detected Node.js version: $NODE_VERSION" + +if [ "$NODE_VERSION" -lt 18 ]; then + echo "❌ Error: Node.js 18 or higher is required" + echo " Current version: $(node -v)" + exit 1 +fi + +# Set Vite version based on Node version +if [ "$NODE_VERSION" -ge 20 ]; then + VITE_VERSION="latest" + echo "✅ Using Vite latest (Node 20+)" +else + VITE_VERSION="5.4.11" + echo "✅ Using Vite $VITE_VERSION (Node 18 compatible)" +fi + +# Detect OS and set sed syntax +if [[ "$OSTYPE" == "darwin"* ]]; then + SED_INPLACE="sed -i ''" +else + SED_INPLACE="sed -i" +fi + +# Check if pnpm is installed +if ! command -v pnpm &> /dev/null; then + echo "📦 pnpm not found. Installing pnpm..." + npm install -g pnpm +fi + +# Check if project name is provided +if [ -z "$1" ]; then + echo "❌ Usage: ./create-react-shadcn-complete.sh " + exit 1 +fi + +PROJECT_NAME="$1" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +COMPONENTS_TARBALL="$SCRIPT_DIR/shadcn-components.tar.gz" + +# Check if components tarball exists +if [ ! -f "$COMPONENTS_TARBALL" ]; then + echo "❌ Error: shadcn-components.tar.gz not found in script directory" + echo " Expected location: $COMPONENTS_TARBALL" + exit 1 +fi + +echo "🚀 Creating new React + Vite project: $PROJECT_NAME" + +# Create new Vite project (always use latest create-vite, pin vite version later) +pnpm create vite "$PROJECT_NAME" --template react-ts + +# Navigate into project directory +cd "$PROJECT_NAME" + +echo "🧹 Cleaning up Vite template..." +$SED_INPLACE '/.*<\/title>/'"$PROJECT_NAME"'<\/title>/' index.html + +echo "📦 Installing base dependencies..." +pnpm install + +# Pin Vite version for Node 18 +if [ "$NODE_VERSION" -lt 20 ]; then + echo "📌 Pinning Vite to $VITE_VERSION for Node 18 compatibility..." + pnpm add -D vite@$VITE_VERSION +fi + +echo "📦 Installing Tailwind CSS and dependencies..." +pnpm install -D tailwindcss@3.4.1 postcss autoprefixer @types/node tailwindcss-animate +pnpm install class-variance-authority clsx tailwind-merge lucide-react next-themes + +echo "⚙️ Creating Tailwind and PostCSS configuration..." +cat > postcss.config.js << 'EOF' +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} +EOF + +echo "📝 Configuring Tailwind with shadcn theme..." +cat > tailwind.config.js << 'EOF' +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: ["class"], + content: [ + "./index.html", + "./src/**/*.{js,ts,jsx,tsx}", + ], + theme: { + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: "0" }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: "0" }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, + }, + }, + plugins: [require("tailwindcss-animate")], +} +EOF + +# Add Tailwind directives and CSS variables to index.css +echo "🎨 Adding Tailwind directives and CSS variables..." +cat > src/index.css << 'EOF' +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; + --radius: 0.5rem; + } + + .dark { + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} +EOF + +# Add path aliases to tsconfig.json +echo "🔧 Adding path aliases to tsconfig.json..." +node -e " +const fs = require('fs'); +const config = JSON.parse(fs.readFileSync('tsconfig.json', 'utf8')); +config.compilerOptions = config.compilerOptions || {}; +config.compilerOptions.baseUrl = '.'; +config.compilerOptions.paths = { '@/*': ['./src/*'] }; +fs.writeFileSync('tsconfig.json', JSON.stringify(config, null, 2)); +" + +# Add path aliases to tsconfig.app.json +echo "🔧 Adding path aliases to tsconfig.app.json..." +node -e " +const fs = require('fs'); +const path = 'tsconfig.app.json'; +const content = fs.readFileSync(path, 'utf8'); +// Remove comments manually +const lines = content.split('\n').filter(line => !line.trim().startsWith('//')); +const jsonContent = lines.join('\n'); +const config = JSON.parse(jsonContent.replace(/\/\*[\s\S]*?\*\//g, '').replace(/,(\s*[}\]])/g, '\$1')); +config.compilerOptions = config.compilerOptions || {}; +config.compilerOptions.baseUrl = '.'; +config.compilerOptions.paths = { '@/*': ['./src/*'] }; +fs.writeFileSync(path, JSON.stringify(config, null, 2)); +" + +# Update vite.config.ts +echo "⚙️ Updating Vite configuration..." +cat > vite.config.ts << 'EOF' +import path from "path"; +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; + +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + "@": path.resolve(__dirname, "./src"), + }, + }, +}); +EOF + +# Install all shadcn/ui dependencies +echo "📦 Installing shadcn/ui dependencies..." +pnpm install @radix-ui/react-accordion @radix-ui/react-aspect-ratio @radix-ui/react-avatar @radix-ui/react-checkbox @radix-ui/react-collapsible @radix-ui/react-context-menu @radix-ui/react-dialog @radix-ui/react-dropdown-menu @radix-ui/react-hover-card @radix-ui/react-label @radix-ui/react-menubar @radix-ui/react-navigation-menu @radix-ui/react-popover @radix-ui/react-progress @radix-ui/react-radio-group @radix-ui/react-scroll-area @radix-ui/react-select @radix-ui/react-separator @radix-ui/react-slider @radix-ui/react-slot @radix-ui/react-switch @radix-ui/react-tabs @radix-ui/react-toast @radix-ui/react-toggle @radix-ui/react-toggle-group @radix-ui/react-tooltip +pnpm install sonner cmdk vaul embla-carousel-react react-day-picker react-resizable-panels date-fns react-hook-form @hookform/resolvers zod + +# Extract shadcn components from tarball +echo "📦 Extracting shadcn/ui components..." +tar -xzf "$COMPONENTS_TARBALL" -C src/ + +# Create components.json for reference +echo "📝 Creating components.json config..." +cat > components.json << 'EOF' +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/index.css", + "baseColor": "slate", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + } +} +EOF + +echo "✅ Setup complete! You can now use Tailwind CSS and shadcn/ui in your project." +echo "" +echo "📦 Included components (40+ total):" +echo " - accordion, alert, aspect-ratio, avatar, badge, breadcrumb" +echo " - button, calendar, card, carousel, checkbox, collapsible" +echo " - command, context-menu, dialog, drawer, dropdown-menu" +echo " - form, hover-card, input, label, menubar, navigation-menu" +echo " - popover, progress, radio-group, resizable, scroll-area" +echo " - select, separator, sheet, skeleton, slider, sonner" +echo " - switch, table, tabs, textarea, toast, toggle, toggle-group, tooltip" +echo "" +echo "To start developing:" +echo " cd $PROJECT_NAME" +echo " pnpm dev" +echo "" +echo "📚 Import components like:" +echo " import { Button } from '@/components/ui/button'" +echo " import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card'" +echo " import { Dialog, DialogContent, DialogTrigger } from '@/components/ui/dialog'" diff --git a/.claude/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz b/.claude/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..cdbe7cdd1e724a7c9840387e17a6a7f26d3477e1 GIT binary patch literal 19967 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 O=l=uCe*wS%S^@x~L|~-= literal 0 HcmV?d00001 diff --git a/.claude/skills/webapp-testing/.openskills.json b/.claude/skills/webapp-testing/.openskills.json new file mode 100644 index 0000000..b7a90bc --- /dev/null +++ b/.claude/skills/webapp-testing/.openskills.json @@ -0,0 +1,7 @@ +{ + "source": "anthropics/skills", + "sourceType": "git", + "repoUrl": "https://github.com/anthropics/skills", + "subpath": "skills\\webapp-testing", + "installedAt": "2026-03-02T09:19:50.172Z" +} \ No newline at end of file diff --git a/.claude/skills/webapp-testing/LICENSE.txt b/.claude/skills/webapp-testing/LICENSE.txt new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/.claude/skills/webapp-testing/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/.claude/skills/webapp-testing/SKILL.md b/.claude/skills/webapp-testing/SKILL.md new file mode 100644 index 0000000..4726215 --- /dev/null +++ b/.claude/skills/webapp-testing/SKILL.md @@ -0,0 +1,96 @@ +--- +name: webapp-testing +description: Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs. +license: Complete terms in LICENSE.txt +--- + +# Web Application Testing + +To test local web applications, write native Python Playwright scripts. + +**Helper Scripts Available**: +- `scripts/with_server.py` - Manages server lifecycle (supports multiple servers) + +**Always run scripts with `--help` first** to see usage. DO NOT read the source until you try running the script first and find that a customized solution is abslutely necessary. These scripts can be very large and thus pollute your context window. They exist to be called directly as black-box scripts rather than ingested into your context window. + +## Decision Tree: Choosing Your Approach + +``` +User task → Is it static HTML? + ├─ Yes → Read HTML file directly to identify selectors + │ ├─ Success → Write Playwright script using selectors + │ └─ Fails/Incomplete → Treat as dynamic (below) + │ + └─ No (dynamic webapp) → Is the server already running? + ├─ No → Run: python scripts/with_server.py --help + │ Then use the helper + write simplified Playwright script + │ + └─ Yes → Reconnaissance-then-action: + 1. Navigate and wait for networkidle + 2. Take screenshot or inspect DOM + 3. Identify selectors from rendered state + 4. Execute actions with discovered selectors +``` + +## Example: Using with_server.py + +To start a server, run `--help` first, then use the helper: + +**Single server:** +```bash +python scripts/with_server.py --server "npm run dev" --port 5173 -- python your_automation.py +``` + +**Multiple servers (e.g., backend + frontend):** +```bash +python scripts/with_server.py \ + --server "cd backend && python server.py" --port 3000 \ + --server "cd frontend && npm run dev" --port 5173 \ + -- python your_automation.py +``` + +To create an automation script, include only Playwright logic (servers are managed automatically): +```python +from playwright.sync_api import sync_playwright + +with sync_playwright() as p: + browser = p.chromium.launch(headless=True) # Always launch chromium in headless mode + page = browser.new_page() + page.goto('http://localhost:5173') # Server already running and ready + page.wait_for_load_state('networkidle') # CRITICAL: Wait for JS to execute + # ... your automation logic + browser.close() +``` + +## Reconnaissance-Then-Action Pattern + +1. **Inspect rendered DOM**: + ```python + page.screenshot(path='/tmp/inspect.png', full_page=True) + content = page.content() + page.locator('button').all() + ``` + +2. **Identify selectors** from inspection results + +3. **Execute actions** using discovered selectors + +## Common Pitfall + +❌ **Don't** inspect the DOM before waiting for `networkidle` on dynamic apps +✅ **Do** wait for `page.wait_for_load_state('networkidle')` before inspection + +## Best Practices + +- **Use bundled scripts as black boxes** - To accomplish a task, consider whether one of the scripts available in `scripts/` can help. These scripts handle common, complex workflows reliably without cluttering the context window. Use `--help` to see usage, then invoke directly. +- Use `sync_playwright()` for synchronous scripts +- Always close the browser when done +- Use descriptive selectors: `text=`, `role=`, CSS selectors, or IDs +- Add appropriate waits: `page.wait_for_selector()` or `page.wait_for_timeout()` + +## Reference Files + +- **examples/** - Examples showing common patterns: + - `element_discovery.py` - Discovering buttons, links, and inputs on a page + - `static_html_automation.py` - Using file:// URLs for local HTML + - `console_logging.py` - Capturing console logs during automation \ No newline at end of file diff --git a/.claude/skills/webapp-testing/examples/console_logging.py b/.claude/skills/webapp-testing/examples/console_logging.py new file mode 100644 index 0000000..9329b5e --- /dev/null +++ b/.claude/skills/webapp-testing/examples/console_logging.py @@ -0,0 +1,35 @@ +from playwright.sync_api import sync_playwright + +# Example: Capturing console logs during browser automation + +url = 'http://localhost:5173' # Replace with your URL + +console_logs = [] + +with sync_playwright() as p: + browser = p.chromium.launch(headless=True) + page = browser.new_page(viewport={'width': 1920, 'height': 1080}) + + # Set up console log capture + def handle_console_message(msg): + console_logs.append(f"[{msg.type}] {msg.text}") + print(f"Console: [{msg.type}] {msg.text}") + + page.on("console", handle_console_message) + + # Navigate to page + page.goto(url) + page.wait_for_load_state('networkidle') + + # Interact with the page (triggers console logs) + page.click('text=Dashboard') + page.wait_for_timeout(1000) + + browser.close() + +# Save console logs to file +with open('/mnt/user-data/outputs/console.log', 'w') as f: + f.write('\n'.join(console_logs)) + +print(f"\nCaptured {len(console_logs)} console messages") +print(f"Logs saved to: /mnt/user-data/outputs/console.log") \ No newline at end of file diff --git a/.claude/skills/webapp-testing/examples/element_discovery.py b/.claude/skills/webapp-testing/examples/element_discovery.py new file mode 100644 index 0000000..917ba72 --- /dev/null +++ b/.claude/skills/webapp-testing/examples/element_discovery.py @@ -0,0 +1,40 @@ +from playwright.sync_api import sync_playwright + +# Example: Discovering buttons and other elements on a page + +with sync_playwright() as p: + browser = p.chromium.launch(headless=True) + page = browser.new_page() + + # Navigate to page and wait for it to fully load + page.goto('http://localhost:5173') + page.wait_for_load_state('networkidle') + + # Discover all buttons on the page + buttons = page.locator('button').all() + print(f"Found {len(buttons)} buttons:") + for i, button in enumerate(buttons): + text = button.inner_text() if button.is_visible() else "[hidden]" + print(f" [{i}] {text}") + + # Discover links + links = page.locator('a[href]').all() + print(f"\nFound {len(links)} links:") + for link in links[:5]: # Show first 5 + text = link.inner_text().strip() + href = link.get_attribute('href') + print(f" - {text} -> {href}") + + # Discover input fields + inputs = page.locator('input, textarea, select').all() + print(f"\nFound {len(inputs)} input fields:") + for input_elem in inputs: + name = input_elem.get_attribute('name') or input_elem.get_attribute('id') or "[unnamed]" + input_type = input_elem.get_attribute('type') or 'text' + print(f" - {name} ({input_type})") + + # Take screenshot for visual reference + page.screenshot(path='/tmp/page_discovery.png', full_page=True) + print("\nScreenshot saved to /tmp/page_discovery.png") + + browser.close() \ No newline at end of file diff --git a/.claude/skills/webapp-testing/examples/static_html_automation.py b/.claude/skills/webapp-testing/examples/static_html_automation.py new file mode 100644 index 0000000..90bbedc --- /dev/null +++ b/.claude/skills/webapp-testing/examples/static_html_automation.py @@ -0,0 +1,33 @@ +from playwright.sync_api import sync_playwright +import os + +# Example: Automating interaction with static HTML files using file:// URLs + +html_file_path = os.path.abspath('path/to/your/file.html') +file_url = f'file://{html_file_path}' + +with sync_playwright() as p: + browser = p.chromium.launch(headless=True) + page = browser.new_page(viewport={'width': 1920, 'height': 1080}) + + # Navigate to local HTML file + page.goto(file_url) + + # Take screenshot + page.screenshot(path='/mnt/user-data/outputs/static_page.png', full_page=True) + + # Interact with elements + page.click('text=Click Me') + page.fill('#name', 'John Doe') + page.fill('#email', 'john@example.com') + + # Submit form + page.click('button[type="submit"]') + page.wait_for_timeout(500) + + # Take final screenshot + page.screenshot(path='/mnt/user-data/outputs/after_submit.png', full_page=True) + + browser.close() + +print("Static HTML automation completed!") \ No newline at end of file diff --git a/.claude/skills/webapp-testing/scripts/with_server.py b/.claude/skills/webapp-testing/scripts/with_server.py new file mode 100644 index 0000000..431f2eb --- /dev/null +++ b/.claude/skills/webapp-testing/scripts/with_server.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 +""" +Start one or more servers, wait for them to be ready, run a command, then clean up. + +Usage: + # Single server + python scripts/with_server.py --server "npm run dev" --port 5173 -- python automation.py + python scripts/with_server.py --server "npm start" --port 3000 -- python test.py + + # Multiple servers + python scripts/with_server.py \ + --server "cd backend && python server.py" --port 3000 \ + --server "cd frontend && npm run dev" --port 5173 \ + -- python test.py +""" + +import subprocess +import socket +import time +import sys +import argparse + +def is_server_ready(port, timeout=30): + """Wait for server to be ready by polling the port.""" + start_time = time.time() + while time.time() - start_time < timeout: + try: + with socket.create_connection(('localhost', port), timeout=1): + return True + except (socket.error, ConnectionRefusedError): + time.sleep(0.5) + return False + + +def main(): + parser = argparse.ArgumentParser(description='Run command with one or more servers') + parser.add_argument('--server', action='append', dest='servers', required=True, help='Server command (can be repeated)') + parser.add_argument('--port', action='append', dest='ports', type=int, required=True, help='Port for each server (must match --server count)') + parser.add_argument('--timeout', type=int, default=30, help='Timeout in seconds per server (default: 30)') + parser.add_argument('command', nargs=argparse.REMAINDER, help='Command to run after server(s) ready') + + args = parser.parse_args() + + # Remove the '--' separator if present + if args.command and args.command[0] == '--': + args.command = args.command[1:] + + if not args.command: + print("Error: No command specified to run") + sys.exit(1) + + # Parse server configurations + if len(args.servers) != len(args.ports): + print("Error: Number of --server and --port arguments must match") + sys.exit(1) + + servers = [] + for cmd, port in zip(args.servers, args.ports): + servers.append({'cmd': cmd, 'port': port}) + + server_processes = [] + + try: + # Start all servers + for i, server in enumerate(servers): + print(f"Starting server {i+1}/{len(servers)}: {server['cmd']}") + + # Use shell=True to support commands with cd and && + process = subprocess.Popen( + server['cmd'], + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE + ) + server_processes.append(process) + + # Wait for this server to be ready + print(f"Waiting for server on port {server['port']}...") + if not is_server_ready(server['port'], timeout=args.timeout): + raise RuntimeError(f"Server failed to start on port {server['port']} within {args.timeout}s") + + print(f"Server ready on port {server['port']}") + + print(f"\nAll {len(servers)} server(s) ready") + + # Run the command + print(f"Running: {' '.join(args.command)}\n") + result = subprocess.run(args.command) + sys.exit(result.returncode) + + finally: + # Clean up all servers + print(f"\nStopping {len(server_processes)} server(s)...") + for i, process in enumerate(server_processes): + try: + process.terminate() + process.wait(timeout=5) + except subprocess.TimeoutExpired: + process.kill() + process.wait() + print(f"Server {i+1} stopped") + print("All servers stopped") + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/.claude/skills/xlsx/.openskills.json b/.claude/skills/xlsx/.openskills.json new file mode 100644 index 0000000..91628a7 --- /dev/null +++ b/.claude/skills/xlsx/.openskills.json @@ -0,0 +1,7 @@ +{ + "source": "anthropics/skills", + "sourceType": "git", + "repoUrl": "https://github.com/anthropics/skills", + "subpath": "skills\\xlsx", + "installedAt": "2026-03-02T09:19:50.195Z" +} \ No newline at end of file diff --git a/.claude/skills/xlsx/LICENSE.txt b/.claude/skills/xlsx/LICENSE.txt new file mode 100644 index 0000000..c55ab42 --- /dev/null +++ b/.claude/skills/xlsx/LICENSE.txt @@ -0,0 +1,30 @@ +© 2025 Anthropic, PBC. All rights reserved. + +LICENSE: Use of these materials (including all code, prompts, assets, files, +and other components of this Skill) is governed by your agreement with +Anthropic regarding use of Anthropic's services. If no separate agreement +exists, use is governed by Anthropic's Consumer Terms of Service or +Commercial Terms of Service, as applicable: +https://www.anthropic.com/legal/consumer-terms +https://www.anthropic.com/legal/commercial-terms +Your applicable agreement is referred to as the "Agreement." "Services" are +as defined in the Agreement. + +ADDITIONAL RESTRICTIONS: Notwithstanding anything in the Agreement to the +contrary, users may not: + +- Extract these materials from the Services or retain copies of these + materials outside the Services +- Reproduce or copy these materials, except for temporary copies created + automatically during authorized use of the Services +- Create derivative works based on these materials +- Distribute, sublicense, or transfer these materials to any third party +- Make, offer to sell, sell, or import any inventions embodied in these + materials +- Reverse engineer, decompile, or disassemble these materials + +The receipt, viewing, or possession of these materials does not convey or +imply any license or right beyond those expressly granted above. + +Anthropic retains all right, title, and interest in these materials, +including all copyrights, patents, and other intellectual property rights. diff --git a/.claude/skills/xlsx/SKILL.md b/.claude/skills/xlsx/SKILL.md new file mode 100644 index 0000000..c5c881b --- /dev/null +++ b/.claude/skills/xlsx/SKILL.md @@ -0,0 +1,292 @@ +--- +name: xlsx +description: "Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved." +license: Proprietary. LICENSE.txt has complete terms +--- + +# Requirements for Outputs + +## All Excel files + +### Professional Font +- Use a consistent, professional font (e.g., Arial, Times New Roman) for all deliverables unless otherwise instructed by the user + +### Zero Formula Errors +- Every Excel model MUST be delivered with ZERO formula errors (#REF!, #DIV/0!, #VALUE!, #N/A, #NAME?) + +### Preserve Existing Templates (when updating templates) +- Study and EXACTLY match existing format, style, and conventions when modifying files +- Never impose standardized formatting on files with established patterns +- Existing template conventions ALWAYS override these guidelines + +## Financial models + +### Color Coding Standards +Unless otherwise stated by the user or existing template + +#### Industry-Standard Color Conventions +- **Blue text (RGB: 0,0,255)**: Hardcoded inputs, and numbers users will change for scenarios +- **Black text (RGB: 0,0,0)**: ALL formulas and calculations +- **Green text (RGB: 0,128,0)**: Links pulling from other worksheets within same workbook +- **Red text (RGB: 255,0,0)**: External links to other files +- **Yellow background (RGB: 255,255,0)**: Key assumptions needing attention or cells that need to be updated + +### Number Formatting Standards + +#### Required Format Rules +- **Years**: Format as text strings (e.g., "2024" not "2,024") +- **Currency**: Use $#,##0 format; ALWAYS specify units in headers ("Revenue ($mm)") +- **Zeros**: Use number formatting to make all zeros "-", including percentages (e.g., "$#,##0;($#,##0);-") +- **Percentages**: Default to 0.0% format (one decimal) +- **Multiples**: Format as 0.0x for valuation multiples (EV/EBITDA, P/E) +- **Negative numbers**: Use parentheses (123) not minus -123 + +### Formula Construction Rules + +#### Assumptions Placement +- Place ALL assumptions (growth rates, margins, multiples, etc.) in separate assumption cells +- Use cell references instead of hardcoded values in formulas +- Example: Use =B5*(1+$B$6) instead of =B5*1.05 + +#### Formula Error Prevention +- Verify all cell references are correct +- Check for off-by-one errors in ranges +- Ensure consistent formulas across all projection periods +- Test with edge cases (zero values, negative numbers) +- Verify no unintended circular references + +#### Documentation Requirements for Hardcodes +- Comment or in cells beside (if end of table). Format: "Source: [System/Document], [Date], [Specific Reference], [URL if applicable]" +- Examples: + - "Source: Company 10-K, FY2024, Page 45, Revenue Note, [SEC EDGAR URL]" + - "Source: Company 10-Q, Q2 2025, Exhibit 99.1, [SEC EDGAR URL]" + - "Source: Bloomberg Terminal, 8/15/2025, AAPL US Equity" + - "Source: FactSet, 8/20/2025, Consensus Estimates Screen" + +# XLSX creation, editing, and analysis + +## Overview + +A user may ask you to create, edit, or analyze the contents of an .xlsx file. You have different tools and workflows available for different tasks. + +## Important Requirements + +**LibreOffice Required for Formula Recalculation**: You can assume LibreOffice is installed for recalculating formula values using the `scripts/recalc.py` script. The script automatically configures LibreOffice on first run, including in sandboxed environments where Unix sockets are restricted (handled by `scripts/office/soffice.py`) + +## Reading and analyzing data + +### Data analysis with pandas +For data analysis, visualization, and basic operations, use **pandas** which provides powerful data manipulation capabilities: + +```python +import pandas as pd + +# Read Excel +df = pd.read_excel('file.xlsx') # Default: first sheet +all_sheets = pd.read_excel('file.xlsx', sheet_name=None) # All sheets as dict + +# Analyze +df.head() # Preview data +df.info() # Column info +df.describe() # Statistics + +# Write Excel +df.to_excel('output.xlsx', index=False) +``` + +## Excel File Workflows + +## CRITICAL: Use Formulas, Not Hardcoded Values + +**Always use Excel formulas instead of calculating values in Python and hardcoding them.** This ensures the spreadsheet remains dynamic and updateable. + +### ❌ WRONG - Hardcoding Calculated Values +```python +# Bad: Calculating in Python and hardcoding result +total = df['Sales'].sum() +sheet['B10'] = total # Hardcodes 5000 + +# Bad: Computing growth rate in Python +growth = (df.iloc[-1]['Revenue'] - df.iloc[0]['Revenue']) / df.iloc[0]['Revenue'] +sheet['C5'] = growth # Hardcodes 0.15 + +# Bad: Python calculation for average +avg = sum(values) / len(values) +sheet['D20'] = avg # Hardcodes 42.5 +``` + +### ✅ CORRECT - Using Excel Formulas +```python +# Good: Let Excel calculate the sum +sheet['B10'] = '=SUM(B2:B9)' + +# Good: Growth rate as Excel formula +sheet['C5'] = '=(C4-C2)/C2' + +# Good: Average using Excel function +sheet['D20'] = '=AVERAGE(D2:D19)' +``` + +This applies to ALL calculations - totals, percentages, ratios, differences, etc. The spreadsheet should be able to recalculate when source data changes. + +## Common Workflow +1. **Choose tool**: pandas for data, openpyxl for formulas/formatting +2. **Create/Load**: Create new workbook or load existing file +3. **Modify**: Add/edit data, formulas, and formatting +4. **Save**: Write to file +5. **Recalculate formulas (MANDATORY IF USING FORMULAS)**: Use the scripts/recalc.py script + ```bash + python scripts/recalc.py output.xlsx + ``` +6. **Verify and fix any errors**: + - The script returns JSON with error details + - If `status` is `errors_found`, check `error_summary` for specific error types and locations + - Fix the identified errors and recalculate again + - Common errors to fix: + - `#REF!`: Invalid cell references + - `#DIV/0!`: Division by zero + - `#VALUE!`: Wrong data type in formula + - `#NAME?`: Unrecognized formula name + +### Creating new Excel files + +```python +# Using openpyxl for formulas and formatting +from openpyxl import Workbook +from openpyxl.styles import Font, PatternFill, Alignment + +wb = Workbook() +sheet = wb.active + +# Add data +sheet['A1'] = 'Hello' +sheet['B1'] = 'World' +sheet.append(['Row', 'of', 'data']) + +# Add formula +sheet['B2'] = '=SUM(A1:A10)' + +# Formatting +sheet['A1'].font = Font(bold=True, color='FF0000') +sheet['A1'].fill = PatternFill('solid', start_color='FFFF00') +sheet['A1'].alignment = Alignment(horizontal='center') + +# Column width +sheet.column_dimensions['A'].width = 20 + +wb.save('output.xlsx') +``` + +### Editing existing Excel files + +```python +# Using openpyxl to preserve formulas and formatting +from openpyxl import load_workbook + +# Load existing file +wb = load_workbook('existing.xlsx') +sheet = wb.active # or wb['SheetName'] for specific sheet + +# Working with multiple sheets +for sheet_name in wb.sheetnames: + sheet = wb[sheet_name] + print(f"Sheet: {sheet_name}") + +# Modify cells +sheet['A1'] = 'New Value' +sheet.insert_rows(2) # Insert row at position 2 +sheet.delete_cols(3) # Delete column 3 + +# Add new sheet +new_sheet = wb.create_sheet('NewSheet') +new_sheet['A1'] = 'Data' + +wb.save('modified.xlsx') +``` + +## Recalculating formulas + +Excel files created or modified by openpyxl contain formulas as strings but not calculated values. Use the provided `scripts/recalc.py` script to recalculate formulas: + +```bash +python scripts/recalc.py <excel_file> [timeout_seconds] +``` + +Example: +```bash +python scripts/recalc.py output.xlsx 30 +``` + +The script: +- Automatically sets up LibreOffice macro on first run +- Recalculates all formulas in all sheets +- Scans ALL cells for Excel errors (#REF!, #DIV/0!, etc.) +- Returns JSON with detailed error locations and counts +- Works on both Linux and macOS + +## Formula Verification Checklist + +Quick checks to ensure formulas work correctly: + +### Essential Verification +- [ ] **Test 2-3 sample references**: Verify they pull correct values before building full model +- [ ] **Column mapping**: Confirm Excel columns match (e.g., column 64 = BL, not BK) +- [ ] **Row offset**: Remember Excel rows are 1-indexed (DataFrame row 5 = Excel row 6) + +### Common Pitfalls +- [ ] **NaN handling**: Check for null values with `pd.notna()` +- [ ] **Far-right columns**: FY data often in columns 50+ +- [ ] **Multiple matches**: Search all occurrences, not just first +- [ ] **Division by zero**: Check denominators before using `/` in formulas (#DIV/0!) +- [ ] **Wrong references**: Verify all cell references point to intended cells (#REF!) +- [ ] **Cross-sheet references**: Use correct format (Sheet1!A1) for linking sheets + +### Formula Testing Strategy +- [ ] **Start small**: Test formulas on 2-3 cells before applying broadly +- [ ] **Verify dependencies**: Check all cells referenced in formulas exist +- [ ] **Test edge cases**: Include zero, negative, and very large values + +### Interpreting scripts/recalc.py Output +The script returns JSON with error details: +```json +{ + "status": "success", // or "errors_found" + "total_errors": 0, // Total error count + "total_formulas": 42, // Number of formulas in file + "error_summary": { // Only present if errors found + "#REF!": { + "count": 2, + "locations": ["Sheet1!B5", "Sheet1!C10"] + } + } +} +``` + +## Best Practices + +### Library Selection +- **pandas**: Best for data analysis, bulk operations, and simple data export +- **openpyxl**: Best for complex formatting, formulas, and Excel-specific features + +### Working with openpyxl +- Cell indices are 1-based (row=1, column=1 refers to cell A1) +- Use `data_only=True` to read calculated values: `load_workbook('file.xlsx', data_only=True)` +- **Warning**: If opened with `data_only=True` and saved, formulas are replaced with values and permanently lost +- For large files: Use `read_only=True` for reading or `write_only=True` for writing +- Formulas are preserved but not evaluated - use scripts/recalc.py to update values + +### Working with pandas +- Specify data types to avoid inference issues: `pd.read_excel('file.xlsx', dtype={'id': str})` +- For large files, read specific columns: `pd.read_excel('file.xlsx', usecols=['A', 'C', 'E'])` +- Handle dates properly: `pd.read_excel('file.xlsx', parse_dates=['date_column'])` + +## Code Style Guidelines +**IMPORTANT**: When generating Python code for Excel operations: +- Write minimal, concise Python code without unnecessary comments +- Avoid verbose variable names and redundant operations +- Avoid unnecessary print statements + +**For Excel files themselves**: +- Add comments to cells with complex formulas or important assumptions +- Document data sources for hardcoded values +- Include notes for key calculations and model sections \ No newline at end of file diff --git a/.claude/skills/xlsx/scripts/office/helpers/__init__.py b/.claude/skills/xlsx/scripts/office/helpers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/.claude/skills/xlsx/scripts/office/helpers/merge_runs.py b/.claude/skills/xlsx/scripts/office/helpers/merge_runs.py new file mode 100644 index 0000000..ad7c25e --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/helpers/merge_runs.py @@ -0,0 +1,199 @@ +"""Merge adjacent runs with identical formatting in DOCX. + +Merges adjacent <w:r> elements that have identical <w:rPr> properties. +Works on runs in paragraphs and inside tracked changes (<w:ins>, <w:del>). + +Also: +- Removes rsid attributes from runs (revision metadata that doesn't affect rendering) +- Removes proofErr elements (spell/grammar markers that block merging) +""" + +from pathlib import Path + +import defusedxml.minidom + + +def merge_runs(input_dir: str) -> tuple[int, str]: + doc_xml = Path(input_dir) / "word" / "document.xml" + + if not doc_xml.exists(): + return 0, f"Error: {doc_xml} not found" + + try: + dom = defusedxml.minidom.parseString(doc_xml.read_text(encoding="utf-8")) + root = dom.documentElement + + _remove_elements(root, "proofErr") + _strip_run_rsid_attrs(root) + + containers = {run.parentNode for run in _find_elements(root, "r")} + + merge_count = 0 + for container in containers: + merge_count += _merge_runs_in(container) + + doc_xml.write_bytes(dom.toxml(encoding="UTF-8")) + return merge_count, f"Merged {merge_count} runs" + + except Exception as e: + return 0, f"Error: {e}" + + + + +def _find_elements(root, tag: str) -> list: + results = [] + + def traverse(node): + if node.nodeType == node.ELEMENT_NODE: + name = node.localName or node.tagName + if name == tag or name.endswith(f":{tag}"): + results.append(node) + for child in node.childNodes: + traverse(child) + + traverse(root) + return results + + +def _get_child(parent, tag: str): + for child in parent.childNodes: + if child.nodeType == child.ELEMENT_NODE: + name = child.localName or child.tagName + if name == tag or name.endswith(f":{tag}"): + return child + return None + + +def _get_children(parent, tag: str) -> list: + results = [] + for child in parent.childNodes: + if child.nodeType == child.ELEMENT_NODE: + name = child.localName or child.tagName + if name == tag or name.endswith(f":{tag}"): + results.append(child) + return results + + +def _is_adjacent(elem1, elem2) -> bool: + node = elem1.nextSibling + while node: + if node == elem2: + return True + if node.nodeType == node.ELEMENT_NODE: + return False + if node.nodeType == node.TEXT_NODE and node.data.strip(): + return False + node = node.nextSibling + return False + + + + +def _remove_elements(root, tag: str): + for elem in _find_elements(root, tag): + if elem.parentNode: + elem.parentNode.removeChild(elem) + + +def _strip_run_rsid_attrs(root): + for run in _find_elements(root, "r"): + for attr in list(run.attributes.values()): + if "rsid" in attr.name.lower(): + run.removeAttribute(attr.name) + + + + +def _merge_runs_in(container) -> int: + merge_count = 0 + run = _first_child_run(container) + + while run: + while True: + next_elem = _next_element_sibling(run) + if next_elem and _is_run(next_elem) and _can_merge(run, next_elem): + _merge_run_content(run, next_elem) + container.removeChild(next_elem) + merge_count += 1 + else: + break + + _consolidate_text(run) + run = _next_sibling_run(run) + + return merge_count + + +def _first_child_run(container): + for child in container.childNodes: + if child.nodeType == child.ELEMENT_NODE and _is_run(child): + return child + return None + + +def _next_element_sibling(node): + sibling = node.nextSibling + while sibling: + if sibling.nodeType == sibling.ELEMENT_NODE: + return sibling + sibling = sibling.nextSibling + return None + + +def _next_sibling_run(node): + sibling = node.nextSibling + while sibling: + if sibling.nodeType == sibling.ELEMENT_NODE: + if _is_run(sibling): + return sibling + sibling = sibling.nextSibling + return None + + +def _is_run(node) -> bool: + name = node.localName or node.tagName + return name == "r" or name.endswith(":r") + + +def _can_merge(run1, run2) -> bool: + rpr1 = _get_child(run1, "rPr") + rpr2 = _get_child(run2, "rPr") + + if (rpr1 is None) != (rpr2 is None): + return False + if rpr1 is None: + return True + return rpr1.toxml() == rpr2.toxml() + + +def _merge_run_content(target, source): + for child in list(source.childNodes): + if child.nodeType == child.ELEMENT_NODE: + name = child.localName or child.tagName + if name != "rPr" and not name.endswith(":rPr"): + target.appendChild(child) + + +def _consolidate_text(run): + t_elements = _get_children(run, "t") + + for i in range(len(t_elements) - 1, 0, -1): + curr, prev = t_elements[i], t_elements[i - 1] + + if _is_adjacent(prev, curr): + prev_text = prev.firstChild.data if prev.firstChild else "" + curr_text = curr.firstChild.data if curr.firstChild else "" + merged = prev_text + curr_text + + if prev.firstChild: + prev.firstChild.data = merged + else: + prev.appendChild(run.ownerDocument.createTextNode(merged)) + + if merged.startswith(" ") or merged.endswith(" "): + prev.setAttribute("xml:space", "preserve") + elif prev.hasAttribute("xml:space"): + prev.removeAttribute("xml:space") + + run.removeChild(curr) diff --git a/.claude/skills/xlsx/scripts/office/helpers/simplify_redlines.py b/.claude/skills/xlsx/scripts/office/helpers/simplify_redlines.py new file mode 100644 index 0000000..db963bb --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/helpers/simplify_redlines.py @@ -0,0 +1,197 @@ +"""Simplify tracked changes by merging adjacent w:ins or w:del elements. + +Merges adjacent <w:ins> elements from the same author into a single element. +Same for <w:del> elements. This makes heavily-redlined documents easier to +work with by reducing the number of tracked change wrappers. + +Rules: +- Only merges w:ins with w:ins, w:del with w:del (same element type) +- Only merges if same author (ignores timestamp differences) +- Only merges if truly adjacent (only whitespace between them) +""" + +import xml.etree.ElementTree as ET +import zipfile +from pathlib import Path + +import defusedxml.minidom + +WORD_NS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main" + + +def simplify_redlines(input_dir: str) -> tuple[int, str]: + doc_xml = Path(input_dir) / "word" / "document.xml" + + if not doc_xml.exists(): + return 0, f"Error: {doc_xml} not found" + + try: + dom = defusedxml.minidom.parseString(doc_xml.read_text(encoding="utf-8")) + root = dom.documentElement + + merge_count = 0 + + containers = _find_elements(root, "p") + _find_elements(root, "tc") + + for container in containers: + merge_count += _merge_tracked_changes_in(container, "ins") + merge_count += _merge_tracked_changes_in(container, "del") + + doc_xml.write_bytes(dom.toxml(encoding="UTF-8")) + return merge_count, f"Simplified {merge_count} tracked changes" + + except Exception as e: + return 0, f"Error: {e}" + + +def _merge_tracked_changes_in(container, tag: str) -> int: + merge_count = 0 + + tracked = [ + child + for child in container.childNodes + if child.nodeType == child.ELEMENT_NODE and _is_element(child, tag) + ] + + if len(tracked) < 2: + return 0 + + i = 0 + while i < len(tracked) - 1: + curr = tracked[i] + next_elem = tracked[i + 1] + + if _can_merge_tracked(curr, next_elem): + _merge_tracked_content(curr, next_elem) + container.removeChild(next_elem) + tracked.pop(i + 1) + merge_count += 1 + else: + i += 1 + + return merge_count + + +def _is_element(node, tag: str) -> bool: + name = node.localName or node.tagName + return name == tag or name.endswith(f":{tag}") + + +def _get_author(elem) -> str: + author = elem.getAttribute("w:author") + if not author: + for attr in elem.attributes.values(): + if attr.localName == "author" or attr.name.endswith(":author"): + return attr.value + return author + + +def _can_merge_tracked(elem1, elem2) -> bool: + if _get_author(elem1) != _get_author(elem2): + return False + + node = elem1.nextSibling + while node and node != elem2: + if node.nodeType == node.ELEMENT_NODE: + return False + if node.nodeType == node.TEXT_NODE and node.data.strip(): + return False + node = node.nextSibling + + return True + + +def _merge_tracked_content(target, source): + while source.firstChild: + child = source.firstChild + source.removeChild(child) + target.appendChild(child) + + +def _find_elements(root, tag: str) -> list: + results = [] + + def traverse(node): + if node.nodeType == node.ELEMENT_NODE: + name = node.localName or node.tagName + if name == tag or name.endswith(f":{tag}"): + results.append(node) + for child in node.childNodes: + traverse(child) + + traverse(root) + return results + + +def get_tracked_change_authors(doc_xml_path: Path) -> dict[str, int]: + if not doc_xml_path.exists(): + return {} + + try: + tree = ET.parse(doc_xml_path) + root = tree.getroot() + except ET.ParseError: + return {} + + namespaces = {"w": WORD_NS} + author_attr = f"{{{WORD_NS}}}author" + + authors: dict[str, int] = {} + for tag in ["ins", "del"]: + for elem in root.findall(f".//w:{tag}", namespaces): + author = elem.get(author_attr) + if author: + authors[author] = authors.get(author, 0) + 1 + + return authors + + +def _get_authors_from_docx(docx_path: Path) -> dict[str, int]: + try: + with zipfile.ZipFile(docx_path, "r") as zf: + if "word/document.xml" not in zf.namelist(): + return {} + with zf.open("word/document.xml") as f: + tree = ET.parse(f) + root = tree.getroot() + + namespaces = {"w": WORD_NS} + author_attr = f"{{{WORD_NS}}}author" + + authors: dict[str, int] = {} + for tag in ["ins", "del"]: + for elem in root.findall(f".//w:{tag}", namespaces): + author = elem.get(author_attr) + if author: + authors[author] = authors.get(author, 0) + 1 + return authors + except (zipfile.BadZipFile, ET.ParseError): + return {} + + +def infer_author(modified_dir: Path, original_docx: Path, default: str = "Claude") -> str: + modified_xml = modified_dir / "word" / "document.xml" + modified_authors = get_tracked_change_authors(modified_xml) + + if not modified_authors: + return default + + original_authors = _get_authors_from_docx(original_docx) + + new_changes: dict[str, int] = {} + for author, count in modified_authors.items(): + original_count = original_authors.get(author, 0) + diff = count - original_count + if diff > 0: + new_changes[author] = diff + + if not new_changes: + return default + + if len(new_changes) == 1: + return next(iter(new_changes)) + + raise ValueError( + f"Multiple authors added new changes: {new_changes}. " + "Cannot infer which author to validate." + ) diff --git a/.claude/skills/xlsx/scripts/office/pack.py b/.claude/skills/xlsx/scripts/office/pack.py new file mode 100644 index 0000000..db29ed8 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/pack.py @@ -0,0 +1,159 @@ +"""Pack a directory into a DOCX, PPTX, or XLSX file. + +Validates with auto-repair, condenses XML formatting, and creates the Office file. + +Usage: + python pack.py <input_directory> <output_file> [--original <file>] [--validate true|false] + +Examples: + python pack.py unpacked/ output.docx --original input.docx + python pack.py unpacked/ output.pptx --validate false +""" + +import argparse +import sys +import shutil +import tempfile +import zipfile +from pathlib import Path + +import defusedxml.minidom + +from validators import DOCXSchemaValidator, PPTXSchemaValidator, RedliningValidator + +def pack( + input_directory: str, + output_file: str, + original_file: str | None = None, + validate: bool = True, + infer_author_func=None, +) -> tuple[None, str]: + input_dir = Path(input_directory) + output_path = Path(output_file) + suffix = output_path.suffix.lower() + + if not input_dir.is_dir(): + return None, f"Error: {input_dir} is not a directory" + + if suffix not in {".docx", ".pptx", ".xlsx"}: + return None, f"Error: {output_file} must be a .docx, .pptx, or .xlsx file" + + if validate and original_file: + original_path = Path(original_file) + if original_path.exists(): + success, output = _run_validation( + input_dir, original_path, suffix, infer_author_func + ) + if output: + print(output) + if not success: + return None, f"Error: Validation failed for {input_dir}" + + with tempfile.TemporaryDirectory() as temp_dir: + temp_content_dir = Path(temp_dir) / "content" + shutil.copytree(input_dir, temp_content_dir) + + for pattern in ["*.xml", "*.rels"]: + for xml_file in temp_content_dir.rglob(pattern): + _condense_xml(xml_file) + + output_path.parent.mkdir(parents=True, exist_ok=True) + with zipfile.ZipFile(output_path, "w", zipfile.ZIP_DEFLATED) as zf: + for f in temp_content_dir.rglob("*"): + if f.is_file(): + zf.write(f, f.relative_to(temp_content_dir)) + + return None, f"Successfully packed {input_dir} to {output_file}" + + +def _run_validation( + unpacked_dir: Path, + original_file: Path, + suffix: str, + infer_author_func=None, +) -> tuple[bool, str | None]: + output_lines = [] + validators = [] + + if suffix == ".docx": + author = "Claude" + if infer_author_func: + try: + author = infer_author_func(unpacked_dir, original_file) + except ValueError as e: + print(f"Warning: {e} Using default author 'Claude'.", file=sys.stderr) + + validators = [ + DOCXSchemaValidator(unpacked_dir, original_file), + RedliningValidator(unpacked_dir, original_file, author=author), + ] + elif suffix == ".pptx": + validators = [PPTXSchemaValidator(unpacked_dir, original_file)] + + if not validators: + return True, None + + total_repairs = sum(v.repair() for v in validators) + if total_repairs: + output_lines.append(f"Auto-repaired {total_repairs} issue(s)") + + success = all(v.validate() for v in validators) + + if success: + output_lines.append("All validations PASSED!") + + return success, "\n".join(output_lines) if output_lines else None + + +def _condense_xml(xml_file: Path) -> None: + try: + with open(xml_file, encoding="utf-8") as f: + dom = defusedxml.minidom.parse(f) + + for element in dom.getElementsByTagName("*"): + if element.tagName.endswith(":t"): + continue + + for child in list(element.childNodes): + if ( + child.nodeType == child.TEXT_NODE + and child.nodeValue + and child.nodeValue.strip() == "" + ) or child.nodeType == child.COMMENT_NODE: + element.removeChild(child) + + xml_file.write_bytes(dom.toxml(encoding="UTF-8")) + except Exception as e: + print(f"ERROR: Failed to parse {xml_file.name}: {e}", file=sys.stderr) + raise + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Pack a directory into a DOCX, PPTX, or XLSX file" + ) + parser.add_argument("input_directory", help="Unpacked Office document directory") + parser.add_argument("output_file", help="Output Office file (.docx/.pptx/.xlsx)") + parser.add_argument( + "--original", + help="Original file for validation comparison", + ) + parser.add_argument( + "--validate", + type=lambda x: x.lower() == "true", + default=True, + metavar="true|false", + help="Run validation with auto-repair (default: true)", + ) + args = parser.parse_args() + + _, message = pack( + args.input_directory, + args.output_file, + original_file=args.original, + validate=args.validate, + ) + print(message) + + if "Error" in message: + sys.exit(1) diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd new file mode 100644 index 0000000..6454ef9 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd @@ -0,0 +1,1499 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns="http://schemas.openxmlformats.org/drawingml/2006/chart" + xmlns:cdr="http://schemas.openxmlformats.org/drawingml/2006/chartDrawing" + xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/chart" + elementFormDefault="qualified" attributeFormDefault="unqualified" blockDefault="#all"> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + schemaLocation="shared-relationshipReference.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main" + schemaLocation="dml-main.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/chartDrawing" + schemaLocation="dml-chartDrawing.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + schemaLocation="shared-commonSimpleTypes.xsd"/> + <xsd:complexType name="CT_Boolean"> + <xsd:attribute name="val" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_Double"> + <xsd:attribute name="val" type="xsd:double" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_UnsignedInt"> + <xsd:attribute name="val" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_RelId"> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Extension"> + <xsd:sequence> + <xsd:any processContents="lax"/> + </xsd:sequence> + <xsd:attribute name="uri" type="xsd:token"/> + </xsd:complexType> + <xsd:complexType name="CT_ExtensionList"> + <xsd:sequence> + <xsd:element name="ext" type="CT_Extension" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_NumVal"> + <xsd:sequence> + <xsd:element name="v" type="s:ST_Xstring" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="idx" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="formatCode" type="s:ST_Xstring" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_NumData"> + <xsd:sequence> + <xsd:element name="formatCode" type="s:ST_Xstring" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ptCount" type="CT_UnsignedInt" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pt" type="CT_NumVal" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_NumRef"> + <xsd:sequence> + <xsd:element name="f" type="xsd:string" minOccurs="1" maxOccurs="1"/> + <xsd:element name="numCache" type="CT_NumData" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_NumDataSource"> + <xsd:sequence> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="numRef" type="CT_NumRef" minOccurs="1" maxOccurs="1"/> + <xsd:element name="numLit" type="CT_NumData" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_StrVal"> + <xsd:sequence> + <xsd:element name="v" type="s:ST_Xstring" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="idx" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_StrData"> + <xsd:sequence> + <xsd:element name="ptCount" type="CT_UnsignedInt" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pt" type="CT_StrVal" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_StrRef"> + <xsd:sequence> + <xsd:element name="f" type="xsd:string" minOccurs="1" maxOccurs="1"/> + <xsd:element name="strCache" type="CT_StrData" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Tx"> + <xsd:sequence> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="strRef" type="CT_StrRef" minOccurs="1" maxOccurs="1"/> + <xsd:element name="rich" type="a:CT_TextBody" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TextLanguageID"> + <xsd:attribute name="val" type="s:ST_Lang" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Lvl"> + <xsd:sequence> + <xsd:element name="pt" type="CT_StrVal" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_MultiLvlStrData"> + <xsd:sequence> + <xsd:element name="ptCount" type="CT_UnsignedInt" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lvl" type="CT_Lvl" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_MultiLvlStrRef"> + <xsd:sequence> + <xsd:element name="f" type="xsd:string" minOccurs="1" maxOccurs="1"/> + <xsd:element name="multiLvlStrCache" type="CT_MultiLvlStrData" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_AxDataSource"> + <xsd:sequence> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="multiLvlStrRef" type="CT_MultiLvlStrRef" minOccurs="1" maxOccurs="1"/> + <xsd:element name="numRef" type="CT_NumRef" minOccurs="1" maxOccurs="1"/> + <xsd:element name="numLit" type="CT_NumData" minOccurs="1" maxOccurs="1"/> + <xsd:element name="strRef" type="CT_StrRef" minOccurs="1" maxOccurs="1"/> + <xsd:element name="strLit" type="CT_StrData" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SerTx"> + <xsd:sequence> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="strRef" type="CT_StrRef" minOccurs="1" maxOccurs="1"/> + <xsd:element name="v" type="s:ST_Xstring" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_LayoutTarget"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="inner"/> + <xsd:enumeration value="outer"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_LayoutTarget"> + <xsd:attribute name="val" type="ST_LayoutTarget" default="outer"/> + </xsd:complexType> + <xsd:simpleType name="ST_LayoutMode"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="edge"/> + <xsd:enumeration value="factor"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_LayoutMode"> + <xsd:attribute name="val" type="ST_LayoutMode" default="factor"/> + </xsd:complexType> + <xsd:complexType name="CT_ManualLayout"> + <xsd:sequence> + <xsd:element name="layoutTarget" type="CT_LayoutTarget" minOccurs="0" maxOccurs="1"/> + <xsd:element name="xMode" type="CT_LayoutMode" minOccurs="0" maxOccurs="1"/> + <xsd:element name="yMode" type="CT_LayoutMode" minOccurs="0" maxOccurs="1"/> + <xsd:element name="wMode" type="CT_LayoutMode" minOccurs="0" maxOccurs="1"/> + <xsd:element name="hMode" type="CT_LayoutMode" minOccurs="0" maxOccurs="1"/> + <xsd:element name="x" type="CT_Double" minOccurs="0" maxOccurs="1"/> + <xsd:element name="y" type="CT_Double" minOccurs="0" maxOccurs="1"/> + <xsd:element name="w" type="CT_Double" minOccurs="0" maxOccurs="1"/> + <xsd:element name="h" type="CT_Double" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Layout"> + <xsd:sequence> + <xsd:element name="manualLayout" type="CT_ManualLayout" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Title"> + <xsd:sequence> + <xsd:element name="tx" type="CT_Tx" minOccurs="0" maxOccurs="1"/> + <xsd:element name="layout" type="CT_Layout" minOccurs="0" maxOccurs="1"/> + <xsd:element name="overlay" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txPr" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_RotX"> + <xsd:restriction base="xsd:byte"> + <xsd:minInclusive value="-90"/> + <xsd:maxInclusive value="90"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_RotX"> + <xsd:attribute name="val" type="ST_RotX" default="0"/> + </xsd:complexType> + <xsd:simpleType name="ST_HPercent"> + <xsd:union memberTypes="ST_HPercentWithSymbol ST_HPercentUShort"/> + </xsd:simpleType> + <xsd:simpleType name="ST_HPercentWithSymbol"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="0*(([5-9])|([1-9][0-9])|([1-4][0-9][0-9])|500)%"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_HPercentUShort"> + <xsd:restriction base="xsd:unsignedShort"> + <xsd:minInclusive value="5"/> + <xsd:maxInclusive value="500"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_HPercent"> + <xsd:attribute name="val" type="ST_HPercent" default="100%"/> + </xsd:complexType> + <xsd:simpleType name="ST_RotY"> + <xsd:restriction base="xsd:unsignedShort"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="360"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_RotY"> + <xsd:attribute name="val" type="ST_RotY" default="0"/> + </xsd:complexType> + <xsd:simpleType name="ST_DepthPercent"> + <xsd:union memberTypes="ST_DepthPercentWithSymbol ST_DepthPercentUShort"/> + </xsd:simpleType> + <xsd:simpleType name="ST_DepthPercentWithSymbol"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="0*(([2-9][0-9])|([1-9][0-9][0-9])|(1[0-9][0-9][0-9])|2000)%"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_DepthPercentUShort"> + <xsd:restriction base="xsd:unsignedShort"> + <xsd:minInclusive value="20"/> + <xsd:maxInclusive value="2000"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_DepthPercent"> + <xsd:attribute name="val" type="ST_DepthPercent" default="100%"/> + </xsd:complexType> + <xsd:simpleType name="ST_Perspective"> + <xsd:restriction base="xsd:unsignedByte"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="240"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Perspective"> + <xsd:attribute name="val" type="ST_Perspective" default="30"/> + </xsd:complexType> + <xsd:complexType name="CT_View3D"> + <xsd:sequence> + <xsd:element name="rotX" type="CT_RotX" minOccurs="0" maxOccurs="1"/> + <xsd:element name="hPercent" type="CT_HPercent" minOccurs="0" maxOccurs="1"/> + <xsd:element name="rotY" type="CT_RotY" minOccurs="0" maxOccurs="1"/> + <xsd:element name="depthPercent" type="CT_DepthPercent" minOccurs="0" maxOccurs="1"/> + <xsd:element name="rAngAx" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="perspective" type="CT_Perspective" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Surface"> + <xsd:sequence> + <xsd:element name="thickness" type="CT_Thickness" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pictureOptions" type="CT_PictureOptions" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_Thickness"> + <xsd:union memberTypes="ST_ThicknessPercent xsd:unsignedInt"/> + </xsd:simpleType> + <xsd:simpleType name="ST_ThicknessPercent"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="([0-9]+)%"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Thickness"> + <xsd:attribute name="val" type="ST_Thickness" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_DTable"> + <xsd:sequence> + <xsd:element name="showHorzBorder" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="showVertBorder" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="showOutline" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="showKeys" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txPr" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_GapAmount"> + <xsd:union memberTypes="ST_GapAmountPercent ST_GapAmountUShort"/> + </xsd:simpleType> + <xsd:simpleType name="ST_GapAmountPercent"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="0*(([0-9])|([1-9][0-9])|([1-4][0-9][0-9])|500)%"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_GapAmountUShort"> + <xsd:restriction base="xsd:unsignedShort"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="500"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_GapAmount"> + <xsd:attribute name="val" type="ST_GapAmount" default="150%"/> + </xsd:complexType> + <xsd:simpleType name="ST_Overlap"> + <xsd:union memberTypes="ST_OverlapPercent ST_OverlapByte"/> + </xsd:simpleType> + <xsd:simpleType name="ST_OverlapPercent"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="(-?0*(([0-9])|([1-9][0-9])|100))%"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_OverlapByte"> + <xsd:restriction base="xsd:byte"> + <xsd:minInclusive value="-100"/> + <xsd:maxInclusive value="100"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Overlap"> + <xsd:attribute name="val" type="ST_Overlap" default="0%"/> + </xsd:complexType> + <xsd:simpleType name="ST_BubbleScale"> + <xsd:union memberTypes="ST_BubbleScalePercent ST_BubbleScaleUInt"/> + </xsd:simpleType> + <xsd:simpleType name="ST_BubbleScalePercent"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="0*(([0-9])|([1-9][0-9])|([1-2][0-9][0-9])|300)%"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_BubbleScaleUInt"> + <xsd:restriction base="xsd:unsignedInt"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="300"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_BubbleScale"> + <xsd:attribute name="val" type="ST_BubbleScale" default="100%"/> + </xsd:complexType> + <xsd:simpleType name="ST_SizeRepresents"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="area"/> + <xsd:enumeration value="w"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SizeRepresents"> + <xsd:attribute name="val" type="ST_SizeRepresents" default="area"/> + </xsd:complexType> + <xsd:simpleType name="ST_FirstSliceAng"> + <xsd:restriction base="xsd:unsignedShort"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="360"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_FirstSliceAng"> + <xsd:attribute name="val" type="ST_FirstSliceAng" default="0"/> + </xsd:complexType> + <xsd:simpleType name="ST_HoleSize"> + <xsd:union memberTypes="ST_HoleSizePercent ST_HoleSizeUByte"/> + </xsd:simpleType> + <xsd:simpleType name="ST_HoleSizePercent"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="0*([1-9]|([1-8][0-9])|90)%"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_HoleSizeUByte"> + <xsd:restriction base="xsd:unsignedByte"> + <xsd:minInclusive value="1"/> + <xsd:maxInclusive value="90"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_HoleSize"> + <xsd:attribute name="val" type="ST_HoleSize" default="10%"/> + </xsd:complexType> + <xsd:simpleType name="ST_SplitType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="auto"/> + <xsd:enumeration value="cust"/> + <xsd:enumeration value="percent"/> + <xsd:enumeration value="pos"/> + <xsd:enumeration value="val"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SplitType"> + <xsd:attribute name="val" type="ST_SplitType" default="auto"/> + </xsd:complexType> + <xsd:complexType name="CT_CustSplit"> + <xsd:sequence> + <xsd:element name="secondPiePt" type="CT_UnsignedInt" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_SecondPieSize"> + <xsd:union memberTypes="ST_SecondPieSizePercent ST_SecondPieSizeUShort"/> + </xsd:simpleType> + <xsd:simpleType name="ST_SecondPieSizePercent"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="0*(([5-9])|([1-9][0-9])|(1[0-9][0-9])|200)%"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_SecondPieSizeUShort"> + <xsd:restriction base="xsd:unsignedShort"> + <xsd:minInclusive value="5"/> + <xsd:maxInclusive value="200"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SecondPieSize"> + <xsd:attribute name="val" type="ST_SecondPieSize" default="75%"/> + </xsd:complexType> + <xsd:complexType name="CT_NumFmt"> + <xsd:attribute name="formatCode" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="sourceLinked" type="xsd:boolean"/> + </xsd:complexType> + <xsd:simpleType name="ST_LblAlgn"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="ctr"/> + <xsd:enumeration value="l"/> + <xsd:enumeration value="r"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_LblAlgn"> + <xsd:attribute name="val" type="ST_LblAlgn" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_DLblPos"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="bestFit"/> + <xsd:enumeration value="b"/> + <xsd:enumeration value="ctr"/> + <xsd:enumeration value="inBase"/> + <xsd:enumeration value="inEnd"/> + <xsd:enumeration value="l"/> + <xsd:enumeration value="outEnd"/> + <xsd:enumeration value="r"/> + <xsd:enumeration value="t"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_DLblPos"> + <xsd:attribute name="val" type="ST_DLblPos" use="required"/> + </xsd:complexType> + <xsd:group name="EG_DLblShared"> + <xsd:sequence> + <xsd:element name="numFmt" type="CT_NumFmt" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txPr" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dLblPos" type="CT_DLblPos" minOccurs="0" maxOccurs="1"/> + <xsd:element name="showLegendKey" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="showVal" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="showCatName" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="showSerName" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="showPercent" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="showBubbleSize" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="separator" type="xsd:string" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:group> + <xsd:group name="Group_DLbl"> + <xsd:sequence> + <xsd:element name="layout" type="CT_Layout" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tx" type="CT_Tx" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_DLblShared" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_DLbl"> + <xsd:sequence> + <xsd:element name="idx" type="CT_UnsignedInt" minOccurs="1" maxOccurs="1"/> + <xsd:choice> + <xsd:element name="delete" type="CT_Boolean" minOccurs="1" maxOccurs="1"/> + <xsd:group ref="Group_DLbl" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="Group_DLbls"> + <xsd:sequence> + <xsd:group ref="EG_DLblShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="showLeaderLines" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="leaderLines" type="CT_ChartLines" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_DLbls"> + <xsd:sequence> + <xsd:element name="dLbl" type="CT_DLbl" minOccurs="0" maxOccurs="unbounded"/> + <xsd:choice> + <xsd:element name="delete" type="CT_Boolean" minOccurs="1" maxOccurs="1"/> + <xsd:group ref="Group_DLbls" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_MarkerStyle"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="circle"/> + <xsd:enumeration value="dash"/> + <xsd:enumeration value="diamond"/> + <xsd:enumeration value="dot"/> + <xsd:enumeration value="none"/> + <xsd:enumeration value="picture"/> + <xsd:enumeration value="plus"/> + <xsd:enumeration value="square"/> + <xsd:enumeration value="star"/> + <xsd:enumeration value="triangle"/> + <xsd:enumeration value="x"/> + <xsd:enumeration value="auto"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_MarkerStyle"> + <xsd:attribute name="val" type="ST_MarkerStyle" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_MarkerSize"> + <xsd:restriction base="xsd:unsignedByte"> + <xsd:minInclusive value="2"/> + <xsd:maxInclusive value="72"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_MarkerSize"> + <xsd:attribute name="val" type="ST_MarkerSize" default="5"/> + </xsd:complexType> + <xsd:complexType name="CT_Marker"> + <xsd:sequence> + <xsd:element name="symbol" type="CT_MarkerStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="size" type="CT_MarkerSize" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DPt"> + <xsd:sequence> + <xsd:element name="idx" type="CT_UnsignedInt" minOccurs="1" maxOccurs="1"/> + <xsd:element name="invertIfNegative" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="marker" type="CT_Marker" minOccurs="0" maxOccurs="1"/> + <xsd:element name="bubble3D" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="explosion" type="CT_UnsignedInt" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pictureOptions" type="CT_PictureOptions" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_TrendlineType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="exp"/> + <xsd:enumeration value="linear"/> + <xsd:enumeration value="log"/> + <xsd:enumeration value="movingAvg"/> + <xsd:enumeration value="poly"/> + <xsd:enumeration value="power"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TrendlineType"> + <xsd:attribute name="val" type="ST_TrendlineType" default="linear"/> + </xsd:complexType> + <xsd:simpleType name="ST_Order"> + <xsd:restriction base="xsd:unsignedByte"> + <xsd:minInclusive value="2"/> + <xsd:maxInclusive value="6"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Order"> + <xsd:attribute name="val" type="ST_Order" default="2"/> + </xsd:complexType> + <xsd:simpleType name="ST_Period"> + <xsd:restriction base="xsd:unsignedInt"> + <xsd:minInclusive value="2"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Period"> + <xsd:attribute name="val" type="ST_Period" default="2"/> + </xsd:complexType> + <xsd:complexType name="CT_TrendlineLbl"> + <xsd:sequence> + <xsd:element name="layout" type="CT_Layout" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tx" type="CT_Tx" minOccurs="0" maxOccurs="1"/> + <xsd:element name="numFmt" type="CT_NumFmt" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txPr" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Trendline"> + <xsd:sequence> + <xsd:element name="name" type="xsd:string" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="trendlineType" type="CT_TrendlineType" minOccurs="1" maxOccurs="1"/> + <xsd:element name="order" type="CT_Order" minOccurs="0" maxOccurs="1"/> + <xsd:element name="period" type="CT_Period" minOccurs="0" maxOccurs="1"/> + <xsd:element name="forward" type="CT_Double" minOccurs="0" maxOccurs="1"/> + <xsd:element name="backward" type="CT_Double" minOccurs="0" maxOccurs="1"/> + <xsd:element name="intercept" type="CT_Double" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dispRSqr" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dispEq" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="trendlineLbl" type="CT_TrendlineLbl" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_ErrDir"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="x"/> + <xsd:enumeration value="y"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_ErrDir"> + <xsd:attribute name="val" type="ST_ErrDir" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_ErrBarType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="both"/> + <xsd:enumeration value="minus"/> + <xsd:enumeration value="plus"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_ErrBarType"> + <xsd:attribute name="val" type="ST_ErrBarType" default="both"/> + </xsd:complexType> + <xsd:simpleType name="ST_ErrValType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="cust"/> + <xsd:enumeration value="fixedVal"/> + <xsd:enumeration value="percentage"/> + <xsd:enumeration value="stdDev"/> + <xsd:enumeration value="stdErr"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_ErrValType"> + <xsd:attribute name="val" type="ST_ErrValType" default="fixedVal"/> + </xsd:complexType> + <xsd:complexType name="CT_ErrBars"> + <xsd:sequence> + <xsd:element name="errDir" type="CT_ErrDir" minOccurs="0" maxOccurs="1"/> + <xsd:element name="errBarType" type="CT_ErrBarType" minOccurs="1" maxOccurs="1"/> + <xsd:element name="errValType" type="CT_ErrValType" minOccurs="1" maxOccurs="1"/> + <xsd:element name="noEndCap" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="plus" type="CT_NumDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="minus" type="CT_NumDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="val" type="CT_Double" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_UpDownBar"> + <xsd:sequence> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_UpDownBars"> + <xsd:sequence> + <xsd:element name="gapWidth" type="CT_GapAmount" minOccurs="0" maxOccurs="1"/> + <xsd:element name="upBars" type="CT_UpDownBar" minOccurs="0" maxOccurs="1"/> + <xsd:element name="downBars" type="CT_UpDownBar" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_SerShared"> + <xsd:sequence> + <xsd:element name="idx" type="CT_UnsignedInt" minOccurs="1" maxOccurs="1"/> + <xsd:element name="order" type="CT_UnsignedInt" minOccurs="1" maxOccurs="1"/> + <xsd:element name="tx" type="CT_SerTx" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_LineSer"> + <xsd:sequence> + <xsd:group ref="EG_SerShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="marker" type="CT_Marker" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dPt" type="CT_DPt" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="dLbls" type="CT_DLbls" minOccurs="0" maxOccurs="1"/> + <xsd:element name="trendline" type="CT_Trendline" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="errBars" type="CT_ErrBars" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cat" type="CT_AxDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="val" type="CT_NumDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="smooth" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ScatterSer"> + <xsd:sequence> + <xsd:group ref="EG_SerShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="marker" type="CT_Marker" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dPt" type="CT_DPt" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="dLbls" type="CT_DLbls" minOccurs="0" maxOccurs="1"/> + <xsd:element name="trendline" type="CT_Trendline" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="errBars" type="CT_ErrBars" minOccurs="0" maxOccurs="2"/> + <xsd:element name="xVal" type="CT_AxDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="yVal" type="CT_NumDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="smooth" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_RadarSer"> + <xsd:sequence> + <xsd:group ref="EG_SerShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="marker" type="CT_Marker" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dPt" type="CT_DPt" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="dLbls" type="CT_DLbls" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cat" type="CT_AxDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="val" type="CT_NumDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_BarSer"> + <xsd:sequence> + <xsd:group ref="EG_SerShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="invertIfNegative" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pictureOptions" type="CT_PictureOptions" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dPt" type="CT_DPt" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="dLbls" type="CT_DLbls" minOccurs="0" maxOccurs="1"/> + <xsd:element name="trendline" type="CT_Trendline" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="errBars" type="CT_ErrBars" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cat" type="CT_AxDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="val" type="CT_NumDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="shape" type="CT_Shape" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_AreaSer"> + <xsd:sequence> + <xsd:group ref="EG_SerShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="pictureOptions" type="CT_PictureOptions" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dPt" type="CT_DPt" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="dLbls" type="CT_DLbls" minOccurs="0" maxOccurs="1"/> + <xsd:element name="trendline" type="CT_Trendline" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="errBars" type="CT_ErrBars" minOccurs="0" maxOccurs="2"/> + <xsd:element name="cat" type="CT_AxDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="val" type="CT_NumDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_PieSer"> + <xsd:sequence> + <xsd:group ref="EG_SerShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="explosion" type="CT_UnsignedInt" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dPt" type="CT_DPt" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="dLbls" type="CT_DLbls" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cat" type="CT_AxDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="val" type="CT_NumDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_BubbleSer"> + <xsd:sequence> + <xsd:group ref="EG_SerShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="invertIfNegative" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dPt" type="CT_DPt" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="dLbls" type="CT_DLbls" minOccurs="0" maxOccurs="1"/> + <xsd:element name="trendline" type="CT_Trendline" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="errBars" type="CT_ErrBars" minOccurs="0" maxOccurs="2"/> + <xsd:element name="xVal" type="CT_AxDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="yVal" type="CT_NumDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="bubbleSize" type="CT_NumDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="bubble3D" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SurfaceSer"> + <xsd:sequence> + <xsd:group ref="EG_SerShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cat" type="CT_AxDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="val" type="CT_NumDataSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_Grouping"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="percentStacked"/> + <xsd:enumeration value="standard"/> + <xsd:enumeration value="stacked"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Grouping"> + <xsd:attribute name="val" type="ST_Grouping" default="standard"/> + </xsd:complexType> + <xsd:complexType name="CT_ChartLines"> + <xsd:sequence> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_LineChartShared"> + <xsd:sequence> + <xsd:element name="grouping" type="CT_Grouping" minOccurs="1" maxOccurs="1"/> + <xsd:element name="varyColors" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ser" type="CT_LineSer" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="dLbls" type="CT_DLbls" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dropLines" type="CT_ChartLines" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_LineChart"> + <xsd:sequence> + <xsd:group ref="EG_LineChartShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="hiLowLines" type="CT_ChartLines" minOccurs="0" maxOccurs="1"/> + <xsd:element name="upDownBars" type="CT_UpDownBars" minOccurs="0" maxOccurs="1"/> + <xsd:element name="marker" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="smooth" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="axId" type="CT_UnsignedInt" minOccurs="2" maxOccurs="2"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Line3DChart"> + <xsd:sequence> + <xsd:group ref="EG_LineChartShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="gapDepth" type="CT_GapAmount" minOccurs="0" maxOccurs="1"/> + <xsd:element name="axId" type="CT_UnsignedInt" minOccurs="3" maxOccurs="3"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_StockChart"> + <xsd:sequence> + <xsd:element name="ser" type="CT_LineSer" minOccurs="3" maxOccurs="4"/> + <xsd:element name="dLbls" type="CT_DLbls" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dropLines" type="CT_ChartLines" minOccurs="0" maxOccurs="1"/> + <xsd:element name="hiLowLines" type="CT_ChartLines" minOccurs="0" maxOccurs="1"/> + <xsd:element name="upDownBars" type="CT_UpDownBars" minOccurs="0" maxOccurs="1"/> + <xsd:element name="axId" type="CT_UnsignedInt" minOccurs="2" maxOccurs="2"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_ScatterStyle"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="line"/> + <xsd:enumeration value="lineMarker"/> + <xsd:enumeration value="marker"/> + <xsd:enumeration value="smooth"/> + <xsd:enumeration value="smoothMarker"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_ScatterStyle"> + <xsd:attribute name="val" type="ST_ScatterStyle" default="marker"/> + </xsd:complexType> + <xsd:complexType name="CT_ScatterChart"> + <xsd:sequence> + <xsd:element name="scatterStyle" type="CT_ScatterStyle" minOccurs="1" maxOccurs="1"/> + <xsd:element name="varyColors" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ser" type="CT_ScatterSer" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="dLbls" type="CT_DLbls" minOccurs="0" maxOccurs="1"/> + <xsd:element name="axId" type="CT_UnsignedInt" minOccurs="2" maxOccurs="2"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_RadarStyle"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="standard"/> + <xsd:enumeration value="marker"/> + <xsd:enumeration value="filled"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_RadarStyle"> + <xsd:attribute name="val" type="ST_RadarStyle" default="standard"/> + </xsd:complexType> + <xsd:complexType name="CT_RadarChart"> + <xsd:sequence> + <xsd:element name="radarStyle" type="CT_RadarStyle" minOccurs="1" maxOccurs="1"/> + <xsd:element name="varyColors" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ser" type="CT_RadarSer" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="dLbls" type="CT_DLbls" minOccurs="0" maxOccurs="1"/> + <xsd:element name="axId" type="CT_UnsignedInt" minOccurs="2" maxOccurs="2"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_BarGrouping"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="percentStacked"/> + <xsd:enumeration value="clustered"/> + <xsd:enumeration value="standard"/> + <xsd:enumeration value="stacked"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_BarGrouping"> + <xsd:attribute name="val" type="ST_BarGrouping" default="clustered"/> + </xsd:complexType> + <xsd:simpleType name="ST_BarDir"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="bar"/> + <xsd:enumeration value="col"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_BarDir"> + <xsd:attribute name="val" type="ST_BarDir" default="col"/> + </xsd:complexType> + <xsd:simpleType name="ST_Shape"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="cone"/> + <xsd:enumeration value="coneToMax"/> + <xsd:enumeration value="box"/> + <xsd:enumeration value="cylinder"/> + <xsd:enumeration value="pyramid"/> + <xsd:enumeration value="pyramidToMax"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Shape"> + <xsd:attribute name="val" type="ST_Shape" default="box"/> + </xsd:complexType> + <xsd:group name="EG_BarChartShared"> + <xsd:sequence> + <xsd:element name="barDir" type="CT_BarDir" minOccurs="1" maxOccurs="1"/> + <xsd:element name="grouping" type="CT_BarGrouping" minOccurs="0" maxOccurs="1"/> + <xsd:element name="varyColors" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ser" type="CT_BarSer" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="dLbls" type="CT_DLbls" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_BarChart"> + <xsd:sequence> + <xsd:group ref="EG_BarChartShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="gapWidth" type="CT_GapAmount" minOccurs="0" maxOccurs="1"/> + <xsd:element name="overlap" type="CT_Overlap" minOccurs="0" maxOccurs="1"/> + <xsd:element name="serLines" type="CT_ChartLines" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="axId" type="CT_UnsignedInt" minOccurs="2" maxOccurs="2"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Bar3DChart"> + <xsd:sequence> + <xsd:group ref="EG_BarChartShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="gapWidth" type="CT_GapAmount" minOccurs="0" maxOccurs="1"/> + <xsd:element name="gapDepth" type="CT_GapAmount" minOccurs="0" maxOccurs="1"/> + <xsd:element name="shape" type="CT_Shape" minOccurs="0" maxOccurs="1"/> + <xsd:element name="axId" type="CT_UnsignedInt" minOccurs="2" maxOccurs="3"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_AreaChartShared"> + <xsd:sequence> + <xsd:element name="grouping" type="CT_Grouping" minOccurs="0" maxOccurs="1"/> + <xsd:element name="varyColors" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ser" type="CT_AreaSer" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="dLbls" type="CT_DLbls" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dropLines" type="CT_ChartLines" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_AreaChart"> + <xsd:sequence> + <xsd:group ref="EG_AreaChartShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="axId" type="CT_UnsignedInt" minOccurs="2" maxOccurs="2"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Area3DChart"> + <xsd:sequence> + <xsd:group ref="EG_AreaChartShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="gapDepth" type="CT_GapAmount" minOccurs="0" maxOccurs="1"/> + <xsd:element name="axId" type="CT_UnsignedInt" minOccurs="2" maxOccurs="3"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_PieChartShared"> + <xsd:sequence> + <xsd:element name="varyColors" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ser" type="CT_PieSer" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="dLbls" type="CT_DLbls" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_PieChart"> + <xsd:sequence> + <xsd:group ref="EG_PieChartShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="firstSliceAng" type="CT_FirstSliceAng" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Pie3DChart"> + <xsd:sequence> + <xsd:group ref="EG_PieChartShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DoughnutChart"> + <xsd:sequence> + <xsd:group ref="EG_PieChartShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="firstSliceAng" type="CT_FirstSliceAng" minOccurs="0" maxOccurs="1"/> + <xsd:element name="holeSize" type="CT_HoleSize" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_OfPieType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="pie"/> + <xsd:enumeration value="bar"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_OfPieType"> + <xsd:attribute name="val" type="ST_OfPieType" default="pie"/> + </xsd:complexType> + <xsd:complexType name="CT_OfPieChart"> + <xsd:sequence> + <xsd:element name="ofPieType" type="CT_OfPieType" minOccurs="1" maxOccurs="1"/> + <xsd:group ref="EG_PieChartShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="gapWidth" type="CT_GapAmount" minOccurs="0" maxOccurs="1"/> + <xsd:element name="splitType" type="CT_SplitType" minOccurs="0" maxOccurs="1"/> + <xsd:element name="splitPos" type="CT_Double" minOccurs="0" maxOccurs="1"/> + <xsd:element name="custSplit" type="CT_CustSplit" minOccurs="0" maxOccurs="1"/> + <xsd:element name="secondPieSize" type="CT_SecondPieSize" minOccurs="0" maxOccurs="1"/> + <xsd:element name="serLines" type="CT_ChartLines" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_BubbleChart"> + <xsd:sequence> + <xsd:element name="varyColors" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ser" type="CT_BubbleSer" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="dLbls" type="CT_DLbls" minOccurs="0" maxOccurs="1"/> + <xsd:element name="bubble3D" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="bubbleScale" type="CT_BubbleScale" minOccurs="0" maxOccurs="1"/> + <xsd:element name="showNegBubbles" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sizeRepresents" type="CT_SizeRepresents" minOccurs="0" maxOccurs="1"/> + <xsd:element name="axId" type="CT_UnsignedInt" minOccurs="2" maxOccurs="2"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_BandFmt"> + <xsd:sequence> + <xsd:element name="idx" type="CT_UnsignedInt" minOccurs="1" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_BandFmts"> + <xsd:sequence> + <xsd:element name="bandFmt" type="CT_BandFmt" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_SurfaceChartShared"> + <xsd:sequence> + <xsd:element name="wireframe" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ser" type="CT_SurfaceSer" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="bandFmts" type="CT_BandFmts" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_SurfaceChart"> + <xsd:sequence> + <xsd:group ref="EG_SurfaceChartShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="axId" type="CT_UnsignedInt" minOccurs="2" maxOccurs="3"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Surface3DChart"> + <xsd:sequence> + <xsd:group ref="EG_SurfaceChartShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="axId" type="CT_UnsignedInt" minOccurs="3" maxOccurs="3"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_AxPos"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="b"/> + <xsd:enumeration value="l"/> + <xsd:enumeration value="r"/> + <xsd:enumeration value="t"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_AxPos"> + <xsd:attribute name="val" type="ST_AxPos" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_Crosses"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="autoZero"/> + <xsd:enumeration value="max"/> + <xsd:enumeration value="min"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Crosses"> + <xsd:attribute name="val" type="ST_Crosses" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_CrossBetween"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="between"/> + <xsd:enumeration value="midCat"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_CrossBetween"> + <xsd:attribute name="val" type="ST_CrossBetween" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_TickMark"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="cross"/> + <xsd:enumeration value="in"/> + <xsd:enumeration value="none"/> + <xsd:enumeration value="out"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TickMark"> + <xsd:attribute name="val" type="ST_TickMark" default="cross"/> + </xsd:complexType> + <xsd:simpleType name="ST_TickLblPos"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="high"/> + <xsd:enumeration value="low"/> + <xsd:enumeration value="nextTo"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TickLblPos"> + <xsd:attribute name="val" type="ST_TickLblPos" default="nextTo"/> + </xsd:complexType> + <xsd:simpleType name="ST_Skip"> + <xsd:restriction base="xsd:unsignedInt"> + <xsd:minInclusive value="1"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Skip"> + <xsd:attribute name="val" type="ST_Skip" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_TimeUnit"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="days"/> + <xsd:enumeration value="months"/> + <xsd:enumeration value="years"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TimeUnit"> + <xsd:attribute name="val" type="ST_TimeUnit" default="days"/> + </xsd:complexType> + <xsd:simpleType name="ST_AxisUnit"> + <xsd:restriction base="xsd:double"> + <xsd:minExclusive value="0"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_AxisUnit"> + <xsd:attribute name="val" type="ST_AxisUnit" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_BuiltInUnit"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="hundreds"/> + <xsd:enumeration value="thousands"/> + <xsd:enumeration value="tenThousands"/> + <xsd:enumeration value="hundredThousands"/> + <xsd:enumeration value="millions"/> + <xsd:enumeration value="tenMillions"/> + <xsd:enumeration value="hundredMillions"/> + <xsd:enumeration value="billions"/> + <xsd:enumeration value="trillions"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_BuiltInUnit"> + <xsd:attribute name="val" type="ST_BuiltInUnit" default="thousands"/> + </xsd:complexType> + <xsd:simpleType name="ST_PictureFormat"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="stretch"/> + <xsd:enumeration value="stack"/> + <xsd:enumeration value="stackScale"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PictureFormat"> + <xsd:attribute name="val" type="ST_PictureFormat" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_PictureStackUnit"> + <xsd:restriction base="xsd:double"> + <xsd:minExclusive value="0"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PictureStackUnit"> + <xsd:attribute name="val" type="ST_PictureStackUnit" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_PictureOptions"> + <xsd:sequence> + <xsd:element name="applyToFront" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="applyToSides" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="applyToEnd" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pictureFormat" type="CT_PictureFormat" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pictureStackUnit" type="CT_PictureStackUnit" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DispUnitsLbl"> + <xsd:sequence> + <xsd:element name="layout" type="CT_Layout" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tx" type="CT_Tx" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txPr" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DispUnits"> + <xsd:sequence> + <xsd:choice> + <xsd:element name="custUnit" type="CT_Double" minOccurs="1" maxOccurs="1"/> + <xsd:element name="builtInUnit" type="CT_BuiltInUnit" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + <xsd:element name="dispUnitsLbl" type="CT_DispUnitsLbl" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_Orientation"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="maxMin"/> + <xsd:enumeration value="minMax"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Orientation"> + <xsd:attribute name="val" type="ST_Orientation" default="minMax"/> + </xsd:complexType> + <xsd:simpleType name="ST_LogBase"> + <xsd:restriction base="xsd:double"> + <xsd:minInclusive value="2"/> + <xsd:maxInclusive value="1000"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_LogBase"> + <xsd:attribute name="val" type="ST_LogBase" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Scaling"> + <xsd:sequence> + <xsd:element name="logBase" type="CT_LogBase" minOccurs="0" maxOccurs="1"/> + <xsd:element name="orientation" type="CT_Orientation" minOccurs="0" maxOccurs="1"/> + <xsd:element name="max" type="CT_Double" minOccurs="0" maxOccurs="1"/> + <xsd:element name="min" type="CT_Double" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_LblOffset"> + <xsd:union memberTypes="ST_LblOffsetPercent ST_LblOffsetUShort"/> + </xsd:simpleType> + <xsd:simpleType name="ST_LblOffsetPercent"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="0*(([0-9])|([1-9][0-9])|([1-9][0-9][0-9])|1000)%"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_LblOffsetUShort"> + <xsd:restriction base="xsd:unsignedShort"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="1000"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_LblOffset"> + <xsd:attribute name="val" type="ST_LblOffset" default="100%"/> + </xsd:complexType> + <xsd:group name="EG_AxShared"> + <xsd:sequence> + <xsd:element name="axId" type="CT_UnsignedInt" minOccurs="1" maxOccurs="1"/> + <xsd:element name="scaling" type="CT_Scaling" minOccurs="1" maxOccurs="1"/> + <xsd:element name="delete" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="axPos" type="CT_AxPos" minOccurs="1" maxOccurs="1"/> + <xsd:element name="majorGridlines" type="CT_ChartLines" minOccurs="0" maxOccurs="1"/> + <xsd:element name="minorGridlines" type="CT_ChartLines" minOccurs="0" maxOccurs="1"/> + <xsd:element name="title" type="CT_Title" minOccurs="0" maxOccurs="1"/> + <xsd:element name="numFmt" type="CT_NumFmt" minOccurs="0" maxOccurs="1"/> + <xsd:element name="majorTickMark" type="CT_TickMark" minOccurs="0" maxOccurs="1"/> + <xsd:element name="minorTickMark" type="CT_TickMark" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tickLblPos" type="CT_TickLblPos" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txPr" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/> + <xsd:element name="crossAx" type="CT_UnsignedInt" minOccurs="1" maxOccurs="1"/> + <xsd:choice minOccurs="0" maxOccurs="1"> + <xsd:element name="crosses" type="CT_Crosses" minOccurs="1" maxOccurs="1"/> + <xsd:element name="crossesAt" type="CT_Double" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_CatAx"> + <xsd:sequence> + <xsd:group ref="EG_AxShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="auto" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lblAlgn" type="CT_LblAlgn" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lblOffset" type="CT_LblOffset" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tickLblSkip" type="CT_Skip" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tickMarkSkip" type="CT_Skip" minOccurs="0" maxOccurs="1"/> + <xsd:element name="noMultiLvlLbl" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DateAx"> + <xsd:sequence> + <xsd:group ref="EG_AxShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="auto" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lblOffset" type="CT_LblOffset" minOccurs="0" maxOccurs="1"/> + <xsd:element name="baseTimeUnit" type="CT_TimeUnit" minOccurs="0" maxOccurs="1"/> + <xsd:element name="majorUnit" type="CT_AxisUnit" minOccurs="0" maxOccurs="1"/> + <xsd:element name="majorTimeUnit" type="CT_TimeUnit" minOccurs="0" maxOccurs="1"/> + <xsd:element name="minorUnit" type="CT_AxisUnit" minOccurs="0" maxOccurs="1"/> + <xsd:element name="minorTimeUnit" type="CT_TimeUnit" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SerAx"> + <xsd:sequence> + <xsd:group ref="EG_AxShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="tickLblSkip" type="CT_Skip" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tickMarkSkip" type="CT_Skip" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ValAx"> + <xsd:sequence> + <xsd:group ref="EG_AxShared" minOccurs="1" maxOccurs="1"/> + <xsd:element name="crossBetween" type="CT_CrossBetween" minOccurs="0" maxOccurs="1"/> + <xsd:element name="majorUnit" type="CT_AxisUnit" minOccurs="0" maxOccurs="1"/> + <xsd:element name="minorUnit" type="CT_AxisUnit" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dispUnits" type="CT_DispUnits" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_PlotArea"> + <xsd:sequence> + <xsd:element name="layout" type="CT_Layout" minOccurs="0" maxOccurs="1"/> + <xsd:choice minOccurs="1" maxOccurs="unbounded"> + <xsd:element name="areaChart" type="CT_AreaChart" minOccurs="1" maxOccurs="1"/> + <xsd:element name="area3DChart" type="CT_Area3DChart" minOccurs="1" maxOccurs="1"/> + <xsd:element name="lineChart" type="CT_LineChart" minOccurs="1" maxOccurs="1"/> + <xsd:element name="line3DChart" type="CT_Line3DChart" minOccurs="1" maxOccurs="1"/> + <xsd:element name="stockChart" type="CT_StockChart" minOccurs="1" maxOccurs="1"/> + <xsd:element name="radarChart" type="CT_RadarChart" minOccurs="1" maxOccurs="1"/> + <xsd:element name="scatterChart" type="CT_ScatterChart" minOccurs="1" maxOccurs="1"/> + <xsd:element name="pieChart" type="CT_PieChart" minOccurs="1" maxOccurs="1"/> + <xsd:element name="pie3DChart" type="CT_Pie3DChart" minOccurs="1" maxOccurs="1"/> + <xsd:element name="doughnutChart" type="CT_DoughnutChart" minOccurs="1" maxOccurs="1"/> + <xsd:element name="barChart" type="CT_BarChart" minOccurs="1" maxOccurs="1"/> + <xsd:element name="bar3DChart" type="CT_Bar3DChart" minOccurs="1" maxOccurs="1"/> + <xsd:element name="ofPieChart" type="CT_OfPieChart" minOccurs="1" maxOccurs="1"/> + <xsd:element name="surfaceChart" type="CT_SurfaceChart" minOccurs="1" maxOccurs="1"/> + <xsd:element name="surface3DChart" type="CT_Surface3DChart" minOccurs="1" maxOccurs="1"/> + <xsd:element name="bubbleChart" type="CT_BubbleChart" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="valAx" type="CT_ValAx" minOccurs="1" maxOccurs="1"/> + <xsd:element name="catAx" type="CT_CatAx" minOccurs="1" maxOccurs="1"/> + <xsd:element name="dateAx" type="CT_DateAx" minOccurs="1" maxOccurs="1"/> + <xsd:element name="serAx" type="CT_SerAx" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + <xsd:element name="dTable" type="CT_DTable" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_PivotFmt"> + <xsd:sequence> + <xsd:element name="idx" type="CT_UnsignedInt" minOccurs="1" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txPr" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/> + <xsd:element name="marker" type="CT_Marker" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dLbl" type="CT_DLbl" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_PivotFmts"> + <xsd:sequence> + <xsd:element name="pivotFmt" type="CT_PivotFmt" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_LegendPos"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="b"/> + <xsd:enumeration value="tr"/> + <xsd:enumeration value="l"/> + <xsd:enumeration value="r"/> + <xsd:enumeration value="t"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_LegendPos"> + <xsd:attribute name="val" type="ST_LegendPos" default="r"/> + </xsd:complexType> + <xsd:group name="EG_LegendEntryData"> + <xsd:sequence> + <xsd:element name="txPr" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_LegendEntry"> + <xsd:sequence> + <xsd:element name="idx" type="CT_UnsignedInt" minOccurs="1" maxOccurs="1"/> + <xsd:choice> + <xsd:element name="delete" type="CT_Boolean" minOccurs="1" maxOccurs="1"/> + <xsd:group ref="EG_LegendEntryData" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Legend"> + <xsd:sequence> + <xsd:element name="legendPos" type="CT_LegendPos" minOccurs="0" maxOccurs="1"/> + <xsd:element name="legendEntry" type="CT_LegendEntry" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="layout" type="CT_Layout" minOccurs="0" maxOccurs="1"/> + <xsd:element name="overlay" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txPr" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_DispBlanksAs"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="span"/> + <xsd:enumeration value="gap"/> + <xsd:enumeration value="zero"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_DispBlanksAs"> + <xsd:attribute name="val" type="ST_DispBlanksAs" default="zero"/> + </xsd:complexType> + <xsd:complexType name="CT_Chart"> + <xsd:sequence> + <xsd:element name="title" type="CT_Title" minOccurs="0" maxOccurs="1"/> + <xsd:element name="autoTitleDeleted" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pivotFmts" type="CT_PivotFmts" minOccurs="0" maxOccurs="1"/> + <xsd:element name="view3D" type="CT_View3D" minOccurs="0" maxOccurs="1"/> + <xsd:element name="floor" type="CT_Surface" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sideWall" type="CT_Surface" minOccurs="0" maxOccurs="1"/> + <xsd:element name="backWall" type="CT_Surface" minOccurs="0" maxOccurs="1"/> + <xsd:element name="plotArea" type="CT_PlotArea" minOccurs="1" maxOccurs="1"/> + <xsd:element name="legend" type="CT_Legend" minOccurs="0" maxOccurs="1"/> + <xsd:element name="plotVisOnly" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dispBlanksAs" type="CT_DispBlanksAs" minOccurs="0" maxOccurs="1"/> + <xsd:element name="showDLblsOverMax" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_Style"> + <xsd:restriction base="xsd:unsignedByte"> + <xsd:minInclusive value="1"/> + <xsd:maxInclusive value="48"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Style"> + <xsd:attribute name="val" type="ST_Style" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_PivotSource"> + <xsd:sequence> + <xsd:element name="name" type="s:ST_Xstring" minOccurs="1" maxOccurs="1"/> + <xsd:element name="fmtId" type="CT_UnsignedInt" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Protection"> + <xsd:sequence> + <xsd:element name="chartObject" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="data" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="formatting" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="selection" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="userInterface" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_HeaderFooter"> + <xsd:sequence> + <xsd:element name="oddHeader" type="s:ST_Xstring" minOccurs="0" maxOccurs="1"/> + <xsd:element name="oddFooter" type="s:ST_Xstring" minOccurs="0" maxOccurs="1"/> + <xsd:element name="evenHeader" type="s:ST_Xstring" minOccurs="0" maxOccurs="1"/> + <xsd:element name="evenFooter" type="s:ST_Xstring" minOccurs="0" maxOccurs="1"/> + <xsd:element name="firstHeader" type="s:ST_Xstring" minOccurs="0" maxOccurs="1"/> + <xsd:element name="firstFooter" type="s:ST_Xstring" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="alignWithMargins" type="xsd:boolean" default="true"/> + <xsd:attribute name="differentOddEven" type="xsd:boolean" default="false"/> + <xsd:attribute name="differentFirst" type="xsd:boolean" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_PageMargins"> + <xsd:attribute name="l" type="xsd:double" use="required"/> + <xsd:attribute name="r" type="xsd:double" use="required"/> + <xsd:attribute name="t" type="xsd:double" use="required"/> + <xsd:attribute name="b" type="xsd:double" use="required"/> + <xsd:attribute name="header" type="xsd:double" use="required"/> + <xsd:attribute name="footer" type="xsd:double" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_PageSetupOrientation"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="default"/> + <xsd:enumeration value="portrait"/> + <xsd:enumeration value="landscape"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_ExternalData"> + <xsd:sequence> + <xsd:element name="autoUpdate" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_PageSetup"> + <xsd:attribute name="paperSize" type="xsd:unsignedInt" use="optional" default="1"/> + <xsd:attribute name="paperHeight" type="s:ST_PositiveUniversalMeasure" use="optional"/> + <xsd:attribute name="paperWidth" type="s:ST_PositiveUniversalMeasure" use="optional"/> + <xsd:attribute name="firstPageNumber" type="xsd:unsignedInt" use="optional" default="1"/> + <xsd:attribute name="orientation" type="ST_PageSetupOrientation" use="optional" + default="default"/> + <xsd:attribute name="blackAndWhite" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="draft" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="useFirstPageNumber" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="horizontalDpi" type="xsd:int" use="optional" default="600"/> + <xsd:attribute name="verticalDpi" type="xsd:int" use="optional" default="600"/> + <xsd:attribute name="copies" type="xsd:unsignedInt" use="optional" default="1"/> + </xsd:complexType> + <xsd:complexType name="CT_PrintSettings"> + <xsd:sequence> + <xsd:element name="headerFooter" type="CT_HeaderFooter" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pageMargins" type="CT_PageMargins" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pageSetup" type="CT_PageSetup" minOccurs="0" maxOccurs="1"/> + <xsd:element name="legacyDrawingHF" type="CT_RelId" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ChartSpace"> + <xsd:sequence> + <xsd:element name="date1904" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lang" type="CT_TextLanguageID" minOccurs="0" maxOccurs="1"/> + <xsd:element name="roundedCorners" type="CT_Boolean" minOccurs="0" maxOccurs="1"/> + <xsd:element name="style" type="CT_Style" minOccurs="0" maxOccurs="1"/> + <xsd:element name="clrMapOvr" type="a:CT_ColorMapping" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pivotSource" type="CT_PivotSource" minOccurs="0" maxOccurs="1"/> + <xsd:element name="protection" type="CT_Protection" minOccurs="0" maxOccurs="1"/> + <xsd:element name="chart" type="CT_Chart" minOccurs="1" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txPr" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/> + <xsd:element name="externalData" type="CT_ExternalData" minOccurs="0" maxOccurs="1"/> + <xsd:element name="printSettings" type="CT_PrintSettings" minOccurs="0" maxOccurs="1"/> + <xsd:element name="userShapes" type="CT_RelId" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="chartSpace" type="CT_ChartSpace"/> + <xsd:element name="userShapes" type="cdr:CT_Drawing"/> + <xsd:element name="chart" type="CT_RelId"/> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd new file mode 100644 index 0000000..afa4f46 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" + xmlns="http://schemas.openxmlformats.org/drawingml/2006/chartDrawing" + targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/chartDrawing" + elementFormDefault="qualified"> + <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main" + schemaLocation="dml-main.xsd"/> + <xsd:complexType name="CT_ShapeNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvSpPr" type="a:CT_NonVisualDrawingShapeProps" minOccurs="1" maxOccurs="1" + /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Shape"> + <xsd:sequence> + <xsd:element name="nvSpPr" type="CT_ShapeNonVisual" minOccurs="1" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txBody" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="macro" type="xsd:string" use="optional"/> + <xsd:attribute name="textlink" type="xsd:string" use="optional"/> + <xsd:attribute name="fLocksText" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_ConnectorNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvCxnSpPr" type="a:CT_NonVisualConnectorProperties" minOccurs="1" + maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Connector"> + <xsd:sequence> + <xsd:element name="nvCxnSpPr" type="CT_ConnectorNonVisual" minOccurs="1" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="macro" type="xsd:string" use="optional"/> + <xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_PictureNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvPicPr" type="a:CT_NonVisualPictureProperties" minOccurs="1" + maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Picture"> + <xsd:sequence> + <xsd:element name="nvPicPr" type="CT_PictureNonVisual" minOccurs="1" maxOccurs="1"/> + <xsd:element name="blipFill" type="a:CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="macro" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_GraphicFrameNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvGraphicFramePr" type="a:CT_NonVisualGraphicFrameProperties" + minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GraphicFrame"> + <xsd:sequence> + <xsd:element name="nvGraphicFramePr" type="CT_GraphicFrameNonVisual" minOccurs="1" + maxOccurs="1"/> + <xsd:element name="xfrm" type="a:CT_Transform2D" minOccurs="1" maxOccurs="1"/> + <xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="macro" type="xsd:string" use="optional"/> + <xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_GroupShapeNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvGrpSpPr" type="a:CT_NonVisualGroupDrawingShapeProps" minOccurs="1" + maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GroupShape"> + <xsd:sequence> + <xsd:element name="nvGrpSpPr" type="CT_GroupShapeNonVisual" minOccurs="1" maxOccurs="1"/> + <xsd:element name="grpSpPr" type="a:CT_GroupShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="sp" type="CT_Shape"/> + <xsd:element name="grpSp" type="CT_GroupShape"/> + <xsd:element name="graphicFrame" type="CT_GraphicFrame"/> + <xsd:element name="cxnSp" type="CT_Connector"/> + <xsd:element name="pic" type="CT_Picture"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_ObjectChoices"> + <xsd:sequence> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="sp" type="CT_Shape"/> + <xsd:element name="grpSp" type="CT_GroupShape"/> + <xsd:element name="graphicFrame" type="CT_GraphicFrame"/> + <xsd:element name="cxnSp" type="CT_Connector"/> + <xsd:element name="pic" type="CT_Picture"/> + </xsd:choice> + </xsd:sequence> + </xsd:group> + <xsd:simpleType name="ST_MarkerCoordinate"> + <xsd:restriction base="xsd:double"> + <xsd:minInclusive value="0.0"/> + <xsd:maxInclusive value="1.0"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Marker"> + <xsd:sequence> + <xsd:element name="x" type="ST_MarkerCoordinate" minOccurs="1" maxOccurs="1"/> + <xsd:element name="y" type="ST_MarkerCoordinate" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_RelSizeAnchor"> + <xsd:sequence> + <xsd:element name="from" type="CT_Marker"/> + <xsd:element name="to" type="CT_Marker"/> + <xsd:group ref="EG_ObjectChoices"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_AbsSizeAnchor"> + <xsd:sequence> + <xsd:element name="from" type="CT_Marker"/> + <xsd:element name="ext" type="a:CT_PositiveSize2D"/> + <xsd:group ref="EG_ObjectChoices"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_Anchor"> + <xsd:choice> + <xsd:element name="relSizeAnchor" type="CT_RelSizeAnchor"/> + <xsd:element name="absSizeAnchor" type="CT_AbsSizeAnchor"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_Drawing"> + <xsd:sequence> + <xsd:group ref="EG_Anchor" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd new file mode 100644 index 0000000..64e66b8 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd @@ -0,0 +1,1085 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="http://schemas.openxmlformats.org/drawingml/2006/diagram" + xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/diagram" + elementFormDefault="qualified" attributeFormDefault="unqualified"> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + schemaLocation="shared-relationshipReference.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main" + schemaLocation="dml-main.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + schemaLocation="shared-commonSimpleTypes.xsd"/> + <xsd:complexType name="CT_CTName"> + <xsd:attribute name="lang" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="val" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_CTDescription"> + <xsd:attribute name="lang" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="val" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_CTCategory"> + <xsd:attribute name="type" type="xsd:anyURI" use="required"/> + <xsd:attribute name="pri" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_CTCategories"> + <xsd:sequence minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="cat" type="CT_CTCategory" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_ClrAppMethod"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="span"/> + <xsd:enumeration value="cycle"/> + <xsd:enumeration value="repeat"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_HueDir"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="cw"/> + <xsd:enumeration value="ccw"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Colors"> + <xsd:sequence> + <xsd:group ref="a:EG_ColorChoice" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="meth" type="ST_ClrAppMethod" use="optional" default="span"/> + <xsd:attribute name="hueDir" type="ST_HueDir" use="optional" default="cw"/> + </xsd:complexType> + <xsd:complexType name="CT_CTStyleLabel"> + <xsd:sequence> + <xsd:element name="fillClrLst" type="CT_Colors" minOccurs="0" maxOccurs="1"/> + <xsd:element name="linClrLst" type="CT_Colors" minOccurs="0" maxOccurs="1"/> + <xsd:element name="effectClrLst" type="CT_Colors" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txLinClrLst" type="CT_Colors" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txFillClrLst" type="CT_Colors" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txEffectClrLst" type="CT_Colors" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_ColorTransform"> + <xsd:sequence> + <xsd:element name="title" type="CT_CTName" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="desc" type="CT_CTDescription" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="catLst" type="CT_CTCategories" minOccurs="0"/> + <xsd:element name="styleLbl" type="CT_CTStyleLabel" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="uniqueId" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="minVer" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:element name="colorsDef" type="CT_ColorTransform"/> + <xsd:complexType name="CT_ColorTransformHeader"> + <xsd:sequence> + <xsd:element name="title" type="CT_CTName" minOccurs="1" maxOccurs="unbounded"/> + <xsd:element name="desc" type="CT_CTDescription" minOccurs="1" maxOccurs="unbounded"/> + <xsd:element name="catLst" type="CT_CTCategories" minOccurs="0"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="uniqueId" type="xsd:string" use="required"/> + <xsd:attribute name="minVer" type="xsd:string" use="optional"/> + <xsd:attribute name="resId" type="xsd:int" use="optional" default="0"/> + </xsd:complexType> + <xsd:element name="colorsDefHdr" type="CT_ColorTransformHeader"/> + <xsd:complexType name="CT_ColorTransformHeaderLst"> + <xsd:sequence> + <xsd:element name="colorsDefHdr" type="CT_ColorTransformHeader" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="colorsDefHdrLst" type="CT_ColorTransformHeaderLst"/> + <xsd:simpleType name="ST_PtType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="node"/> + <xsd:enumeration value="asst"/> + <xsd:enumeration value="doc"/> + <xsd:enumeration value="pres"/> + <xsd:enumeration value="parTrans"/> + <xsd:enumeration value="sibTrans"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Pt"> + <xsd:sequence> + <xsd:element name="prSet" type="CT_ElemPropSet" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="t" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="modelId" type="ST_ModelId" use="required"/> + <xsd:attribute name="type" type="ST_PtType" use="optional" default="node"/> + <xsd:attribute name="cxnId" type="ST_ModelId" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_PtList"> + <xsd:sequence> + <xsd:element name="pt" type="CT_Pt" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_CxnType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="parOf"/> + <xsd:enumeration value="presOf"/> + <xsd:enumeration value="presParOf"/> + <xsd:enumeration value="unknownRelationship"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Cxn"> + <xsd:sequence> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="modelId" type="ST_ModelId" use="required"/> + <xsd:attribute name="type" type="ST_CxnType" use="optional" default="parOf"/> + <xsd:attribute name="srcId" type="ST_ModelId" use="required"/> + <xsd:attribute name="destId" type="ST_ModelId" use="required"/> + <xsd:attribute name="srcOrd" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="destOrd" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="parTransId" type="ST_ModelId" use="optional" default="0"/> + <xsd:attribute name="sibTransId" type="ST_ModelId" use="optional" default="0"/> + <xsd:attribute name="presId" type="xsd:string" use="optional" default=""/> + </xsd:complexType> + <xsd:complexType name="CT_CxnList"> + <xsd:sequence> + <xsd:element name="cxn" type="CT_Cxn" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DataModel"> + <xsd:sequence> + <xsd:element name="ptLst" type="CT_PtList"/> + <xsd:element name="cxnLst" type="CT_CxnList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="bg" type="a:CT_BackgroundFormatting" minOccurs="0"/> + <xsd:element name="whole" type="a:CT_WholeE2oFormatting" minOccurs="0"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="dataModel" type="CT_DataModel"/> + <xsd:attributeGroup name="AG_IteratorAttributes"> + <xsd:attribute name="axis" type="ST_AxisTypes" use="optional" default="none"/> + <xsd:attribute name="ptType" type="ST_ElementTypes" use="optional" default="all"/> + <xsd:attribute name="hideLastTrans" type="ST_Booleans" use="optional" default="true"/> + <xsd:attribute name="st" type="ST_Ints" use="optional" default="1"/> + <xsd:attribute name="cnt" type="ST_UnsignedInts" use="optional" default="0"/> + <xsd:attribute name="step" type="ST_Ints" use="optional" default="1"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_ConstraintAttributes"> + <xsd:attribute name="type" type="ST_ConstraintType" use="required"/> + <xsd:attribute name="for" type="ST_ConstraintRelationship" use="optional" default="self"/> + <xsd:attribute name="forName" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="ptType" type="ST_ElementType" use="optional" default="all"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_ConstraintRefAttributes"> + <xsd:attribute name="refType" type="ST_ConstraintType" use="optional" default="none"/> + <xsd:attribute name="refFor" type="ST_ConstraintRelationship" use="optional" default="self"/> + <xsd:attribute name="refForName" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="refPtType" type="ST_ElementType" use="optional" default="all"/> + </xsd:attributeGroup> + <xsd:complexType name="CT_Constraint"> + <xsd:sequence> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_ConstraintAttributes"/> + <xsd:attributeGroup ref="AG_ConstraintRefAttributes"/> + <xsd:attribute name="op" type="ST_BoolOperator" use="optional" default="none"/> + <xsd:attribute name="val" type="xsd:double" use="optional" default="0"/> + <xsd:attribute name="fact" type="xsd:double" use="optional" default="1"/> + </xsd:complexType> + <xsd:complexType name="CT_Constraints"> + <xsd:sequence> + <xsd:element name="constr" type="CT_Constraint" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_NumericRule"> + <xsd:sequence> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_ConstraintAttributes"/> + <xsd:attribute name="val" type="xsd:double" use="optional" default="NaN"/> + <xsd:attribute name="fact" type="xsd:double" use="optional" default="NaN"/> + <xsd:attribute name="max" type="xsd:double" use="optional" default="NaN"/> + </xsd:complexType> + <xsd:complexType name="CT_Rules"> + <xsd:sequence> + <xsd:element name="rule" type="CT_NumericRule" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_PresentationOf"> + <xsd:sequence> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_IteratorAttributes"/> + </xsd:complexType> + <xsd:simpleType name="ST_LayoutShapeType" final="restriction"> + <xsd:union memberTypes="a:ST_ShapeType ST_OutputShapeType"/> + </xsd:simpleType> + <xsd:simpleType name="ST_Index1"> + <xsd:restriction base="xsd:unsignedInt"> + <xsd:minInclusive value="1"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Adj"> + <xsd:attribute name="idx" type="ST_Index1" use="required"/> + <xsd:attribute name="val" type="xsd:double" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_AdjLst"> + <xsd:sequence> + <xsd:element name="adj" type="CT_Adj" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Shape"> + <xsd:sequence> + <xsd:element name="adjLst" type="CT_AdjLst" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="rot" type="xsd:double" use="optional" default="0"/> + <xsd:attribute name="type" type="ST_LayoutShapeType" use="optional" default="none"/> + <xsd:attribute ref="r:blip" use="optional"/> + <xsd:attribute name="zOrderOff" type="xsd:int" use="optional" default="0"/> + <xsd:attribute name="hideGeom" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="lkTxEntry" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="blipPhldr" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_Parameter"> + <xsd:attribute name="type" type="ST_ParameterId" use="required"/> + <xsd:attribute name="val" type="ST_ParameterVal" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Algorithm"> + <xsd:sequence> + <xsd:element name="param" type="CT_Parameter" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="type" type="ST_AlgorithmType" use="required"/> + <xsd:attribute name="rev" type="xsd:unsignedInt" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_LayoutNode"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="alg" type="CT_Algorithm" minOccurs="0" maxOccurs="1"/> + <xsd:element name="shape" type="CT_Shape" minOccurs="0" maxOccurs="1"/> + <xsd:element name="presOf" type="CT_PresentationOf" minOccurs="0" maxOccurs="1"/> + <xsd:element name="constrLst" type="CT_Constraints" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ruleLst" type="CT_Rules" minOccurs="0" maxOccurs="1"/> + <xsd:element name="varLst" type="CT_LayoutVariablePropertySet" minOccurs="0" maxOccurs="1"/> + <xsd:element name="forEach" type="CT_ForEach"/> + <xsd:element name="layoutNode" type="CT_LayoutNode"/> + <xsd:element name="choose" type="CT_Choose"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:choice> + <xsd:attribute name="name" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="styleLbl" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="chOrder" type="ST_ChildOrderType" use="optional" default="b"/> + <xsd:attribute name="moveWith" type="xsd:string" use="optional" default=""/> + </xsd:complexType> + <xsd:complexType name="CT_ForEach"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="alg" type="CT_Algorithm" minOccurs="0" maxOccurs="1"/> + <xsd:element name="shape" type="CT_Shape" minOccurs="0" maxOccurs="1"/> + <xsd:element name="presOf" type="CT_PresentationOf" minOccurs="0" maxOccurs="1"/> + <xsd:element name="constrLst" type="CT_Constraints" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ruleLst" type="CT_Rules" minOccurs="0" maxOccurs="1"/> + <xsd:element name="forEach" type="CT_ForEach"/> + <xsd:element name="layoutNode" type="CT_LayoutNode"/> + <xsd:element name="choose" type="CT_Choose"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:choice> + <xsd:attribute name="name" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="ref" type="xsd:string" use="optional" default=""/> + <xsd:attributeGroup ref="AG_IteratorAttributes"/> + </xsd:complexType> + <xsd:complexType name="CT_When"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="alg" type="CT_Algorithm" minOccurs="0" maxOccurs="1"/> + <xsd:element name="shape" type="CT_Shape" minOccurs="0" maxOccurs="1"/> + <xsd:element name="presOf" type="CT_PresentationOf" minOccurs="0" maxOccurs="1"/> + <xsd:element name="constrLst" type="CT_Constraints" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ruleLst" type="CT_Rules" minOccurs="0" maxOccurs="1"/> + <xsd:element name="forEach" type="CT_ForEach"/> + <xsd:element name="layoutNode" type="CT_LayoutNode"/> + <xsd:element name="choose" type="CT_Choose"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:choice> + <xsd:attribute name="name" type="xsd:string" use="optional" default=""/> + <xsd:attributeGroup ref="AG_IteratorAttributes"/> + <xsd:attribute name="func" type="ST_FunctionType" use="required"/> + <xsd:attribute name="arg" type="ST_FunctionArgument" use="optional" default="none"/> + <xsd:attribute name="op" type="ST_FunctionOperator" use="required"/> + <xsd:attribute name="val" type="ST_FunctionValue" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Otherwise"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="alg" type="CT_Algorithm" minOccurs="0" maxOccurs="1"/> + <xsd:element name="shape" type="CT_Shape" minOccurs="0" maxOccurs="1"/> + <xsd:element name="presOf" type="CT_PresentationOf" minOccurs="0" maxOccurs="1"/> + <xsd:element name="constrLst" type="CT_Constraints" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ruleLst" type="CT_Rules" minOccurs="0" maxOccurs="1"/> + <xsd:element name="forEach" type="CT_ForEach"/> + <xsd:element name="layoutNode" type="CT_LayoutNode"/> + <xsd:element name="choose" type="CT_Choose"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:choice> + <xsd:attribute name="name" type="xsd:string" use="optional" default=""/> + </xsd:complexType> + <xsd:complexType name="CT_Choose"> + <xsd:sequence> + <xsd:element name="if" type="CT_When" maxOccurs="unbounded"/> + <xsd:element name="else" type="CT_Otherwise" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="optional" default=""/> + </xsd:complexType> + <xsd:complexType name="CT_SampleData"> + <xsd:sequence> + <xsd:element name="dataModel" type="CT_DataModel" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="useDef" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_Category"> + <xsd:attribute name="type" type="xsd:anyURI" use="required"/> + <xsd:attribute name="pri" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Categories"> + <xsd:sequence> + <xsd:element name="cat" type="CT_Category" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Name"> + <xsd:attribute name="lang" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="val" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Description"> + <xsd:attribute name="lang" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="val" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_DiagramDefinition"> + <xsd:sequence> + <xsd:element name="title" type="CT_Name" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="desc" type="CT_Description" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="catLst" type="CT_Categories" minOccurs="0"/> + <xsd:element name="sampData" type="CT_SampleData" minOccurs="0"/> + <xsd:element name="styleData" type="CT_SampleData" minOccurs="0"/> + <xsd:element name="clrData" type="CT_SampleData" minOccurs="0"/> + <xsd:element name="layoutNode" type="CT_LayoutNode"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="uniqueId" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="minVer" type="xsd:string" use="optional"/> + <xsd:attribute name="defStyle" type="xsd:string" use="optional" default=""/> + </xsd:complexType> + <xsd:element name="layoutDef" type="CT_DiagramDefinition"/> + <xsd:complexType name="CT_DiagramDefinitionHeader"> + <xsd:sequence> + <xsd:element name="title" type="CT_Name" minOccurs="1" maxOccurs="unbounded"/> + <xsd:element name="desc" type="CT_Description" minOccurs="1" maxOccurs="unbounded"/> + <xsd:element name="catLst" type="CT_Categories" minOccurs="0"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="uniqueId" type="xsd:string" use="required"/> + <xsd:attribute name="minVer" type="xsd:string" use="optional"/> + <xsd:attribute name="defStyle" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="resId" type="xsd:int" use="optional" default="0"/> + </xsd:complexType> + <xsd:element name="layoutDefHdr" type="CT_DiagramDefinitionHeader"/> + <xsd:complexType name="CT_DiagramDefinitionHeaderLst"> + <xsd:sequence> + <xsd:element name="layoutDefHdr" type="CT_DiagramDefinitionHeader" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="layoutDefHdrLst" type="CT_DiagramDefinitionHeaderLst"/> + <xsd:complexType name="CT_RelIds"> + <xsd:attribute ref="r:dm" use="required"/> + <xsd:attribute ref="r:lo" use="required"/> + <xsd:attribute ref="r:qs" use="required"/> + <xsd:attribute ref="r:cs" use="required"/> + </xsd:complexType> + <xsd:element name="relIds" type="CT_RelIds"/> + <xsd:simpleType name="ST_ParameterVal"> + <xsd:union + memberTypes="ST_DiagramHorizontalAlignment ST_VerticalAlignment ST_ChildDirection ST_ChildAlignment ST_SecondaryChildAlignment ST_LinearDirection ST_SecondaryLinearDirection ST_StartingElement ST_BendPoint ST_ConnectorRouting ST_ArrowheadStyle ST_ConnectorDimension ST_RotationPath ST_CenterShapeMapping ST_NodeHorizontalAlignment ST_NodeVerticalAlignment ST_FallbackDimension ST_TextDirection ST_PyramidAccentPosition ST_PyramidAccentTextMargin ST_TextBlockDirection ST_TextAnchorHorizontal ST_TextAnchorVertical ST_DiagramTextAlignment ST_AutoTextRotation ST_GrowDirection ST_FlowDirection ST_ContinueDirection ST_Breakpoint ST_Offset ST_HierarchyAlignment xsd:int xsd:double xsd:boolean xsd:string ST_ConnectorPoint" + /> + </xsd:simpleType> + <xsd:simpleType name="ST_ModelId"> + <xsd:union memberTypes="xsd:int s:ST_Guid"/> + </xsd:simpleType> + <xsd:simpleType name="ST_PrSetCustVal"> + <xsd:union memberTypes="s:ST_Percentage xsd:int"/> + </xsd:simpleType> + <xsd:complexType name="CT_ElemPropSet"> + <xsd:sequence> + <xsd:element name="presLayoutVars" type="CT_LayoutVariablePropertySet" minOccurs="0" + maxOccurs="1"/> + <xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="presAssocID" type="ST_ModelId" use="optional"/> + <xsd:attribute name="presName" type="xsd:string" use="optional"/> + <xsd:attribute name="presStyleLbl" type="xsd:string" use="optional"/> + <xsd:attribute name="presStyleIdx" type="xsd:int" use="optional"/> + <xsd:attribute name="presStyleCnt" type="xsd:int" use="optional"/> + <xsd:attribute name="loTypeId" type="xsd:string" use="optional"/> + <xsd:attribute name="loCatId" type="xsd:string" use="optional"/> + <xsd:attribute name="qsTypeId" type="xsd:string" use="optional"/> + <xsd:attribute name="qsCatId" type="xsd:string" use="optional"/> + <xsd:attribute name="csTypeId" type="xsd:string" use="optional"/> + <xsd:attribute name="csCatId" type="xsd:string" use="optional"/> + <xsd:attribute name="coherent3DOff" type="xsd:boolean" use="optional"/> + <xsd:attribute name="phldrT" type="xsd:string" use="optional"/> + <xsd:attribute name="phldr" type="xsd:boolean" use="optional"/> + <xsd:attribute name="custAng" type="xsd:int" use="optional"/> + <xsd:attribute name="custFlipVert" type="xsd:boolean" use="optional"/> + <xsd:attribute name="custFlipHor" type="xsd:boolean" use="optional"/> + <xsd:attribute name="custSzX" type="xsd:int" use="optional"/> + <xsd:attribute name="custSzY" type="xsd:int" use="optional"/> + <xsd:attribute name="custScaleX" type="ST_PrSetCustVal" use="optional"/> + <xsd:attribute name="custScaleY" type="ST_PrSetCustVal" use="optional"/> + <xsd:attribute name="custT" type="xsd:boolean" use="optional"/> + <xsd:attribute name="custLinFactX" type="ST_PrSetCustVal" use="optional"/> + <xsd:attribute name="custLinFactY" type="ST_PrSetCustVal" use="optional"/> + <xsd:attribute name="custLinFactNeighborX" type="ST_PrSetCustVal" use="optional"/> + <xsd:attribute name="custLinFactNeighborY" type="ST_PrSetCustVal" use="optional"/> + <xsd:attribute name="custRadScaleRad" type="ST_PrSetCustVal" use="optional"/> + <xsd:attribute name="custRadScaleInc" type="ST_PrSetCustVal" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_Direction" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="norm"/> + <xsd:enumeration value="rev"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_HierBranchStyle" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="l"/> + <xsd:enumeration value="r"/> + <xsd:enumeration value="hang"/> + <xsd:enumeration value="std"/> + <xsd:enumeration value="init"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_AnimOneStr" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="one"/> + <xsd:enumeration value="branch"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_AnimLvlStr" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="lvl"/> + <xsd:enumeration value="ctr"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_OrgChart"> + <xsd:attribute name="val" type="xsd:boolean" default="false" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_NodeCount"> + <xsd:restriction base="xsd:int"> + <xsd:minInclusive value="-1"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_ChildMax"> + <xsd:attribute name="val" type="ST_NodeCount" default="-1" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_ChildPref"> + <xsd:attribute name="val" type="ST_NodeCount" default="-1" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_BulletEnabled"> + <xsd:attribute name="val" type="xsd:boolean" default="false" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Direction"> + <xsd:attribute name="val" type="ST_Direction" default="norm" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_HierBranchStyle"> + <xsd:attribute name="val" type="ST_HierBranchStyle" default="std" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_AnimOne"> + <xsd:attribute name="val" type="ST_AnimOneStr" default="one" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_AnimLvl"> + <xsd:attribute name="val" type="ST_AnimLvlStr" default="none" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_ResizeHandlesStr" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="exact"/> + <xsd:enumeration value="rel"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_ResizeHandles"> + <xsd:attribute name="val" type="ST_ResizeHandlesStr" default="rel" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_LayoutVariablePropertySet"> + <xsd:sequence> + <xsd:element name="orgChart" type="CT_OrgChart" minOccurs="0" maxOccurs="1"/> + <xsd:element name="chMax" type="CT_ChildMax" minOccurs="0" maxOccurs="1"/> + <xsd:element name="chPref" type="CT_ChildPref" minOccurs="0" maxOccurs="1"/> + <xsd:element name="bulletEnabled" type="CT_BulletEnabled" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dir" type="CT_Direction" minOccurs="0" maxOccurs="1"/> + <xsd:element name="hierBranch" type="CT_HierBranchStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="animOne" type="CT_AnimOne" minOccurs="0" maxOccurs="1"/> + <xsd:element name="animLvl" type="CT_AnimLvl" minOccurs="0" maxOccurs="1"/> + <xsd:element name="resizeHandles" type="CT_ResizeHandles" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SDName"> + <xsd:attribute name="lang" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="val" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SDDescription"> + <xsd:attribute name="lang" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="val" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SDCategory"> + <xsd:attribute name="type" type="xsd:anyURI" use="required"/> + <xsd:attribute name="pri" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SDCategories"> + <xsd:sequence minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="cat" type="CT_SDCategory" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TextProps"> + <xsd:sequence> + <xsd:group ref="a:EG_Text3D" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_StyleLabel"> + <xsd:sequence> + <xsd:element name="scene3d" type="a:CT_Scene3D" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sp3d" type="a:CT_Shape3D" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txPr" type="CT_TextProps" minOccurs="0" maxOccurs="1"/> + <xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_StyleDefinition"> + <xsd:sequence> + <xsd:element name="title" type="CT_SDName" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="desc" type="CT_SDDescription" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="catLst" type="CT_SDCategories" minOccurs="0"/> + <xsd:element name="scene3d" type="a:CT_Scene3D" minOccurs="0" maxOccurs="1"/> + <xsd:element name="styleLbl" type="CT_StyleLabel" minOccurs="1" maxOccurs="unbounded"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="uniqueId" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="minVer" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:element name="styleDef" type="CT_StyleDefinition"/> + <xsd:complexType name="CT_StyleDefinitionHeader"> + <xsd:sequence> + <xsd:element name="title" type="CT_SDName" minOccurs="1" maxOccurs="unbounded"/> + <xsd:element name="desc" type="CT_SDDescription" minOccurs="1" maxOccurs="unbounded"/> + <xsd:element name="catLst" type="CT_SDCategories" minOccurs="0"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="uniqueId" type="xsd:string" use="required"/> + <xsd:attribute name="minVer" type="xsd:string" use="optional"/> + <xsd:attribute name="resId" type="xsd:int" use="optional" default="0"/> + </xsd:complexType> + <xsd:element name="styleDefHdr" type="CT_StyleDefinitionHeader"/> + <xsd:complexType name="CT_StyleDefinitionHeaderLst"> + <xsd:sequence> + <xsd:element name="styleDefHdr" type="CT_StyleDefinitionHeader" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="styleDefHdrLst" type="CT_StyleDefinitionHeaderLst"/> + <xsd:simpleType name="ST_AlgorithmType" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="composite"/> + <xsd:enumeration value="conn"/> + <xsd:enumeration value="cycle"/> + <xsd:enumeration value="hierChild"/> + <xsd:enumeration value="hierRoot"/> + <xsd:enumeration value="pyra"/> + <xsd:enumeration value="lin"/> + <xsd:enumeration value="sp"/> + <xsd:enumeration value="tx"/> + <xsd:enumeration value="snake"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_AxisType" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="self"/> + <xsd:enumeration value="ch"/> + <xsd:enumeration value="des"/> + <xsd:enumeration value="desOrSelf"/> + <xsd:enumeration value="par"/> + <xsd:enumeration value="ancst"/> + <xsd:enumeration value="ancstOrSelf"/> + <xsd:enumeration value="followSib"/> + <xsd:enumeration value="precedSib"/> + <xsd:enumeration value="follow"/> + <xsd:enumeration value="preced"/> + <xsd:enumeration value="root"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_AxisTypes"> + <xsd:list itemType="ST_AxisType"/> + </xsd:simpleType> + <xsd:simpleType name="ST_BoolOperator" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="equ"/> + <xsd:enumeration value="gte"/> + <xsd:enumeration value="lte"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ChildOrderType" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="b"/> + <xsd:enumeration value="t"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ConstraintType" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="alignOff"/> + <xsd:enumeration value="begMarg"/> + <xsd:enumeration value="bendDist"/> + <xsd:enumeration value="begPad"/> + <xsd:enumeration value="b"/> + <xsd:enumeration value="bMarg"/> + <xsd:enumeration value="bOff"/> + <xsd:enumeration value="ctrX"/> + <xsd:enumeration value="ctrXOff"/> + <xsd:enumeration value="ctrY"/> + <xsd:enumeration value="ctrYOff"/> + <xsd:enumeration value="connDist"/> + <xsd:enumeration value="diam"/> + <xsd:enumeration value="endMarg"/> + <xsd:enumeration value="endPad"/> + <xsd:enumeration value="h"/> + <xsd:enumeration value="hArH"/> + <xsd:enumeration value="hOff"/> + <xsd:enumeration value="l"/> + <xsd:enumeration value="lMarg"/> + <xsd:enumeration value="lOff"/> + <xsd:enumeration value="r"/> + <xsd:enumeration value="rMarg"/> + <xsd:enumeration value="rOff"/> + <xsd:enumeration value="primFontSz"/> + <xsd:enumeration value="pyraAcctRatio"/> + <xsd:enumeration value="secFontSz"/> + <xsd:enumeration value="sibSp"/> + <xsd:enumeration value="secSibSp"/> + <xsd:enumeration value="sp"/> + <xsd:enumeration value="stemThick"/> + <xsd:enumeration value="t"/> + <xsd:enumeration value="tMarg"/> + <xsd:enumeration value="tOff"/> + <xsd:enumeration value="userA"/> + <xsd:enumeration value="userB"/> + <xsd:enumeration value="userC"/> + <xsd:enumeration value="userD"/> + <xsd:enumeration value="userE"/> + <xsd:enumeration value="userF"/> + <xsd:enumeration value="userG"/> + <xsd:enumeration value="userH"/> + <xsd:enumeration value="userI"/> + <xsd:enumeration value="userJ"/> + <xsd:enumeration value="userK"/> + <xsd:enumeration value="userL"/> + <xsd:enumeration value="userM"/> + <xsd:enumeration value="userN"/> + <xsd:enumeration value="userO"/> + <xsd:enumeration value="userP"/> + <xsd:enumeration value="userQ"/> + <xsd:enumeration value="userR"/> + <xsd:enumeration value="userS"/> + <xsd:enumeration value="userT"/> + <xsd:enumeration value="userU"/> + <xsd:enumeration value="userV"/> + <xsd:enumeration value="userW"/> + <xsd:enumeration value="userX"/> + <xsd:enumeration value="userY"/> + <xsd:enumeration value="userZ"/> + <xsd:enumeration value="w"/> + <xsd:enumeration value="wArH"/> + <xsd:enumeration value="wOff"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ConstraintRelationship" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="self"/> + <xsd:enumeration value="ch"/> + <xsd:enumeration value="des"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ElementType" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="all"/> + <xsd:enumeration value="doc"/> + <xsd:enumeration value="node"/> + <xsd:enumeration value="norm"/> + <xsd:enumeration value="nonNorm"/> + <xsd:enumeration value="asst"/> + <xsd:enumeration value="nonAsst"/> + <xsd:enumeration value="parTrans"/> + <xsd:enumeration value="pres"/> + <xsd:enumeration value="sibTrans"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ElementTypes"> + <xsd:list itemType="ST_ElementType"/> + </xsd:simpleType> + <xsd:simpleType name="ST_ParameterId" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="horzAlign"/> + <xsd:enumeration value="vertAlign"/> + <xsd:enumeration value="chDir"/> + <xsd:enumeration value="chAlign"/> + <xsd:enumeration value="secChAlign"/> + <xsd:enumeration value="linDir"/> + <xsd:enumeration value="secLinDir"/> + <xsd:enumeration value="stElem"/> + <xsd:enumeration value="bendPt"/> + <xsd:enumeration value="connRout"/> + <xsd:enumeration value="begSty"/> + <xsd:enumeration value="endSty"/> + <xsd:enumeration value="dim"/> + <xsd:enumeration value="rotPath"/> + <xsd:enumeration value="ctrShpMap"/> + <xsd:enumeration value="nodeHorzAlign"/> + <xsd:enumeration value="nodeVertAlign"/> + <xsd:enumeration value="fallback"/> + <xsd:enumeration value="txDir"/> + <xsd:enumeration value="pyraAcctPos"/> + <xsd:enumeration value="pyraAcctTxMar"/> + <xsd:enumeration value="txBlDir"/> + <xsd:enumeration value="txAnchorHorz"/> + <xsd:enumeration value="txAnchorVert"/> + <xsd:enumeration value="txAnchorHorzCh"/> + <xsd:enumeration value="txAnchorVertCh"/> + <xsd:enumeration value="parTxLTRAlign"/> + <xsd:enumeration value="parTxRTLAlign"/> + <xsd:enumeration value="shpTxLTRAlignCh"/> + <xsd:enumeration value="shpTxRTLAlignCh"/> + <xsd:enumeration value="autoTxRot"/> + <xsd:enumeration value="grDir"/> + <xsd:enumeration value="flowDir"/> + <xsd:enumeration value="contDir"/> + <xsd:enumeration value="bkpt"/> + <xsd:enumeration value="off"/> + <xsd:enumeration value="hierAlign"/> + <xsd:enumeration value="bkPtFixedVal"/> + <xsd:enumeration value="stBulletLvl"/> + <xsd:enumeration value="stAng"/> + <xsd:enumeration value="spanAng"/> + <xsd:enumeration value="ar"/> + <xsd:enumeration value="lnSpPar"/> + <xsd:enumeration value="lnSpAfParP"/> + <xsd:enumeration value="lnSpCh"/> + <xsd:enumeration value="lnSpAfChP"/> + <xsd:enumeration value="rtShortDist"/> + <xsd:enumeration value="alignTx"/> + <xsd:enumeration value="pyraLvlNode"/> + <xsd:enumeration value="pyraAcctBkgdNode"/> + <xsd:enumeration value="pyraAcctTxNode"/> + <xsd:enumeration value="srcNode"/> + <xsd:enumeration value="dstNode"/> + <xsd:enumeration value="begPts"/> + <xsd:enumeration value="endPts"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Ints"> + <xsd:list itemType="xsd:int"/> + </xsd:simpleType> + <xsd:simpleType name="ST_UnsignedInts"> + <xsd:list itemType="xsd:unsignedInt"/> + </xsd:simpleType> + <xsd:simpleType name="ST_Booleans"> + <xsd:list itemType="xsd:boolean"/> + </xsd:simpleType> + <xsd:simpleType name="ST_FunctionType" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="cnt"/> + <xsd:enumeration value="pos"/> + <xsd:enumeration value="revPos"/> + <xsd:enumeration value="posEven"/> + <xsd:enumeration value="posOdd"/> + <xsd:enumeration value="var"/> + <xsd:enumeration value="depth"/> + <xsd:enumeration value="maxDepth"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FunctionOperator" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="equ"/> + <xsd:enumeration value="neq"/> + <xsd:enumeration value="gt"/> + <xsd:enumeration value="lt"/> + <xsd:enumeration value="gte"/> + <xsd:enumeration value="lte"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_DiagramHorizontalAlignment" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="l"/> + <xsd:enumeration value="ctr"/> + <xsd:enumeration value="r"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_VerticalAlignment" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="t"/> + <xsd:enumeration value="mid"/> + <xsd:enumeration value="b"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ChildDirection" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="horz"/> + <xsd:enumeration value="vert"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ChildAlignment" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="t"/> + <xsd:enumeration value="b"/> + <xsd:enumeration value="l"/> + <xsd:enumeration value="r"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_SecondaryChildAlignment" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="t"/> + <xsd:enumeration value="b"/> + <xsd:enumeration value="l"/> + <xsd:enumeration value="r"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_LinearDirection" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="fromL"/> + <xsd:enumeration value="fromR"/> + <xsd:enumeration value="fromT"/> + <xsd:enumeration value="fromB"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_SecondaryLinearDirection" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="fromL"/> + <xsd:enumeration value="fromR"/> + <xsd:enumeration value="fromT"/> + <xsd:enumeration value="fromB"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_StartingElement" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="node"/> + <xsd:enumeration value="trans"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_RotationPath" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="alongPath"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_CenterShapeMapping" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="fNode"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_BendPoint" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="beg"/> + <xsd:enumeration value="def"/> + <xsd:enumeration value="end"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ConnectorRouting" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="stra"/> + <xsd:enumeration value="bend"/> + <xsd:enumeration value="curve"/> + <xsd:enumeration value="longCurve"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ArrowheadStyle" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="auto"/> + <xsd:enumeration value="arr"/> + <xsd:enumeration value="noArr"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ConnectorDimension" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="1D"/> + <xsd:enumeration value="2D"/> + <xsd:enumeration value="cust"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ConnectorPoint" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="auto"/> + <xsd:enumeration value="bCtr"/> + <xsd:enumeration value="ctr"/> + <xsd:enumeration value="midL"/> + <xsd:enumeration value="midR"/> + <xsd:enumeration value="tCtr"/> + <xsd:enumeration value="bL"/> + <xsd:enumeration value="bR"/> + <xsd:enumeration value="tL"/> + <xsd:enumeration value="tR"/> + <xsd:enumeration value="radial"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_NodeHorizontalAlignment" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="l"/> + <xsd:enumeration value="ctr"/> + <xsd:enumeration value="r"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_NodeVerticalAlignment" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="t"/> + <xsd:enumeration value="mid"/> + <xsd:enumeration value="b"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FallbackDimension" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="1D"/> + <xsd:enumeration value="2D"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextDirection" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="fromT"/> + <xsd:enumeration value="fromB"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PyramidAccentPosition" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="bef"/> + <xsd:enumeration value="aft"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PyramidAccentTextMargin" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="step"/> + <xsd:enumeration value="stack"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextBlockDirection" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="horz"/> + <xsd:enumeration value="vert"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextAnchorHorizontal" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="ctr"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextAnchorVertical" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="t"/> + <xsd:enumeration value="mid"/> + <xsd:enumeration value="b"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_DiagramTextAlignment" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="l"/> + <xsd:enumeration value="ctr"/> + <xsd:enumeration value="r"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_AutoTextRotation" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="upr"/> + <xsd:enumeration value="grav"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_GrowDirection" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="tL"/> + <xsd:enumeration value="tR"/> + <xsd:enumeration value="bL"/> + <xsd:enumeration value="bR"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FlowDirection" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="row"/> + <xsd:enumeration value="col"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ContinueDirection" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="revDir"/> + <xsd:enumeration value="sameDir"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Breakpoint" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="endCnv"/> + <xsd:enumeration value="bal"/> + <xsd:enumeration value="fixed"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Offset" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="ctr"/> + <xsd:enumeration value="off"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_HierarchyAlignment" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="tL"/> + <xsd:enumeration value="tR"/> + <xsd:enumeration value="tCtrCh"/> + <xsd:enumeration value="tCtrDes"/> + <xsd:enumeration value="bL"/> + <xsd:enumeration value="bR"/> + <xsd:enumeration value="bCtrCh"/> + <xsd:enumeration value="bCtrDes"/> + <xsd:enumeration value="lT"/> + <xsd:enumeration value="lB"/> + <xsd:enumeration value="lCtrCh"/> + <xsd:enumeration value="lCtrDes"/> + <xsd:enumeration value="rT"/> + <xsd:enumeration value="rB"/> + <xsd:enumeration value="rCtrCh"/> + <xsd:enumeration value="rCtrDes"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FunctionValue" final="restriction"> + <xsd:union + memberTypes="xsd:int xsd:boolean ST_Direction ST_HierBranchStyle ST_AnimOneStr ST_AnimLvlStr ST_ResizeHandlesStr" + /> + </xsd:simpleType> + <xsd:simpleType name="ST_VariableType" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="orgChart"/> + <xsd:enumeration value="chMax"/> + <xsd:enumeration value="chPref"/> + <xsd:enumeration value="bulEnabled"/> + <xsd:enumeration value="dir"/> + <xsd:enumeration value="hierBranch"/> + <xsd:enumeration value="animOne"/> + <xsd:enumeration value="animLvl"/> + <xsd:enumeration value="resizeHandles"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FunctionArgument" final="restriction"> + <xsd:union memberTypes="ST_VariableType"/> + </xsd:simpleType> + <xsd:simpleType name="ST_OutputShapeType" final="restriction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="conn"/> + </xsd:restriction> + </xsd:simpleType> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd new file mode 100644 index 0000000..687eea8 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas" + xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + elementFormDefault="qualified" + targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas"> + <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main" + schemaLocation="dml-main.xsd"/> + <xsd:element name="lockedCanvas" type="a:CT_GvmlGroupShape"/> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd new file mode 100644 index 0000000..6ac81b0 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd @@ -0,0 +1,3081 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" + targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/main" + elementFormDefault="qualified"> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + schemaLocation="shared-relationshipReference.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + schemaLocation="shared-commonSimpleTypes.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/diagram" + schemaLocation="dml-diagram.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/chart" + schemaLocation="dml-chart.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/picture" + schemaLocation="dml-picture.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas" + schemaLocation="dml-lockedCanvas.xsd"/> + <xsd:complexType name="CT_AudioFile"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute ref="r:link" use="required"/> + <xsd:attribute name="contentType" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_VideoFile"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute ref="r:link" use="required"/> + <xsd:attribute name="contentType" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_QuickTimeFile"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute ref="r:link" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_AudioCDTime"> + <xsd:attribute name="track" type="xsd:unsignedByte" use="required"/> + <xsd:attribute name="time" type="xsd:unsignedInt" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_AudioCD"> + <xsd:sequence> + <xsd:element name="st" type="CT_AudioCDTime" minOccurs="1" maxOccurs="1"/> + <xsd:element name="end" type="CT_AudioCDTime" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_Media"> + <xsd:choice> + <xsd:element name="audioCd" type="CT_AudioCD"/> + <xsd:element name="wavAudioFile" type="CT_EmbeddedWAVAudioFile"/> + <xsd:element name="audioFile" type="CT_AudioFile"/> + <xsd:element name="videoFile" type="CT_VideoFile"/> + <xsd:element name="quickTimeFile" type="CT_QuickTimeFile"/> + </xsd:choice> + </xsd:group> + <xsd:element name="videoFile" type="CT_VideoFile"/> + <xsd:simpleType name="ST_StyleMatrixColumnIndex"> + <xsd:restriction base="xsd:unsignedInt"/> + </xsd:simpleType> + <xsd:simpleType name="ST_FontCollectionIndex"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="major"/> + <xsd:enumeration value="minor"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ColorSchemeIndex"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="dk1"/> + <xsd:enumeration value="lt1"/> + <xsd:enumeration value="dk2"/> + <xsd:enumeration value="lt2"/> + <xsd:enumeration value="accent1"/> + <xsd:enumeration value="accent2"/> + <xsd:enumeration value="accent3"/> + <xsd:enumeration value="accent4"/> + <xsd:enumeration value="accent5"/> + <xsd:enumeration value="accent6"/> + <xsd:enumeration value="hlink"/> + <xsd:enumeration value="folHlink"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_ColorScheme"> + <xsd:sequence> + <xsd:element name="dk1" type="CT_Color" minOccurs="1" maxOccurs="1"/> + <xsd:element name="lt1" type="CT_Color" minOccurs="1" maxOccurs="1"/> + <xsd:element name="dk2" type="CT_Color" minOccurs="1" maxOccurs="1"/> + <xsd:element name="lt2" type="CT_Color" minOccurs="1" maxOccurs="1"/> + <xsd:element name="accent1" type="CT_Color" minOccurs="1" maxOccurs="1"/> + <xsd:element name="accent2" type="CT_Color" minOccurs="1" maxOccurs="1"/> + <xsd:element name="accent3" type="CT_Color" minOccurs="1" maxOccurs="1"/> + <xsd:element name="accent4" type="CT_Color" minOccurs="1" maxOccurs="1"/> + <xsd:element name="accent5" type="CT_Color" minOccurs="1" maxOccurs="1"/> + <xsd:element name="accent6" type="CT_Color" minOccurs="1" maxOccurs="1"/> + <xsd:element name="hlink" type="CT_Color" minOccurs="1" maxOccurs="1"/> + <xsd:element name="folHlink" type="CT_Color" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_CustomColor"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="optional" default=""/> + </xsd:complexType> + <xsd:complexType name="CT_SupplementalFont"> + <xsd:attribute name="script" type="xsd:string" use="required"/> + <xsd:attribute name="typeface" type="ST_TextTypeface" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_CustomColorList"> + <xsd:sequence> + <xsd:element name="custClr" type="CT_CustomColor" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_FontCollection"> + <xsd:sequence> + <xsd:element name="latin" type="CT_TextFont" minOccurs="1" maxOccurs="1"/> + <xsd:element name="ea" type="CT_TextFont" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cs" type="CT_TextFont" minOccurs="1" maxOccurs="1"/> + <xsd:element name="font" type="CT_SupplementalFont" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_EffectStyleItem"> + <xsd:sequence> + <xsd:group ref="EG_EffectProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="scene3d" type="CT_Scene3D" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sp3d" type="CT_Shape3D" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_FontScheme"> + <xsd:sequence> + <xsd:element name="majorFont" type="CT_FontCollection" minOccurs="1" maxOccurs="1"/> + <xsd:element name="minorFont" type="CT_FontCollection" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_FillStyleList"> + <xsd:sequence> + <xsd:group ref="EG_FillProperties" minOccurs="3" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_LineStyleList"> + <xsd:sequence> + <xsd:element name="ln" type="CT_LineProperties" minOccurs="3" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_EffectStyleList"> + <xsd:sequence> + <xsd:element name="effectStyle" type="CT_EffectStyleItem" minOccurs="3" maxOccurs="unbounded" + /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_BackgroundFillStyleList"> + <xsd:sequence> + <xsd:group ref="EG_FillProperties" minOccurs="3" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_StyleMatrix"> + <xsd:sequence> + <xsd:element name="fillStyleLst" type="CT_FillStyleList" minOccurs="1" maxOccurs="1"/> + <xsd:element name="lnStyleLst" type="CT_LineStyleList" minOccurs="1" maxOccurs="1"/> + <xsd:element name="effectStyleLst" type="CT_EffectStyleList" minOccurs="1" maxOccurs="1"/> + <xsd:element name="bgFillStyleLst" type="CT_BackgroundFillStyleList" minOccurs="1" + maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="optional" default=""/> + </xsd:complexType> + <xsd:complexType name="CT_BaseStyles"> + <xsd:sequence> + <xsd:element name="clrScheme" type="CT_ColorScheme" minOccurs="1" maxOccurs="1"/> + <xsd:element name="fontScheme" type="CT_FontScheme" minOccurs="1" maxOccurs="1"/> + <xsd:element name="fmtScheme" type="CT_StyleMatrix" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_OfficeArtExtension"> + <xsd:sequence> + <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="uri" type="xsd:token" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_Coordinate"> + <xsd:union memberTypes="ST_CoordinateUnqualified s:ST_UniversalMeasure"/> + </xsd:simpleType> + <xsd:simpleType name="ST_CoordinateUnqualified"> + <xsd:restriction base="xsd:long"> + <xsd:minInclusive value="-27273042329600"/> + <xsd:maxInclusive value="27273042316900"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Coordinate32"> + <xsd:union memberTypes="ST_Coordinate32Unqualified s:ST_UniversalMeasure"/> + </xsd:simpleType> + <xsd:simpleType name="ST_Coordinate32Unqualified"> + <xsd:restriction base="xsd:int"/> + </xsd:simpleType> + <xsd:simpleType name="ST_PositiveCoordinate"> + <xsd:restriction base="xsd:long"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="27273042316900"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PositiveCoordinate32"> + <xsd:restriction base="ST_Coordinate32Unqualified"> + <xsd:minInclusive value="0"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Angle"> + <xsd:restriction base="xsd:int"/> + </xsd:simpleType> + <xsd:complexType name="CT_Angle"> + <xsd:attribute name="val" type="ST_Angle" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_FixedAngle"> + <xsd:restriction base="ST_Angle"> + <xsd:minExclusive value="-5400000"/> + <xsd:maxExclusive value="5400000"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PositiveFixedAngle"> + <xsd:restriction base="ST_Angle"> + <xsd:minInclusive value="0"/> + <xsd:maxExclusive value="21600000"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PositiveFixedAngle"> + <xsd:attribute name="val" type="ST_PositiveFixedAngle" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_Percentage"> + <xsd:union memberTypes="ST_PercentageDecimal s:ST_Percentage"/> + </xsd:simpleType> + <xsd:simpleType name="ST_PercentageDecimal"> + <xsd:restriction base="xsd:int"/> + </xsd:simpleType> + <xsd:complexType name="CT_Percentage"> + <xsd:attribute name="val" type="ST_Percentage" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_PositivePercentage"> + <xsd:union memberTypes="ST_PositivePercentageDecimal s:ST_PositivePercentage"/> + </xsd:simpleType> + <xsd:simpleType name="ST_PositivePercentageDecimal"> + <xsd:restriction base="ST_PercentageDecimal"> + <xsd:minInclusive value="0"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PositivePercentage"> + <xsd:attribute name="val" type="ST_PositivePercentage" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_FixedPercentage"> + <xsd:union memberTypes="ST_FixedPercentageDecimal s:ST_FixedPercentage"/> + </xsd:simpleType> + <xsd:simpleType name="ST_FixedPercentageDecimal"> + <xsd:restriction base="ST_PercentageDecimal"> + <xsd:minInclusive value="-100000"/> + <xsd:maxInclusive value="100000"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_FixedPercentage"> + <xsd:attribute name="val" type="ST_FixedPercentage" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_PositiveFixedPercentage"> + <xsd:union memberTypes="ST_PositiveFixedPercentageDecimal s:ST_PositiveFixedPercentage"/> + </xsd:simpleType> + <xsd:simpleType name="ST_PositiveFixedPercentageDecimal"> + <xsd:restriction base="ST_PercentageDecimal"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="100000"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PositiveFixedPercentage"> + <xsd:attribute name="val" type="ST_PositiveFixedPercentage" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Ratio"> + <xsd:attribute name="n" type="xsd:long" use="required"/> + <xsd:attribute name="d" type="xsd:long" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Point2D"> + <xsd:attribute name="x" type="ST_Coordinate" use="required"/> + <xsd:attribute name="y" type="ST_Coordinate" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_PositiveSize2D"> + <xsd:attribute name="cx" type="ST_PositiveCoordinate" use="required"/> + <xsd:attribute name="cy" type="ST_PositiveCoordinate" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_ComplementTransform"/> + <xsd:complexType name="CT_InverseTransform"/> + <xsd:complexType name="CT_GrayscaleTransform"/> + <xsd:complexType name="CT_GammaTransform"/> + <xsd:complexType name="CT_InverseGammaTransform"/> + <xsd:group name="EG_ColorTransform"> + <xsd:choice> + <xsd:element name="tint" type="CT_PositiveFixedPercentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="shade" type="CT_PositiveFixedPercentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="comp" type="CT_ComplementTransform" minOccurs="1" maxOccurs="1"/> + <xsd:element name="inv" type="CT_InverseTransform" minOccurs="1" maxOccurs="1"/> + <xsd:element name="gray" type="CT_GrayscaleTransform" minOccurs="1" maxOccurs="1"/> + <xsd:element name="alpha" type="CT_PositiveFixedPercentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="alphaOff" type="CT_FixedPercentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="alphaMod" type="CT_PositivePercentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="hue" type="CT_PositiveFixedAngle" minOccurs="1" maxOccurs="1"/> + <xsd:element name="hueOff" type="CT_Angle" minOccurs="1" maxOccurs="1"/> + <xsd:element name="hueMod" type="CT_PositivePercentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="sat" type="CT_Percentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="satOff" type="CT_Percentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="satMod" type="CT_Percentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="lum" type="CT_Percentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="lumOff" type="CT_Percentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="lumMod" type="CT_Percentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="red" type="CT_Percentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="redOff" type="CT_Percentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="redMod" type="CT_Percentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="green" type="CT_Percentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="greenOff" type="CT_Percentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="greenMod" type="CT_Percentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="blue" type="CT_Percentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="blueOff" type="CT_Percentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="blueMod" type="CT_Percentage" minOccurs="1" maxOccurs="1"/> + <xsd:element name="gamma" type="CT_GammaTransform" minOccurs="1" maxOccurs="1"/> + <xsd:element name="invGamma" type="CT_InverseGammaTransform" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_ScRgbColor"> + <xsd:sequence> + <xsd:group ref="EG_ColorTransform" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="r" type="ST_Percentage" use="required"/> + <xsd:attribute name="g" type="ST_Percentage" use="required"/> + <xsd:attribute name="b" type="ST_Percentage" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SRgbColor"> + <xsd:sequence> + <xsd:group ref="EG_ColorTransform" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="val" type="s:ST_HexColorRGB" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_HslColor"> + <xsd:sequence> + <xsd:group ref="EG_ColorTransform" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="hue" type="ST_PositiveFixedAngle" use="required"/> + <xsd:attribute name="sat" type="ST_Percentage" use="required"/> + <xsd:attribute name="lum" type="ST_Percentage" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_SystemColorVal"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="scrollBar"/> + <xsd:enumeration value="background"/> + <xsd:enumeration value="activeCaption"/> + <xsd:enumeration value="inactiveCaption"/> + <xsd:enumeration value="menu"/> + <xsd:enumeration value="window"/> + <xsd:enumeration value="windowFrame"/> + <xsd:enumeration value="menuText"/> + <xsd:enumeration value="windowText"/> + <xsd:enumeration value="captionText"/> + <xsd:enumeration value="activeBorder"/> + <xsd:enumeration value="inactiveBorder"/> + <xsd:enumeration value="appWorkspace"/> + <xsd:enumeration value="highlight"/> + <xsd:enumeration value="highlightText"/> + <xsd:enumeration value="btnFace"/> + <xsd:enumeration value="btnShadow"/> + <xsd:enumeration value="grayText"/> + <xsd:enumeration value="btnText"/> + <xsd:enumeration value="inactiveCaptionText"/> + <xsd:enumeration value="btnHighlight"/> + <xsd:enumeration value="3dDkShadow"/> + <xsd:enumeration value="3dLight"/> + <xsd:enumeration value="infoText"/> + <xsd:enumeration value="infoBk"/> + <xsd:enumeration value="hotLight"/> + <xsd:enumeration value="gradientActiveCaption"/> + <xsd:enumeration value="gradientInactiveCaption"/> + <xsd:enumeration value="menuHighlight"/> + <xsd:enumeration value="menuBar"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SystemColor"> + <xsd:sequence> + <xsd:group ref="EG_ColorTransform" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="val" type="ST_SystemColorVal" use="required"/> + <xsd:attribute name="lastClr" type="s:ST_HexColorRGB" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_SchemeColorVal"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="bg1"/> + <xsd:enumeration value="tx1"/> + <xsd:enumeration value="bg2"/> + <xsd:enumeration value="tx2"/> + <xsd:enumeration value="accent1"/> + <xsd:enumeration value="accent2"/> + <xsd:enumeration value="accent3"/> + <xsd:enumeration value="accent4"/> + <xsd:enumeration value="accent5"/> + <xsd:enumeration value="accent6"/> + <xsd:enumeration value="hlink"/> + <xsd:enumeration value="folHlink"/> + <xsd:enumeration value="phClr"/> + <xsd:enumeration value="dk1"/> + <xsd:enumeration value="lt1"/> + <xsd:enumeration value="dk2"/> + <xsd:enumeration value="lt2"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SchemeColor"> + <xsd:sequence> + <xsd:group ref="EG_ColorTransform" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="val" type="ST_SchemeColorVal" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_PresetColorVal"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="aliceBlue"/> + <xsd:enumeration value="antiqueWhite"/> + <xsd:enumeration value="aqua"/> + <xsd:enumeration value="aquamarine"/> + <xsd:enumeration value="azure"/> + <xsd:enumeration value="beige"/> + <xsd:enumeration value="bisque"/> + <xsd:enumeration value="black"/> + <xsd:enumeration value="blanchedAlmond"/> + <xsd:enumeration value="blue"/> + <xsd:enumeration value="blueViolet"/> + <xsd:enumeration value="brown"/> + <xsd:enumeration value="burlyWood"/> + <xsd:enumeration value="cadetBlue"/> + <xsd:enumeration value="chartreuse"/> + <xsd:enumeration value="chocolate"/> + <xsd:enumeration value="coral"/> + <xsd:enumeration value="cornflowerBlue"/> + <xsd:enumeration value="cornsilk"/> + <xsd:enumeration value="crimson"/> + <xsd:enumeration value="cyan"/> + <xsd:enumeration value="darkBlue"/> + <xsd:enumeration value="darkCyan"/> + <xsd:enumeration value="darkGoldenrod"/> + <xsd:enumeration value="darkGray"/> + <xsd:enumeration value="darkGrey"/> + <xsd:enumeration value="darkGreen"/> + <xsd:enumeration value="darkKhaki"/> + <xsd:enumeration value="darkMagenta"/> + <xsd:enumeration value="darkOliveGreen"/> + <xsd:enumeration value="darkOrange"/> + <xsd:enumeration value="darkOrchid"/> + <xsd:enumeration value="darkRed"/> + <xsd:enumeration value="darkSalmon"/> + <xsd:enumeration value="darkSeaGreen"/> + <xsd:enumeration value="darkSlateBlue"/> + <xsd:enumeration value="darkSlateGray"/> + <xsd:enumeration value="darkSlateGrey"/> + <xsd:enumeration value="darkTurquoise"/> + <xsd:enumeration value="darkViolet"/> + <xsd:enumeration value="dkBlue"/> + <xsd:enumeration value="dkCyan"/> + <xsd:enumeration value="dkGoldenrod"/> + <xsd:enumeration value="dkGray"/> + <xsd:enumeration value="dkGrey"/> + <xsd:enumeration value="dkGreen"/> + <xsd:enumeration value="dkKhaki"/> + <xsd:enumeration value="dkMagenta"/> + <xsd:enumeration value="dkOliveGreen"/> + <xsd:enumeration value="dkOrange"/> + <xsd:enumeration value="dkOrchid"/> + <xsd:enumeration value="dkRed"/> + <xsd:enumeration value="dkSalmon"/> + <xsd:enumeration value="dkSeaGreen"/> + <xsd:enumeration value="dkSlateBlue"/> + <xsd:enumeration value="dkSlateGray"/> + <xsd:enumeration value="dkSlateGrey"/> + <xsd:enumeration value="dkTurquoise"/> + <xsd:enumeration value="dkViolet"/> + <xsd:enumeration value="deepPink"/> + <xsd:enumeration value="deepSkyBlue"/> + <xsd:enumeration value="dimGray"/> + <xsd:enumeration value="dimGrey"/> + <xsd:enumeration value="dodgerBlue"/> + <xsd:enumeration value="firebrick"/> + <xsd:enumeration value="floralWhite"/> + <xsd:enumeration value="forestGreen"/> + <xsd:enumeration value="fuchsia"/> + <xsd:enumeration value="gainsboro"/> + <xsd:enumeration value="ghostWhite"/> + <xsd:enumeration value="gold"/> + <xsd:enumeration value="goldenrod"/> + <xsd:enumeration value="gray"/> + <xsd:enumeration value="grey"/> + <xsd:enumeration value="green"/> + <xsd:enumeration value="greenYellow"/> + <xsd:enumeration value="honeydew"/> + <xsd:enumeration value="hotPink"/> + <xsd:enumeration value="indianRed"/> + <xsd:enumeration value="indigo"/> + <xsd:enumeration value="ivory"/> + <xsd:enumeration value="khaki"/> + <xsd:enumeration value="lavender"/> + <xsd:enumeration value="lavenderBlush"/> + <xsd:enumeration value="lawnGreen"/> + <xsd:enumeration value="lemonChiffon"/> + <xsd:enumeration value="lightBlue"/> + <xsd:enumeration value="lightCoral"/> + <xsd:enumeration value="lightCyan"/> + <xsd:enumeration value="lightGoldenrodYellow"/> + <xsd:enumeration value="lightGray"/> + <xsd:enumeration value="lightGrey"/> + <xsd:enumeration value="lightGreen"/> + <xsd:enumeration value="lightPink"/> + <xsd:enumeration value="lightSalmon"/> + <xsd:enumeration value="lightSeaGreen"/> + <xsd:enumeration value="lightSkyBlue"/> + <xsd:enumeration value="lightSlateGray"/> + <xsd:enumeration value="lightSlateGrey"/> + <xsd:enumeration value="lightSteelBlue"/> + <xsd:enumeration value="lightYellow"/> + <xsd:enumeration value="ltBlue"/> + <xsd:enumeration value="ltCoral"/> + <xsd:enumeration value="ltCyan"/> + <xsd:enumeration value="ltGoldenrodYellow"/> + <xsd:enumeration value="ltGray"/> + <xsd:enumeration value="ltGrey"/> + <xsd:enumeration value="ltGreen"/> + <xsd:enumeration value="ltPink"/> + <xsd:enumeration value="ltSalmon"/> + <xsd:enumeration value="ltSeaGreen"/> + <xsd:enumeration value="ltSkyBlue"/> + <xsd:enumeration value="ltSlateGray"/> + <xsd:enumeration value="ltSlateGrey"/> + <xsd:enumeration value="ltSteelBlue"/> + <xsd:enumeration value="ltYellow"/> + <xsd:enumeration value="lime"/> + <xsd:enumeration value="limeGreen"/> + <xsd:enumeration value="linen"/> + <xsd:enumeration value="magenta"/> + <xsd:enumeration value="maroon"/> + <xsd:enumeration value="medAquamarine"/> + <xsd:enumeration value="medBlue"/> + <xsd:enumeration value="medOrchid"/> + <xsd:enumeration value="medPurple"/> + <xsd:enumeration value="medSeaGreen"/> + <xsd:enumeration value="medSlateBlue"/> + <xsd:enumeration value="medSpringGreen"/> + <xsd:enumeration value="medTurquoise"/> + <xsd:enumeration value="medVioletRed"/> + <xsd:enumeration value="mediumAquamarine"/> + <xsd:enumeration value="mediumBlue"/> + <xsd:enumeration value="mediumOrchid"/> + <xsd:enumeration value="mediumPurple"/> + <xsd:enumeration value="mediumSeaGreen"/> + <xsd:enumeration value="mediumSlateBlue"/> + <xsd:enumeration value="mediumSpringGreen"/> + <xsd:enumeration value="mediumTurquoise"/> + <xsd:enumeration value="mediumVioletRed"/> + <xsd:enumeration value="midnightBlue"/> + <xsd:enumeration value="mintCream"/> + <xsd:enumeration value="mistyRose"/> + <xsd:enumeration value="moccasin"/> + <xsd:enumeration value="navajoWhite"/> + <xsd:enumeration value="navy"/> + <xsd:enumeration value="oldLace"/> + <xsd:enumeration value="olive"/> + <xsd:enumeration value="oliveDrab"/> + <xsd:enumeration value="orange"/> + <xsd:enumeration value="orangeRed"/> + <xsd:enumeration value="orchid"/> + <xsd:enumeration value="paleGoldenrod"/> + <xsd:enumeration value="paleGreen"/> + <xsd:enumeration value="paleTurquoise"/> + <xsd:enumeration value="paleVioletRed"/> + <xsd:enumeration value="papayaWhip"/> + <xsd:enumeration value="peachPuff"/> + <xsd:enumeration value="peru"/> + <xsd:enumeration value="pink"/> + <xsd:enumeration value="plum"/> + <xsd:enumeration value="powderBlue"/> + <xsd:enumeration value="purple"/> + <xsd:enumeration value="red"/> + <xsd:enumeration value="rosyBrown"/> + <xsd:enumeration value="royalBlue"/> + <xsd:enumeration value="saddleBrown"/> + <xsd:enumeration value="salmon"/> + <xsd:enumeration value="sandyBrown"/> + <xsd:enumeration value="seaGreen"/> + <xsd:enumeration value="seaShell"/> + <xsd:enumeration value="sienna"/> + <xsd:enumeration value="silver"/> + <xsd:enumeration value="skyBlue"/> + <xsd:enumeration value="slateBlue"/> + <xsd:enumeration value="slateGray"/> + <xsd:enumeration value="slateGrey"/> + <xsd:enumeration value="snow"/> + <xsd:enumeration value="springGreen"/> + <xsd:enumeration value="steelBlue"/> + <xsd:enumeration value="tan"/> + <xsd:enumeration value="teal"/> + <xsd:enumeration value="thistle"/> + <xsd:enumeration value="tomato"/> + <xsd:enumeration value="turquoise"/> + <xsd:enumeration value="violet"/> + <xsd:enumeration value="wheat"/> + <xsd:enumeration value="white"/> + <xsd:enumeration value="whiteSmoke"/> + <xsd:enumeration value="yellow"/> + <xsd:enumeration value="yellowGreen"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PresetColor"> + <xsd:sequence> + <xsd:group ref="EG_ColorTransform" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="val" type="ST_PresetColorVal" use="required"/> + </xsd:complexType> + <xsd:group name="EG_OfficeArtExtensionList"> + <xsd:sequence> + <xsd:element name="ext" type="CT_OfficeArtExtension" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_OfficeArtExtensionList"> + <xsd:sequence> + <xsd:group ref="EG_OfficeArtExtensionList" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Scale2D"> + <xsd:sequence> + <xsd:element name="sx" type="CT_Ratio" minOccurs="1" maxOccurs="1"/> + <xsd:element name="sy" type="CT_Ratio" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Transform2D"> + <xsd:sequence> + <xsd:element name="off" type="CT_Point2D" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ext" type="CT_PositiveSize2D" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="rot" type="ST_Angle" use="optional" default="0"/> + <xsd:attribute name="flipH" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="flipV" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_GroupTransform2D"> + <xsd:sequence> + <xsd:element name="off" type="CT_Point2D" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ext" type="CT_PositiveSize2D" minOccurs="0" maxOccurs="1"/> + <xsd:element name="chOff" type="CT_Point2D" minOccurs="0" maxOccurs="1"/> + <xsd:element name="chExt" type="CT_PositiveSize2D" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="rot" type="ST_Angle" use="optional" default="0"/> + <xsd:attribute name="flipH" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="flipV" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_Point3D"> + <xsd:attribute name="x" type="ST_Coordinate" use="required"/> + <xsd:attribute name="y" type="ST_Coordinate" use="required"/> + <xsd:attribute name="z" type="ST_Coordinate" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Vector3D"> + <xsd:attribute name="dx" type="ST_Coordinate" use="required"/> + <xsd:attribute name="dy" type="ST_Coordinate" use="required"/> + <xsd:attribute name="dz" type="ST_Coordinate" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SphereCoords"> + <xsd:attribute name="lat" type="ST_PositiveFixedAngle" use="required"/> + <xsd:attribute name="lon" type="ST_PositiveFixedAngle" use="required"/> + <xsd:attribute name="rev" type="ST_PositiveFixedAngle" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_RelativeRect"> + <xsd:attribute name="l" type="ST_Percentage" use="optional" default="0%"/> + <xsd:attribute name="t" type="ST_Percentage" use="optional" default="0%"/> + <xsd:attribute name="r" type="ST_Percentage" use="optional" default="0%"/> + <xsd:attribute name="b" type="ST_Percentage" use="optional" default="0%"/> + </xsd:complexType> + <xsd:simpleType name="ST_RectAlignment"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="tl"/> + <xsd:enumeration value="t"/> + <xsd:enumeration value="tr"/> + <xsd:enumeration value="l"/> + <xsd:enumeration value="ctr"/> + <xsd:enumeration value="r"/> + <xsd:enumeration value="bl"/> + <xsd:enumeration value="b"/> + <xsd:enumeration value="br"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:group name="EG_ColorChoice"> + <xsd:choice> + <xsd:element name="scrgbClr" type="CT_ScRgbColor" minOccurs="1" maxOccurs="1"/> + <xsd:element name="srgbClr" type="CT_SRgbColor" minOccurs="1" maxOccurs="1"/> + <xsd:element name="hslClr" type="CT_HslColor" minOccurs="1" maxOccurs="1"/> + <xsd:element name="sysClr" type="CT_SystemColor" minOccurs="1" maxOccurs="1"/> + <xsd:element name="schemeClr" type="CT_SchemeColor" minOccurs="1" maxOccurs="1"/> + <xsd:element name="prstClr" type="CT_PresetColor" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_Color"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ColorMRU"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_BlackWhiteMode"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="clr"/> + <xsd:enumeration value="auto"/> + <xsd:enumeration value="gray"/> + <xsd:enumeration value="ltGray"/> + <xsd:enumeration value="invGray"/> + <xsd:enumeration value="grayWhite"/> + <xsd:enumeration value="blackGray"/> + <xsd:enumeration value="blackWhite"/> + <xsd:enumeration value="black"/> + <xsd:enumeration value="white"/> + <xsd:enumeration value="hidden"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:attributeGroup name="AG_Blob"> + <xsd:attribute ref="r:embed" use="optional" default=""/> + <xsd:attribute ref="r:link" use="optional" default=""/> + </xsd:attributeGroup> + <xsd:complexType name="CT_EmbeddedWAVAudioFile"> + <xsd:attribute ref="r:embed" use="required"/> + <xsd:attribute name="name" type="xsd:string" use="optional" default=""/> + </xsd:complexType> + <xsd:complexType name="CT_Hyperlink"> + <xsd:sequence> + <xsd:element name="snd" type="CT_EmbeddedWAVAudioFile" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute ref="r:id" use="optional"/> + <xsd:attribute name="invalidUrl" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="action" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="tgtFrame" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="tooltip" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="history" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="highlightClick" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="endSnd" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:simpleType name="ST_DrawingElementId"> + <xsd:restriction base="xsd:unsignedInt"/> + </xsd:simpleType> + <xsd:attributeGroup name="AG_Locking"> + <xsd:attribute name="noGrp" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noSelect" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noRot" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noChangeAspect" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noMove" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noResize" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noEditPoints" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noAdjustHandles" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noChangeArrowheads" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noChangeShapeType" type="xsd:boolean" use="optional" default="false"/> + </xsd:attributeGroup> + <xsd:complexType name="CT_ConnectorLocking"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_Locking"/> + </xsd:complexType> + <xsd:complexType name="CT_ShapeLocking"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_Locking"/> + <xsd:attribute name="noTextEdit" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_PictureLocking"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_Locking"/> + <xsd:attribute name="noCrop" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_GroupLocking"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="noGrp" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noUngrp" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noSelect" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noRot" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noChangeAspect" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noMove" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noResize" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_GraphicalObjectFrameLocking"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="noGrp" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noDrilldown" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noSelect" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noChangeAspect" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noMove" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="noResize" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_ContentPartLocking"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_Locking"/> + </xsd:complexType> + <xsd:complexType name="CT_NonVisualDrawingProps"> + <xsd:sequence> + <xsd:element name="hlinkClick" type="CT_Hyperlink" minOccurs="0" maxOccurs="1"/> + <xsd:element name="hlinkHover" type="CT_Hyperlink" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="id" type="ST_DrawingElementId" use="required"/> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="descr" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="hidden" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="title" type="xsd:string" use="optional" default=""/> + </xsd:complexType> + <xsd:complexType name="CT_NonVisualDrawingShapeProps"> + <xsd:sequence> + <xsd:element name="spLocks" type="CT_ShapeLocking" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="txBox" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_NonVisualConnectorProperties"> + <xsd:sequence> + <xsd:element name="cxnSpLocks" type="CT_ConnectorLocking" minOccurs="0" maxOccurs="1"/> + <xsd:element name="stCxn" type="CT_Connection" minOccurs="0" maxOccurs="1"/> + <xsd:element name="endCxn" type="CT_Connection" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_NonVisualPictureProperties"> + <xsd:sequence> + <xsd:element name="picLocks" type="CT_PictureLocking" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="preferRelativeResize" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_NonVisualGroupDrawingShapeProps"> + <xsd:sequence> + <xsd:element name="grpSpLocks" type="CT_GroupLocking" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_NonVisualGraphicFrameProperties"> + <xsd:sequence> + <xsd:element name="graphicFrameLocks" type="CT_GraphicalObjectFrameLocking" minOccurs="0" + maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_NonVisualContentPartProperties"> + <xsd:sequence> + <xsd:element name="cpLocks" type="CT_ContentPartLocking" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="isComment" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_GraphicalObjectData"> + <xsd:sequence> + <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="strict"/> + </xsd:sequence> + <xsd:attribute name="uri" type="xsd:token" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_GraphicalObject"> + <xsd:sequence> + <xsd:element name="graphicData" type="CT_GraphicalObjectData"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="graphic" type="CT_GraphicalObject"/> + <xsd:simpleType name="ST_ChartBuildStep"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="category"/> + <xsd:enumeration value="ptInCategory"/> + <xsd:enumeration value="series"/> + <xsd:enumeration value="ptInSeries"/> + <xsd:enumeration value="allPts"/> + <xsd:enumeration value="gridLegend"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_DgmBuildStep"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="sp"/> + <xsd:enumeration value="bg"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_AnimationDgmElement"> + <xsd:attribute name="id" type="s:ST_Guid" use="optional" + default="{00000000-0000-0000-0000-000000000000}"/> + <xsd:attribute name="bldStep" type="ST_DgmBuildStep" use="optional" default="sp"/> + </xsd:complexType> + <xsd:complexType name="CT_AnimationChartElement"> + <xsd:attribute name="seriesIdx" type="xsd:int" use="optional" default="-1"/> + <xsd:attribute name="categoryIdx" type="xsd:int" use="optional" default="-1"/> + <xsd:attribute name="bldStep" type="ST_ChartBuildStep" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_AnimationElementChoice"> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="dgm" type="CT_AnimationDgmElement"/> + <xsd:element name="chart" type="CT_AnimationChartElement"/> + </xsd:choice> + </xsd:complexType> + <xsd:simpleType name="ST_AnimationBuildType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="allAtOnce"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_AnimationDgmOnlyBuildType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="one"/> + <xsd:enumeration value="lvlOne"/> + <xsd:enumeration value="lvlAtOnce"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_AnimationDgmBuildType"> + <xsd:union memberTypes="ST_AnimationBuildType ST_AnimationDgmOnlyBuildType"/> + </xsd:simpleType> + <xsd:complexType name="CT_AnimationDgmBuildProperties"> + <xsd:attribute name="bld" type="ST_AnimationDgmBuildType" use="optional" default="allAtOnce"/> + <xsd:attribute name="rev" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:simpleType name="ST_AnimationChartOnlyBuildType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="series"/> + <xsd:enumeration value="category"/> + <xsd:enumeration value="seriesEl"/> + <xsd:enumeration value="categoryEl"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_AnimationChartBuildType"> + <xsd:union memberTypes="ST_AnimationBuildType ST_AnimationChartOnlyBuildType"/> + </xsd:simpleType> + <xsd:complexType name="CT_AnimationChartBuildProperties"> + <xsd:attribute name="bld" type="ST_AnimationChartBuildType" use="optional" default="allAtOnce"/> + <xsd:attribute name="animBg" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_AnimationGraphicalObjectBuildProperties"> + <xsd:choice> + <xsd:element name="bldDgm" type="CT_AnimationDgmBuildProperties"/> + <xsd:element name="bldChart" type="CT_AnimationChartBuildProperties"/> + </xsd:choice> + </xsd:complexType> + <xsd:complexType name="CT_BackgroundFormatting"> + <xsd:sequence> + <xsd:group ref="EG_FillProperties" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_EffectProperties" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_WholeE2oFormatting"> + <xsd:sequence> + <xsd:element name="ln" type="CT_LineProperties" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_EffectProperties" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GvmlUseShapeRectangle"/> + <xsd:complexType name="CT_GvmlTextShape"> + <xsd:sequence> + <xsd:element name="txBody" type="CT_TextBody" minOccurs="1" maxOccurs="1"/> + <xsd:choice> + <xsd:element name="useSpRect" type="CT_GvmlUseShapeRectangle" minOccurs="1" maxOccurs="1"/> + <xsd:element name="xfrm" type="CT_Transform2D" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GvmlShapeNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvSpPr" type="CT_NonVisualDrawingShapeProps" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GvmlShape"> + <xsd:sequence> + <xsd:element name="nvSpPr" type="CT_GvmlShapeNonVisual" minOccurs="1" maxOccurs="1"/> + <xsd:element name="spPr" type="CT_ShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="txSp" type="CT_GvmlTextShape" minOccurs="0" maxOccurs="1"/> + <xsd:element name="style" type="CT_ShapeStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GvmlConnectorNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvCxnSpPr" type="CT_NonVisualConnectorProperties" minOccurs="1" + maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GvmlConnector"> + <xsd:sequence> + <xsd:element name="nvCxnSpPr" type="CT_GvmlConnectorNonVisual" minOccurs="1" maxOccurs="1"/> + <xsd:element name="spPr" type="CT_ShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="style" type="CT_ShapeStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GvmlPictureNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvPicPr" type="CT_NonVisualPictureProperties" minOccurs="1" maxOccurs="1" + /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GvmlPicture"> + <xsd:sequence> + <xsd:element name="nvPicPr" type="CT_GvmlPictureNonVisual" minOccurs="1" maxOccurs="1"/> + <xsd:element name="blipFill" type="CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="spPr" type="CT_ShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="style" type="CT_ShapeStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GvmlGraphicFrameNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvGraphicFramePr" type="CT_NonVisualGraphicFrameProperties" minOccurs="1" + maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GvmlGraphicalObjectFrame"> + <xsd:sequence> + <xsd:element name="nvGraphicFramePr" type="CT_GvmlGraphicFrameNonVisual" minOccurs="1" + maxOccurs="1"/> + <xsd:element ref="graphic" minOccurs="1" maxOccurs="1"/> + <xsd:element name="xfrm" type="CT_Transform2D" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GvmlGroupShapeNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvGrpSpPr" type="CT_NonVisualGroupDrawingShapeProps" minOccurs="1" + maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GvmlGroupShape"> + <xsd:sequence> + <xsd:element name="nvGrpSpPr" type="CT_GvmlGroupShapeNonVisual" minOccurs="1" maxOccurs="1"/> + <xsd:element name="grpSpPr" type="CT_GroupShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="txSp" type="CT_GvmlTextShape"/> + <xsd:element name="sp" type="CT_GvmlShape"/> + <xsd:element name="cxnSp" type="CT_GvmlConnector"/> + <xsd:element name="pic" type="CT_GvmlPicture"/> + <xsd:element name="graphicFrame" type="CT_GvmlGraphicalObjectFrame"/> + <xsd:element name="grpSp" type="CT_GvmlGroupShape"/> + </xsd:choice> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_PresetCameraType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="legacyObliqueTopLeft"/> + <xsd:enumeration value="legacyObliqueTop"/> + <xsd:enumeration value="legacyObliqueTopRight"/> + <xsd:enumeration value="legacyObliqueLeft"/> + <xsd:enumeration value="legacyObliqueFront"/> + <xsd:enumeration value="legacyObliqueRight"/> + <xsd:enumeration value="legacyObliqueBottomLeft"/> + <xsd:enumeration value="legacyObliqueBottom"/> + <xsd:enumeration value="legacyObliqueBottomRight"/> + <xsd:enumeration value="legacyPerspectiveTopLeft"/> + <xsd:enumeration value="legacyPerspectiveTop"/> + <xsd:enumeration value="legacyPerspectiveTopRight"/> + <xsd:enumeration value="legacyPerspectiveLeft"/> + <xsd:enumeration value="legacyPerspectiveFront"/> + <xsd:enumeration value="legacyPerspectiveRight"/> + <xsd:enumeration value="legacyPerspectiveBottomLeft"/> + <xsd:enumeration value="legacyPerspectiveBottom"/> + <xsd:enumeration value="legacyPerspectiveBottomRight"/> + <xsd:enumeration value="orthographicFront"/> + <xsd:enumeration value="isometricTopUp"/> + <xsd:enumeration value="isometricTopDown"/> + <xsd:enumeration value="isometricBottomUp"/> + <xsd:enumeration value="isometricBottomDown"/> + <xsd:enumeration value="isometricLeftUp"/> + <xsd:enumeration value="isometricLeftDown"/> + <xsd:enumeration value="isometricRightUp"/> + <xsd:enumeration value="isometricRightDown"/> + <xsd:enumeration value="isometricOffAxis1Left"/> + <xsd:enumeration value="isometricOffAxis1Right"/> + <xsd:enumeration value="isometricOffAxis1Top"/> + <xsd:enumeration value="isometricOffAxis2Left"/> + <xsd:enumeration value="isometricOffAxis2Right"/> + <xsd:enumeration value="isometricOffAxis2Top"/> + <xsd:enumeration value="isometricOffAxis3Left"/> + <xsd:enumeration value="isometricOffAxis3Right"/> + <xsd:enumeration value="isometricOffAxis3Bottom"/> + <xsd:enumeration value="isometricOffAxis4Left"/> + <xsd:enumeration value="isometricOffAxis4Right"/> + <xsd:enumeration value="isometricOffAxis4Bottom"/> + <xsd:enumeration value="obliqueTopLeft"/> + <xsd:enumeration value="obliqueTop"/> + <xsd:enumeration value="obliqueTopRight"/> + <xsd:enumeration value="obliqueLeft"/> + <xsd:enumeration value="obliqueRight"/> + <xsd:enumeration value="obliqueBottomLeft"/> + <xsd:enumeration value="obliqueBottom"/> + <xsd:enumeration value="obliqueBottomRight"/> + <xsd:enumeration value="perspectiveFront"/> + <xsd:enumeration value="perspectiveLeft"/> + <xsd:enumeration value="perspectiveRight"/> + <xsd:enumeration value="perspectiveAbove"/> + <xsd:enumeration value="perspectiveBelow"/> + <xsd:enumeration value="perspectiveAboveLeftFacing"/> + <xsd:enumeration value="perspectiveAboveRightFacing"/> + <xsd:enumeration value="perspectiveContrastingLeftFacing"/> + <xsd:enumeration value="perspectiveContrastingRightFacing"/> + <xsd:enumeration value="perspectiveHeroicLeftFacing"/> + <xsd:enumeration value="perspectiveHeroicRightFacing"/> + <xsd:enumeration value="perspectiveHeroicExtremeLeftFacing"/> + <xsd:enumeration value="perspectiveHeroicExtremeRightFacing"/> + <xsd:enumeration value="perspectiveRelaxed"/> + <xsd:enumeration value="perspectiveRelaxedModerately"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FOVAngle"> + <xsd:restriction base="ST_Angle"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="10800000"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Camera"> + <xsd:sequence> + <xsd:element name="rot" type="CT_SphereCoords" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="prst" type="ST_PresetCameraType" use="required"/> + <xsd:attribute name="fov" type="ST_FOVAngle" use="optional"/> + <xsd:attribute name="zoom" type="ST_PositivePercentage" use="optional" default="100%"/> + </xsd:complexType> + <xsd:simpleType name="ST_LightRigDirection"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="tl"/> + <xsd:enumeration value="t"/> + <xsd:enumeration value="tr"/> + <xsd:enumeration value="l"/> + <xsd:enumeration value="r"/> + <xsd:enumeration value="bl"/> + <xsd:enumeration value="b"/> + <xsd:enumeration value="br"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_LightRigType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="legacyFlat1"/> + <xsd:enumeration value="legacyFlat2"/> + <xsd:enumeration value="legacyFlat3"/> + <xsd:enumeration value="legacyFlat4"/> + <xsd:enumeration value="legacyNormal1"/> + <xsd:enumeration value="legacyNormal2"/> + <xsd:enumeration value="legacyNormal3"/> + <xsd:enumeration value="legacyNormal4"/> + <xsd:enumeration value="legacyHarsh1"/> + <xsd:enumeration value="legacyHarsh2"/> + <xsd:enumeration value="legacyHarsh3"/> + <xsd:enumeration value="legacyHarsh4"/> + <xsd:enumeration value="threePt"/> + <xsd:enumeration value="balanced"/> + <xsd:enumeration value="soft"/> + <xsd:enumeration value="harsh"/> + <xsd:enumeration value="flood"/> + <xsd:enumeration value="contrasting"/> + <xsd:enumeration value="morning"/> + <xsd:enumeration value="sunrise"/> + <xsd:enumeration value="sunset"/> + <xsd:enumeration value="chilly"/> + <xsd:enumeration value="freezing"/> + <xsd:enumeration value="flat"/> + <xsd:enumeration value="twoPt"/> + <xsd:enumeration value="glow"/> + <xsd:enumeration value="brightRoom"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_LightRig"> + <xsd:sequence> + <xsd:element name="rot" type="CT_SphereCoords" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="rig" type="ST_LightRigType" use="required"/> + <xsd:attribute name="dir" type="ST_LightRigDirection" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Scene3D"> + <xsd:sequence> + <xsd:element name="camera" type="CT_Camera" minOccurs="1" maxOccurs="1"/> + <xsd:element name="lightRig" type="CT_LightRig" minOccurs="1" maxOccurs="1"/> + <xsd:element name="backdrop" type="CT_Backdrop" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Backdrop"> + <xsd:sequence> + <xsd:element name="anchor" type="CT_Point3D" minOccurs="1" maxOccurs="1"/> + <xsd:element name="norm" type="CT_Vector3D" minOccurs="1" maxOccurs="1"/> + <xsd:element name="up" type="CT_Vector3D" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_BevelPresetType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="relaxedInset"/> + <xsd:enumeration value="circle"/> + <xsd:enumeration value="slope"/> + <xsd:enumeration value="cross"/> + <xsd:enumeration value="angle"/> + <xsd:enumeration value="softRound"/> + <xsd:enumeration value="convex"/> + <xsd:enumeration value="coolSlant"/> + <xsd:enumeration value="divot"/> + <xsd:enumeration value="riblet"/> + <xsd:enumeration value="hardEdge"/> + <xsd:enumeration value="artDeco"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Bevel"> + <xsd:attribute name="w" type="ST_PositiveCoordinate" use="optional" default="76200"/> + <xsd:attribute name="h" type="ST_PositiveCoordinate" use="optional" default="76200"/> + <xsd:attribute name="prst" type="ST_BevelPresetType" use="optional" default="circle"/> + </xsd:complexType> + <xsd:simpleType name="ST_PresetMaterialType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="legacyMatte"/> + <xsd:enumeration value="legacyPlastic"/> + <xsd:enumeration value="legacyMetal"/> + <xsd:enumeration value="legacyWireframe"/> + <xsd:enumeration value="matte"/> + <xsd:enumeration value="plastic"/> + <xsd:enumeration value="metal"/> + <xsd:enumeration value="warmMatte"/> + <xsd:enumeration value="translucentPowder"/> + <xsd:enumeration value="powder"/> + <xsd:enumeration value="dkEdge"/> + <xsd:enumeration value="softEdge"/> + <xsd:enumeration value="clear"/> + <xsd:enumeration value="flat"/> + <xsd:enumeration value="softmetal"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Shape3D"> + <xsd:sequence> + <xsd:element name="bevelT" type="CT_Bevel" minOccurs="0" maxOccurs="1"/> + <xsd:element name="bevelB" type="CT_Bevel" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extrusionClr" type="CT_Color" minOccurs="0" maxOccurs="1"/> + <xsd:element name="contourClr" type="CT_Color" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="z" type="ST_Coordinate" use="optional" default="0"/> + <xsd:attribute name="extrusionH" type="ST_PositiveCoordinate" use="optional" default="0"/> + <xsd:attribute name="contourW" type="ST_PositiveCoordinate" use="optional" default="0"/> + <xsd:attribute name="prstMaterial" type="ST_PresetMaterialType" use="optional" + default="warmMatte"/> + </xsd:complexType> + <xsd:complexType name="CT_FlatText"> + <xsd:attribute name="z" type="ST_Coordinate" use="optional" default="0"/> + </xsd:complexType> + <xsd:group name="EG_Text3D"> + <xsd:choice> + <xsd:element name="sp3d" type="CT_Shape3D" minOccurs="1" maxOccurs="1"/> + <xsd:element name="flatTx" type="CT_FlatText" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_AlphaBiLevelEffect"> + <xsd:attribute name="thresh" type="ST_PositiveFixedPercentage" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_AlphaCeilingEffect"/> + <xsd:complexType name="CT_AlphaFloorEffect"/> + <xsd:complexType name="CT_AlphaInverseEffect"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_AlphaModulateFixedEffect"> + <xsd:attribute name="amt" type="ST_PositivePercentage" use="optional" default="100%"/> + </xsd:complexType> + <xsd:complexType name="CT_AlphaOutsetEffect"> + <xsd:attribute name="rad" type="ST_Coordinate" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_AlphaReplaceEffect"> + <xsd:attribute name="a" type="ST_PositiveFixedPercentage" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_BiLevelEffect"> + <xsd:attribute name="thresh" type="ST_PositiveFixedPercentage" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_BlurEffect"> + <xsd:attribute name="rad" type="ST_PositiveCoordinate" use="optional" default="0"/> + <xsd:attribute name="grow" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_ColorChangeEffect"> + <xsd:sequence> + <xsd:element name="clrFrom" type="CT_Color" minOccurs="1" maxOccurs="1"/> + <xsd:element name="clrTo" type="CT_Color" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="useA" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_ColorReplaceEffect"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DuotoneEffect"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice" minOccurs="2" maxOccurs="2"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GlowEffect"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="rad" type="ST_PositiveCoordinate" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_GrayscaleEffect"/> + <xsd:complexType name="CT_HSLEffect"> + <xsd:attribute name="hue" type="ST_PositiveFixedAngle" use="optional" default="0"/> + <xsd:attribute name="sat" type="ST_FixedPercentage" use="optional" default="0%"/> + <xsd:attribute name="lum" type="ST_FixedPercentage" use="optional" default="0%"/> + </xsd:complexType> + <xsd:complexType name="CT_InnerShadowEffect"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="blurRad" type="ST_PositiveCoordinate" use="optional" default="0"/> + <xsd:attribute name="dist" type="ST_PositiveCoordinate" use="optional" default="0"/> + <xsd:attribute name="dir" type="ST_PositiveFixedAngle" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_LuminanceEffect"> + <xsd:attribute name="bright" type="ST_FixedPercentage" use="optional" default="0%"/> + <xsd:attribute name="contrast" type="ST_FixedPercentage" use="optional" default="0%"/> + </xsd:complexType> + <xsd:complexType name="CT_OuterShadowEffect"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="blurRad" type="ST_PositiveCoordinate" use="optional" default="0"/> + <xsd:attribute name="dist" type="ST_PositiveCoordinate" use="optional" default="0"/> + <xsd:attribute name="dir" type="ST_PositiveFixedAngle" use="optional" default="0"/> + <xsd:attribute name="sx" type="ST_Percentage" use="optional" default="100%"/> + <xsd:attribute name="sy" type="ST_Percentage" use="optional" default="100%"/> + <xsd:attribute name="kx" type="ST_FixedAngle" use="optional" default="0"/> + <xsd:attribute name="ky" type="ST_FixedAngle" use="optional" default="0"/> + <xsd:attribute name="algn" type="ST_RectAlignment" use="optional" default="b"/> + <xsd:attribute name="rotWithShape" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:simpleType name="ST_PresetShadowVal"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="shdw1"/> + <xsd:enumeration value="shdw2"/> + <xsd:enumeration value="shdw3"/> + <xsd:enumeration value="shdw4"/> + <xsd:enumeration value="shdw5"/> + <xsd:enumeration value="shdw6"/> + <xsd:enumeration value="shdw7"/> + <xsd:enumeration value="shdw8"/> + <xsd:enumeration value="shdw9"/> + <xsd:enumeration value="shdw10"/> + <xsd:enumeration value="shdw11"/> + <xsd:enumeration value="shdw12"/> + <xsd:enumeration value="shdw13"/> + <xsd:enumeration value="shdw14"/> + <xsd:enumeration value="shdw15"/> + <xsd:enumeration value="shdw16"/> + <xsd:enumeration value="shdw17"/> + <xsd:enumeration value="shdw18"/> + <xsd:enumeration value="shdw19"/> + <xsd:enumeration value="shdw20"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PresetShadowEffect"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="prst" type="ST_PresetShadowVal" use="required"/> + <xsd:attribute name="dist" type="ST_PositiveCoordinate" use="optional" default="0"/> + <xsd:attribute name="dir" type="ST_PositiveFixedAngle" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_ReflectionEffect"> + <xsd:attribute name="blurRad" type="ST_PositiveCoordinate" use="optional" default="0"/> + <xsd:attribute name="stA" type="ST_PositiveFixedPercentage" use="optional" default="100%"/> + <xsd:attribute name="stPos" type="ST_PositiveFixedPercentage" use="optional" default="0%"/> + <xsd:attribute name="endA" type="ST_PositiveFixedPercentage" use="optional" default="0%"/> + <xsd:attribute name="endPos" type="ST_PositiveFixedPercentage" use="optional" default="100%"/> + <xsd:attribute name="dist" type="ST_PositiveCoordinate" use="optional" default="0"/> + <xsd:attribute name="dir" type="ST_PositiveFixedAngle" use="optional" default="0"/> + <xsd:attribute name="fadeDir" type="ST_PositiveFixedAngle" use="optional" default="5400000"/> + <xsd:attribute name="sx" type="ST_Percentage" use="optional" default="100%"/> + <xsd:attribute name="sy" type="ST_Percentage" use="optional" default="100%"/> + <xsd:attribute name="kx" type="ST_FixedAngle" use="optional" default="0"/> + <xsd:attribute name="ky" type="ST_FixedAngle" use="optional" default="0"/> + <xsd:attribute name="algn" type="ST_RectAlignment" use="optional" default="b"/> + <xsd:attribute name="rotWithShape" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_RelativeOffsetEffect"> + <xsd:attribute name="tx" type="ST_Percentage" use="optional" default="0%"/> + <xsd:attribute name="ty" type="ST_Percentage" use="optional" default="0%"/> + </xsd:complexType> + <xsd:complexType name="CT_SoftEdgesEffect"> + <xsd:attribute name="rad" type="ST_PositiveCoordinate" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TintEffect"> + <xsd:attribute name="hue" type="ST_PositiveFixedAngle" use="optional" default="0"/> + <xsd:attribute name="amt" type="ST_FixedPercentage" use="optional" default="0%"/> + </xsd:complexType> + <xsd:complexType name="CT_TransformEffect"> + <xsd:attribute name="sx" type="ST_Percentage" use="optional" default="100%"/> + <xsd:attribute name="sy" type="ST_Percentage" use="optional" default="100%"/> + <xsd:attribute name="kx" type="ST_FixedAngle" use="optional" default="0"/> + <xsd:attribute name="ky" type="ST_FixedAngle" use="optional" default="0"/> + <xsd:attribute name="tx" type="ST_Coordinate" use="optional" default="0"/> + <xsd:attribute name="ty" type="ST_Coordinate" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_NoFillProperties"/> + <xsd:complexType name="CT_SolidColorFillProperties"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_LinearShadeProperties"> + <xsd:attribute name="ang" type="ST_PositiveFixedAngle" use="optional"/> + <xsd:attribute name="scaled" type="xsd:boolean" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_PathShadeType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="shape"/> + <xsd:enumeration value="circle"/> + <xsd:enumeration value="rect"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PathShadeProperties"> + <xsd:sequence> + <xsd:element name="fillToRect" type="CT_RelativeRect" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="path" type="ST_PathShadeType" use="optional"/> + </xsd:complexType> + <xsd:group name="EG_ShadeProperties"> + <xsd:choice> + <xsd:element name="lin" type="CT_LinearShadeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="path" type="CT_PathShadeProperties" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:simpleType name="ST_TileFlipMode"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="x"/> + <xsd:enumeration value="y"/> + <xsd:enumeration value="xy"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_GradientStop"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="pos" type="ST_PositiveFixedPercentage" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_GradientStopList"> + <xsd:sequence> + <xsd:element name="gs" type="CT_GradientStop" minOccurs="2" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GradientFillProperties"> + <xsd:sequence> + <xsd:element name="gsLst" type="CT_GradientStopList" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_ShadeProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tileRect" type="CT_RelativeRect" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="flip" type="ST_TileFlipMode" use="optional" default="none"/> + <xsd:attribute name="rotWithShape" type="xsd:boolean" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TileInfoProperties"> + <xsd:attribute name="tx" type="ST_Coordinate" use="optional"/> + <xsd:attribute name="ty" type="ST_Coordinate" use="optional"/> + <xsd:attribute name="sx" type="ST_Percentage" use="optional"/> + <xsd:attribute name="sy" type="ST_Percentage" use="optional"/> + <xsd:attribute name="flip" type="ST_TileFlipMode" use="optional" default="none"/> + <xsd:attribute name="algn" type="ST_RectAlignment" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_StretchInfoProperties"> + <xsd:sequence> + <xsd:element name="fillRect" type="CT_RelativeRect" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_FillModeProperties"> + <xsd:choice> + <xsd:element name="tile" type="CT_TileInfoProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="stretch" type="CT_StretchInfoProperties" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:simpleType name="ST_BlipCompression"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="email"/> + <xsd:enumeration value="screen"/> + <xsd:enumeration value="print"/> + <xsd:enumeration value="hqprint"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Blip"> + <xsd:sequence> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="alphaBiLevel" type="CT_AlphaBiLevelEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="alphaCeiling" type="CT_AlphaCeilingEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="alphaFloor" type="CT_AlphaFloorEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="alphaInv" type="CT_AlphaInverseEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="alphaMod" type="CT_AlphaModulateEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="alphaModFix" type="CT_AlphaModulateFixedEffect" minOccurs="1" + maxOccurs="1"/> + <xsd:element name="alphaRepl" type="CT_AlphaReplaceEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="biLevel" type="CT_BiLevelEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="blur" type="CT_BlurEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="clrChange" type="CT_ColorChangeEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="clrRepl" type="CT_ColorReplaceEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="duotone" type="CT_DuotoneEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="fillOverlay" type="CT_FillOverlayEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="grayscl" type="CT_GrayscaleEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="hsl" type="CT_HSLEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="lum" type="CT_LuminanceEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="tint" type="CT_TintEffect" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_Blob"/> + <xsd:attribute name="cstate" type="ST_BlipCompression" use="optional" default="none"/> + </xsd:complexType> + <xsd:complexType name="CT_BlipFillProperties"> + <xsd:sequence> + <xsd:element name="blip" type="CT_Blip" minOccurs="0" maxOccurs="1"/> + <xsd:element name="srcRect" type="CT_RelativeRect" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_FillModeProperties" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="dpi" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="rotWithShape" type="xsd:boolean" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_PresetPatternVal"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="pct5"/> + <xsd:enumeration value="pct10"/> + <xsd:enumeration value="pct20"/> + <xsd:enumeration value="pct25"/> + <xsd:enumeration value="pct30"/> + <xsd:enumeration value="pct40"/> + <xsd:enumeration value="pct50"/> + <xsd:enumeration value="pct60"/> + <xsd:enumeration value="pct70"/> + <xsd:enumeration value="pct75"/> + <xsd:enumeration value="pct80"/> + <xsd:enumeration value="pct90"/> + <xsd:enumeration value="horz"/> + <xsd:enumeration value="vert"/> + <xsd:enumeration value="ltHorz"/> + <xsd:enumeration value="ltVert"/> + <xsd:enumeration value="dkHorz"/> + <xsd:enumeration value="dkVert"/> + <xsd:enumeration value="narHorz"/> + <xsd:enumeration value="narVert"/> + <xsd:enumeration value="dashHorz"/> + <xsd:enumeration value="dashVert"/> + <xsd:enumeration value="cross"/> + <xsd:enumeration value="dnDiag"/> + <xsd:enumeration value="upDiag"/> + <xsd:enumeration value="ltDnDiag"/> + <xsd:enumeration value="ltUpDiag"/> + <xsd:enumeration value="dkDnDiag"/> + <xsd:enumeration value="dkUpDiag"/> + <xsd:enumeration value="wdDnDiag"/> + <xsd:enumeration value="wdUpDiag"/> + <xsd:enumeration value="dashDnDiag"/> + <xsd:enumeration value="dashUpDiag"/> + <xsd:enumeration value="diagCross"/> + <xsd:enumeration value="smCheck"/> + <xsd:enumeration value="lgCheck"/> + <xsd:enumeration value="smGrid"/> + <xsd:enumeration value="lgGrid"/> + <xsd:enumeration value="dotGrid"/> + <xsd:enumeration value="smConfetti"/> + <xsd:enumeration value="lgConfetti"/> + <xsd:enumeration value="horzBrick"/> + <xsd:enumeration value="diagBrick"/> + <xsd:enumeration value="solidDmnd"/> + <xsd:enumeration value="openDmnd"/> + <xsd:enumeration value="dotDmnd"/> + <xsd:enumeration value="plaid"/> + <xsd:enumeration value="sphere"/> + <xsd:enumeration value="weave"/> + <xsd:enumeration value="divot"/> + <xsd:enumeration value="shingle"/> + <xsd:enumeration value="wave"/> + <xsd:enumeration value="trellis"/> + <xsd:enumeration value="zigZag"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PatternFillProperties"> + <xsd:sequence> + <xsd:element name="fgClr" type="CT_Color" minOccurs="0" maxOccurs="1"/> + <xsd:element name="bgClr" type="CT_Color" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="prst" type="ST_PresetPatternVal" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_GroupFillProperties"/> + <xsd:group name="EG_FillProperties"> + <xsd:choice> + <xsd:element name="noFill" type="CT_NoFillProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="solidFill" type="CT_SolidColorFillProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="gradFill" type="CT_GradientFillProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="blipFill" type="CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="pattFill" type="CT_PatternFillProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="grpFill" type="CT_GroupFillProperties" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_FillProperties"> + <xsd:sequence> + <xsd:group ref="EG_FillProperties" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_FillEffect"> + <xsd:sequence> + <xsd:group ref="EG_FillProperties" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_BlendMode"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="over"/> + <xsd:enumeration value="mult"/> + <xsd:enumeration value="screen"/> + <xsd:enumeration value="darken"/> + <xsd:enumeration value="lighten"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_FillOverlayEffect"> + <xsd:sequence> + <xsd:group ref="EG_FillProperties" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="blend" type="ST_BlendMode" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_EffectReference"> + <xsd:attribute name="ref" type="xsd:token" use="required"/> + </xsd:complexType> + <xsd:group name="EG_Effect"> + <xsd:choice> + <xsd:element name="cont" type="CT_EffectContainer" minOccurs="1" maxOccurs="1"/> + <xsd:element name="effect" type="CT_EffectReference" minOccurs="1" maxOccurs="1"/> + <xsd:element name="alphaBiLevel" type="CT_AlphaBiLevelEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="alphaCeiling" type="CT_AlphaCeilingEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="alphaFloor" type="CT_AlphaFloorEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="alphaInv" type="CT_AlphaInverseEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="alphaMod" type="CT_AlphaModulateEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="alphaModFix" type="CT_AlphaModulateFixedEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="alphaOutset" type="CT_AlphaOutsetEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="alphaRepl" type="CT_AlphaReplaceEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="biLevel" type="CT_BiLevelEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="blend" type="CT_BlendEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="blur" type="CT_BlurEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="clrChange" type="CT_ColorChangeEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="clrRepl" type="CT_ColorReplaceEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="duotone" type="CT_DuotoneEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="fill" type="CT_FillEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="fillOverlay" type="CT_FillOverlayEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="glow" type="CT_GlowEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="grayscl" type="CT_GrayscaleEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="hsl" type="CT_HSLEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="innerShdw" type="CT_InnerShadowEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="lum" type="CT_LuminanceEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="outerShdw" type="CT_OuterShadowEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="prstShdw" type="CT_PresetShadowEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="reflection" type="CT_ReflectionEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="relOff" type="CT_RelativeOffsetEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="softEdge" type="CT_SoftEdgesEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="tint" type="CT_TintEffect" minOccurs="1" maxOccurs="1"/> + <xsd:element name="xfrm" type="CT_TransformEffect" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:simpleType name="ST_EffectContainerType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="sib"/> + <xsd:enumeration value="tree"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_EffectContainer"> + <xsd:group ref="EG_Effect" minOccurs="0" maxOccurs="unbounded"/> + <xsd:attribute name="type" type="ST_EffectContainerType" use="optional" default="sib"/> + <xsd:attribute name="name" type="xsd:token" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_AlphaModulateEffect"> + <xsd:sequence> + <xsd:element name="cont" type="CT_EffectContainer" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_BlendEffect"> + <xsd:sequence> + <xsd:element name="cont" type="CT_EffectContainer" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="blend" type="ST_BlendMode" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_EffectList"> + <xsd:sequence> + <xsd:element name="blur" type="CT_BlurEffect" minOccurs="0" maxOccurs="1"/> + <xsd:element name="fillOverlay" type="CT_FillOverlayEffect" minOccurs="0" maxOccurs="1"/> + <xsd:element name="glow" type="CT_GlowEffect" minOccurs="0" maxOccurs="1"/> + <xsd:element name="innerShdw" type="CT_InnerShadowEffect" minOccurs="0" maxOccurs="1"/> + <xsd:element name="outerShdw" type="CT_OuterShadowEffect" minOccurs="0" maxOccurs="1"/> + <xsd:element name="prstShdw" type="CT_PresetShadowEffect" minOccurs="0" maxOccurs="1"/> + <xsd:element name="reflection" type="CT_ReflectionEffect" minOccurs="0" maxOccurs="1"/> + <xsd:element name="softEdge" type="CT_SoftEdgesEffect" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_EffectProperties"> + <xsd:choice> + <xsd:element name="effectLst" type="CT_EffectList" minOccurs="1" maxOccurs="1"/> + <xsd:element name="effectDag" type="CT_EffectContainer" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_EffectProperties"> + <xsd:sequence> + <xsd:group ref="EG_EffectProperties" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="blip" type="CT_Blip"/> + <xsd:simpleType name="ST_ShapeType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="line"/> + <xsd:enumeration value="lineInv"/> + <xsd:enumeration value="triangle"/> + <xsd:enumeration value="rtTriangle"/> + <xsd:enumeration value="rect"/> + <xsd:enumeration value="diamond"/> + <xsd:enumeration value="parallelogram"/> + <xsd:enumeration value="trapezoid"/> + <xsd:enumeration value="nonIsoscelesTrapezoid"/> + <xsd:enumeration value="pentagon"/> + <xsd:enumeration value="hexagon"/> + <xsd:enumeration value="heptagon"/> + <xsd:enumeration value="octagon"/> + <xsd:enumeration value="decagon"/> + <xsd:enumeration value="dodecagon"/> + <xsd:enumeration value="star4"/> + <xsd:enumeration value="star5"/> + <xsd:enumeration value="star6"/> + <xsd:enumeration value="star7"/> + <xsd:enumeration value="star8"/> + <xsd:enumeration value="star10"/> + <xsd:enumeration value="star12"/> + <xsd:enumeration value="star16"/> + <xsd:enumeration value="star24"/> + <xsd:enumeration value="star32"/> + <xsd:enumeration value="roundRect"/> + <xsd:enumeration value="round1Rect"/> + <xsd:enumeration value="round2SameRect"/> + <xsd:enumeration value="round2DiagRect"/> + <xsd:enumeration value="snipRoundRect"/> + <xsd:enumeration value="snip1Rect"/> + <xsd:enumeration value="snip2SameRect"/> + <xsd:enumeration value="snip2DiagRect"/> + <xsd:enumeration value="plaque"/> + <xsd:enumeration value="ellipse"/> + <xsd:enumeration value="teardrop"/> + <xsd:enumeration value="homePlate"/> + <xsd:enumeration value="chevron"/> + <xsd:enumeration value="pieWedge"/> + <xsd:enumeration value="pie"/> + <xsd:enumeration value="blockArc"/> + <xsd:enumeration value="donut"/> + <xsd:enumeration value="noSmoking"/> + <xsd:enumeration value="rightArrow"/> + <xsd:enumeration value="leftArrow"/> + <xsd:enumeration value="upArrow"/> + <xsd:enumeration value="downArrow"/> + <xsd:enumeration value="stripedRightArrow"/> + <xsd:enumeration value="notchedRightArrow"/> + <xsd:enumeration value="bentUpArrow"/> + <xsd:enumeration value="leftRightArrow"/> + <xsd:enumeration value="upDownArrow"/> + <xsd:enumeration value="leftUpArrow"/> + <xsd:enumeration value="leftRightUpArrow"/> + <xsd:enumeration value="quadArrow"/> + <xsd:enumeration value="leftArrowCallout"/> + <xsd:enumeration value="rightArrowCallout"/> + <xsd:enumeration value="upArrowCallout"/> + <xsd:enumeration value="downArrowCallout"/> + <xsd:enumeration value="leftRightArrowCallout"/> + <xsd:enumeration value="upDownArrowCallout"/> + <xsd:enumeration value="quadArrowCallout"/> + <xsd:enumeration value="bentArrow"/> + <xsd:enumeration value="uturnArrow"/> + <xsd:enumeration value="circularArrow"/> + <xsd:enumeration value="leftCircularArrow"/> + <xsd:enumeration value="leftRightCircularArrow"/> + <xsd:enumeration value="curvedRightArrow"/> + <xsd:enumeration value="curvedLeftArrow"/> + <xsd:enumeration value="curvedUpArrow"/> + <xsd:enumeration value="curvedDownArrow"/> + <xsd:enumeration value="swooshArrow"/> + <xsd:enumeration value="cube"/> + <xsd:enumeration value="can"/> + <xsd:enumeration value="lightningBolt"/> + <xsd:enumeration value="heart"/> + <xsd:enumeration value="sun"/> + <xsd:enumeration value="moon"/> + <xsd:enumeration value="smileyFace"/> + <xsd:enumeration value="irregularSeal1"/> + <xsd:enumeration value="irregularSeal2"/> + <xsd:enumeration value="foldedCorner"/> + <xsd:enumeration value="bevel"/> + <xsd:enumeration value="frame"/> + <xsd:enumeration value="halfFrame"/> + <xsd:enumeration value="corner"/> + <xsd:enumeration value="diagStripe"/> + <xsd:enumeration value="chord"/> + <xsd:enumeration value="arc"/> + <xsd:enumeration value="leftBracket"/> + <xsd:enumeration value="rightBracket"/> + <xsd:enumeration value="leftBrace"/> + <xsd:enumeration value="rightBrace"/> + <xsd:enumeration value="bracketPair"/> + <xsd:enumeration value="bracePair"/> + <xsd:enumeration value="straightConnector1"/> + <xsd:enumeration value="bentConnector2"/> + <xsd:enumeration value="bentConnector3"/> + <xsd:enumeration value="bentConnector4"/> + <xsd:enumeration value="bentConnector5"/> + <xsd:enumeration value="curvedConnector2"/> + <xsd:enumeration value="curvedConnector3"/> + <xsd:enumeration value="curvedConnector4"/> + <xsd:enumeration value="curvedConnector5"/> + <xsd:enumeration value="callout1"/> + <xsd:enumeration value="callout2"/> + <xsd:enumeration value="callout3"/> + <xsd:enumeration value="accentCallout1"/> + <xsd:enumeration value="accentCallout2"/> + <xsd:enumeration value="accentCallout3"/> + <xsd:enumeration value="borderCallout1"/> + <xsd:enumeration value="borderCallout2"/> + <xsd:enumeration value="borderCallout3"/> + <xsd:enumeration value="accentBorderCallout1"/> + <xsd:enumeration value="accentBorderCallout2"/> + <xsd:enumeration value="accentBorderCallout3"/> + <xsd:enumeration value="wedgeRectCallout"/> + <xsd:enumeration value="wedgeRoundRectCallout"/> + <xsd:enumeration value="wedgeEllipseCallout"/> + <xsd:enumeration value="cloudCallout"/> + <xsd:enumeration value="cloud"/> + <xsd:enumeration value="ribbon"/> + <xsd:enumeration value="ribbon2"/> + <xsd:enumeration value="ellipseRibbon"/> + <xsd:enumeration value="ellipseRibbon2"/> + <xsd:enumeration value="leftRightRibbon"/> + <xsd:enumeration value="verticalScroll"/> + <xsd:enumeration value="horizontalScroll"/> + <xsd:enumeration value="wave"/> + <xsd:enumeration value="doubleWave"/> + <xsd:enumeration value="plus"/> + <xsd:enumeration value="flowChartProcess"/> + <xsd:enumeration value="flowChartDecision"/> + <xsd:enumeration value="flowChartInputOutput"/> + <xsd:enumeration value="flowChartPredefinedProcess"/> + <xsd:enumeration value="flowChartInternalStorage"/> + <xsd:enumeration value="flowChartDocument"/> + <xsd:enumeration value="flowChartMultidocument"/> + <xsd:enumeration value="flowChartTerminator"/> + <xsd:enumeration value="flowChartPreparation"/> + <xsd:enumeration value="flowChartManualInput"/> + <xsd:enumeration value="flowChartManualOperation"/> + <xsd:enumeration value="flowChartConnector"/> + <xsd:enumeration value="flowChartPunchedCard"/> + <xsd:enumeration value="flowChartPunchedTape"/> + <xsd:enumeration value="flowChartSummingJunction"/> + <xsd:enumeration value="flowChartOr"/> + <xsd:enumeration value="flowChartCollate"/> + <xsd:enumeration value="flowChartSort"/> + <xsd:enumeration value="flowChartExtract"/> + <xsd:enumeration value="flowChartMerge"/> + <xsd:enumeration value="flowChartOfflineStorage"/> + <xsd:enumeration value="flowChartOnlineStorage"/> + <xsd:enumeration value="flowChartMagneticTape"/> + <xsd:enumeration value="flowChartMagneticDisk"/> + <xsd:enumeration value="flowChartMagneticDrum"/> + <xsd:enumeration value="flowChartDisplay"/> + <xsd:enumeration value="flowChartDelay"/> + <xsd:enumeration value="flowChartAlternateProcess"/> + <xsd:enumeration value="flowChartOffpageConnector"/> + <xsd:enumeration value="actionButtonBlank"/> + <xsd:enumeration value="actionButtonHome"/> + <xsd:enumeration value="actionButtonHelp"/> + <xsd:enumeration value="actionButtonInformation"/> + <xsd:enumeration value="actionButtonForwardNext"/> + <xsd:enumeration value="actionButtonBackPrevious"/> + <xsd:enumeration value="actionButtonEnd"/> + <xsd:enumeration value="actionButtonBeginning"/> + <xsd:enumeration value="actionButtonReturn"/> + <xsd:enumeration value="actionButtonDocument"/> + <xsd:enumeration value="actionButtonSound"/> + <xsd:enumeration value="actionButtonMovie"/> + <xsd:enumeration value="gear6"/> + <xsd:enumeration value="gear9"/> + <xsd:enumeration value="funnel"/> + <xsd:enumeration value="mathPlus"/> + <xsd:enumeration value="mathMinus"/> + <xsd:enumeration value="mathMultiply"/> + <xsd:enumeration value="mathDivide"/> + <xsd:enumeration value="mathEqual"/> + <xsd:enumeration value="mathNotEqual"/> + <xsd:enumeration value="cornerTabs"/> + <xsd:enumeration value="squareTabs"/> + <xsd:enumeration value="plaqueTabs"/> + <xsd:enumeration value="chartX"/> + <xsd:enumeration value="chartStar"/> + <xsd:enumeration value="chartPlus"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextShapeType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="textNoShape"/> + <xsd:enumeration value="textPlain"/> + <xsd:enumeration value="textStop"/> + <xsd:enumeration value="textTriangle"/> + <xsd:enumeration value="textTriangleInverted"/> + <xsd:enumeration value="textChevron"/> + <xsd:enumeration value="textChevronInverted"/> + <xsd:enumeration value="textRingInside"/> + <xsd:enumeration value="textRingOutside"/> + <xsd:enumeration value="textArchUp"/> + <xsd:enumeration value="textArchDown"/> + <xsd:enumeration value="textCircle"/> + <xsd:enumeration value="textButton"/> + <xsd:enumeration value="textArchUpPour"/> + <xsd:enumeration value="textArchDownPour"/> + <xsd:enumeration value="textCirclePour"/> + <xsd:enumeration value="textButtonPour"/> + <xsd:enumeration value="textCurveUp"/> + <xsd:enumeration value="textCurveDown"/> + <xsd:enumeration value="textCanUp"/> + <xsd:enumeration value="textCanDown"/> + <xsd:enumeration value="textWave1"/> + <xsd:enumeration value="textWave2"/> + <xsd:enumeration value="textDoubleWave1"/> + <xsd:enumeration value="textWave4"/> + <xsd:enumeration value="textInflate"/> + <xsd:enumeration value="textDeflate"/> + <xsd:enumeration value="textInflateBottom"/> + <xsd:enumeration value="textDeflateBottom"/> + <xsd:enumeration value="textInflateTop"/> + <xsd:enumeration value="textDeflateTop"/> + <xsd:enumeration value="textDeflateInflate"/> + <xsd:enumeration value="textDeflateInflateDeflate"/> + <xsd:enumeration value="textFadeRight"/> + <xsd:enumeration value="textFadeLeft"/> + <xsd:enumeration value="textFadeUp"/> + <xsd:enumeration value="textFadeDown"/> + <xsd:enumeration value="textSlantUp"/> + <xsd:enumeration value="textSlantDown"/> + <xsd:enumeration value="textCascadeUp"/> + <xsd:enumeration value="textCascadeDown"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_GeomGuideName"> + <xsd:restriction base="xsd:token"/> + </xsd:simpleType> + <xsd:simpleType name="ST_GeomGuideFormula"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:complexType name="CT_GeomGuide"> + <xsd:attribute name="name" type="ST_GeomGuideName" use="required"/> + <xsd:attribute name="fmla" type="ST_GeomGuideFormula" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_GeomGuideList"> + <xsd:sequence> + <xsd:element name="gd" type="CT_GeomGuide" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_AdjCoordinate"> + <xsd:union memberTypes="ST_Coordinate ST_GeomGuideName"/> + </xsd:simpleType> + <xsd:simpleType name="ST_AdjAngle"> + <xsd:union memberTypes="ST_Angle ST_GeomGuideName"/> + </xsd:simpleType> + <xsd:complexType name="CT_AdjPoint2D"> + <xsd:attribute name="x" type="ST_AdjCoordinate" use="required"/> + <xsd:attribute name="y" type="ST_AdjCoordinate" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_GeomRect"> + <xsd:attribute name="l" type="ST_AdjCoordinate" use="required"/> + <xsd:attribute name="t" type="ST_AdjCoordinate" use="required"/> + <xsd:attribute name="r" type="ST_AdjCoordinate" use="required"/> + <xsd:attribute name="b" type="ST_AdjCoordinate" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_XYAdjustHandle"> + <xsd:sequence> + <xsd:element name="pos" type="CT_AdjPoint2D" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="gdRefX" type="ST_GeomGuideName" use="optional"/> + <xsd:attribute name="minX" type="ST_AdjCoordinate" use="optional"/> + <xsd:attribute name="maxX" type="ST_AdjCoordinate" use="optional"/> + <xsd:attribute name="gdRefY" type="ST_GeomGuideName" use="optional"/> + <xsd:attribute name="minY" type="ST_AdjCoordinate" use="optional"/> + <xsd:attribute name="maxY" type="ST_AdjCoordinate" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_PolarAdjustHandle"> + <xsd:sequence> + <xsd:element name="pos" type="CT_AdjPoint2D" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="gdRefR" type="ST_GeomGuideName" use="optional"/> + <xsd:attribute name="minR" type="ST_AdjCoordinate" use="optional"/> + <xsd:attribute name="maxR" type="ST_AdjCoordinate" use="optional"/> + <xsd:attribute name="gdRefAng" type="ST_GeomGuideName" use="optional"/> + <xsd:attribute name="minAng" type="ST_AdjAngle" use="optional"/> + <xsd:attribute name="maxAng" type="ST_AdjAngle" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_ConnectionSite"> + <xsd:sequence> + <xsd:element name="pos" type="CT_AdjPoint2D" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="ang" type="ST_AdjAngle" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_AdjustHandleList"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="ahXY" type="CT_XYAdjustHandle" minOccurs="1" maxOccurs="1"/> + <xsd:element name="ahPolar" type="CT_PolarAdjustHandle" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:complexType> + <xsd:complexType name="CT_ConnectionSiteList"> + <xsd:sequence> + <xsd:element name="cxn" type="CT_ConnectionSite" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Connection"> + <xsd:attribute name="id" type="ST_DrawingElementId" use="required"/> + <xsd:attribute name="idx" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Path2DMoveTo"> + <xsd:sequence> + <xsd:element name="pt" type="CT_AdjPoint2D" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Path2DLineTo"> + <xsd:sequence> + <xsd:element name="pt" type="CT_AdjPoint2D" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Path2DArcTo"> + <xsd:attribute name="wR" type="ST_AdjCoordinate" use="required"/> + <xsd:attribute name="hR" type="ST_AdjCoordinate" use="required"/> + <xsd:attribute name="stAng" type="ST_AdjAngle" use="required"/> + <xsd:attribute name="swAng" type="ST_AdjAngle" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Path2DQuadBezierTo"> + <xsd:sequence> + <xsd:element name="pt" type="CT_AdjPoint2D" minOccurs="2" maxOccurs="2"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Path2DCubicBezierTo"> + <xsd:sequence> + <xsd:element name="pt" type="CT_AdjPoint2D" minOccurs="3" maxOccurs="3"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Path2DClose"/> + <xsd:simpleType name="ST_PathFillMode"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="norm"/> + <xsd:enumeration value="lighten"/> + <xsd:enumeration value="lightenLess"/> + <xsd:enumeration value="darken"/> + <xsd:enumeration value="darkenLess"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Path2D"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="close" type="CT_Path2DClose" minOccurs="1" maxOccurs="1"/> + <xsd:element name="moveTo" type="CT_Path2DMoveTo" minOccurs="1" maxOccurs="1"/> + <xsd:element name="lnTo" type="CT_Path2DLineTo" minOccurs="1" maxOccurs="1"/> + <xsd:element name="arcTo" type="CT_Path2DArcTo" minOccurs="1" maxOccurs="1"/> + <xsd:element name="quadBezTo" type="CT_Path2DQuadBezierTo" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cubicBezTo" type="CT_Path2DCubicBezierTo" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + <xsd:attribute name="w" type="ST_PositiveCoordinate" use="optional" default="0"/> + <xsd:attribute name="h" type="ST_PositiveCoordinate" use="optional" default="0"/> + <xsd:attribute name="fill" type="ST_PathFillMode" use="optional" default="norm"/> + <xsd:attribute name="stroke" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="extrusionOk" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_Path2DList"> + <xsd:sequence> + <xsd:element name="path" type="CT_Path2D" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_PresetGeometry2D"> + <xsd:sequence> + <xsd:element name="avLst" type="CT_GeomGuideList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="prst" type="ST_ShapeType" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_PresetTextShape"> + <xsd:sequence> + <xsd:element name="avLst" type="CT_GeomGuideList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="prst" type="ST_TextShapeType" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_CustomGeometry2D"> + <xsd:sequence> + <xsd:element name="avLst" type="CT_GeomGuideList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="gdLst" type="CT_GeomGuideList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ahLst" type="CT_AdjustHandleList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cxnLst" type="CT_ConnectionSiteList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="rect" type="CT_GeomRect" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pathLst" type="CT_Path2DList" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_Geometry"> + <xsd:choice> + <xsd:element name="custGeom" type="CT_CustomGeometry2D" minOccurs="1" maxOccurs="1"/> + <xsd:element name="prstGeom" type="CT_PresetGeometry2D" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:group name="EG_TextGeometry"> + <xsd:choice> + <xsd:element name="custGeom" type="CT_CustomGeometry2D" minOccurs="1" maxOccurs="1"/> + <xsd:element name="prstTxWarp" type="CT_PresetTextShape" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:simpleType name="ST_LineEndType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="triangle"/> + <xsd:enumeration value="stealth"/> + <xsd:enumeration value="diamond"/> + <xsd:enumeration value="oval"/> + <xsd:enumeration value="arrow"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_LineEndWidth"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="sm"/> + <xsd:enumeration value="med"/> + <xsd:enumeration value="lg"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_LineEndLength"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="sm"/> + <xsd:enumeration value="med"/> + <xsd:enumeration value="lg"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_LineEndProperties"> + <xsd:attribute name="type" type="ST_LineEndType" use="optional" default="none"/> + <xsd:attribute name="w" type="ST_LineEndWidth" use="optional"/> + <xsd:attribute name="len" type="ST_LineEndLength" use="optional"/> + </xsd:complexType> + <xsd:group name="EG_LineFillProperties"> + <xsd:choice> + <xsd:element name="noFill" type="CT_NoFillProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="solidFill" type="CT_SolidColorFillProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="gradFill" type="CT_GradientFillProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="pattFill" type="CT_PatternFillProperties" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_LineJoinBevel"/> + <xsd:complexType name="CT_LineJoinRound"/> + <xsd:complexType name="CT_LineJoinMiterProperties"> + <xsd:attribute name="lim" type="ST_PositivePercentage" use="optional"/> + </xsd:complexType> + <xsd:group name="EG_LineJoinProperties"> + <xsd:choice> + <xsd:element name="round" type="CT_LineJoinRound" minOccurs="1" maxOccurs="1"/> + <xsd:element name="bevel" type="CT_LineJoinBevel" minOccurs="1" maxOccurs="1"/> + <xsd:element name="miter" type="CT_LineJoinMiterProperties" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:simpleType name="ST_PresetLineDashVal"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="solid"/> + <xsd:enumeration value="dot"/> + <xsd:enumeration value="dash"/> + <xsd:enumeration value="lgDash"/> + <xsd:enumeration value="dashDot"/> + <xsd:enumeration value="lgDashDot"/> + <xsd:enumeration value="lgDashDotDot"/> + <xsd:enumeration value="sysDash"/> + <xsd:enumeration value="sysDot"/> + <xsd:enumeration value="sysDashDot"/> + <xsd:enumeration value="sysDashDotDot"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PresetLineDashProperties"> + <xsd:attribute name="val" type="ST_PresetLineDashVal" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_DashStop"> + <xsd:attribute name="d" type="ST_PositivePercentage" use="required"/> + <xsd:attribute name="sp" type="ST_PositivePercentage" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_DashStopList"> + <xsd:sequence> + <xsd:element name="ds" type="CT_DashStop" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_LineDashProperties"> + <xsd:choice> + <xsd:element name="prstDash" type="CT_PresetLineDashProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="custDash" type="CT_DashStopList" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:simpleType name="ST_LineCap"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="rnd"/> + <xsd:enumeration value="sq"/> + <xsd:enumeration value="flat"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_LineWidth"> + <xsd:restriction base="ST_Coordinate32Unqualified"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="20116800"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PenAlignment"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="ctr"/> + <xsd:enumeration value="in"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_CompoundLine"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="sng"/> + <xsd:enumeration value="dbl"/> + <xsd:enumeration value="thickThin"/> + <xsd:enumeration value="thinThick"/> + <xsd:enumeration value="tri"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_LineProperties"> + <xsd:sequence> + <xsd:group ref="EG_LineFillProperties" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_LineDashProperties" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_LineJoinProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="headEnd" type="CT_LineEndProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tailEnd" type="CT_LineEndProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="w" type="ST_LineWidth" use="optional"/> + <xsd:attribute name="cap" type="ST_LineCap" use="optional"/> + <xsd:attribute name="cmpd" type="ST_CompoundLine" use="optional"/> + <xsd:attribute name="algn" type="ST_PenAlignment" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_ShapeID"> + <xsd:restriction base="xsd:token"/> + </xsd:simpleType> + <xsd:complexType name="CT_ShapeProperties"> + <xsd:sequence> + <xsd:element name="xfrm" type="CT_Transform2D" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_Geometry" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_FillProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ln" type="CT_LineProperties" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_EffectProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="scene3d" type="CT_Scene3D" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sp3d" type="CT_Shape3D" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="bwMode" type="ST_BlackWhiteMode" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_GroupShapeProperties"> + <xsd:sequence> + <xsd:element name="xfrm" type="CT_GroupTransform2D" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_FillProperties" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_EffectProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="scene3d" type="CT_Scene3D" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="bwMode" type="ST_BlackWhiteMode" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_StyleMatrixReference"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="idx" type="ST_StyleMatrixColumnIndex" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_FontReference"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="idx" type="ST_FontCollectionIndex" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_ShapeStyle"> + <xsd:sequence> + <xsd:element name="lnRef" type="CT_StyleMatrixReference" minOccurs="1" maxOccurs="1"/> + <xsd:element name="fillRef" type="CT_StyleMatrixReference" minOccurs="1" maxOccurs="1"/> + <xsd:element name="effectRef" type="CT_StyleMatrixReference" minOccurs="1" maxOccurs="1"/> + <xsd:element name="fontRef" type="CT_FontReference" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DefaultShapeDefinition"> + <xsd:sequence> + <xsd:element name="spPr" type="CT_ShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="bodyPr" type="CT_TextBodyProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="lstStyle" type="CT_TextListStyle" minOccurs="1" maxOccurs="1"/> + <xsd:element name="style" type="CT_ShapeStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ObjectStyleDefaults"> + <xsd:sequence> + <xsd:element name="spDef" type="CT_DefaultShapeDefinition" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lnDef" type="CT_DefaultShapeDefinition" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txDef" type="CT_DefaultShapeDefinition" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_EmptyElement"/> + <xsd:complexType name="CT_ColorMapping"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="bg1" type="ST_ColorSchemeIndex" use="required"/> + <xsd:attribute name="tx1" type="ST_ColorSchemeIndex" use="required"/> + <xsd:attribute name="bg2" type="ST_ColorSchemeIndex" use="required"/> + <xsd:attribute name="tx2" type="ST_ColorSchemeIndex" use="required"/> + <xsd:attribute name="accent1" type="ST_ColorSchemeIndex" use="required"/> + <xsd:attribute name="accent2" type="ST_ColorSchemeIndex" use="required"/> + <xsd:attribute name="accent3" type="ST_ColorSchemeIndex" use="required"/> + <xsd:attribute name="accent4" type="ST_ColorSchemeIndex" use="required"/> + <xsd:attribute name="accent5" type="ST_ColorSchemeIndex" use="required"/> + <xsd:attribute name="accent6" type="ST_ColorSchemeIndex" use="required"/> + <xsd:attribute name="hlink" type="ST_ColorSchemeIndex" use="required"/> + <xsd:attribute name="folHlink" type="ST_ColorSchemeIndex" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_ColorMappingOverride"> + <xsd:sequence> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="masterClrMapping" type="CT_EmptyElement"/> + <xsd:element name="overrideClrMapping" type="CT_ColorMapping"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ColorSchemeAndMapping"> + <xsd:sequence> + <xsd:element name="clrScheme" type="CT_ColorScheme" minOccurs="1" maxOccurs="1"/> + <xsd:element name="clrMap" type="CT_ColorMapping" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ColorSchemeList"> + <xsd:sequence> + <xsd:element name="extraClrScheme" type="CT_ColorSchemeAndMapping" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_OfficeStyleSheet"> + <xsd:sequence> + <xsd:element name="themeElements" type="CT_BaseStyles" minOccurs="1" maxOccurs="1"/> + <xsd:element name="objectDefaults" type="CT_ObjectStyleDefaults" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extraClrSchemeLst" type="CT_ColorSchemeList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="custClrLst" type="CT_CustomColorList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="optional" default=""/> + </xsd:complexType> + <xsd:complexType name="CT_BaseStylesOverride"> + <xsd:sequence> + <xsd:element name="clrScheme" type="CT_ColorScheme" minOccurs="0" maxOccurs="1"/> + <xsd:element name="fontScheme" type="CT_FontScheme" minOccurs="0" maxOccurs="1"/> + <xsd:element name="fmtScheme" type="CT_StyleMatrix" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ClipboardStyleSheet"> + <xsd:sequence> + <xsd:element name="themeElements" type="CT_BaseStyles" minOccurs="1" maxOccurs="1"/> + <xsd:element name="clrMap" type="CT_ColorMapping" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="theme" type="CT_OfficeStyleSheet"/> + <xsd:element name="themeOverride" type="CT_BaseStylesOverride"/> + <xsd:element name="themeManager" type="CT_EmptyElement"/> + <xsd:complexType name="CT_TableCellProperties"> + <xsd:sequence> + <xsd:element name="lnL" type="CT_LineProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lnR" type="CT_LineProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lnT" type="CT_LineProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lnB" type="CT_LineProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lnTlToBr" type="CT_LineProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lnBlToTr" type="CT_LineProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cell3D" type="CT_Cell3D" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_FillProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="headers" type="CT_Headers" minOccurs="0"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="marL" type="ST_Coordinate32" use="optional" default="91440"/> + <xsd:attribute name="marR" type="ST_Coordinate32" use="optional" default="91440"/> + <xsd:attribute name="marT" type="ST_Coordinate32" use="optional" default="45720"/> + <xsd:attribute name="marB" type="ST_Coordinate32" use="optional" default="45720"/> + <xsd:attribute name="vert" type="ST_TextVerticalType" use="optional" default="horz"/> + <xsd:attribute name="anchor" type="ST_TextAnchoringType" use="optional" default="t"/> + <xsd:attribute name="anchorCtr" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="horzOverflow" type="ST_TextHorzOverflowType" use="optional" default="clip" + /> + </xsd:complexType> + <xsd:complexType name="CT_Headers"> + <xsd:sequence minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="header" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TableCol"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="w" type="ST_Coordinate" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TableGrid"> + <xsd:sequence> + <xsd:element name="gridCol" type="CT_TableCol" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TableCell"> + <xsd:sequence> + <xsd:element name="txBody" type="CT_TextBody" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tcPr" type="CT_TableCellProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="rowSpan" type="xsd:int" use="optional" default="1"/> + <xsd:attribute name="gridSpan" type="xsd:int" use="optional" default="1"/> + <xsd:attribute name="hMerge" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="vMerge" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="id" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TableRow"> + <xsd:sequence> + <xsd:element name="tc" type="CT_TableCell" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="h" type="ST_Coordinate" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TableProperties"> + <xsd:sequence> + <xsd:group ref="EG_FillProperties" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_EffectProperties" minOccurs="0" maxOccurs="1"/> + <xsd:choice minOccurs="0" maxOccurs="1"> + <xsd:element name="tableStyle" type="CT_TableStyle"/> + <xsd:element name="tableStyleId" type="s:ST_Guid"/> + </xsd:choice> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="rtl" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="firstRow" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="firstCol" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="lastRow" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="lastCol" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="bandRow" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="bandCol" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_Table"> + <xsd:sequence> + <xsd:element name="tblPr" type="CT_TableProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblGrid" type="CT_TableGrid" minOccurs="1" maxOccurs="1"/> + <xsd:element name="tr" type="CT_TableRow" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="tbl" type="CT_Table"/> + <xsd:complexType name="CT_Cell3D"> + <xsd:sequence> + <xsd:element name="bevel" type="CT_Bevel" minOccurs="1" maxOccurs="1"/> + <xsd:element name="lightRig" type="CT_LightRig" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="prstMaterial" type="ST_PresetMaterialType" use="optional" default="plastic" + /> + </xsd:complexType> + <xsd:group name="EG_ThemeableFillStyle"> + <xsd:choice> + <xsd:element name="fill" type="CT_FillProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="fillRef" type="CT_StyleMatrixReference" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_ThemeableLineStyle"> + <xsd:choice> + <xsd:element name="ln" type="CT_LineProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="lnRef" type="CT_StyleMatrixReference" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:complexType> + <xsd:group name="EG_ThemeableEffectStyle"> + <xsd:choice> + <xsd:element name="effect" type="CT_EffectProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="effectRef" type="CT_StyleMatrixReference" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:group name="EG_ThemeableFontStyles"> + <xsd:choice> + <xsd:element name="font" type="CT_FontCollection" minOccurs="1" maxOccurs="1"/> + <xsd:element name="fontRef" type="CT_FontReference" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:simpleType name="ST_OnOffStyleType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="on"/> + <xsd:enumeration value="off"/> + <xsd:enumeration value="def"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TableStyleTextStyle"> + <xsd:sequence> + <xsd:group ref="EG_ThemeableFontStyles" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_ColorChoice" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="b" type="ST_OnOffStyleType" use="optional" default="def"/> + <xsd:attribute name="i" type="ST_OnOffStyleType" use="optional" default="def"/> + </xsd:complexType> + <xsd:complexType name="CT_TableCellBorderStyle"> + <xsd:sequence> + <xsd:element name="left" type="CT_ThemeableLineStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="right" type="CT_ThemeableLineStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="top" type="CT_ThemeableLineStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="bottom" type="CT_ThemeableLineStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="insideH" type="CT_ThemeableLineStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="insideV" type="CT_ThemeableLineStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tl2br" type="CT_ThemeableLineStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tr2bl" type="CT_ThemeableLineStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TableBackgroundStyle"> + <xsd:sequence> + <xsd:group ref="EG_ThemeableFillStyle" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_ThemeableEffectStyle" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TableStyleCellStyle"> + <xsd:sequence> + <xsd:element name="tcBdr" type="CT_TableCellBorderStyle" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_ThemeableFillStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cell3D" type="CT_Cell3D" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TablePartStyle"> + <xsd:sequence> + <xsd:element name="tcTxStyle" type="CT_TableStyleTextStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tcStyle" type="CT_TableStyleCellStyle" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TableStyle"> + <xsd:sequence> + <xsd:element name="tblBg" type="CT_TableBackgroundStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="wholeTbl" type="CT_TablePartStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="band1H" type="CT_TablePartStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="band2H" type="CT_TablePartStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="band1V" type="CT_TablePartStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="band2V" type="CT_TablePartStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lastCol" type="CT_TablePartStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="firstCol" type="CT_TablePartStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lastRow" type="CT_TablePartStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="seCell" type="CT_TablePartStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="swCell" type="CT_TablePartStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="firstRow" type="CT_TablePartStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="neCell" type="CT_TablePartStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="nwCell" type="CT_TablePartStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="styleId" type="s:ST_Guid" use="required"/> + <xsd:attribute name="styleName" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TableStyleList"> + <xsd:sequence> + <xsd:element name="tblStyle" type="CT_TableStyle" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="def" type="s:ST_Guid" use="required"/> + </xsd:complexType> + <xsd:element name="tblStyleLst" type="CT_TableStyleList"/> + <xsd:complexType name="CT_TextParagraph"> + <xsd:sequence> + <xsd:element name="pPr" type="CT_TextParagraphProperties" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_TextRun" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="endParaRPr" type="CT_TextCharacterProperties" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_TextAnchoringType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="t"/> + <xsd:enumeration value="ctr"/> + <xsd:enumeration value="b"/> + <xsd:enumeration value="just"/> + <xsd:enumeration value="dist"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextVertOverflowType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="overflow"/> + <xsd:enumeration value="ellipsis"/> + <xsd:enumeration value="clip"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextHorzOverflowType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="overflow"/> + <xsd:enumeration value="clip"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextVerticalType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="horz"/> + <xsd:enumeration value="vert"/> + <xsd:enumeration value="vert270"/> + <xsd:enumeration value="wordArtVert"/> + <xsd:enumeration value="eaVert"/> + <xsd:enumeration value="mongolianVert"/> + <xsd:enumeration value="wordArtVertRtl"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextWrappingType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="square"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextColumnCount"> + <xsd:restriction base="xsd:int"> + <xsd:minInclusive value="1"/> + <xsd:maxInclusive value="16"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TextListStyle"> + <xsd:sequence> + <xsd:element name="defPPr" type="CT_TextParagraphProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lvl1pPr" type="CT_TextParagraphProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lvl2pPr" type="CT_TextParagraphProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lvl3pPr" type="CT_TextParagraphProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lvl4pPr" type="CT_TextParagraphProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lvl5pPr" type="CT_TextParagraphProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lvl6pPr" type="CT_TextParagraphProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lvl7pPr" type="CT_TextParagraphProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lvl8pPr" type="CT_TextParagraphProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="lvl9pPr" type="CT_TextParagraphProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_TextFontScalePercentOrPercentString"> + <xsd:union memberTypes="ST_TextFontScalePercent s:ST_Percentage"/> + </xsd:simpleType> + <xsd:simpleType name="ST_TextFontScalePercent"> + <xsd:restriction base="ST_PercentageDecimal"> + <xsd:minInclusive value="1000"/> + <xsd:maxInclusive value="100000"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TextNormalAutofit"> + <xsd:attribute name="fontScale" type="ST_TextFontScalePercentOrPercentString" use="optional" + default="100%"/> + <xsd:attribute name="lnSpcReduction" type="ST_TextSpacingPercentOrPercentString" use="optional" + default="0%"/> + </xsd:complexType> + <xsd:complexType name="CT_TextShapeAutofit"/> + <xsd:complexType name="CT_TextNoAutofit"/> + <xsd:group name="EG_TextAutofit"> + <xsd:choice> + <xsd:element name="noAutofit" type="CT_TextNoAutofit"/> + <xsd:element name="normAutofit" type="CT_TextNormalAutofit"/> + <xsd:element name="spAutoFit" type="CT_TextShapeAutofit"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_TextBodyProperties"> + <xsd:sequence> + <xsd:element name="prstTxWarp" type="CT_PresetTextShape" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_TextAutofit" minOccurs="0" maxOccurs="1"/> + <xsd:element name="scene3d" type="CT_Scene3D" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_Text3D" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="rot" type="ST_Angle" use="optional"/> + <xsd:attribute name="spcFirstLastPara" type="xsd:boolean" use="optional"/> + <xsd:attribute name="vertOverflow" type="ST_TextVertOverflowType" use="optional"/> + <xsd:attribute name="horzOverflow" type="ST_TextHorzOverflowType" use="optional"/> + <xsd:attribute name="vert" type="ST_TextVerticalType" use="optional"/> + <xsd:attribute name="wrap" type="ST_TextWrappingType" use="optional"/> + <xsd:attribute name="lIns" type="ST_Coordinate32" use="optional"/> + <xsd:attribute name="tIns" type="ST_Coordinate32" use="optional"/> + <xsd:attribute name="rIns" type="ST_Coordinate32" use="optional"/> + <xsd:attribute name="bIns" type="ST_Coordinate32" use="optional"/> + <xsd:attribute name="numCol" type="ST_TextColumnCount" use="optional"/> + <xsd:attribute name="spcCol" type="ST_PositiveCoordinate32" use="optional"/> + <xsd:attribute name="rtlCol" type="xsd:boolean" use="optional"/> + <xsd:attribute name="fromWordArt" type="xsd:boolean" use="optional"/> + <xsd:attribute name="anchor" type="ST_TextAnchoringType" use="optional"/> + <xsd:attribute name="anchorCtr" type="xsd:boolean" use="optional"/> + <xsd:attribute name="forceAA" type="xsd:boolean" use="optional"/> + <xsd:attribute name="upright" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="compatLnSpc" type="xsd:boolean" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TextBody"> + <xsd:sequence> + <xsd:element name="bodyPr" type="CT_TextBodyProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="lstStyle" type="CT_TextListStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="p" type="CT_TextParagraph" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_TextBulletStartAtNum"> + <xsd:restriction base="xsd:int"> + <xsd:minInclusive value="1"/> + <xsd:maxInclusive value="32767"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextAutonumberScheme"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="alphaLcParenBoth"/> + <xsd:enumeration value="alphaUcParenBoth"/> + <xsd:enumeration value="alphaLcParenR"/> + <xsd:enumeration value="alphaUcParenR"/> + <xsd:enumeration value="alphaLcPeriod"/> + <xsd:enumeration value="alphaUcPeriod"/> + <xsd:enumeration value="arabicParenBoth"/> + <xsd:enumeration value="arabicParenR"/> + <xsd:enumeration value="arabicPeriod"/> + <xsd:enumeration value="arabicPlain"/> + <xsd:enumeration value="romanLcParenBoth"/> + <xsd:enumeration value="romanUcParenBoth"/> + <xsd:enumeration value="romanLcParenR"/> + <xsd:enumeration value="romanUcParenR"/> + <xsd:enumeration value="romanLcPeriod"/> + <xsd:enumeration value="romanUcPeriod"/> + <xsd:enumeration value="circleNumDbPlain"/> + <xsd:enumeration value="circleNumWdBlackPlain"/> + <xsd:enumeration value="circleNumWdWhitePlain"/> + <xsd:enumeration value="arabicDbPeriod"/> + <xsd:enumeration value="arabicDbPlain"/> + <xsd:enumeration value="ea1ChsPeriod"/> + <xsd:enumeration value="ea1ChsPlain"/> + <xsd:enumeration value="ea1ChtPeriod"/> + <xsd:enumeration value="ea1ChtPlain"/> + <xsd:enumeration value="ea1JpnChsDbPeriod"/> + <xsd:enumeration value="ea1JpnKorPlain"/> + <xsd:enumeration value="ea1JpnKorPeriod"/> + <xsd:enumeration value="arabic1Minus"/> + <xsd:enumeration value="arabic2Minus"/> + <xsd:enumeration value="hebrew2Minus"/> + <xsd:enumeration value="thaiAlphaPeriod"/> + <xsd:enumeration value="thaiAlphaParenR"/> + <xsd:enumeration value="thaiAlphaParenBoth"/> + <xsd:enumeration value="thaiNumPeriod"/> + <xsd:enumeration value="thaiNumParenR"/> + <xsd:enumeration value="thaiNumParenBoth"/> + <xsd:enumeration value="hindiAlphaPeriod"/> + <xsd:enumeration value="hindiNumPeriod"/> + <xsd:enumeration value="hindiNumParenR"/> + <xsd:enumeration value="hindiAlpha1Period"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TextBulletColorFollowText"/> + <xsd:group name="EG_TextBulletColor"> + <xsd:choice> + <xsd:element name="buClrTx" type="CT_TextBulletColorFollowText" minOccurs="1" maxOccurs="1"/> + <xsd:element name="buClr" type="CT_Color" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:simpleType name="ST_TextBulletSize"> + <xsd:union memberTypes="ST_TextBulletSizePercent ST_TextBulletSizeDecimal"/> + </xsd:simpleType> + <xsd:simpleType name="ST_TextBulletSizePercent"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="0*((2[5-9])|([3-9][0-9])|([1-3][0-9][0-9])|400)%"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextBulletSizeDecimal"> + <xsd:restriction base="ST_PercentageDecimal"> + <xsd:minInclusive value="25000"/> + <xsd:maxInclusive value="400000"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TextBulletSizeFollowText"/> + <xsd:complexType name="CT_TextBulletSizePercent"> + <xsd:attribute name="val" type="ST_TextBulletSizePercent" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TextBulletSizePoint"> + <xsd:attribute name="val" type="ST_TextFontSize" use="required"/> + </xsd:complexType> + <xsd:group name="EG_TextBulletSize"> + <xsd:choice> + <xsd:element name="buSzTx" type="CT_TextBulletSizeFollowText"/> + <xsd:element name="buSzPct" type="CT_TextBulletSizePercent"/> + <xsd:element name="buSzPts" type="CT_TextBulletSizePoint"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_TextBulletTypefaceFollowText"/> + <xsd:group name="EG_TextBulletTypeface"> + <xsd:choice> + <xsd:element name="buFontTx" type="CT_TextBulletTypefaceFollowText"/> + <xsd:element name="buFont" type="CT_TextFont"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_TextAutonumberBullet"> + <xsd:attribute name="type" type="ST_TextAutonumberScheme" use="required"/> + <xsd:attribute name="startAt" type="ST_TextBulletStartAtNum" use="optional" default="1"/> + </xsd:complexType> + <xsd:complexType name="CT_TextCharBullet"> + <xsd:attribute name="char" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TextBlipBullet"> + <xsd:sequence> + <xsd:element name="blip" type="CT_Blip" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TextNoBullet"/> + <xsd:group name="EG_TextBullet"> + <xsd:choice> + <xsd:element name="buNone" type="CT_TextNoBullet"/> + <xsd:element name="buAutoNum" type="CT_TextAutonumberBullet"/> + <xsd:element name="buChar" type="CT_TextCharBullet"/> + <xsd:element name="buBlip" type="CT_TextBlipBullet"/> + </xsd:choice> + </xsd:group> + <xsd:simpleType name="ST_TextPoint"> + <xsd:union memberTypes="ST_TextPointUnqualified s:ST_UniversalMeasure"/> + </xsd:simpleType> + <xsd:simpleType name="ST_TextPointUnqualified"> + <xsd:restriction base="xsd:int"> + <xsd:minInclusive value="-400000"/> + <xsd:maxInclusive value="400000"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextNonNegativePoint"> + <xsd:restriction base="xsd:int"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="400000"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextFontSize"> + <xsd:restriction base="xsd:int"> + <xsd:minInclusive value="100"/> + <xsd:maxInclusive value="400000"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextTypeface"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:simpleType name="ST_PitchFamily"> + <xsd:restriction base="xsd:byte"> + <xsd:enumeration value="00"/> + <xsd:enumeration value="01"/> + <xsd:enumeration value="02"/> + <xsd:enumeration value="16"/> + <xsd:enumeration value="17"/> + <xsd:enumeration value="18"/> + <xsd:enumeration value="32"/> + <xsd:enumeration value="33"/> + <xsd:enumeration value="34"/> + <xsd:enumeration value="48"/> + <xsd:enumeration value="49"/> + <xsd:enumeration value="50"/> + <xsd:enumeration value="64"/> + <xsd:enumeration value="65"/> + <xsd:enumeration value="66"/> + <xsd:enumeration value="80"/> + <xsd:enumeration value="81"/> + <xsd:enumeration value="82"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TextFont"> + <xsd:attribute name="typeface" type="ST_TextTypeface" use="required"/> + <xsd:attribute name="panose" type="s:ST_Panose" use="optional"/> + <xsd:attribute name="pitchFamily" type="ST_PitchFamily" use="optional" default="0"/> + <xsd:attribute name="charset" type="xsd:byte" use="optional" default="1"/> + </xsd:complexType> + <xsd:simpleType name="ST_TextUnderlineType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="words"/> + <xsd:enumeration value="sng"/> + <xsd:enumeration value="dbl"/> + <xsd:enumeration value="heavy"/> + <xsd:enumeration value="dotted"/> + <xsd:enumeration value="dottedHeavy"/> + <xsd:enumeration value="dash"/> + <xsd:enumeration value="dashHeavy"/> + <xsd:enumeration value="dashLong"/> + <xsd:enumeration value="dashLongHeavy"/> + <xsd:enumeration value="dotDash"/> + <xsd:enumeration value="dotDashHeavy"/> + <xsd:enumeration value="dotDotDash"/> + <xsd:enumeration value="dotDotDashHeavy"/> + <xsd:enumeration value="wavy"/> + <xsd:enumeration value="wavyHeavy"/> + <xsd:enumeration value="wavyDbl"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TextUnderlineLineFollowText"/> + <xsd:complexType name="CT_TextUnderlineFillFollowText"/> + <xsd:complexType name="CT_TextUnderlineFillGroupWrapper"> + <xsd:group ref="EG_FillProperties" minOccurs="1" maxOccurs="1"/> + </xsd:complexType> + <xsd:group name="EG_TextUnderlineLine"> + <xsd:choice> + <xsd:element name="uLnTx" type="CT_TextUnderlineLineFollowText"/> + <xsd:element name="uLn" type="CT_LineProperties" minOccurs="0" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:group name="EG_TextUnderlineFill"> + <xsd:choice> + <xsd:element name="uFillTx" type="CT_TextUnderlineFillFollowText"/> + <xsd:element name="uFill" type="CT_TextUnderlineFillGroupWrapper"/> + </xsd:choice> + </xsd:group> + <xsd:simpleType name="ST_TextStrikeType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="noStrike"/> + <xsd:enumeration value="sngStrike"/> + <xsd:enumeration value="dblStrike"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextCapsType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="small"/> + <xsd:enumeration value="all"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TextCharacterProperties"> + <xsd:sequence> + <xsd:element name="ln" type="CT_LineProperties" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_FillProperties" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_EffectProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="highlight" type="CT_Color" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_TextUnderlineLine" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_TextUnderlineFill" minOccurs="0" maxOccurs="1"/> + <xsd:element name="latin" type="CT_TextFont" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ea" type="CT_TextFont" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cs" type="CT_TextFont" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sym" type="CT_TextFont" minOccurs="0" maxOccurs="1"/> + <xsd:element name="hlinkClick" type="CT_Hyperlink" minOccurs="0" maxOccurs="1"/> + <xsd:element name="hlinkMouseOver" type="CT_Hyperlink" minOccurs="0" maxOccurs="1"/> + <xsd:element name="rtl" type="CT_Boolean" minOccurs="0"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="kumimoji" type="xsd:boolean" use="optional"/> + <xsd:attribute name="lang" type="s:ST_Lang" use="optional"/> + <xsd:attribute name="altLang" type="s:ST_Lang" use="optional"/> + <xsd:attribute name="sz" type="ST_TextFontSize" use="optional"/> + <xsd:attribute name="b" type="xsd:boolean" use="optional"/> + <xsd:attribute name="i" type="xsd:boolean" use="optional"/> + <xsd:attribute name="u" type="ST_TextUnderlineType" use="optional"/> + <xsd:attribute name="strike" type="ST_TextStrikeType" use="optional"/> + <xsd:attribute name="kern" type="ST_TextNonNegativePoint" use="optional"/> + <xsd:attribute name="cap" type="ST_TextCapsType" use="optional" default="none"/> + <xsd:attribute name="spc" type="ST_TextPoint" use="optional"/> + <xsd:attribute name="normalizeH" type="xsd:boolean" use="optional"/> + <xsd:attribute name="baseline" type="ST_Percentage" use="optional"/> + <xsd:attribute name="noProof" type="xsd:boolean" use="optional"/> + <xsd:attribute name="dirty" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="err" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="smtClean" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="smtId" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="bmk" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Boolean"> + <xsd:attribute name="val" type="s:ST_OnOff" default="0"/> + </xsd:complexType> + <xsd:simpleType name="ST_TextSpacingPoint"> + <xsd:restriction base="xsd:int"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="158400"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextSpacingPercentOrPercentString"> + <xsd:union memberTypes="ST_TextSpacingPercent s:ST_Percentage"/> + </xsd:simpleType> + <xsd:simpleType name="ST_TextSpacingPercent"> + <xsd:restriction base="ST_PercentageDecimal"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="13200000"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TextSpacingPercent"> + <xsd:attribute name="val" type="ST_TextSpacingPercentOrPercentString" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TextSpacingPoint"> + <xsd:attribute name="val" type="ST_TextSpacingPoint" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_TextMargin"> + <xsd:restriction base="ST_Coordinate32Unqualified"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="51206400"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextIndent"> + <xsd:restriction base="ST_Coordinate32Unqualified"> + <xsd:minInclusive value="-51206400"/> + <xsd:maxInclusive value="51206400"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextTabAlignType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="l"/> + <xsd:enumeration value="ctr"/> + <xsd:enumeration value="r"/> + <xsd:enumeration value="dec"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TextTabStop"> + <xsd:attribute name="pos" type="ST_Coordinate32" use="optional"/> + <xsd:attribute name="algn" type="ST_TextTabAlignType" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TextTabStopList"> + <xsd:sequence> + <xsd:element name="tab" type="CT_TextTabStop" minOccurs="0" maxOccurs="32"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TextLineBreak"> + <xsd:sequence> + <xsd:element name="rPr" type="CT_TextCharacterProperties" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TextSpacing"> + <xsd:choice> + <xsd:element name="spcPct" type="CT_TextSpacingPercent"/> + <xsd:element name="spcPts" type="CT_TextSpacingPoint"/> + </xsd:choice> + </xsd:complexType> + <xsd:simpleType name="ST_TextAlignType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="l"/> + <xsd:enumeration value="ctr"/> + <xsd:enumeration value="r"/> + <xsd:enumeration value="just"/> + <xsd:enumeration value="justLow"/> + <xsd:enumeration value="dist"/> + <xsd:enumeration value="thaiDist"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextFontAlignType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="auto"/> + <xsd:enumeration value="t"/> + <xsd:enumeration value="ctr"/> + <xsd:enumeration value="base"/> + <xsd:enumeration value="b"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextIndentLevelType"> + <xsd:restriction base="xsd:int"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="8"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TextParagraphProperties"> + <xsd:sequence> + <xsd:element name="lnSpc" type="CT_TextSpacing" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spcBef" type="CT_TextSpacing" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spcAft" type="CT_TextSpacing" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_TextBulletColor" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_TextBulletSize" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_TextBulletTypeface" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_TextBullet" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tabLst" type="CT_TextTabStopList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="defRPr" type="CT_TextCharacterProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="marL" type="ST_TextMargin" use="optional"/> + <xsd:attribute name="marR" type="ST_TextMargin" use="optional"/> + <xsd:attribute name="lvl" type="ST_TextIndentLevelType" use="optional"/> + <xsd:attribute name="indent" type="ST_TextIndent" use="optional"/> + <xsd:attribute name="algn" type="ST_TextAlignType" use="optional"/> + <xsd:attribute name="defTabSz" type="ST_Coordinate32" use="optional"/> + <xsd:attribute name="rtl" type="xsd:boolean" use="optional"/> + <xsd:attribute name="eaLnBrk" type="xsd:boolean" use="optional"/> + <xsd:attribute name="fontAlgn" type="ST_TextFontAlignType" use="optional"/> + <xsd:attribute name="latinLnBrk" type="xsd:boolean" use="optional"/> + <xsd:attribute name="hangingPunct" type="xsd:boolean" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TextField"> + <xsd:sequence> + <xsd:element name="rPr" type="CT_TextCharacterProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pPr" type="CT_TextParagraphProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="t" type="xsd:string" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="id" type="s:ST_Guid" use="required"/> + <xsd:attribute name="type" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:group name="EG_TextRun"> + <xsd:choice> + <xsd:element name="r" type="CT_RegularTextRun"/> + <xsd:element name="br" type="CT_TextLineBreak"/> + <xsd:element name="fld" type="CT_TextField"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_RegularTextRun"> + <xsd:sequence> + <xsd:element name="rPr" type="CT_TextCharacterProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="t" type="xsd:string" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd new file mode 100644 index 0000000..1dbf051 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="http://schemas.openxmlformats.org/drawingml/2006/picture" + xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" elementFormDefault="qualified" + targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/picture"> + <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main" + schemaLocation="dml-main.xsd"/> + <xsd:complexType name="CT_PictureNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvPicPr" type="a:CT_NonVisualPictureProperties" minOccurs="1" + maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Picture"> + <xsd:sequence minOccurs="1" maxOccurs="1"> + <xsd:element name="nvPicPr" type="CT_PictureNonVisual" minOccurs="1" maxOccurs="1"/> + <xsd:element name="blipFill" type="a:CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="pic" type="CT_Picture"/> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd new file mode 100644 index 0000000..f1af17d --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd @@ -0,0 +1,185 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" + xmlns="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" + elementFormDefault="qualified"> + <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main" + schemaLocation="dml-main.xsd"/> + <xsd:import schemaLocation="shared-relationshipReference.xsd" + namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships"/> + <xsd:element name="from" type="CT_Marker"/> + <xsd:element name="to" type="CT_Marker"/> + <xsd:complexType name="CT_AnchorClientData"> + <xsd:attribute name="fLocksWithSheet" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="fPrintsWithSheet" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_ShapeNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvSpPr" type="a:CT_NonVisualDrawingShapeProps" minOccurs="1" maxOccurs="1" + /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Shape"> + <xsd:sequence> + <xsd:element name="nvSpPr" type="CT_ShapeNonVisual" minOccurs="1" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txBody" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="macro" type="xsd:string" use="optional"/> + <xsd:attribute name="textlink" type="xsd:string" use="optional"/> + <xsd:attribute name="fLocksText" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_ConnectorNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvCxnSpPr" type="a:CT_NonVisualConnectorProperties" minOccurs="1" + maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Connector"> + <xsd:sequence> + <xsd:element name="nvCxnSpPr" type="CT_ConnectorNonVisual" minOccurs="1" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="macro" type="xsd:string" use="optional"/> + <xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_PictureNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvPicPr" type="a:CT_NonVisualPictureProperties" minOccurs="1" + maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Picture"> + <xsd:sequence> + <xsd:element name="nvPicPr" type="CT_PictureNonVisual" minOccurs="1" maxOccurs="1"/> + <xsd:element name="blipFill" type="a:CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="macro" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_GraphicalObjectFrameNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvGraphicFramePr" type="a:CT_NonVisualGraphicFrameProperties" + minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GraphicalObjectFrame"> + <xsd:sequence> + <xsd:element name="nvGraphicFramePr" type="CT_GraphicalObjectFrameNonVisual" minOccurs="1" + maxOccurs="1"/> + <xsd:element name="xfrm" type="a:CT_Transform2D" minOccurs="1" maxOccurs="1"/> + <xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="macro" type="xsd:string" use="optional"/> + <xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_GroupShapeNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvGrpSpPr" type="a:CT_NonVisualGroupDrawingShapeProps" minOccurs="1" + maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GroupShape"> + <xsd:sequence> + <xsd:element name="nvGrpSpPr" type="CT_GroupShapeNonVisual" minOccurs="1" maxOccurs="1"/> + <xsd:element name="grpSpPr" type="a:CT_GroupShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="sp" type="CT_Shape"/> + <xsd:element name="grpSp" type="CT_GroupShape"/> + <xsd:element name="graphicFrame" type="CT_GraphicalObjectFrame"/> + <xsd:element name="cxnSp" type="CT_Connector"/> + <xsd:element name="pic" type="CT_Picture"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_ObjectChoices"> + <xsd:sequence> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="sp" type="CT_Shape"/> + <xsd:element name="grpSp" type="CT_GroupShape"/> + <xsd:element name="graphicFrame" type="CT_GraphicalObjectFrame"/> + <xsd:element name="cxnSp" type="CT_Connector"/> + <xsd:element name="pic" type="CT_Picture"/> + <xsd:element name="contentPart" type="CT_Rel"/> + </xsd:choice> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_Rel"> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_ColID"> + <xsd:restriction base="xsd:int"> + <xsd:minInclusive value="0"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_RowID"> + <xsd:restriction base="xsd:int"> + <xsd:minInclusive value="0"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Marker"> + <xsd:sequence> + <xsd:element name="col" type="ST_ColID"/> + <xsd:element name="colOff" type="a:ST_Coordinate"/> + <xsd:element name="row" type="ST_RowID"/> + <xsd:element name="rowOff" type="a:ST_Coordinate"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_EditAs"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="twoCell"/> + <xsd:enumeration value="oneCell"/> + <xsd:enumeration value="absolute"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TwoCellAnchor"> + <xsd:sequence> + <xsd:element name="from" type="CT_Marker"/> + <xsd:element name="to" type="CT_Marker"/> + <xsd:group ref="EG_ObjectChoices"/> + <xsd:element name="clientData" type="CT_AnchorClientData" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="editAs" type="ST_EditAs" use="optional" default="twoCell"/> + </xsd:complexType> + <xsd:complexType name="CT_OneCellAnchor"> + <xsd:sequence> + <xsd:element name="from" type="CT_Marker"/> + <xsd:element name="ext" type="a:CT_PositiveSize2D"/> + <xsd:group ref="EG_ObjectChoices"/> + <xsd:element name="clientData" type="CT_AnchorClientData" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_AbsoluteAnchor"> + <xsd:sequence> + <xsd:element name="pos" type="a:CT_Point2D"/> + <xsd:element name="ext" type="a:CT_PositiveSize2D"/> + <xsd:group ref="EG_ObjectChoices"/> + <xsd:element name="clientData" type="CT_AnchorClientData" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_Anchor"> + <xsd:choice> + <xsd:element name="twoCellAnchor" type="CT_TwoCellAnchor"/> + <xsd:element name="oneCellAnchor" type="CT_OneCellAnchor"/> + <xsd:element name="absoluteAnchor" type="CT_AbsoluteAnchor"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_Drawing"> + <xsd:sequence> + <xsd:group ref="EG_Anchor" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="wsDr" type="CT_Drawing"/> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd new file mode 100644 index 0000000..0a185ab --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd @@ -0,0 +1,287 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" + xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" + xmlns:dpct="http://schemas.openxmlformats.org/drawingml/2006/picture" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" + targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" + elementFormDefault="qualified"> + <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main" + schemaLocation="dml-main.xsd"/> + <xsd:import schemaLocation="wml.xsd" + namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main"/> + <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/picture" + schemaLocation="dml-picture.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + schemaLocation="shared-relationshipReference.xsd"/> + <xsd:complexType name="CT_EffectExtent"> + <xsd:attribute name="l" type="a:ST_Coordinate" use="required"/> + <xsd:attribute name="t" type="a:ST_Coordinate" use="required"/> + <xsd:attribute name="r" type="a:ST_Coordinate" use="required"/> + <xsd:attribute name="b" type="a:ST_Coordinate" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_WrapDistance"> + <xsd:restriction base="xsd:unsignedInt"/> + </xsd:simpleType> + <xsd:complexType name="CT_Inline"> + <xsd:sequence> + <xsd:element name="extent" type="a:CT_PositiveSize2D"/> + <xsd:element name="effectExtent" type="CT_EffectExtent" minOccurs="0"/> + <xsd:element name="docPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvGraphicFramePr" type="a:CT_NonVisualGraphicFrameProperties" + minOccurs="0" maxOccurs="1"/> + <xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="distT" type="ST_WrapDistance" use="optional"/> + <xsd:attribute name="distB" type="ST_WrapDistance" use="optional"/> + <xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/> + <xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_WrapText"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="bothSides"/> + <xsd:enumeration value="left"/> + <xsd:enumeration value="right"/> + <xsd:enumeration value="largest"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_WrapPath"> + <xsd:sequence> + <xsd:element name="start" type="a:CT_Point2D" minOccurs="1" maxOccurs="1"/> + <xsd:element name="lineTo" type="a:CT_Point2D" minOccurs="2" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="edited" type="xsd:boolean" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_WrapNone"/> + <xsd:complexType name="CT_WrapSquare"> + <xsd:sequence> + <xsd:element name="effectExtent" type="CT_EffectExtent" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="wrapText" type="ST_WrapText" use="required"/> + <xsd:attribute name="distT" type="ST_WrapDistance" use="optional"/> + <xsd:attribute name="distB" type="ST_WrapDistance" use="optional"/> + <xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/> + <xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_WrapTight"> + <xsd:sequence> + <xsd:element name="wrapPolygon" type="CT_WrapPath" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="wrapText" type="ST_WrapText" use="required"/> + <xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/> + <xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_WrapThrough"> + <xsd:sequence> + <xsd:element name="wrapPolygon" type="CT_WrapPath" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="wrapText" type="ST_WrapText" use="required"/> + <xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/> + <xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_WrapTopBottom"> + <xsd:sequence> + <xsd:element name="effectExtent" type="CT_EffectExtent" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="distT" type="ST_WrapDistance" use="optional"/> + <xsd:attribute name="distB" type="ST_WrapDistance" use="optional"/> + </xsd:complexType> + <xsd:group name="EG_WrapType"> + <xsd:sequence> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="wrapNone" type="CT_WrapNone" minOccurs="1" maxOccurs="1"/> + <xsd:element name="wrapSquare" type="CT_WrapSquare" minOccurs="1" maxOccurs="1"/> + <xsd:element name="wrapTight" type="CT_WrapTight" minOccurs="1" maxOccurs="1"/> + <xsd:element name="wrapThrough" type="CT_WrapThrough" minOccurs="1" maxOccurs="1"/> + <xsd:element name="wrapTopAndBottom" type="CT_WrapTopBottom" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:sequence> + </xsd:group> + <xsd:simpleType name="ST_PositionOffset"> + <xsd:restriction base="xsd:int"/> + </xsd:simpleType> + <xsd:simpleType name="ST_AlignH"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="left"/> + <xsd:enumeration value="right"/> + <xsd:enumeration value="center"/> + <xsd:enumeration value="inside"/> + <xsd:enumeration value="outside"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_RelFromH"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="margin"/> + <xsd:enumeration value="page"/> + <xsd:enumeration value="column"/> + <xsd:enumeration value="character"/> + <xsd:enumeration value="leftMargin"/> + <xsd:enumeration value="rightMargin"/> + <xsd:enumeration value="insideMargin"/> + <xsd:enumeration value="outsideMargin"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PosH"> + <xsd:sequence> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="align" type="ST_AlignH" minOccurs="1" maxOccurs="1"/> + <xsd:element name="posOffset" type="ST_PositionOffset" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:sequence> + <xsd:attribute name="relativeFrom" type="ST_RelFromH" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_AlignV"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="top"/> + <xsd:enumeration value="bottom"/> + <xsd:enumeration value="center"/> + <xsd:enumeration value="inside"/> + <xsd:enumeration value="outside"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_RelFromV"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="margin"/> + <xsd:enumeration value="page"/> + <xsd:enumeration value="paragraph"/> + <xsd:enumeration value="line"/> + <xsd:enumeration value="topMargin"/> + <xsd:enumeration value="bottomMargin"/> + <xsd:enumeration value="insideMargin"/> + <xsd:enumeration value="outsideMargin"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PosV"> + <xsd:sequence> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="align" type="ST_AlignV" minOccurs="1" maxOccurs="1"/> + <xsd:element name="posOffset" type="ST_PositionOffset" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + </xsd:sequence> + <xsd:attribute name="relativeFrom" type="ST_RelFromV" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Anchor"> + <xsd:sequence> + <xsd:element name="simplePos" type="a:CT_Point2D"/> + <xsd:element name="positionH" type="CT_PosH"/> + <xsd:element name="positionV" type="CT_PosV"/> + <xsd:element name="extent" type="a:CT_PositiveSize2D"/> + <xsd:element name="effectExtent" type="CT_EffectExtent" minOccurs="0"/> + <xsd:group ref="EG_WrapType"/> + <xsd:element name="docPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvGraphicFramePr" type="a:CT_NonVisualGraphicFrameProperties" + minOccurs="0" maxOccurs="1"/> + <xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="distT" type="ST_WrapDistance" use="optional"/> + <xsd:attribute name="distB" type="ST_WrapDistance" use="optional"/> + <xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/> + <xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/> + <xsd:attribute name="simplePos" type="xsd:boolean"/> + <xsd:attribute name="relativeHeight" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="behindDoc" type="xsd:boolean" use="required"/> + <xsd:attribute name="locked" type="xsd:boolean" use="required"/> + <xsd:attribute name="layoutInCell" type="xsd:boolean" use="required"/> + <xsd:attribute name="hidden" type="xsd:boolean" use="optional"/> + <xsd:attribute name="allowOverlap" type="xsd:boolean" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TxbxContent"> + <xsd:group ref="w:EG_BlockLevelElts" minOccurs="1" maxOccurs="unbounded"/> + </xsd:complexType> + <xsd:complexType name="CT_TextboxInfo"> + <xsd:sequence> + <xsd:element name="txbxContent" type="CT_TxbxContent" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:unsignedShort" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_LinkedTextboxInformation"> + <xsd:sequence> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:unsignedShort" use="required"/> + <xsd:attribute name="seq" type="xsd:unsignedShort" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_WordprocessingShape"> + <xsd:sequence minOccurs="1" maxOccurs="1"> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="0" maxOccurs="1"/> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="cNvSpPr" type="a:CT_NonVisualDrawingShapeProps" minOccurs="1" + maxOccurs="1"/> + <xsd:element name="cNvCnPr" type="a:CT_NonVisualConnectorProperties" minOccurs="1" + maxOccurs="1"/> + </xsd:choice> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + <xsd:choice minOccurs="0" maxOccurs="1"> + <xsd:element name="txbx" type="CT_TextboxInfo" minOccurs="1" maxOccurs="1"/> + <xsd:element name="linkedTxbx" type="CT_LinkedTextboxInformation" minOccurs="1" + maxOccurs="1"/> + </xsd:choice> + <xsd:element name="bodyPr" type="a:CT_TextBodyProperties" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="normalEastAsianFlow" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_GraphicFrame"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvFrPr" type="a:CT_NonVisualGraphicFrameProperties" minOccurs="1" + maxOccurs="1"/> + <xsd:element name="xfrm" type="a:CT_Transform2D" minOccurs="1" maxOccurs="1"/> + <xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_WordprocessingContentPartNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cNvContentPartPr" type="a:CT_NonVisualContentPartProperties" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_WordprocessingContentPart"> + <xsd:sequence> + <xsd:element name="nvContentPartPr" type="CT_WordprocessingContentPartNonVisual" minOccurs="0" maxOccurs="1"/> + <xsd:element name="xfrm" type="a:CT_Transform2D" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="bwMode" type="a:ST_BlackWhiteMode" use="optional"/> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_WordprocessingGroup"> + <xsd:sequence minOccurs="1" maxOccurs="1"> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cNvGrpSpPr" type="a:CT_NonVisualGroupDrawingShapeProps" minOccurs="1" + maxOccurs="1"/> + <xsd:element name="grpSpPr" type="a:CT_GroupShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element ref="wsp"/> + <xsd:element name="grpSp" type="CT_WordprocessingGroup"/> + <xsd:element name="graphicFrame" type="CT_GraphicFrame"/> + <xsd:element ref="dpct:pic"/> + <xsd:element name="contentPart" type="CT_WordprocessingContentPart"/> + </xsd:choice> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_WordprocessingCanvas"> + <xsd:sequence minOccurs="1" maxOccurs="1"> + <xsd:element name="bg" type="a:CT_BackgroundFormatting" minOccurs="0" maxOccurs="1"/> + <xsd:element name="whole" type="a:CT_WholeE2oFormatting" minOccurs="0" maxOccurs="1"/> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element ref="wsp"/> + <xsd:element ref="dpct:pic"/> + <xsd:element name="contentPart" type="CT_WordprocessingContentPart"/> + <xsd:element ref="wgp"/> + <xsd:element name="graphicFrame" type="CT_GraphicFrame"/> + </xsd:choice> + <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="wpc" type="CT_WordprocessingCanvas"/> + <xsd:element name="wgp" type="CT_WordprocessingGroup"/> + <xsd:element name="wsp" type="CT_WordprocessingShape"/> + <xsd:element name="inline" type="CT_Inline"/> + <xsd:element name="anchor" type="CT_Anchor"/> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd new file mode 100644 index 0000000..14ef488 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd @@ -0,0 +1,1676 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="http://schemas.openxmlformats.org/presentationml/2006/main" + xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" + xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + elementFormDefault="qualified" + targetNamespace="http://schemas.openxmlformats.org/presentationml/2006/main"> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + schemaLocation="shared-relationshipReference.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main" + schemaLocation="dml-main.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + schemaLocation="shared-commonSimpleTypes.xsd"/> + <xsd:simpleType name="ST_TransitionSideDirectionType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="l"/> + <xsd:enumeration value="u"/> + <xsd:enumeration value="r"/> + <xsd:enumeration value="d"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TransitionCornerDirectionType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="lu"/> + <xsd:enumeration value="ru"/> + <xsd:enumeration value="ld"/> + <xsd:enumeration value="rd"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TransitionInOutDirectionType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="out"/> + <xsd:enumeration value="in"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SideDirectionTransition"> + <xsd:attribute name="dir" type="ST_TransitionSideDirectionType" use="optional" default="l"/> + </xsd:complexType> + <xsd:complexType name="CT_CornerDirectionTransition"> + <xsd:attribute name="dir" type="ST_TransitionCornerDirectionType" use="optional" default="lu"/> + </xsd:complexType> + <xsd:simpleType name="ST_TransitionEightDirectionType"> + <xsd:union memberTypes="ST_TransitionSideDirectionType ST_TransitionCornerDirectionType"/> + </xsd:simpleType> + <xsd:complexType name="CT_EightDirectionTransition"> + <xsd:attribute name="dir" type="ST_TransitionEightDirectionType" use="optional" default="l"/> + </xsd:complexType> + <xsd:complexType name="CT_OrientationTransition"> + <xsd:attribute name="dir" type="ST_Direction" use="optional" default="horz"/> + </xsd:complexType> + <xsd:complexType name="CT_InOutTransition"> + <xsd:attribute name="dir" type="ST_TransitionInOutDirectionType" use="optional" default="out"/> + </xsd:complexType> + <xsd:complexType name="CT_OptionalBlackTransition"> + <xsd:attribute name="thruBlk" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_SplitTransition"> + <xsd:attribute name="orient" type="ST_Direction" use="optional" default="horz"/> + <xsd:attribute name="dir" type="ST_TransitionInOutDirectionType" use="optional" default="out"/> + </xsd:complexType> + <xsd:complexType name="CT_WheelTransition"> + <xsd:attribute name="spokes" type="xsd:unsignedInt" use="optional" default="4"/> + </xsd:complexType> + <xsd:complexType name="CT_TransitionStartSoundAction"> + <xsd:sequence> + <xsd:element minOccurs="1" maxOccurs="1" name="snd" type="a:CT_EmbeddedWAVAudioFile"/> + </xsd:sequence> + <xsd:attribute name="loop" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_TransitionSoundAction"> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="stSnd" type="CT_TransitionStartSoundAction"/> + <xsd:element name="endSnd" type="CT_Empty"/> + </xsd:choice> + </xsd:complexType> + <xsd:simpleType name="ST_TransitionSpeed"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="slow"/> + <xsd:enumeration value="med"/> + <xsd:enumeration value="fast"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SlideTransition"> + <xsd:sequence> + <xsd:choice minOccurs="0" maxOccurs="1"> + <xsd:element name="blinds" type="CT_OrientationTransition"/> + <xsd:element name="checker" type="CT_OrientationTransition"/> + <xsd:element name="circle" type="CT_Empty"/> + <xsd:element name="dissolve" type="CT_Empty"/> + <xsd:element name="comb" type="CT_OrientationTransition"/> + <xsd:element name="cover" type="CT_EightDirectionTransition"/> + <xsd:element name="cut" type="CT_OptionalBlackTransition"/> + <xsd:element name="diamond" type="CT_Empty"/> + <xsd:element name="fade" type="CT_OptionalBlackTransition"/> + <xsd:element name="newsflash" type="CT_Empty"/> + <xsd:element name="plus" type="CT_Empty"/> + <xsd:element name="pull" type="CT_EightDirectionTransition"/> + <xsd:element name="push" type="CT_SideDirectionTransition"/> + <xsd:element name="random" type="CT_Empty"/> + <xsd:element name="randomBar" type="CT_OrientationTransition"/> + <xsd:element name="split" type="CT_SplitTransition"/> + <xsd:element name="strips" type="CT_CornerDirectionTransition"/> + <xsd:element name="wedge" type="CT_Empty"/> + <xsd:element name="wheel" type="CT_WheelTransition"/> + <xsd:element name="wipe" type="CT_SideDirectionTransition"/> + <xsd:element name="zoom" type="CT_InOutTransition"/> + </xsd:choice> + <xsd:element name="sndAc" minOccurs="0" maxOccurs="1" type="CT_TransitionSoundAction"/> + <xsd:element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="spd" type="ST_TransitionSpeed" use="optional" default="fast"/> + <xsd:attribute name="advClick" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="advTm" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_TLTimeIndefinite"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="indefinite"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TLTime"> + <xsd:union memberTypes="xsd:unsignedInt ST_TLTimeIndefinite"/> + </xsd:simpleType> + <xsd:simpleType name="ST_TLTimeNodeID"> + <xsd:restriction base="xsd:unsignedInt"/> + </xsd:simpleType> + <xsd:complexType name="CT_TLIterateIntervalTime"> + <xsd:attribute name="val" type="ST_TLTime" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TLIterateIntervalPercentage"> + <xsd:attribute name="val" type="a:ST_PositivePercentage" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_IterateType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="el"/> + <xsd:enumeration value="wd"/> + <xsd:enumeration value="lt"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TLIterateData"> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="tmAbs" type="CT_TLIterateIntervalTime"/> + <xsd:element name="tmPct" type="CT_TLIterateIntervalPercentage"/> + </xsd:choice> + <xsd:attribute name="type" type="ST_IterateType" use="optional" default="el"/> + <xsd:attribute name="backwards" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_TLSubShapeId"> + <xsd:attribute name="spid" type="a:ST_ShapeID" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TLTextTargetElement"> + <xsd:choice minOccurs="0" maxOccurs="1"> + <xsd:element name="charRg" type="CT_IndexRange"/> + <xsd:element name="pRg" type="CT_IndexRange"/> + </xsd:choice> + </xsd:complexType> + <xsd:simpleType name="ST_TLChartSubelementType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="gridLegend"/> + <xsd:enumeration value="series"/> + <xsd:enumeration value="category"/> + <xsd:enumeration value="ptInSeries"/> + <xsd:enumeration value="ptInCategory"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TLOleChartTargetElement"> + <xsd:attribute name="type" type="ST_TLChartSubelementType" use="required"/> + <xsd:attribute name="lvl" type="xsd:unsignedInt" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_TLShapeTargetElement"> + <xsd:choice minOccurs="0" maxOccurs="1"> + <xsd:element name="bg" type="CT_Empty"/> + <xsd:element name="subSp" type="CT_TLSubShapeId"/> + <xsd:element name="oleChartEl" type="CT_TLOleChartTargetElement"/> + <xsd:element name="txEl" type="CT_TLTextTargetElement"/> + <xsd:element name="graphicEl" type="a:CT_AnimationElementChoice"/> + </xsd:choice> + <xsd:attribute name="spid" type="a:ST_DrawingElementId" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TLTimeTargetElement"> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="sldTgt" type="CT_Empty"/> + <xsd:element name="sndTgt" type="a:CT_EmbeddedWAVAudioFile"/> + <xsd:element name="spTgt" type="CT_TLShapeTargetElement"/> + <xsd:element name="inkTgt" type="CT_TLSubShapeId"/> + </xsd:choice> + </xsd:complexType> + <xsd:complexType name="CT_TLTriggerTimeNodeID"> + <xsd:attribute name="val" type="ST_TLTimeNodeID" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_TLTriggerRuntimeNode"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="first"/> + <xsd:enumeration value="last"/> + <xsd:enumeration value="all"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TLTriggerRuntimeNode"> + <xsd:attribute name="val" type="ST_TLTriggerRuntimeNode" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_TLTriggerEvent"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="onBegin"/> + <xsd:enumeration value="onEnd"/> + <xsd:enumeration value="begin"/> + <xsd:enumeration value="end"/> + <xsd:enumeration value="onClick"/> + <xsd:enumeration value="onDblClick"/> + <xsd:enumeration value="onMouseOver"/> + <xsd:enumeration value="onMouseOut"/> + <xsd:enumeration value="onNext"/> + <xsd:enumeration value="onPrev"/> + <xsd:enumeration value="onStopAudio"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TLTimeCondition"> + <xsd:choice minOccurs="0" maxOccurs="1"> + <xsd:element name="tgtEl" type="CT_TLTimeTargetElement"/> + <xsd:element name="tn" type="CT_TLTriggerTimeNodeID"/> + <xsd:element name="rtn" type="CT_TLTriggerRuntimeNode"/> + </xsd:choice> + <xsd:attribute name="evt" use="optional" type="ST_TLTriggerEvent"/> + <xsd:attribute name="delay" type="ST_TLTime" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TLTimeConditionList"> + <xsd:sequence> + <xsd:element name="cond" type="CT_TLTimeCondition" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TimeNodeList"> + <xsd:choice minOccurs="1" maxOccurs="unbounded"> + <xsd:element name="par" type="CT_TLTimeNodeParallel"/> + <xsd:element name="seq" type="CT_TLTimeNodeSequence"/> + <xsd:element name="excl" type="CT_TLTimeNodeExclusive"/> + <xsd:element name="anim" type="CT_TLAnimateBehavior"/> + <xsd:element name="animClr" type="CT_TLAnimateColorBehavior"/> + <xsd:element name="animEffect" type="CT_TLAnimateEffectBehavior"/> + <xsd:element name="animMotion" type="CT_TLAnimateMotionBehavior"/> + <xsd:element name="animRot" type="CT_TLAnimateRotationBehavior"/> + <xsd:element name="animScale" type="CT_TLAnimateScaleBehavior"/> + <xsd:element name="cmd" type="CT_TLCommandBehavior"/> + <xsd:element name="set" type="CT_TLSetBehavior"/> + <xsd:element name="audio" type="CT_TLMediaNodeAudio"/> + <xsd:element name="video" type="CT_TLMediaNodeVideo"/> + </xsd:choice> + </xsd:complexType> + <xsd:simpleType name="ST_TLTimeNodePresetClassType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="entr"/> + <xsd:enumeration value="exit"/> + <xsd:enumeration value="emph"/> + <xsd:enumeration value="path"/> + <xsd:enumeration value="verb"/> + <xsd:enumeration value="mediacall"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TLTimeNodeRestartType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="always"/> + <xsd:enumeration value="whenNotActive"/> + <xsd:enumeration value="never"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TLTimeNodeFillType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="remove"/> + <xsd:enumeration value="freeze"/> + <xsd:enumeration value="hold"/> + <xsd:enumeration value="transition"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TLTimeNodeSyncType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="canSlip"/> + <xsd:enumeration value="locked"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TLTimeNodeMasterRelation"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="sameClick"/> + <xsd:enumeration value="lastClick"/> + <xsd:enumeration value="nextClick"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TLTimeNodeType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="clickEffect"/> + <xsd:enumeration value="withEffect"/> + <xsd:enumeration value="afterEffect"/> + <xsd:enumeration value="mainSeq"/> + <xsd:enumeration value="interactiveSeq"/> + <xsd:enumeration value="clickPar"/> + <xsd:enumeration value="withGroup"/> + <xsd:enumeration value="afterGroup"/> + <xsd:enumeration value="tmRoot"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TLCommonTimeNodeData"> + <xsd:sequence> + <xsd:element name="stCondLst" type="CT_TLTimeConditionList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="endCondLst" type="CT_TLTimeConditionList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="endSync" type="CT_TLTimeCondition" minOccurs="0" maxOccurs="1"/> + <xsd:element name="iterate" type="CT_TLIterateData" minOccurs="0" maxOccurs="1"/> + <xsd:element name="childTnLst" type="CT_TimeNodeList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="subTnLst" type="CT_TimeNodeList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="id" type="ST_TLTimeNodeID" use="optional"/> + <xsd:attribute name="presetID" type="xsd:int" use="optional"/> + <xsd:attribute name="presetClass" type="ST_TLTimeNodePresetClassType" use="optional"/> + <xsd:attribute name="presetSubtype" type="xsd:int" use="optional"/> + <xsd:attribute name="dur" type="ST_TLTime" use="optional"/> + <xsd:attribute name="repeatCount" type="ST_TLTime" use="optional" default="1000"/> + <xsd:attribute name="repeatDur" type="ST_TLTime" use="optional"/> + <xsd:attribute name="spd" type="a:ST_Percentage" use="optional" default="100%"/> + <xsd:attribute name="accel" type="a:ST_PositiveFixedPercentage" use="optional" default="0%"/> + <xsd:attribute name="decel" type="a:ST_PositiveFixedPercentage" use="optional" default="0%"/> + <xsd:attribute name="autoRev" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="restart" type="ST_TLTimeNodeRestartType" use="optional"/> + <xsd:attribute name="fill" type="ST_TLTimeNodeFillType" use="optional"/> + <xsd:attribute name="syncBehavior" type="ST_TLTimeNodeSyncType" use="optional"/> + <xsd:attribute name="tmFilter" type="xsd:string" use="optional"/> + <xsd:attribute name="evtFilter" type="xsd:string" use="optional"/> + <xsd:attribute name="display" type="xsd:boolean" use="optional"/> + <xsd:attribute name="masterRel" type="ST_TLTimeNodeMasterRelation" use="optional"/> + <xsd:attribute name="bldLvl" type="xsd:int" use="optional"/> + <xsd:attribute name="grpId" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="afterEffect" type="xsd:boolean" use="optional"/> + <xsd:attribute name="nodeType" type="ST_TLTimeNodeType" use="optional"/> + <xsd:attribute name="nodePh" type="xsd:boolean" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TLTimeNodeParallel"> + <xsd:sequence> + <xsd:element name="cTn" type="CT_TLCommonTimeNodeData" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_TLNextActionType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="seek"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TLPreviousActionType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="skipTimed"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TLTimeNodeSequence"> + <xsd:sequence> + <xsd:element name="cTn" type="CT_TLCommonTimeNodeData" minOccurs="1" maxOccurs="1"/> + <xsd:element name="prevCondLst" type="CT_TLTimeConditionList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="nextCondLst" type="CT_TLTimeConditionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="concurrent" type="xsd:boolean" use="optional"/> + <xsd:attribute name="prevAc" type="ST_TLPreviousActionType" use="optional"/> + <xsd:attribute name="nextAc" type="ST_TLNextActionType" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TLTimeNodeExclusive"> + <xsd:sequence> + <xsd:element name="cTn" type="CT_TLCommonTimeNodeData" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TLBehaviorAttributeNameList"> + <xsd:sequence> + <xsd:element name="attrName" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_TLBehaviorAdditiveType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="base"/> + <xsd:enumeration value="sum"/> + <xsd:enumeration value="repl"/> + <xsd:enumeration value="mult"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TLBehaviorAccumulateType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="always"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TLBehaviorTransformType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="pt"/> + <xsd:enumeration value="img"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TLBehaviorOverrideType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="normal"/> + <xsd:enumeration value="childStyle"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TLCommonBehaviorData"> + <xsd:sequence> + <xsd:element name="cTn" type="CT_TLCommonTimeNodeData" minOccurs="1" maxOccurs="1"/> + <xsd:element name="tgtEl" type="CT_TLTimeTargetElement" minOccurs="1" maxOccurs="1"/> + <xsd:element name="attrNameLst" type="CT_TLBehaviorAttributeNameList" minOccurs="0" + maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="additive" type="ST_TLBehaviorAdditiveType" use="optional"/> + <xsd:attribute name="accumulate" type="ST_TLBehaviorAccumulateType" use="optional"/> + <xsd:attribute name="xfrmType" type="ST_TLBehaviorTransformType" use="optional"/> + <xsd:attribute name="from" type="xsd:string" use="optional"/> + <xsd:attribute name="to" type="xsd:string" use="optional"/> + <xsd:attribute name="by" type="xsd:string" use="optional"/> + <xsd:attribute name="rctx" type="xsd:string" use="optional"/> + <xsd:attribute name="override" type="ST_TLBehaviorOverrideType" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TLAnimVariantBooleanVal"> + <xsd:attribute name="val" type="xsd:boolean" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TLAnimVariantIntegerVal"> + <xsd:attribute name="val" type="xsd:int" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TLAnimVariantFloatVal"> + <xsd:attribute name="val" type="xsd:float" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TLAnimVariantStringVal"> + <xsd:attribute name="val" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TLAnimVariant"> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="boolVal" type="CT_TLAnimVariantBooleanVal"/> + <xsd:element name="intVal" type="CT_TLAnimVariantIntegerVal"/> + <xsd:element name="fltVal" type="CT_TLAnimVariantFloatVal"/> + <xsd:element name="strVal" type="CT_TLAnimVariantStringVal"/> + <xsd:element name="clrVal" type="a:CT_Color"/> + </xsd:choice> + </xsd:complexType> + <xsd:simpleType name="ST_TLTimeAnimateValueTime"> + <xsd:union memberTypes="a:ST_PositiveFixedPercentage ST_TLTimeIndefinite"/> + </xsd:simpleType> + <xsd:complexType name="CT_TLTimeAnimateValue"> + <xsd:sequence> + <xsd:element name="val" type="CT_TLAnimVariant" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="tm" type="ST_TLTimeAnimateValueTime" use="optional" default="indefinite"/> + <xsd:attribute name="fmla" type="xsd:string" use="optional" default=""/> + </xsd:complexType> + <xsd:complexType name="CT_TLTimeAnimateValueList"> + <xsd:sequence> + <xsd:element name="tav" type="CT_TLTimeAnimateValue" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_TLAnimateBehaviorCalcMode"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="discrete"/> + <xsd:enumeration value="lin"/> + <xsd:enumeration value="fmla"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TLAnimateBehaviorValueType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="str"/> + <xsd:enumeration value="num"/> + <xsd:enumeration value="clr"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TLAnimateBehavior"> + <xsd:sequence> + <xsd:element name="cBhvr" type="CT_TLCommonBehaviorData" minOccurs="1" maxOccurs="1"/> + <xsd:element name="tavLst" type="CT_TLTimeAnimateValueList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="by" type="xsd:string" use="optional"/> + <xsd:attribute name="from" type="xsd:string" use="optional"/> + <xsd:attribute name="to" type="xsd:string" use="optional"/> + <xsd:attribute name="calcmode" type="ST_TLAnimateBehaviorCalcMode" use="optional"/> + <xsd:attribute name="valueType" type="ST_TLAnimateBehaviorValueType" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TLByRgbColorTransform"> + <xsd:attribute name="r" type="a:ST_FixedPercentage" use="required"/> + <xsd:attribute name="g" type="a:ST_FixedPercentage" use="required"/> + <xsd:attribute name="b" type="a:ST_FixedPercentage" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TLByHslColorTransform"> + <xsd:attribute name="h" type="a:ST_Angle" use="required"/> + <xsd:attribute name="s" type="a:ST_FixedPercentage" use="required"/> + <xsd:attribute name="l" type="a:ST_FixedPercentage" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TLByAnimateColorTransform"> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="rgb" type="CT_TLByRgbColorTransform"/> + <xsd:element name="hsl" type="CT_TLByHslColorTransform"/> + </xsd:choice> + </xsd:complexType> + <xsd:simpleType name="ST_TLAnimateColorSpace"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="rgb"/> + <xsd:enumeration value="hsl"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TLAnimateColorDirection"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="cw"/> + <xsd:enumeration value="ccw"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TLAnimateColorBehavior"> + <xsd:sequence> + <xsd:element name="cBhvr" type="CT_TLCommonBehaviorData" minOccurs="1" maxOccurs="1"/> + <xsd:element name="by" type="CT_TLByAnimateColorTransform" minOccurs="0" maxOccurs="1"/> + <xsd:element name="from" type="a:CT_Color" minOccurs="0" maxOccurs="1"/> + <xsd:element name="to" type="a:CT_Color" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="clrSpc" type="ST_TLAnimateColorSpace" use="optional"/> + <xsd:attribute name="dir" type="ST_TLAnimateColorDirection" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_TLAnimateEffectTransition"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="in"/> + <xsd:enumeration value="out"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TLAnimateEffectBehavior"> + <xsd:sequence> + <xsd:element name="cBhvr" type="CT_TLCommonBehaviorData" minOccurs="1" maxOccurs="1"/> + <xsd:element name="progress" type="CT_TLAnimVariant" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="transition" type="ST_TLAnimateEffectTransition" default="in" use="optional"/> + <xsd:attribute name="filter" type="xsd:string" use="optional"/> + <xsd:attribute name="prLst" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_TLAnimateMotionBehaviorOrigin"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="parent"/> + <xsd:enumeration value="layout"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TLAnimateMotionPathEditMode"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="relative"/> + <xsd:enumeration value="fixed"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TLPoint"> + <xsd:attribute name="x" type="a:ST_Percentage" use="required"/> + <xsd:attribute name="y" type="a:ST_Percentage" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TLAnimateMotionBehavior"> + <xsd:sequence> + <xsd:element name="cBhvr" type="CT_TLCommonBehaviorData" minOccurs="1" maxOccurs="1"/> + <xsd:element name="by" type="CT_TLPoint" minOccurs="0" maxOccurs="1"/> + <xsd:element name="from" type="CT_TLPoint" minOccurs="0" maxOccurs="1"/> + <xsd:element name="to" type="CT_TLPoint" minOccurs="0" maxOccurs="1"/> + <xsd:element name="rCtr" type="CT_TLPoint" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="origin" type="ST_TLAnimateMotionBehaviorOrigin" use="optional"/> + <xsd:attribute name="path" type="xsd:string" use="optional"/> + <xsd:attribute name="pathEditMode" type="ST_TLAnimateMotionPathEditMode" use="optional"/> + <xsd:attribute name="rAng" type="a:ST_Angle" use="optional"/> + <xsd:attribute name="ptsTypes" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TLAnimateRotationBehavior"> + <xsd:sequence> + <xsd:element name="cBhvr" type="CT_TLCommonBehaviorData" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="by" type="a:ST_Angle" use="optional"/> + <xsd:attribute name="from" type="a:ST_Angle" use="optional"/> + <xsd:attribute name="to" type="a:ST_Angle" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TLAnimateScaleBehavior"> + <xsd:sequence> + <xsd:element name="cBhvr" type="CT_TLCommonBehaviorData" minOccurs="1" maxOccurs="1"/> + <xsd:element name="by" type="CT_TLPoint" minOccurs="0" maxOccurs="1"/> + <xsd:element name="from" type="CT_TLPoint" minOccurs="0" maxOccurs="1"/> + <xsd:element name="to" type="CT_TLPoint" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="zoomContents" type="xsd:boolean" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_TLCommandType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="evt"/> + <xsd:enumeration value="call"/> + <xsd:enumeration value="verb"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TLCommandBehavior"> + <xsd:sequence> + <xsd:element name="cBhvr" type="CT_TLCommonBehaviorData" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute type="ST_TLCommandType" name="type" use="optional"/> + <xsd:attribute name="cmd" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TLSetBehavior"> + <xsd:sequence> + <xsd:element name="cBhvr" type="CT_TLCommonBehaviorData" minOccurs="1" maxOccurs="1"/> + <xsd:element name="to" type="CT_TLAnimVariant" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TLCommonMediaNodeData"> + <xsd:sequence> + <xsd:element name="cTn" type="CT_TLCommonTimeNodeData" minOccurs="1" maxOccurs="1"/> + <xsd:element name="tgtEl" type="CT_TLTimeTargetElement" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="vol" type="a:ST_PositiveFixedPercentage" default="50%" use="optional"/> + <xsd:attribute name="mute" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="numSld" type="xsd:unsignedInt" use="optional" default="1"/> + <xsd:attribute name="showWhenStopped" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_TLMediaNodeAudio"> + <xsd:sequence> + <xsd:element name="cMediaNode" type="CT_TLCommonMediaNodeData" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="isNarration" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_TLMediaNodeVideo"> + <xsd:sequence> + <xsd:element name="cMediaNode" type="CT_TLCommonMediaNodeData" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="fullScrn" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:attributeGroup name="AG_TLBuild"> + <xsd:attribute name="spid" type="a:ST_DrawingElementId" use="required"/> + <xsd:attribute name="grpId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="uiExpand" type="xsd:boolean" use="optional" default="false"/> + </xsd:attributeGroup> + <xsd:complexType name="CT_TLTemplate"> + <xsd:sequence> + <xsd:element name="tnLst" type="CT_TimeNodeList" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="lvl" type="xsd:unsignedInt" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_TLTemplateList"> + <xsd:sequence> + <xsd:element name="tmpl" type="CT_TLTemplate" minOccurs="0" maxOccurs="9"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_TLParaBuildType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="allAtOnce"/> + <xsd:enumeration value="p"/> + <xsd:enumeration value="cust"/> + <xsd:enumeration value="whole"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TLBuildParagraph"> + <xsd:sequence> + <xsd:element name="tmplLst" type="CT_TLTemplateList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_TLBuild"/> + <xsd:attribute name="build" type="ST_TLParaBuildType" use="optional" default="whole"/> + <xsd:attribute name="bldLvl" type="xsd:unsignedInt" use="optional" default="1"/> + <xsd:attribute name="animBg" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="autoUpdateAnimBg" type="xsd:boolean" default="true" use="optional"/> + <xsd:attribute name="rev" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="advAuto" type="ST_TLTime" use="optional" default="indefinite"/> + </xsd:complexType> + <xsd:simpleType name="ST_TLDiagramBuildType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="whole"/> + <xsd:enumeration value="depthByNode"/> + <xsd:enumeration value="depthByBranch"/> + <xsd:enumeration value="breadthByNode"/> + <xsd:enumeration value="breadthByLvl"/> + <xsd:enumeration value="cw"/> + <xsd:enumeration value="cwIn"/> + <xsd:enumeration value="cwOut"/> + <xsd:enumeration value="ccw"/> + <xsd:enumeration value="ccwIn"/> + <xsd:enumeration value="ccwOut"/> + <xsd:enumeration value="inByRing"/> + <xsd:enumeration value="outByRing"/> + <xsd:enumeration value="up"/> + <xsd:enumeration value="down"/> + <xsd:enumeration value="allAtOnce"/> + <xsd:enumeration value="cust"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TLBuildDiagram"> + <xsd:attributeGroup ref="AG_TLBuild"/> + <xsd:attribute name="bld" type="ST_TLDiagramBuildType" use="optional" default="whole"/> + </xsd:complexType> + <xsd:simpleType name="ST_TLOleChartBuildType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="allAtOnce"/> + <xsd:enumeration value="series"/> + <xsd:enumeration value="category"/> + <xsd:enumeration value="seriesEl"/> + <xsd:enumeration value="categoryEl"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TLOleBuildChart"> + <xsd:attributeGroup ref="AG_TLBuild"/> + <xsd:attribute name="bld" type="ST_TLOleChartBuildType" use="optional" default="allAtOnce"/> + <xsd:attribute name="animBg" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_TLGraphicalObjectBuild"> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="bldAsOne" type="CT_Empty"/> + <xsd:element name="bldSub" type="a:CT_AnimationGraphicalObjectBuildProperties"/> + </xsd:choice> + <xsd:attributeGroup ref="AG_TLBuild"/> + </xsd:complexType> + <xsd:complexType name="CT_BuildList"> + <xsd:choice minOccurs="1" maxOccurs="unbounded"> + <xsd:element name="bldP" type="CT_TLBuildParagraph"/> + <xsd:element name="bldDgm" type="CT_TLBuildDiagram"/> + <xsd:element name="bldOleChart" type="CT_TLOleBuildChart"/> + <xsd:element name="bldGraphic" type="CT_TLGraphicalObjectBuild"/> + </xsd:choice> + </xsd:complexType> + <xsd:complexType name="CT_SlideTiming"> + <xsd:sequence> + <xsd:element name="tnLst" type="CT_TimeNodeList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="bldLst" type="CT_BuildList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Empty"/> + <xsd:simpleType name="ST_Name"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:simpleType name="ST_Direction"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="horz"/> + <xsd:enumeration value="vert"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Index"> + <xsd:restriction base="xsd:unsignedInt"/> + </xsd:simpleType> + <xsd:complexType name="CT_IndexRange"> + <xsd:attribute name="st" type="ST_Index" use="required"/> + <xsd:attribute name="end" type="ST_Index" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SlideRelationshipListEntry"> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SlideRelationshipList"> + <xsd:sequence> + <xsd:element name="sld" type="CT_SlideRelationshipListEntry" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_CustomShowId"> + <xsd:attribute name="id" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:group name="EG_SlideListChoice"> + <xsd:choice> + <xsd:element name="sldAll" type="CT_Empty"/> + <xsd:element name="sldRg" type="CT_IndexRange"/> + <xsd:element name="custShow" type="CT_CustomShowId"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_CustomerData"> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TagsData"> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_CustomerDataList"> + <xsd:sequence minOccurs="0" maxOccurs="1"> + <xsd:element name="custData" type="CT_CustomerData" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="tags" type="CT_TagsData" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Extension"> + <xsd:sequence> + <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="uri" type="xsd:token" use="required"/> + </xsd:complexType> + <xsd:group name="EG_ExtensionList"> + <xsd:sequence> + <xsd:element name="ext" type="CT_Extension" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_ExtensionList"> + <xsd:sequence> + <xsd:group ref="EG_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ExtensionListModify"> + <xsd:sequence> + <xsd:group ref="EG_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="mod" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_CommentAuthor"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="name" type="ST_Name" use="required"/> + <xsd:attribute name="initials" type="ST_Name" use="required"/> + <xsd:attribute name="lastIdx" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="clrIdx" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_CommentAuthorList"> + <xsd:sequence> + <xsd:element name="cmAuthor" type="CT_CommentAuthor" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="cmAuthorLst" type="CT_CommentAuthorList"/> + <xsd:complexType name="CT_Comment"> + <xsd:sequence> + <xsd:element name="pos" type="a:CT_Point2D" minOccurs="1" maxOccurs="1"/> + <xsd:element name="text" type="xsd:string" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="authorId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="dt" type="xsd:dateTime" use="optional"/> + <xsd:attribute name="idx" type="ST_Index" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_CommentList"> + <xsd:sequence> + <xsd:element name="cm" type="CT_Comment" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="cmLst" type="CT_CommentList"/> + <xsd:attributeGroup name="AG_Ole"> + <xsd:attribute name="spid" type="a:ST_ShapeID" use="optional"/> + <xsd:attribute name="name" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="showAsIcon" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute ref="r:id" use="optional"/> + <xsd:attribute name="imgW" type="a:ST_PositiveCoordinate32" use="optional"/> + <xsd:attribute name="imgH" type="a:ST_PositiveCoordinate32" use="optional"/> + </xsd:attributeGroup> + <xsd:simpleType name="ST_OleObjectFollowColorScheme"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="full"/> + <xsd:enumeration value="textAndBackground"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_OleObjectEmbed"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="followColorScheme" type="ST_OleObjectFollowColorScheme" use="optional" + default="none"/> + </xsd:complexType> + <xsd:complexType name="CT_OleObjectLink"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="updateAutomatic" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_OleObject"> + <xsd:sequence> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="embed" type="CT_OleObjectEmbed"/> + <xsd:element name="link" type="CT_OleObjectLink"/> + </xsd:choice> + <xsd:element name="pic" type="CT_Picture" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_Ole"/> + <xsd:attribute name="progId" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:element name="oleObj" type="CT_OleObject"/> + <xsd:complexType name="CT_Control"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pic" type="CT_Picture" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_Ole"/> + </xsd:complexType> + <xsd:complexType name="CT_ControlList"> + <xsd:sequence> + <xsd:element name="control" type="CT_Control" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_SlideId"> + <xsd:restriction base="xsd:unsignedInt"> + <xsd:minInclusive value="256"/> + <xsd:maxExclusive value="2147483648"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SlideIdListEntry"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="id" type="ST_SlideId" use="required"/> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SlideIdList"> + <xsd:sequence> + <xsd:element name="sldId" type="CT_SlideIdListEntry" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_SlideMasterId"> + <xsd:restriction base="xsd:unsignedInt"> + <xsd:minInclusive value="2147483648"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SlideMasterIdListEntry"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="id" type="ST_SlideMasterId" use="optional"/> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SlideMasterIdList"> + <xsd:sequence> + <xsd:element name="sldMasterId" type="CT_SlideMasterIdListEntry" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_NotesMasterIdListEntry"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_NotesMasterIdList"> + <xsd:sequence> + <xsd:element name="notesMasterId" type="CT_NotesMasterIdListEntry" minOccurs="0" maxOccurs="1" + /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_HandoutMasterIdListEntry"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_HandoutMasterIdList"> + <xsd:sequence> + <xsd:element name="handoutMasterId" type="CT_HandoutMasterIdListEntry" minOccurs="0" + maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_EmbeddedFontDataId"> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_EmbeddedFontListEntry"> + <xsd:sequence> + <xsd:element name="font" type="a:CT_TextFont" minOccurs="1" maxOccurs="1"/> + <xsd:element name="regular" type="CT_EmbeddedFontDataId" minOccurs="0" maxOccurs="1"/> + <xsd:element name="bold" type="CT_EmbeddedFontDataId" minOccurs="0" maxOccurs="1"/> + <xsd:element name="italic" type="CT_EmbeddedFontDataId" minOccurs="0" maxOccurs="1"/> + <xsd:element name="boldItalic" type="CT_EmbeddedFontDataId" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_EmbeddedFontList"> + <xsd:sequence> + <xsd:element name="embeddedFont" type="CT_EmbeddedFontListEntry" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SmartTags"> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_CustomShow"> + <xsd:sequence> + <xsd:element name="sldLst" type="CT_SlideRelationshipList" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="name" type="ST_Name" use="required"/> + <xsd:attribute name="id" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_CustomShowList"> + <xsd:sequence> + <xsd:element name="custShow" type="CT_CustomShow" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_PhotoAlbumLayout"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="fitToSlide"/> + <xsd:enumeration value="1pic"/> + <xsd:enumeration value="2pic"/> + <xsd:enumeration value="4pic"/> + <xsd:enumeration value="1picTitle"/> + <xsd:enumeration value="2picTitle"/> + <xsd:enumeration value="4picTitle"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PhotoAlbumFrameShape"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="frameStyle1"/> + <xsd:enumeration value="frameStyle2"/> + <xsd:enumeration value="frameStyle3"/> + <xsd:enumeration value="frameStyle4"/> + <xsd:enumeration value="frameStyle5"/> + <xsd:enumeration value="frameStyle6"/> + <xsd:enumeration value="frameStyle7"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PhotoAlbum"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="bw" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showCaptions" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="layout" type="ST_PhotoAlbumLayout" use="optional" default="fitToSlide"/> + <xsd:attribute name="frame" type="ST_PhotoAlbumFrameShape" use="optional" default="frameStyle1" + /> + </xsd:complexType> + <xsd:simpleType name="ST_SlideSizeCoordinate"> + <xsd:restriction base="a:ST_PositiveCoordinate32"> + <xsd:minInclusive value="914400"/> + <xsd:maxInclusive value="51206400"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_SlideSizeType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="screen4x3"/> + <xsd:enumeration value="letter"/> + <xsd:enumeration value="A4"/> + <xsd:enumeration value="35mm"/> + <xsd:enumeration value="overhead"/> + <xsd:enumeration value="banner"/> + <xsd:enumeration value="custom"/> + <xsd:enumeration value="ledger"/> + <xsd:enumeration value="A3"/> + <xsd:enumeration value="B4ISO"/> + <xsd:enumeration value="B5ISO"/> + <xsd:enumeration value="B4JIS"/> + <xsd:enumeration value="B5JIS"/> + <xsd:enumeration value="hagakiCard"/> + <xsd:enumeration value="screen16x9"/> + <xsd:enumeration value="screen16x10"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SlideSize"> + <xsd:attribute name="cx" type="ST_SlideSizeCoordinate" use="required"/> + <xsd:attribute name="cy" type="ST_SlideSizeCoordinate" use="required"/> + <xsd:attribute name="type" type="ST_SlideSizeType" use="optional" default="custom"/> + </xsd:complexType> + <xsd:complexType name="CT_Kinsoku"> + <xsd:attribute name="lang" type="xsd:string" use="optional"/> + <xsd:attribute name="invalStChars" type="xsd:string" use="required"/> + <xsd:attribute name="invalEndChars" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_BookmarkIdSeed"> + <xsd:restriction base="xsd:unsignedInt"> + <xsd:minInclusive value="1"/> + <xsd:maxExclusive value="2147483648"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_ModifyVerifier"> + <xsd:attribute name="algorithmName" type="xsd:string" use="optional"/> + <xsd:attribute name="hashValue" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="saltValue" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="spinValue" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="cryptProviderType" type="s:ST_CryptProv" use="optional"/> + <xsd:attribute name="cryptAlgorithmClass" type="s:ST_AlgClass" use="optional"/> + <xsd:attribute name="cryptAlgorithmType" type="s:ST_AlgType" use="optional"/> + <xsd:attribute name="cryptAlgorithmSid" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="spinCount" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="saltData" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="hashData" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="cryptProvider" type="xsd:string" use="optional"/> + <xsd:attribute name="algIdExt" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="algIdExtSource" type="xsd:string" use="optional"/> + <xsd:attribute name="cryptProviderTypeExt" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="cryptProviderTypeExtSource" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Presentation"> + <xsd:sequence> + <xsd:element name="sldMasterIdLst" type="CT_SlideMasterIdList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="notesMasterIdLst" type="CT_NotesMasterIdList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="handoutMasterIdLst" type="CT_HandoutMasterIdList" minOccurs="0" + maxOccurs="1"/> + <xsd:element name="sldIdLst" type="CT_SlideIdList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sldSz" type="CT_SlideSize" minOccurs="0" maxOccurs="1"/> + <xsd:element name="notesSz" type="a:CT_PositiveSize2D" minOccurs="1" maxOccurs="1"/> + <xsd:element name="smartTags" type="CT_SmartTags" minOccurs="0" maxOccurs="1"/> + <xsd:element name="embeddedFontLst" type="CT_EmbeddedFontList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="custShowLst" type="CT_CustomShowList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="photoAlbum" type="CT_PhotoAlbum" minOccurs="0" maxOccurs="1"/> + <xsd:element name="custDataLst" type="CT_CustomerDataList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="kinsoku" type="CT_Kinsoku" minOccurs="0"/> + <xsd:element name="defaultTextStyle" type="a:CT_TextListStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="modifyVerifier" type="CT_ModifyVerifier" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="serverZoom" type="a:ST_Percentage" use="optional" default="50%"/> + <xsd:attribute name="firstSlideNum" type="xsd:int" use="optional" default="1"/> + <xsd:attribute name="showSpecialPlsOnTitleSld" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="rtl" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="removePersonalInfoOnSave" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="compatMode" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="strictFirstAndLastChars" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="embedTrueTypeFonts" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="saveSubsetFonts" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="autoCompressPictures" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="bookmarkIdSeed" type="ST_BookmarkIdSeed" use="optional" default="1"/> + <xsd:attribute name="conformance" type="s:ST_ConformanceClass"/> + </xsd:complexType> + <xsd:element name="presentation" type="CT_Presentation"/> + <xsd:complexType name="CT_HtmlPublishProperties"> + <xsd:sequence> + <xsd:group ref="EG_SlideListChoice" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="showSpeakerNotes" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="target" type="xsd:string" use="optional"/> + <xsd:attribute name="title" type="xsd:string" use="optional" default=""/> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_WebColorType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="browser"/> + <xsd:enumeration value="presentationText"/> + <xsd:enumeration value="presentationAccent"/> + <xsd:enumeration value="whiteTextOnBlack"/> + <xsd:enumeration value="blackTextOnWhite"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_WebScreenSize"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="544x376"/> + <xsd:enumeration value="640x480"/> + <xsd:enumeration value="720x512"/> + <xsd:enumeration value="800x600"/> + <xsd:enumeration value="1024x768"/> + <xsd:enumeration value="1152x882"/> + <xsd:enumeration value="1152x900"/> + <xsd:enumeration value="1280x1024"/> + <xsd:enumeration value="1600x1200"/> + <xsd:enumeration value="1800x1400"/> + <xsd:enumeration value="1920x1200"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_WebEncoding"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:complexType name="CT_WebProperties"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="showAnimation" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="resizeGraphics" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="allowPng" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="relyOnVml" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="organizeInFolders" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="useLongFilenames" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="imgSz" type="ST_WebScreenSize" use="optional" default="800x600"/> + <xsd:attribute name="encoding" type="ST_WebEncoding" use="optional" default=""/> + <xsd:attribute name="clr" type="ST_WebColorType" use="optional" default="whiteTextOnBlack"/> + </xsd:complexType> + <xsd:simpleType name="ST_PrintWhat"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="slides"/> + <xsd:enumeration value="handouts1"/> + <xsd:enumeration value="handouts2"/> + <xsd:enumeration value="handouts3"/> + <xsd:enumeration value="handouts4"/> + <xsd:enumeration value="handouts6"/> + <xsd:enumeration value="handouts9"/> + <xsd:enumeration value="notes"/> + <xsd:enumeration value="outline"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PrintColorMode"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="bw"/> + <xsd:enumeration value="gray"/> + <xsd:enumeration value="clr"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PrintProperties"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="prnWhat" type="ST_PrintWhat" use="optional" default="slides"/> + <xsd:attribute name="clrMode" type="ST_PrintColorMode" use="optional" default="clr"/> + <xsd:attribute name="hiddenSlides" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="scaleToFitPaper" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="frameSlides" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_ShowInfoBrowse"> + <xsd:attribute name="showScrollbar" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_ShowInfoKiosk"> + <xsd:attribute name="restart" type="xsd:unsignedInt" use="optional" default="300000"/> + </xsd:complexType> + <xsd:group name="EG_ShowType"> + <xsd:choice> + <xsd:element name="present" type="CT_Empty"/> + <xsd:element name="browse" type="CT_ShowInfoBrowse"/> + <xsd:element name="kiosk" type="CT_ShowInfoKiosk"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_ShowProperties"> + <xsd:sequence minOccurs="0" maxOccurs="1"> + <xsd:group ref="EG_ShowType" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_SlideListChoice" minOccurs="0" maxOccurs="1"/> + <xsd:element name="penClr" type="a:CT_Color" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="loop" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showNarration" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showAnimation" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="useTimings" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_PresentationProperties"> + <xsd:sequence> + <xsd:element name="htmlPubPr" type="CT_HtmlPublishProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="webPr" type="CT_WebProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="prnPr" type="CT_PrintProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="showPr" type="CT_ShowProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="clrMru" type="a:CT_ColorMRU" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="presentationPr" type="CT_PresentationProperties"/> + <xsd:complexType name="CT_HeaderFooter"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="sldNum" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="hdr" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="ftr" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="dt" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:simpleType name="ST_PlaceholderType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="title"/> + <xsd:enumeration value="body"/> + <xsd:enumeration value="ctrTitle"/> + <xsd:enumeration value="subTitle"/> + <xsd:enumeration value="dt"/> + <xsd:enumeration value="sldNum"/> + <xsd:enumeration value="ftr"/> + <xsd:enumeration value="hdr"/> + <xsd:enumeration value="obj"/> + <xsd:enumeration value="chart"/> + <xsd:enumeration value="tbl"/> + <xsd:enumeration value="clipArt"/> + <xsd:enumeration value="dgm"/> + <xsd:enumeration value="media"/> + <xsd:enumeration value="sldImg"/> + <xsd:enumeration value="pic"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PlaceholderSize"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="full"/> + <xsd:enumeration value="half"/> + <xsd:enumeration value="quarter"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Placeholder"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="type" type="ST_PlaceholderType" use="optional" default="obj"/> + <xsd:attribute name="orient" type="ST_Direction" use="optional" default="horz"/> + <xsd:attribute name="sz" type="ST_PlaceholderSize" use="optional" default="full"/> + <xsd:attribute name="idx" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="hasCustomPrompt" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_ApplicationNonVisualDrawingProps"> + <xsd:sequence> + <xsd:element name="ph" type="CT_Placeholder" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="a:EG_Media" minOccurs="0" maxOccurs="1"/> + <xsd:element name="custDataLst" type="CT_CustomerDataList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="isPhoto" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="userDrawn" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_ShapeNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvSpPr" type="a:CT_NonVisualDrawingShapeProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="nvPr" type="CT_ApplicationNonVisualDrawingProps" minOccurs="1" + maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Shape"> + <xsd:sequence> + <xsd:element name="nvSpPr" type="CT_ShapeNonVisual" minOccurs="1" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txBody" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="useBgFill" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_ConnectorNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvCxnSpPr" type="a:CT_NonVisualConnectorProperties" minOccurs="1" + maxOccurs="1"/> + <xsd:element name="nvPr" type="CT_ApplicationNonVisualDrawingProps" minOccurs="1" + maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Connector"> + <xsd:sequence> + <xsd:element name="nvCxnSpPr" type="CT_ConnectorNonVisual" minOccurs="1" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_PictureNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvPicPr" type="a:CT_NonVisualPictureProperties" minOccurs="1" + maxOccurs="1"/> + <xsd:element name="nvPr" type="CT_ApplicationNonVisualDrawingProps" minOccurs="1" + maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Picture"> + <xsd:sequence> + <xsd:element name="nvPicPr" type="CT_PictureNonVisual" minOccurs="1" maxOccurs="1"/> + <xsd:element name="blipFill" type="a:CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GraphicalObjectFrameNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvGraphicFramePr" type="a:CT_NonVisualGraphicFrameProperties" + minOccurs="1" maxOccurs="1"/> + <xsd:element name="nvPr" type="CT_ApplicationNonVisualDrawingProps" minOccurs="1" + maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GraphicalObjectFrame"> + <xsd:sequence> + <xsd:element name="nvGraphicFramePr" type="CT_GraphicalObjectFrameNonVisual" minOccurs="1" + maxOccurs="1"/> + <xsd:element name="xfrm" type="a:CT_Transform2D" minOccurs="1" maxOccurs="1"/> + <xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="bwMode" type="a:ST_BlackWhiteMode" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_GroupShapeNonVisual"> + <xsd:sequence> + <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cNvGrpSpPr" type="a:CT_NonVisualGroupDrawingShapeProps" minOccurs="1" + maxOccurs="1"/> + <xsd:element name="nvPr" type="CT_ApplicationNonVisualDrawingProps" minOccurs="1" + maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GroupShape"> + <xsd:sequence> + <xsd:element name="nvGrpSpPr" type="CT_GroupShapeNonVisual" minOccurs="1" maxOccurs="1"/> + <xsd:element name="grpSpPr" type="a:CT_GroupShapeProperties" minOccurs="1" maxOccurs="1"/> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="sp" type="CT_Shape"/> + <xsd:element name="grpSp" type="CT_GroupShape"/> + <xsd:element name="graphicFrame" type="CT_GraphicalObjectFrame"/> + <xsd:element name="cxnSp" type="CT_Connector"/> + <xsd:element name="pic" type="CT_Picture"/> + <xsd:element name="contentPart" type="CT_Rel"/> + </xsd:choice> + <xsd:element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Rel"> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:group name="EG_TopLevelSlide"> + <xsd:sequence> + <xsd:element name="clrMap" type="a:CT_ColorMapping" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:group> + <xsd:group name="EG_ChildSlide"> + <xsd:sequence> + <xsd:element name="clrMapOvr" type="a:CT_ColorMappingOverride" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:group> + <xsd:attributeGroup name="AG_ChildSlide"> + <xsd:attribute name="showMasterSp" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="showMasterPhAnim" type="xsd:boolean" use="optional" default="true"/> + </xsd:attributeGroup> + <xsd:complexType name="CT_BackgroundProperties"> + <xsd:sequence> + <xsd:group ref="a:EG_FillProperties" minOccurs="1" maxOccurs="1"/> + <xsd:group ref="a:EG_EffectProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="shadeToTitle" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:group name="EG_Background"> + <xsd:choice> + <xsd:element name="bgPr" type="CT_BackgroundProperties"/> + <xsd:element name="bgRef" type="a:CT_StyleMatrixReference"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_Background"> + <xsd:sequence> + <xsd:group ref="EG_Background"/> + </xsd:sequence> + <xsd:attribute name="bwMode" type="a:ST_BlackWhiteMode" use="optional" default="white"/> + </xsd:complexType> + <xsd:complexType name="CT_CommonSlideData"> + <xsd:sequence> + <xsd:element name="bg" type="CT_Background" minOccurs="0" maxOccurs="1"/> + <xsd:element name="spTree" type="CT_GroupShape" minOccurs="1" maxOccurs="1"/> + <xsd:element name="custDataLst" type="CT_CustomerDataList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="controls" type="CT_ControlList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="optional" default=""/> + </xsd:complexType> + <xsd:complexType name="CT_Slide"> + <xsd:sequence minOccurs="1" maxOccurs="1"> + <xsd:element name="cSld" type="CT_CommonSlideData" minOccurs="1" maxOccurs="1"/> + <xsd:group ref="EG_ChildSlide" minOccurs="0" maxOccurs="1"/> + <xsd:element name="transition" type="CT_SlideTransition" minOccurs="0" maxOccurs="1"/> + <xsd:element name="timing" type="CT_SlideTiming" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_ChildSlide"/> + <xsd:attribute name="show" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:element name="sld" type="CT_Slide"/> + <xsd:simpleType name="ST_SlideLayoutType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="title"/> + <xsd:enumeration value="tx"/> + <xsd:enumeration value="twoColTx"/> + <xsd:enumeration value="tbl"/> + <xsd:enumeration value="txAndChart"/> + <xsd:enumeration value="chartAndTx"/> + <xsd:enumeration value="dgm"/> + <xsd:enumeration value="chart"/> + <xsd:enumeration value="txAndClipArt"/> + <xsd:enumeration value="clipArtAndTx"/> + <xsd:enumeration value="titleOnly"/> + <xsd:enumeration value="blank"/> + <xsd:enumeration value="txAndObj"/> + <xsd:enumeration value="objAndTx"/> + <xsd:enumeration value="objOnly"/> + <xsd:enumeration value="obj"/> + <xsd:enumeration value="txAndMedia"/> + <xsd:enumeration value="mediaAndTx"/> + <xsd:enumeration value="objOverTx"/> + <xsd:enumeration value="txOverObj"/> + <xsd:enumeration value="txAndTwoObj"/> + <xsd:enumeration value="twoObjAndTx"/> + <xsd:enumeration value="twoObjOverTx"/> + <xsd:enumeration value="fourObj"/> + <xsd:enumeration value="vertTx"/> + <xsd:enumeration value="clipArtAndVertTx"/> + <xsd:enumeration value="vertTitleAndTx"/> + <xsd:enumeration value="vertTitleAndTxOverChart"/> + <xsd:enumeration value="twoObj"/> + <xsd:enumeration value="objAndTwoObj"/> + <xsd:enumeration value="twoObjAndObj"/> + <xsd:enumeration value="cust"/> + <xsd:enumeration value="secHead"/> + <xsd:enumeration value="twoTxTwoObj"/> + <xsd:enumeration value="objTx"/> + <xsd:enumeration value="picTx"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SlideLayout"> + <xsd:sequence minOccurs="1" maxOccurs="1"> + <xsd:element name="cSld" type="CT_CommonSlideData" minOccurs="1" maxOccurs="1"/> + <xsd:group ref="EG_ChildSlide" minOccurs="0" maxOccurs="1"/> + <xsd:element name="transition" type="CT_SlideTransition" minOccurs="0" maxOccurs="1"/> + <xsd:element name="timing" type="CT_SlideTiming" minOccurs="0" maxOccurs="1"/> + <xsd:element name="hf" type="CT_HeaderFooter" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_ChildSlide"/> + <xsd:attribute name="matchingName" type="xsd:string" use="optional" default=""/> + <xsd:attribute name="type" type="ST_SlideLayoutType" use="optional" default="cust"/> + <xsd:attribute name="preserve" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="userDrawn" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:element name="sldLayout" type="CT_SlideLayout"/> + <xsd:complexType name="CT_SlideMasterTextStyles"> + <xsd:sequence> + <xsd:element name="titleStyle" type="a:CT_TextListStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="bodyStyle" type="a:CT_TextListStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="otherStyle" type="a:CT_TextListStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_SlideLayoutId"> + <xsd:restriction base="xsd:unsignedInt"> + <xsd:minInclusive value="2147483648"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SlideLayoutIdListEntry"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="id" type="ST_SlideLayoutId" use="optional"/> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SlideLayoutIdList"> + <xsd:sequence> + <xsd:element name="sldLayoutId" type="CT_SlideLayoutIdListEntry" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SlideMaster"> + <xsd:sequence minOccurs="1" maxOccurs="1"> + <xsd:element name="cSld" type="CT_CommonSlideData" minOccurs="1" maxOccurs="1"/> + <xsd:group ref="EG_TopLevelSlide" minOccurs="1" maxOccurs="1"/> + <xsd:element name="sldLayoutIdLst" type="CT_SlideLayoutIdList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="transition" type="CT_SlideTransition" minOccurs="0" maxOccurs="1"/> + <xsd:element name="timing" type="CT_SlideTiming" minOccurs="0" maxOccurs="1"/> + <xsd:element name="hf" type="CT_HeaderFooter" minOccurs="0" maxOccurs="1"/> + <xsd:element name="txStyles" type="CT_SlideMasterTextStyles" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="preserve" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:element name="sldMaster" type="CT_SlideMaster"/> + <xsd:complexType name="CT_HandoutMaster"> + <xsd:sequence> + <xsd:element name="cSld" type="CT_CommonSlideData" minOccurs="1" maxOccurs="1"/> + <xsd:group ref="EG_TopLevelSlide" minOccurs="1" maxOccurs="1"/> + <xsd:element name="hf" type="CT_HeaderFooter" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="handoutMaster" type="CT_HandoutMaster"/> + <xsd:complexType name="CT_NotesMaster"> + <xsd:sequence> + <xsd:element name="cSld" type="CT_CommonSlideData" minOccurs="1" maxOccurs="1"/> + <xsd:group ref="EG_TopLevelSlide" minOccurs="1" maxOccurs="1"/> + <xsd:element name="hf" type="CT_HeaderFooter" minOccurs="0" maxOccurs="1"/> + <xsd:element name="notesStyle" type="a:CT_TextListStyle" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="notesMaster" type="CT_NotesMaster"/> + <xsd:complexType name="CT_NotesSlide"> + <xsd:sequence minOccurs="1" maxOccurs="1"> + <xsd:element name="cSld" type="CT_CommonSlideData" minOccurs="1" maxOccurs="1"/> + <xsd:group ref="EG_ChildSlide" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_ChildSlide"/> + </xsd:complexType> + <xsd:element name="notes" type="CT_NotesSlide"/> + <xsd:complexType name="CT_SlideSyncProperties"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="serverSldId" type="xsd:string" use="required"/> + <xsd:attribute name="serverSldModifiedTime" type="xsd:dateTime" use="required"/> + <xsd:attribute name="clientInsertedTime" type="xsd:dateTime" use="required"/> + </xsd:complexType> + <xsd:element name="sldSyncPr" type="CT_SlideSyncProperties"/> + <xsd:complexType name="CT_StringTag"> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="val" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TagList"> + <xsd:sequence> + <xsd:element name="tag" type="CT_StringTag" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="tagLst" type="CT_TagList"/> + <xsd:simpleType name="ST_SplitterBarState"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="minimized"/> + <xsd:enumeration value="restored"/> + <xsd:enumeration value="maximized"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ViewType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="sldView"/> + <xsd:enumeration value="sldMasterView"/> + <xsd:enumeration value="notesView"/> + <xsd:enumeration value="handoutView"/> + <xsd:enumeration value="notesMasterView"/> + <xsd:enumeration value="outlineView"/> + <xsd:enumeration value="sldSorterView"/> + <xsd:enumeration value="sldThumbnailView"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_NormalViewPortion"> + <xsd:attribute name="sz" type="a:ST_PositiveFixedPercentage" use="required"/> + <xsd:attribute name="autoAdjust" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_NormalViewProperties"> + <xsd:sequence> + <xsd:element name="restoredLeft" type="CT_NormalViewPortion" minOccurs="1" maxOccurs="1"/> + <xsd:element name="restoredTop" type="CT_NormalViewPortion" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="showOutlineIcons" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="snapVertSplitter" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="vertBarState" type="ST_SplitterBarState" use="optional" default="restored"/> + <xsd:attribute name="horzBarState" type="ST_SplitterBarState" use="optional" default="restored"/> + <xsd:attribute name="preferSingleView" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_CommonViewProperties"> + <xsd:sequence> + <xsd:element name="scale" type="a:CT_Scale2D" minOccurs="1" maxOccurs="1"/> + <xsd:element name="origin" type="a:CT_Point2D" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="varScale" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_NotesTextViewProperties"> + <xsd:sequence minOccurs="1" maxOccurs="1"> + <xsd:element name="cViewPr" type="CT_CommonViewProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_OutlineViewSlideEntry"> + <xsd:attribute ref="r:id" use="required"/> + <xsd:attribute name="collapse" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_OutlineViewSlideList"> + <xsd:sequence> + <xsd:element name="sld" type="CT_OutlineViewSlideEntry" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_OutlineViewProperties"> + <xsd:sequence minOccurs="1" maxOccurs="1"> + <xsd:element name="cViewPr" type="CT_CommonViewProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="sldLst" type="CT_OutlineViewSlideList" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SlideSorterViewProperties"> + <xsd:sequence minOccurs="1" maxOccurs="1"> + <xsd:element name="cViewPr" type="CT_CommonViewProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="showFormatting" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_Guide"> + <xsd:attribute name="orient" type="ST_Direction" use="optional" default="vert"/> + <xsd:attribute name="pos" type="a:ST_Coordinate32" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_GuideList"> + <xsd:sequence minOccurs="0" maxOccurs="1"> + <xsd:element name="guide" type="CT_Guide" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_CommonSlideViewProperties"> + <xsd:sequence> + <xsd:element name="cViewPr" type="CT_CommonViewProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="guideLst" type="CT_GuideList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="snapToGrid" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="snapToObjects" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showGuides" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_SlideViewProperties"> + <xsd:sequence> + <xsd:element name="cSldViewPr" type="CT_CommonSlideViewProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_NotesViewProperties"> + <xsd:sequence> + <xsd:element name="cSldViewPr" type="CT_CommonSlideViewProperties" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ViewProperties"> + <xsd:sequence minOccurs="0" maxOccurs="1"> + <xsd:element name="normalViewPr" type="CT_NormalViewProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="slideViewPr" type="CT_SlideViewProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="outlineViewPr" type="CT_OutlineViewProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="notesTextViewPr" type="CT_NotesTextViewProperties" minOccurs="0" + maxOccurs="1"/> + <xsd:element name="sorterViewPr" type="CT_SlideSorterViewProperties" minOccurs="0" + maxOccurs="1"/> + <xsd:element name="notesViewPr" type="CT_NotesViewProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="gridSpacing" type="a:CT_PositiveSize2D" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="lastView" type="ST_ViewType" use="optional" default="sldView"/> + <xsd:attribute name="showComments" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:element name="viewPr" type="CT_ViewProperties"/> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd new file mode 100644 index 0000000..c20f3bf --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="http://schemas.openxmlformats.org/officeDocument/2006/characteristics" + targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/characteristics" + elementFormDefault="qualified"> + <xsd:complexType name="CT_AdditionalCharacteristics"> + <xsd:sequence> + <xsd:element name="characteristic" type="CT_Characteristic" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Characteristic"> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="relation" type="ST_Relation" use="required"/> + <xsd:attribute name="val" type="xsd:string" use="required"/> + <xsd:attribute name="vocabulary" type="xsd:anyURI" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_Relation"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="ge"/> + <xsd:enumeration value="le"/> + <xsd:enumeration value="gt"/> + <xsd:enumeration value="lt"/> + <xsd:enumeration value="eq"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:element name="additionalCharacteristics" type="CT_AdditionalCharacteristics"/> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd new file mode 100644 index 0000000..ac60252 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd @@ -0,0 +1,144 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" + xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" + elementFormDefault="qualified"> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + schemaLocation="shared-commonSimpleTypes.xsd"/> + <xsd:simpleType name="ST_SourceType"> + <xsd:restriction base="s:ST_String"> + <xsd:enumeration value="ArticleInAPeriodical"/> + <xsd:enumeration value="Book"/> + <xsd:enumeration value="BookSection"/> + <xsd:enumeration value="JournalArticle"/> + <xsd:enumeration value="ConferenceProceedings"/> + <xsd:enumeration value="Report"/> + <xsd:enumeration value="SoundRecording"/> + <xsd:enumeration value="Performance"/> + <xsd:enumeration value="Art"/> + <xsd:enumeration value="DocumentFromInternetSite"/> + <xsd:enumeration value="InternetSite"/> + <xsd:enumeration value="Film"/> + <xsd:enumeration value="Interview"/> + <xsd:enumeration value="Patent"/> + <xsd:enumeration value="ElectronicSource"/> + <xsd:enumeration value="Case"/> + <xsd:enumeration value="Misc"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_NameListType"> + <xsd:sequence> + <xsd:element name="Person" type="CT_PersonType" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_PersonType"> + <xsd:sequence> + <xsd:element name="Last" type="s:ST_String" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="First" type="s:ST_String" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="Middle" type="s:ST_String" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_NameType"> + <xsd:sequence> + <xsd:element name="NameList" type="CT_NameListType" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_NameOrCorporateType"> + <xsd:sequence> + <xsd:choice minOccurs="0" maxOccurs="1"> + <xsd:element name="NameList" type="CT_NameListType" minOccurs="1" maxOccurs="1"/> + <xsd:element name="Corporate" minOccurs="1" maxOccurs="1" type="s:ST_String"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_AuthorType"> + <xsd:sequence> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="Artist" type="CT_NameType"/> + <xsd:element name="Author" type="CT_NameOrCorporateType"/> + <xsd:element name="BookAuthor" type="CT_NameType"/> + <xsd:element name="Compiler" type="CT_NameType"/> + <xsd:element name="Composer" type="CT_NameType"/> + <xsd:element name="Conductor" type="CT_NameType"/> + <xsd:element name="Counsel" type="CT_NameType"/> + <xsd:element name="Director" type="CT_NameType"/> + <xsd:element name="Editor" type="CT_NameType"/> + <xsd:element name="Interviewee" type="CT_NameType"/> + <xsd:element name="Interviewer" type="CT_NameType"/> + <xsd:element name="Inventor" type="CT_NameType"/> + <xsd:element name="Performer" type="CT_NameOrCorporateType"/> + <xsd:element name="ProducerName" type="CT_NameType"/> + <xsd:element name="Translator" type="CT_NameType"/> + <xsd:element name="Writer" type="CT_NameType"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SourceType"> + <xsd:sequence> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="AbbreviatedCaseNumber" type="s:ST_String"/> + <xsd:element name="AlbumTitle" type="s:ST_String"/> + <xsd:element name="Author" type="CT_AuthorType"/> + <xsd:element name="BookTitle" type="s:ST_String"/> + <xsd:element name="Broadcaster" type="s:ST_String"/> + <xsd:element name="BroadcastTitle" type="s:ST_String"/> + <xsd:element name="CaseNumber" type="s:ST_String"/> + <xsd:element name="ChapterNumber" type="s:ST_String"/> + <xsd:element name="City" type="s:ST_String"/> + <xsd:element name="Comments" type="s:ST_String"/> + <xsd:element name="ConferenceName" type="s:ST_String"/> + <xsd:element name="CountryRegion" type="s:ST_String"/> + <xsd:element name="Court" type="s:ST_String"/> + <xsd:element name="Day" type="s:ST_String"/> + <xsd:element name="DayAccessed" type="s:ST_String"/> + <xsd:element name="Department" type="s:ST_String"/> + <xsd:element name="Distributor" type="s:ST_String"/> + <xsd:element name="Edition" type="s:ST_String"/> + <xsd:element name="Guid" type="s:ST_String"/> + <xsd:element name="Institution" type="s:ST_String"/> + <xsd:element name="InternetSiteTitle" type="s:ST_String"/> + <xsd:element name="Issue" type="s:ST_String"/> + <xsd:element name="JournalName" type="s:ST_String"/> + <xsd:element name="LCID" type="s:ST_Lang"/> + <xsd:element name="Medium" type="s:ST_String"/> + <xsd:element name="Month" type="s:ST_String"/> + <xsd:element name="MonthAccessed" type="s:ST_String"/> + <xsd:element name="NumberVolumes" type="s:ST_String"/> + <xsd:element name="Pages" type="s:ST_String"/> + <xsd:element name="PatentNumber" type="s:ST_String"/> + <xsd:element name="PeriodicalTitle" type="s:ST_String"/> + <xsd:element name="ProductionCompany" type="s:ST_String"/> + <xsd:element name="PublicationTitle" type="s:ST_String"/> + <xsd:element name="Publisher" type="s:ST_String"/> + <xsd:element name="RecordingNumber" type="s:ST_String"/> + <xsd:element name="RefOrder" type="s:ST_String"/> + <xsd:element name="Reporter" type="s:ST_String"/> + <xsd:element name="SourceType" type="ST_SourceType"/> + <xsd:element name="ShortTitle" type="s:ST_String"/> + <xsd:element name="StandardNumber" type="s:ST_String"/> + <xsd:element name="StateProvince" type="s:ST_String"/> + <xsd:element name="Station" type="s:ST_String"/> + <xsd:element name="Tag" type="s:ST_String"/> + <xsd:element name="Theater" type="s:ST_String"/> + <xsd:element name="ThesisType" type="s:ST_String"/> + <xsd:element name="Title" type="s:ST_String"/> + <xsd:element name="Type" type="s:ST_String"/> + <xsd:element name="URL" type="s:ST_String"/> + <xsd:element name="Version" type="s:ST_String"/> + <xsd:element name="Volume" type="s:ST_String"/> + <xsd:element name="Year" type="s:ST_String"/> + <xsd:element name="YearAccessed" type="s:ST_String"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="Sources" type="CT_Sources"/> + <xsd:complexType name="CT_Sources"> + <xsd:sequence> + <xsd:element name="Source" type="CT_SourceType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="SelectedStyle" type="s:ST_String"/> + <xsd:attribute name="StyleName" type="s:ST_String"/> + <xsd:attribute name="URI" type="s:ST_String"/> + </xsd:complexType> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd new file mode 100644 index 0000000..424b8ba --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd @@ -0,0 +1,174 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + elementFormDefault="qualified"> + <xsd:simpleType name="ST_Lang"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:simpleType name="ST_HexColorRGB"> + <xsd:restriction base="xsd:hexBinary"> + <xsd:length value="3" fixed="true"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Panose"> + <xsd:restriction base="xsd:hexBinary"> + <xsd:length value="10"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_CalendarType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="gregorian"/> + <xsd:enumeration value="gregorianUs"/> + <xsd:enumeration value="gregorianMeFrench"/> + <xsd:enumeration value="gregorianArabic"/> + <xsd:enumeration value="hijri"/> + <xsd:enumeration value="hebrew"/> + <xsd:enumeration value="taiwan"/> + <xsd:enumeration value="japan"/> + <xsd:enumeration value="thai"/> + <xsd:enumeration value="korea"/> + <xsd:enumeration value="saka"/> + <xsd:enumeration value="gregorianXlitEnglish"/> + <xsd:enumeration value="gregorianXlitFrench"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_AlgClass"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="hash"/> + <xsd:enumeration value="custom"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_CryptProv"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="rsaAES"/> + <xsd:enumeration value="rsaFull"/> + <xsd:enumeration value="custom"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_AlgType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="typeAny"/> + <xsd:enumeration value="custom"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ColorType"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:simpleType name="ST_Guid"> + <xsd:restriction base="xsd:token"> + <xsd:pattern value="\{[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\}"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_OnOff"> + <xsd:union memberTypes="xsd:boolean ST_OnOff1"/> + </xsd:simpleType> + <xsd:simpleType name="ST_OnOff1"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="on"/> + <xsd:enumeration value="off"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_String"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:simpleType name="ST_XmlName"> + <xsd:restriction base="xsd:NCName"> + <xsd:minLength value="1"/> + <xsd:maxLength value="255"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TrueFalse"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="t"/> + <xsd:enumeration value="f"/> + <xsd:enumeration value="true"/> + <xsd:enumeration value="false"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TrueFalseBlank"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="t"/> + <xsd:enumeration value="f"/> + <xsd:enumeration value="true"/> + <xsd:enumeration value="false"/> + <xsd:enumeration value=""/> + <xsd:enumeration value="True"/> + <xsd:enumeration value="False"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_UnsignedDecimalNumber"> + <xsd:restriction base="xsd:decimal"> + <xsd:minInclusive value="0"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TwipsMeasure"> + <xsd:union memberTypes="ST_UnsignedDecimalNumber ST_PositiveUniversalMeasure"/> + </xsd:simpleType> + <xsd:simpleType name="ST_VerticalAlignRun"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="baseline"/> + <xsd:enumeration value="superscript"/> + <xsd:enumeration value="subscript"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Xstring"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:simpleType name="ST_XAlign"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="left"/> + <xsd:enumeration value="center"/> + <xsd:enumeration value="right"/> + <xsd:enumeration value="inside"/> + <xsd:enumeration value="outside"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_YAlign"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="inline"/> + <xsd:enumeration value="top"/> + <xsd:enumeration value="center"/> + <xsd:enumeration value="bottom"/> + <xsd:enumeration value="inside"/> + <xsd:enumeration value="outside"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ConformanceClass"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="strict"/> + <xsd:enumeration value="transitional"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_UniversalMeasure"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="-?[0-9]+(\.[0-9]+)?(mm|cm|in|pt|pc|pi)"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PositiveUniversalMeasure"> + <xsd:restriction base="ST_UniversalMeasure"> + <xsd:pattern value="[0-9]+(\.[0-9]+)?(mm|cm|in|pt|pc|pi)"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Percentage"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="-?[0-9]+(\.[0-9]+)?%"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FixedPercentage"> + <xsd:restriction base="ST_Percentage"> + <xsd:pattern value="-?((100)|([0-9][0-9]?))(\.[0-9][0-9]?)?%"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PositivePercentage"> + <xsd:restriction base="ST_Percentage"> + <xsd:pattern value="[0-9]+(\.[0-9]+)?%"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PositiveFixedPercentage"> + <xsd:restriction base="ST_Percentage"> + <xsd:pattern value="((100)|([0-9][0-9]?))(\.[0-9][0-9]?)?%"/> + </xsd:restriction> + </xsd:simpleType> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd new file mode 100644 index 0000000..2bddce2 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="http://schemas.openxmlformats.org/officeDocument/2006/customXml" + xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/customXml" + elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all"> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + schemaLocation="shared-commonSimpleTypes.xsd"/> + <xsd:complexType name="CT_DatastoreSchemaRef"> + <xsd:attribute name="uri" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_DatastoreSchemaRefs"> + <xsd:sequence> + <xsd:element name="schemaRef" type="CT_DatastoreSchemaRef" minOccurs="0" maxOccurs="unbounded" + /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DatastoreItem"> + <xsd:sequence> + <xsd:element name="schemaRefs" type="CT_DatastoreSchemaRefs" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="itemID" type="s:ST_Guid" use="required"/> + </xsd:complexType> + <xsd:element name="datastoreItem" type="CT_DatastoreItem"/> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd new file mode 100644 index 0000000..8a8c18b --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="http://schemas.openxmlformats.org/schemaLibrary/2006/main" + targetNamespace="http://schemas.openxmlformats.org/schemaLibrary/2006/main" + attributeFormDefault="qualified" elementFormDefault="qualified"> + <xsd:complexType name="CT_Schema"> + <xsd:attribute name="uri" type="xsd:string" default=""/> + <xsd:attribute name="manifestLocation" type="xsd:string"/> + <xsd:attribute name="schemaLocation" type="xsd:string"/> + <xsd:attribute name="schemaLanguage" type="xsd:token"/> + </xsd:complexType> + <xsd:complexType name="CT_SchemaLibrary"> + <xsd:sequence> + <xsd:element name="schema" type="CT_Schema" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="schemaLibrary" type="CT_SchemaLibrary"/> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd new file mode 100644 index 0000000..5c42706 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" + xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes" + xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" + blockDefault="#all" elementFormDefault="qualified"> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes" + schemaLocation="shared-documentPropertiesVariantTypes.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + schemaLocation="shared-commonSimpleTypes.xsd"/> + <xsd:element name="Properties" type="CT_Properties"/> + <xsd:complexType name="CT_Properties"> + <xsd:sequence> + <xsd:element name="property" minOccurs="0" maxOccurs="unbounded" type="CT_Property"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Property"> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element ref="vt:vector"/> + <xsd:element ref="vt:array"/> + <xsd:element ref="vt:blob"/> + <xsd:element ref="vt:oblob"/> + <xsd:element ref="vt:empty"/> + <xsd:element ref="vt:null"/> + <xsd:element ref="vt:i1"/> + <xsd:element ref="vt:i2"/> + <xsd:element ref="vt:i4"/> + <xsd:element ref="vt:i8"/> + <xsd:element ref="vt:int"/> + <xsd:element ref="vt:ui1"/> + <xsd:element ref="vt:ui2"/> + <xsd:element ref="vt:ui4"/> + <xsd:element ref="vt:ui8"/> + <xsd:element ref="vt:uint"/> + <xsd:element ref="vt:r4"/> + <xsd:element ref="vt:r8"/> + <xsd:element ref="vt:decimal"/> + <xsd:element ref="vt:lpstr"/> + <xsd:element ref="vt:lpwstr"/> + <xsd:element ref="vt:bstr"/> + <xsd:element ref="vt:date"/> + <xsd:element ref="vt:filetime"/> + <xsd:element ref="vt:bool"/> + <xsd:element ref="vt:cy"/> + <xsd:element ref="vt:error"/> + <xsd:element ref="vt:stream"/> + <xsd:element ref="vt:ostream"/> + <xsd:element ref="vt:storage"/> + <xsd:element ref="vt:ostorage"/> + <xsd:element ref="vt:vstream"/> + <xsd:element ref="vt:clsid"/> + </xsd:choice> + <xsd:attribute name="fmtid" use="required" type="s:ST_Guid"/> + <xsd:attribute name="pid" use="required" type="xsd:int"/> + <xsd:attribute name="name" use="optional" type="xsd:string"/> + <xsd:attribute name="linkTarget" use="optional" type="xsd:string"/> + </xsd:complexType> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd new file mode 100644 index 0000000..853c341 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" + xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes" + targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" + elementFormDefault="qualified" blockDefault="#all"> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes" + schemaLocation="shared-documentPropertiesVariantTypes.xsd"/> + <xsd:element name="Properties" type="CT_Properties"/> + <xsd:complexType name="CT_Properties"> + <xsd:all> + <xsd:element name="Template" minOccurs="0" maxOccurs="1" type="xsd:string"/> + <xsd:element name="Manager" minOccurs="0" maxOccurs="1" type="xsd:string"/> + <xsd:element name="Company" minOccurs="0" maxOccurs="1" type="xsd:string"/> + <xsd:element name="Pages" minOccurs="0" maxOccurs="1" type="xsd:int"/> + <xsd:element name="Words" minOccurs="0" maxOccurs="1" type="xsd:int"/> + <xsd:element name="Characters" minOccurs="0" maxOccurs="1" type="xsd:int"/> + <xsd:element name="PresentationFormat" minOccurs="0" maxOccurs="1" type="xsd:string"/> + <xsd:element name="Lines" minOccurs="0" maxOccurs="1" type="xsd:int"/> + <xsd:element name="Paragraphs" minOccurs="0" maxOccurs="1" type="xsd:int"/> + <xsd:element name="Slides" minOccurs="0" maxOccurs="1" type="xsd:int"/> + <xsd:element name="Notes" minOccurs="0" maxOccurs="1" type="xsd:int"/> + <xsd:element name="TotalTime" minOccurs="0" maxOccurs="1" type="xsd:int"/> + <xsd:element name="HiddenSlides" minOccurs="0" maxOccurs="1" type="xsd:int"/> + <xsd:element name="MMClips" minOccurs="0" maxOccurs="1" type="xsd:int"/> + <xsd:element name="ScaleCrop" minOccurs="0" maxOccurs="1" type="xsd:boolean"/> + <xsd:element name="HeadingPairs" minOccurs="0" maxOccurs="1" type="CT_VectorVariant"/> + <xsd:element name="TitlesOfParts" minOccurs="0" maxOccurs="1" type="CT_VectorLpstr"/> + <xsd:element name="LinksUpToDate" minOccurs="0" maxOccurs="1" type="xsd:boolean"/> + <xsd:element name="CharactersWithSpaces" minOccurs="0" maxOccurs="1" type="xsd:int"/> + <xsd:element name="SharedDoc" minOccurs="0" maxOccurs="1" type="xsd:boolean"/> + <xsd:element name="HyperlinkBase" minOccurs="0" maxOccurs="1" type="xsd:string"/> + <xsd:element name="HLinks" minOccurs="0" maxOccurs="1" type="CT_VectorVariant"/> + <xsd:element name="HyperlinksChanged" minOccurs="0" maxOccurs="1" type="xsd:boolean"/> + <xsd:element name="DigSig" minOccurs="0" maxOccurs="1" type="CT_DigSigBlob"/> + <xsd:element name="Application" minOccurs="0" maxOccurs="1" type="xsd:string"/> + <xsd:element name="AppVersion" minOccurs="0" maxOccurs="1" type="xsd:string"/> + <xsd:element name="DocSecurity" minOccurs="0" maxOccurs="1" type="xsd:int"/> + </xsd:all> + </xsd:complexType> + <xsd:complexType name="CT_VectorVariant"> + <xsd:sequence minOccurs="1" maxOccurs="1"> + <xsd:element ref="vt:vector"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_VectorLpstr"> + <xsd:sequence minOccurs="1" maxOccurs="1"> + <xsd:element ref="vt:vector"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DigSigBlob"> + <xsd:sequence minOccurs="1" maxOccurs="1"> + <xsd:element ref="vt:blob"/> + </xsd:sequence> + </xsd:complexType> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd new file mode 100644 index 0000000..da835ee --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd @@ -0,0 +1,195 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes" + xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes" + blockDefault="#all" elementFormDefault="qualified"> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + schemaLocation="shared-commonSimpleTypes.xsd"/> + <xsd:simpleType name="ST_VectorBaseType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="variant"/> + <xsd:enumeration value="i1"/> + <xsd:enumeration value="i2"/> + <xsd:enumeration value="i4"/> + <xsd:enumeration value="i8"/> + <xsd:enumeration value="ui1"/> + <xsd:enumeration value="ui2"/> + <xsd:enumeration value="ui4"/> + <xsd:enumeration value="ui8"/> + <xsd:enumeration value="r4"/> + <xsd:enumeration value="r8"/> + <xsd:enumeration value="lpstr"/> + <xsd:enumeration value="lpwstr"/> + <xsd:enumeration value="bstr"/> + <xsd:enumeration value="date"/> + <xsd:enumeration value="filetime"/> + <xsd:enumeration value="bool"/> + <xsd:enumeration value="cy"/> + <xsd:enumeration value="error"/> + <xsd:enumeration value="clsid"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ArrayBaseType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="variant"/> + <xsd:enumeration value="i1"/> + <xsd:enumeration value="i2"/> + <xsd:enumeration value="i4"/> + <xsd:enumeration value="int"/> + <xsd:enumeration value="ui1"/> + <xsd:enumeration value="ui2"/> + <xsd:enumeration value="ui4"/> + <xsd:enumeration value="uint"/> + <xsd:enumeration value="r4"/> + <xsd:enumeration value="r8"/> + <xsd:enumeration value="decimal"/> + <xsd:enumeration value="bstr"/> + <xsd:enumeration value="date"/> + <xsd:enumeration value="bool"/> + <xsd:enumeration value="cy"/> + <xsd:enumeration value="error"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Cy"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="\s*[0-9]*\.[0-9]{4}\s*"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Error"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="\s*0x[0-9A-Za-z]{8}\s*"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Empty"/> + <xsd:complexType name="CT_Null"/> + <xsd:complexType name="CT_Vector"> + <xsd:choice minOccurs="1" maxOccurs="unbounded"> + <xsd:element ref="variant"/> + <xsd:element ref="i1"/> + <xsd:element ref="i2"/> + <xsd:element ref="i4"/> + <xsd:element ref="i8"/> + <xsd:element ref="ui1"/> + <xsd:element ref="ui2"/> + <xsd:element ref="ui4"/> + <xsd:element ref="ui8"/> + <xsd:element ref="r4"/> + <xsd:element ref="r8"/> + <xsd:element ref="lpstr"/> + <xsd:element ref="lpwstr"/> + <xsd:element ref="bstr"/> + <xsd:element ref="date"/> + <xsd:element ref="filetime"/> + <xsd:element ref="bool"/> + <xsd:element ref="cy"/> + <xsd:element ref="error"/> + <xsd:element ref="clsid"/> + </xsd:choice> + <xsd:attribute name="baseType" type="ST_VectorBaseType" use="required"/> + <xsd:attribute name="size" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Array"> + <xsd:choice minOccurs="1" maxOccurs="unbounded"> + <xsd:element ref="variant"/> + <xsd:element ref="i1"/> + <xsd:element ref="i2"/> + <xsd:element ref="i4"/> + <xsd:element ref="int"/> + <xsd:element ref="ui1"/> + <xsd:element ref="ui2"/> + <xsd:element ref="ui4"/> + <xsd:element ref="uint"/> + <xsd:element ref="r4"/> + <xsd:element ref="r8"/> + <xsd:element ref="decimal"/> + <xsd:element ref="bstr"/> + <xsd:element ref="date"/> + <xsd:element ref="bool"/> + <xsd:element ref="error"/> + <xsd:element ref="cy"/> + </xsd:choice> + <xsd:attribute name="lBounds" type="xsd:int" use="required"/> + <xsd:attribute name="uBounds" type="xsd:int" use="required"/> + <xsd:attribute name="baseType" type="ST_ArrayBaseType" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Variant"> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element ref="variant"/> + <xsd:element ref="vector"/> + <xsd:element ref="array"/> + <xsd:element ref="blob"/> + <xsd:element ref="oblob"/> + <xsd:element ref="empty"/> + <xsd:element ref="null"/> + <xsd:element ref="i1"/> + <xsd:element ref="i2"/> + <xsd:element ref="i4"/> + <xsd:element ref="i8"/> + <xsd:element ref="int"/> + <xsd:element ref="ui1"/> + <xsd:element ref="ui2"/> + <xsd:element ref="ui4"/> + <xsd:element ref="ui8"/> + <xsd:element ref="uint"/> + <xsd:element ref="r4"/> + <xsd:element ref="r8"/> + <xsd:element ref="decimal"/> + <xsd:element ref="lpstr"/> + <xsd:element ref="lpwstr"/> + <xsd:element ref="bstr"/> + <xsd:element ref="date"/> + <xsd:element ref="filetime"/> + <xsd:element ref="bool"/> + <xsd:element ref="cy"/> + <xsd:element ref="error"/> + <xsd:element ref="stream"/> + <xsd:element ref="ostream"/> + <xsd:element ref="storage"/> + <xsd:element ref="ostorage"/> + <xsd:element ref="vstream"/> + <xsd:element ref="clsid"/> + </xsd:choice> + </xsd:complexType> + <xsd:complexType name="CT_Vstream"> + <xsd:simpleContent> + <xsd:extension base="xsd:base64Binary"> + <xsd:attribute name="version" type="s:ST_Guid"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:element name="variant" type="CT_Variant"/> + <xsd:element name="vector" type="CT_Vector"/> + <xsd:element name="array" type="CT_Array"/> + <xsd:element name="blob" type="xsd:base64Binary"/> + <xsd:element name="oblob" type="xsd:base64Binary"/> + <xsd:element name="empty" type="CT_Empty"/> + <xsd:element name="null" type="CT_Null"/> + <xsd:element name="i1" type="xsd:byte"/> + <xsd:element name="i2" type="xsd:short"/> + <xsd:element name="i4" type="xsd:int"/> + <xsd:element name="i8" type="xsd:long"/> + <xsd:element name="int" type="xsd:int"/> + <xsd:element name="ui1" type="xsd:unsignedByte"/> + <xsd:element name="ui2" type="xsd:unsignedShort"/> + <xsd:element name="ui4" type="xsd:unsignedInt"/> + <xsd:element name="ui8" type="xsd:unsignedLong"/> + <xsd:element name="uint" type="xsd:unsignedInt"/> + <xsd:element name="r4" type="xsd:float"/> + <xsd:element name="r8" type="xsd:double"/> + <xsd:element name="decimal" type="xsd:decimal"/> + <xsd:element name="lpstr" type="xsd:string"/> + <xsd:element name="lpwstr" type="xsd:string"/> + <xsd:element name="bstr" type="xsd:string"/> + <xsd:element name="date" type="xsd:dateTime"/> + <xsd:element name="filetime" type="xsd:dateTime"/> + <xsd:element name="bool" type="xsd:boolean"/> + <xsd:element name="cy" type="ST_Cy"/> + <xsd:element name="error" type="ST_Error"/> + <xsd:element name="stream" type="xsd:base64Binary"/> + <xsd:element name="ostream" type="xsd:base64Binary"/> + <xsd:element name="storage" type="xsd:base64Binary"/> + <xsd:element name="ostorage" type="xsd:base64Binary"/> + <xsd:element name="vstream" type="CT_Vstream"/> + <xsd:element name="clsid" type="s:ST_Guid"/> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd new file mode 100644 index 0000000..87ad265 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd @@ -0,0 +1,582 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="http://schemas.openxmlformats.org/officeDocument/2006/math" + xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" + xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" + xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all" + targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/math"> + <xsd:import namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main" + schemaLocation="wml.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + schemaLocation="shared-commonSimpleTypes.xsd"/> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/> + <xsd:simpleType name="ST_Integer255"> + <xsd:restriction base="xsd:integer"> + <xsd:minInclusive value="1"/> + <xsd:maxInclusive value="255"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Integer255"> + <xsd:attribute name="val" type="ST_Integer255" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_Integer2"> + <xsd:restriction base="xsd:integer"> + <xsd:minInclusive value="-2"/> + <xsd:maxInclusive value="2"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Integer2"> + <xsd:attribute name="val" type="ST_Integer2" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_SpacingRule"> + <xsd:restriction base="xsd:integer"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="4"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SpacingRule"> + <xsd:attribute name="val" type="ST_SpacingRule" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_UnSignedInteger"> + <xsd:restriction base="xsd:unsignedInt"/> + </xsd:simpleType> + <xsd:complexType name="CT_UnSignedInteger"> + <xsd:attribute name="val" type="ST_UnSignedInteger" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_Char"> + <xsd:restriction base="xsd:string"> + <xsd:maxLength value="1"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Char"> + <xsd:attribute name="val" type="ST_Char" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_OnOff"> + <xsd:attribute name="val" type="s:ST_OnOff"/> + </xsd:complexType> + <xsd:complexType name="CT_String"> + <xsd:attribute name="val" type="s:ST_String"/> + </xsd:complexType> + <xsd:complexType name="CT_XAlign"> + <xsd:attribute name="val" type="s:ST_XAlign" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_YAlign"> + <xsd:attribute name="val" type="s:ST_YAlign" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_Shp"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="centered"/> + <xsd:enumeration value="match"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Shp"> + <xsd:attribute name="val" type="ST_Shp" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_FType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="bar"/> + <xsd:enumeration value="skw"/> + <xsd:enumeration value="lin"/> + <xsd:enumeration value="noBar"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_FType"> + <xsd:attribute name="val" type="ST_FType" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_LimLoc"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="undOvr"/> + <xsd:enumeration value="subSup"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_LimLoc"> + <xsd:attribute name="val" type="ST_LimLoc" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_TopBot"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="top"/> + <xsd:enumeration value="bot"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TopBot"> + <xsd:attribute name="val" type="ST_TopBot" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_Script"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="roman"/> + <xsd:enumeration value="script"/> + <xsd:enumeration value="fraktur"/> + <xsd:enumeration value="double-struck"/> + <xsd:enumeration value="sans-serif"/> + <xsd:enumeration value="monospace"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Script"> + <xsd:attribute name="val" type="ST_Script"/> + </xsd:complexType> + <xsd:simpleType name="ST_Style"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="p"/> + <xsd:enumeration value="b"/> + <xsd:enumeration value="i"/> + <xsd:enumeration value="bi"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Style"> + <xsd:attribute name="val" type="ST_Style"/> + </xsd:complexType> + <xsd:complexType name="CT_ManualBreak"> + <xsd:attribute name="alnAt" type="ST_Integer255"/> + </xsd:complexType> + <xsd:group name="EG_ScriptStyle"> + <xsd:sequence> + <xsd:element name="scr" minOccurs="0" type="CT_Script"/> + <xsd:element name="sty" minOccurs="0" type="CT_Style"/> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_RPR"> + <xsd:sequence> + <xsd:element name="lit" minOccurs="0" type="CT_OnOff"/> + <xsd:choice> + <xsd:element name="nor" minOccurs="0" type="CT_OnOff"/> + <xsd:sequence> + <xsd:group ref="EG_ScriptStyle"/> + </xsd:sequence> + </xsd:choice> + <xsd:element name="brk" minOccurs="0" type="CT_ManualBreak"/> + <xsd:element name="aln" minOccurs="0" type="CT_OnOff"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Text"> + <xsd:simpleContent> + <xsd:extension base="s:ST_String"> + <xsd:attribute ref="xml:space" use="optional"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:complexType name="CT_R"> + <xsd:sequence> + <xsd:element name="rPr" type="CT_RPR" minOccurs="0"/> + <xsd:group ref="w:EG_RPr" minOccurs="0"/> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:group ref="w:EG_RunInnerContent"/> + <xsd:element name="t" type="CT_Text" minOccurs="0"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_CtrlPr"> + <xsd:sequence> + <xsd:group ref="w:EG_RPrMath" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_AccPr"> + <xsd:sequence> + <xsd:element name="chr" type="CT_Char" minOccurs="0"/> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Acc"> + <xsd:sequence> + <xsd:element name="accPr" type="CT_AccPr" minOccurs="0"/> + <xsd:element name="e" type="CT_OMathArg"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_BarPr"> + <xsd:sequence> + <xsd:element name="pos" type="CT_TopBot" minOccurs="0"/> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Bar"> + <xsd:sequence> + <xsd:element name="barPr" type="CT_BarPr" minOccurs="0"/> + <xsd:element name="e" type="CT_OMathArg"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_BoxPr"> + <xsd:sequence> + <xsd:element name="opEmu" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="noBreak" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="diff" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="brk" type="CT_ManualBreak" minOccurs="0"/> + <xsd:element name="aln" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Box"> + <xsd:sequence> + <xsd:element name="boxPr" type="CT_BoxPr" minOccurs="0"/> + <xsd:element name="e" type="CT_OMathArg"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_BorderBoxPr"> + <xsd:sequence> + <xsd:element name="hideTop" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="hideBot" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="hideLeft" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="hideRight" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="strikeH" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="strikeV" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="strikeBLTR" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="strikeTLBR" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_BorderBox"> + <xsd:sequence> + <xsd:element name="borderBoxPr" type="CT_BorderBoxPr" minOccurs="0"/> + <xsd:element name="e" type="CT_OMathArg"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DPr"> + <xsd:sequence> + <xsd:element name="begChr" type="CT_Char" minOccurs="0"/> + <xsd:element name="sepChr" type="CT_Char" minOccurs="0"/> + <xsd:element name="endChr" type="CT_Char" minOccurs="0"/> + <xsd:element name="grow" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="shp" type="CT_Shp" minOccurs="0"/> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_D"> + <xsd:sequence> + <xsd:element name="dPr" type="CT_DPr" minOccurs="0"/> + <xsd:element name="e" type="CT_OMathArg" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_EqArrPr"> + <xsd:sequence> + <xsd:element name="baseJc" type="CT_YAlign" minOccurs="0"/> + <xsd:element name="maxDist" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="objDist" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="rSpRule" type="CT_SpacingRule" minOccurs="0"/> + <xsd:element name="rSp" type="CT_UnSignedInteger" minOccurs="0"/> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_EqArr"> + <xsd:sequence> + <xsd:element name="eqArrPr" type="CT_EqArrPr" minOccurs="0"/> + <xsd:element name="e" type="CT_OMathArg" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_FPr"> + <xsd:sequence> + <xsd:element name="type" type="CT_FType" minOccurs="0"/> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_F"> + <xsd:sequence> + <xsd:element name="fPr" type="CT_FPr" minOccurs="0"/> + <xsd:element name="num" type="CT_OMathArg"/> + <xsd:element name="den" type="CT_OMathArg"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_FuncPr"> + <xsd:sequence> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Func"> + <xsd:sequence> + <xsd:element name="funcPr" type="CT_FuncPr" minOccurs="0"/> + <xsd:element name="fName" type="CT_OMathArg"/> + <xsd:element name="e" type="CT_OMathArg"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GroupChrPr"> + <xsd:sequence> + <xsd:element name="chr" type="CT_Char" minOccurs="0"/> + <xsd:element name="pos" type="CT_TopBot" minOccurs="0"/> + <xsd:element name="vertJc" type="CT_TopBot" minOccurs="0"/> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GroupChr"> + <xsd:sequence> + <xsd:element name="groupChrPr" type="CT_GroupChrPr" minOccurs="0"/> + <xsd:element name="e" type="CT_OMathArg"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_LimLowPr"> + <xsd:sequence> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_LimLow"> + <xsd:sequence> + <xsd:element name="limLowPr" type="CT_LimLowPr" minOccurs="0"/> + <xsd:element name="e" type="CT_OMathArg"/> + <xsd:element name="lim" type="CT_OMathArg"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_LimUppPr"> + <xsd:sequence> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_LimUpp"> + <xsd:sequence> + <xsd:element name="limUppPr" type="CT_LimUppPr" minOccurs="0"/> + <xsd:element name="e" type="CT_OMathArg"/> + <xsd:element name="lim" type="CT_OMathArg"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_MCPr"> + <xsd:sequence> + <xsd:element name="count" type="CT_Integer255" minOccurs="0"/> + <xsd:element name="mcJc" type="CT_XAlign" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_MC"> + <xsd:sequence> + <xsd:element name="mcPr" type="CT_MCPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_MCS"> + <xsd:sequence> + <xsd:element name="mc" type="CT_MC" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_MPr"> + <xsd:sequence> + <xsd:element name="baseJc" type="CT_YAlign" minOccurs="0"/> + <xsd:element name="plcHide" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="rSpRule" type="CT_SpacingRule" minOccurs="0"/> + <xsd:element name="cGpRule" type="CT_SpacingRule" minOccurs="0"/> + <xsd:element name="rSp" type="CT_UnSignedInteger" minOccurs="0"/> + <xsd:element name="cSp" type="CT_UnSignedInteger" minOccurs="0"/> + <xsd:element name="cGp" type="CT_UnSignedInteger" minOccurs="0"/> + <xsd:element name="mcs" type="CT_MCS" minOccurs="0"/> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_MR"> + <xsd:sequence> + <xsd:element name="e" type="CT_OMathArg" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_M"> + <xsd:sequence> + <xsd:element name="mPr" type="CT_MPr" minOccurs="0"/> + <xsd:element name="mr" type="CT_MR" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_NaryPr"> + <xsd:sequence> + <xsd:element name="chr" type="CT_Char" minOccurs="0"/> + <xsd:element name="limLoc" type="CT_LimLoc" minOccurs="0"/> + <xsd:element name="grow" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="subHide" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="supHide" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Nary"> + <xsd:sequence> + <xsd:element name="naryPr" type="CT_NaryPr" minOccurs="0"/> + <xsd:element name="sub" type="CT_OMathArg"/> + <xsd:element name="sup" type="CT_OMathArg"/> + <xsd:element name="e" type="CT_OMathArg"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_PhantPr"> + <xsd:sequence> + <xsd:element name="show" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="zeroWid" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="zeroAsc" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="zeroDesc" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="transp" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Phant"> + <xsd:sequence> + <xsd:element name="phantPr" type="CT_PhantPr" minOccurs="0"/> + <xsd:element name="e" type="CT_OMathArg"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_RadPr"> + <xsd:sequence> + <xsd:element name="degHide" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Rad"> + <xsd:sequence> + <xsd:element name="radPr" type="CT_RadPr" minOccurs="0"/> + <xsd:element name="deg" type="CT_OMathArg"/> + <xsd:element name="e" type="CT_OMathArg"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SPrePr"> + <xsd:sequence> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SPre"> + <xsd:sequence> + <xsd:element name="sPrePr" type="CT_SPrePr" minOccurs="0"/> + <xsd:element name="sub" type="CT_OMathArg"/> + <xsd:element name="sup" type="CT_OMathArg"/> + <xsd:element name="e" type="CT_OMathArg"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SSubPr"> + <xsd:sequence> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SSub"> + <xsd:sequence> + <xsd:element name="sSubPr" type="CT_SSubPr" minOccurs="0"/> + <xsd:element name="e" type="CT_OMathArg"/> + <xsd:element name="sub" type="CT_OMathArg"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SSubSupPr"> + <xsd:sequence> + <xsd:element name="alnScr" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SSubSup"> + <xsd:sequence> + <xsd:element name="sSubSupPr" type="CT_SSubSupPr" minOccurs="0"/> + <xsd:element name="e" type="CT_OMathArg"/> + <xsd:element name="sub" type="CT_OMathArg"/> + <xsd:element name="sup" type="CT_OMathArg"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SSupPr"> + <xsd:sequence> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SSup"> + <xsd:sequence> + <xsd:element name="sSupPr" type="CT_SSupPr" minOccurs="0"/> + <xsd:element name="e" type="CT_OMathArg"/> + <xsd:element name="sup" type="CT_OMathArg"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_OMathMathElements"> + <xsd:choice> + <xsd:element name="acc" type="CT_Acc"/> + <xsd:element name="bar" type="CT_Bar"/> + <xsd:element name="box" type="CT_Box"/> + <xsd:element name="borderBox" type="CT_BorderBox"/> + <xsd:element name="d" type="CT_D"/> + <xsd:element name="eqArr" type="CT_EqArr"/> + <xsd:element name="f" type="CT_F"/> + <xsd:element name="func" type="CT_Func"/> + <xsd:element name="groupChr" type="CT_GroupChr"/> + <xsd:element name="limLow" type="CT_LimLow"/> + <xsd:element name="limUpp" type="CT_LimUpp"/> + <xsd:element name="m" type="CT_M"/> + <xsd:element name="nary" type="CT_Nary"/> + <xsd:element name="phant" type="CT_Phant"/> + <xsd:element name="rad" type="CT_Rad"/> + <xsd:element name="sPre" type="CT_SPre"/> + <xsd:element name="sSub" type="CT_SSub"/> + <xsd:element name="sSubSup" type="CT_SSubSup"/> + <xsd:element name="sSup" type="CT_SSup"/> + <xsd:element name="r" type="CT_R"/> + </xsd:choice> + </xsd:group> + <xsd:group name="EG_OMathElements"> + <xsd:choice> + <xsd:group ref="EG_OMathMathElements"/> + <xsd:group ref="w:EG_PContentMath"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_OMathArgPr"> + <xsd:sequence> + <xsd:element name="argSz" type="CT_Integer2" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_OMathArg"> + <xsd:sequence> + <xsd:element name="argPr" type="CT_OMathArgPr" minOccurs="0"/> + <xsd:group ref="EG_OMathElements" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_Jc"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="left"/> + <xsd:enumeration value="right"/> + <xsd:enumeration value="center"/> + <xsd:enumeration value="centerGroup"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_OMathJc"> + <xsd:attribute name="val" type="ST_Jc"/> + </xsd:complexType> + <xsd:complexType name="CT_OMathParaPr"> + <xsd:sequence> + <xsd:element name="jc" type="CT_OMathJc" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TwipsMeasure"> + <xsd:attribute name="val" type="s:ST_TwipsMeasure" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_BreakBin"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="before"/> + <xsd:enumeration value="after"/> + <xsd:enumeration value="repeat"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_BreakBin"> + <xsd:attribute name="val" type="ST_BreakBin"/> + </xsd:complexType> + <xsd:simpleType name="ST_BreakBinSub"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="--"/> + <xsd:enumeration value="-+"/> + <xsd:enumeration value="+-"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_BreakBinSub"> + <xsd:attribute name="val" type="ST_BreakBinSub"/> + </xsd:complexType> + <xsd:complexType name="CT_MathPr"> + <xsd:sequence> + <xsd:element name="mathFont" type="CT_String" minOccurs="0"/> + <xsd:element name="brkBin" type="CT_BreakBin" minOccurs="0"/> + <xsd:element name="brkBinSub" type="CT_BreakBinSub" minOccurs="0"/> + <xsd:element name="smallFrac" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="dispDef" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="lMargin" type="CT_TwipsMeasure" minOccurs="0"/> + <xsd:element name="rMargin" type="CT_TwipsMeasure" minOccurs="0"/> + <xsd:element name="defJc" type="CT_OMathJc" minOccurs="0"/> + <xsd:element name="preSp" type="CT_TwipsMeasure" minOccurs="0"/> + <xsd:element name="postSp" type="CT_TwipsMeasure" minOccurs="0"/> + <xsd:element name="interSp" type="CT_TwipsMeasure" minOccurs="0"/> + <xsd:element name="intraSp" type="CT_TwipsMeasure" minOccurs="0"/> + <xsd:choice minOccurs="0"> + <xsd:element name="wrapIndent" type="CT_TwipsMeasure"/> + <xsd:element name="wrapRight" type="CT_OnOff"/> + </xsd:choice> + <xsd:element name="intLim" type="CT_LimLoc" minOccurs="0"/> + <xsd:element name="naryLim" type="CT_LimLoc" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="mathPr" type="CT_MathPr"/> + <xsd:complexType name="CT_OMathPara"> + <xsd:sequence> + <xsd:element name="oMathParaPr" type="CT_OMathParaPr" minOccurs="0"/> + <xsd:element name="oMath" type="CT_OMath" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_OMath"> + <xsd:sequence> + <xsd:group ref="EG_OMathElements" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="oMathPara" type="CT_OMathPara"/> + <xsd:element name="oMath" type="CT_OMath"/> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd new file mode 100644 index 0000000..9e86f1b --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + elementFormDefault="qualified" + targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + blockDefault="#all"> + <xsd:simpleType name="ST_RelationshipId"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:attribute name="id" type="ST_RelationshipId"/> + <xsd:attribute name="embed" type="ST_RelationshipId"/> + <xsd:attribute name="link" type="ST_RelationshipId"/> + <xsd:attribute name="dm" type="ST_RelationshipId" default=""/> + <xsd:attribute name="lo" type="ST_RelationshipId" default=""/> + <xsd:attribute name="qs" type="ST_RelationshipId" default=""/> + <xsd:attribute name="cs" type="ST_RelationshipId" default=""/> + <xsd:attribute name="blip" type="ST_RelationshipId" default=""/> + <xsd:attribute name="pict" type="ST_RelationshipId"/> + <xsd:attribute name="href" type="ST_RelationshipId"/> + <xsd:attribute name="topLeft" type="ST_RelationshipId"/> + <xsd:attribute name="topRight" type="ST_RelationshipId"/> + <xsd:attribute name="bottomLeft" type="ST_RelationshipId"/> + <xsd:attribute name="bottomRight" type="ST_RelationshipId"/> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd new file mode 100644 index 0000000..d0be42e --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd @@ -0,0 +1,4439 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" + xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + targetNamespace="http://schemas.openxmlformats.org/spreadsheetml/2006/main" + elementFormDefault="qualified"> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + schemaLocation="shared-relationshipReference.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + schemaLocation="shared-commonSimpleTypes.xsd"/> + <xsd:import + namespace="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" + schemaLocation="dml-spreadsheetDrawing.xsd"/> + <xsd:complexType name="CT_AutoFilter"> + <xsd:sequence> + <xsd:element name="filterColumn" minOccurs="0" maxOccurs="unbounded" type="CT_FilterColumn"/> + <xsd:element name="sortState" minOccurs="0" maxOccurs="1" type="CT_SortState"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="ref" type="ST_Ref"/> + </xsd:complexType> + <xsd:complexType name="CT_FilterColumn"> + <xsd:choice minOccurs="0" maxOccurs="1"> + <xsd:element name="filters" type="CT_Filters" minOccurs="0" maxOccurs="1"/> + <xsd:element name="top10" type="CT_Top10" minOccurs="0" maxOccurs="1"/> + <xsd:element name="customFilters" type="CT_CustomFilters" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dynamicFilter" type="CT_DynamicFilter" minOccurs="0" maxOccurs="1"/> + <xsd:element name="colorFilter" type="CT_ColorFilter" minOccurs="0" maxOccurs="1"/> + <xsd:element name="iconFilter" minOccurs="0" maxOccurs="1" type="CT_IconFilter"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:choice> + <xsd:attribute name="colId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="hiddenButton" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showButton" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_Filters"> + <xsd:sequence> + <xsd:element name="filter" type="CT_Filter" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="dateGroupItem" type="CT_DateGroupItem" minOccurs="0" maxOccurs="unbounded" + /> + </xsd:sequence> + <xsd:attribute name="blank" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="calendarType" type="s:ST_CalendarType" use="optional" default="none"/> + </xsd:complexType> + <xsd:complexType name="CT_Filter"> + <xsd:attribute name="val" type="s:ST_Xstring"/> + </xsd:complexType> + <xsd:complexType name="CT_CustomFilters"> + <xsd:sequence> + <xsd:element name="customFilter" type="CT_CustomFilter" minOccurs="1" maxOccurs="2"/> + </xsd:sequence> + <xsd:attribute name="and" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_CustomFilter"> + <xsd:attribute name="operator" type="ST_FilterOperator" default="equal" use="optional"/> + <xsd:attribute name="val" type="s:ST_Xstring"/> + </xsd:complexType> + <xsd:complexType name="CT_Top10"> + <xsd:attribute name="top" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="percent" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="val" type="xsd:double" use="required"/> + <xsd:attribute name="filterVal" type="xsd:double" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_ColorFilter"> + <xsd:attribute name="dxfId" type="ST_DxfId" use="optional"/> + <xsd:attribute name="cellColor" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_IconFilter"> + <xsd:attribute name="iconSet" type="ST_IconSetType" use="required"/> + <xsd:attribute name="iconId" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_FilterOperator"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="equal"/> + <xsd:enumeration value="lessThan"/> + <xsd:enumeration value="lessThanOrEqual"/> + <xsd:enumeration value="notEqual"/> + <xsd:enumeration value="greaterThanOrEqual"/> + <xsd:enumeration value="greaterThan"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_DynamicFilter"> + <xsd:attribute name="type" type="ST_DynamicFilterType" use="required"/> + <xsd:attribute name="val" type="xsd:double" use="optional"/> + <xsd:attribute name="valIso" type="xsd:dateTime" use="optional"/> + <xsd:attribute name="maxVal" type="xsd:double" use="optional"/> + <xsd:attribute name="maxValIso" type="xsd:dateTime" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_DynamicFilterType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="null"/> + <xsd:enumeration value="aboveAverage"/> + <xsd:enumeration value="belowAverage"/> + <xsd:enumeration value="tomorrow"/> + <xsd:enumeration value="today"/> + <xsd:enumeration value="yesterday"/> + <xsd:enumeration value="nextWeek"/> + <xsd:enumeration value="thisWeek"/> + <xsd:enumeration value="lastWeek"/> + <xsd:enumeration value="nextMonth"/> + <xsd:enumeration value="thisMonth"/> + <xsd:enumeration value="lastMonth"/> + <xsd:enumeration value="nextQuarter"/> + <xsd:enumeration value="thisQuarter"/> + <xsd:enumeration value="lastQuarter"/> + <xsd:enumeration value="nextYear"/> + <xsd:enumeration value="thisYear"/> + <xsd:enumeration value="lastYear"/> + <xsd:enumeration value="yearToDate"/> + <xsd:enumeration value="Q1"/> + <xsd:enumeration value="Q2"/> + <xsd:enumeration value="Q3"/> + <xsd:enumeration value="Q4"/> + <xsd:enumeration value="M1"/> + <xsd:enumeration value="M2"/> + <xsd:enumeration value="M3"/> + <xsd:enumeration value="M4"/> + <xsd:enumeration value="M5"/> + <xsd:enumeration value="M6"/> + <xsd:enumeration value="M7"/> + <xsd:enumeration value="M8"/> + <xsd:enumeration value="M9"/> + <xsd:enumeration value="M10"/> + <xsd:enumeration value="M11"/> + <xsd:enumeration value="M12"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_IconSetType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="3Arrows"/> + <xsd:enumeration value="3ArrowsGray"/> + <xsd:enumeration value="3Flags"/> + <xsd:enumeration value="3TrafficLights1"/> + <xsd:enumeration value="3TrafficLights2"/> + <xsd:enumeration value="3Signs"/> + <xsd:enumeration value="3Symbols"/> + <xsd:enumeration value="3Symbols2"/> + <xsd:enumeration value="4Arrows"/> + <xsd:enumeration value="4ArrowsGray"/> + <xsd:enumeration value="4RedToBlack"/> + <xsd:enumeration value="4Rating"/> + <xsd:enumeration value="4TrafficLights"/> + <xsd:enumeration value="5Arrows"/> + <xsd:enumeration value="5ArrowsGray"/> + <xsd:enumeration value="5Rating"/> + <xsd:enumeration value="5Quarters"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SortState"> + <xsd:sequence> + <xsd:element name="sortCondition" minOccurs="0" maxOccurs="64" type="CT_SortCondition"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="columnSort" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="caseSensitive" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="sortMethod" type="ST_SortMethod" use="optional" default="none"/> + <xsd:attribute name="ref" type="ST_Ref" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SortCondition"> + <xsd:attribute name="descending" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="sortBy" type="ST_SortBy" use="optional" default="value"/> + <xsd:attribute name="ref" type="ST_Ref" use="required"/> + <xsd:attribute name="customList" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="dxfId" type="ST_DxfId" use="optional"/> + <xsd:attribute name="iconSet" type="ST_IconSetType" use="optional" default="3Arrows"/> + <xsd:attribute name="iconId" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_SortBy"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="value"/> + <xsd:enumeration value="cellColor"/> + <xsd:enumeration value="fontColor"/> + <xsd:enumeration value="icon"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_SortMethod"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="stroke"/> + <xsd:enumeration value="pinYin"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_DateGroupItem"> + <xsd:attribute name="year" type="xsd:unsignedShort" use="required"/> + <xsd:attribute name="month" type="xsd:unsignedShort" use="optional"/> + <xsd:attribute name="day" type="xsd:unsignedShort" use="optional"/> + <xsd:attribute name="hour" type="xsd:unsignedShort" use="optional"/> + <xsd:attribute name="minute" type="xsd:unsignedShort" use="optional"/> + <xsd:attribute name="second" type="xsd:unsignedShort" use="optional"/> + <xsd:attribute name="dateTimeGrouping" type="ST_DateTimeGrouping" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_DateTimeGrouping"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="year"/> + <xsd:enumeration value="month"/> + <xsd:enumeration value="day"/> + <xsd:enumeration value="hour"/> + <xsd:enumeration value="minute"/> + <xsd:enumeration value="second"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_CellRef"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:simpleType name="ST_Ref"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:simpleType name="ST_RefA"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:simpleType name="ST_Sqref"> + <xsd:list itemType="ST_Ref"/> + </xsd:simpleType> + <xsd:simpleType name="ST_Formula"> + <xsd:restriction base="s:ST_Xstring"/> + </xsd:simpleType> + <xsd:simpleType name="ST_UnsignedIntHex"> + <xsd:restriction base="xsd:hexBinary"> + <xsd:length value="4"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_UnsignedShortHex"> + <xsd:restriction base="xsd:hexBinary"> + <xsd:length value="2"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_XStringElement"> + <xsd:attribute name="v" type="s:ST_Xstring" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Extension"> + <xsd:sequence> + <xsd:any processContents="lax"/> + </xsd:sequence> + <xsd:attribute name="uri" type="xsd:token"/> + </xsd:complexType> + <xsd:complexType name="CT_ObjectAnchor"> + <xsd:sequence> + <xsd:element ref="xdr:from" minOccurs="1" maxOccurs="1"/> + <xsd:element ref="xdr:to" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="moveWithCells" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="sizeWithCells" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:group name="EG_ExtensionList"> + <xsd:sequence> + <xsd:element name="ext" type="CT_Extension" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_ExtensionList"> + <xsd:sequence> + <xsd:group ref="EG_ExtensionList" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="calcChain" type="CT_CalcChain"/> + <xsd:complexType name="CT_CalcChain"> + <xsd:sequence> + <xsd:element name="c" type="CT_CalcCell" minOccurs="1" maxOccurs="unbounded"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_CalcCell"> + <xsd:attribute name="r" type="ST_CellRef" use="optional"/> + <xsd:attribute name="ref" type="ST_CellRef" use="optional"/> + <xsd:attribute name="i" type="xsd:int" use="optional" default="0"/> + <xsd:attribute name="s" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="l" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="t" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="a" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:element name="comments" type="CT_Comments"/> + <xsd:complexType name="CT_Comments"> + <xsd:sequence> + <xsd:element name="authors" type="CT_Authors" minOccurs="1" maxOccurs="1"/> + <xsd:element name="commentList" type="CT_CommentList" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Authors"> + <xsd:sequence> + <xsd:element name="author" type="s:ST_Xstring" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_CommentList"> + <xsd:sequence> + <xsd:element name="comment" type="CT_Comment" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Comment"> + <xsd:sequence> + <xsd:element name="text" type="CT_Rst" minOccurs="1" maxOccurs="1"/> + <xsd:element name="commentPr" type="CT_CommentPr" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="ref" type="ST_Ref" use="required"/> + <xsd:attribute name="authorId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="guid" type="s:ST_Guid" use="optional"/> + <xsd:attribute name="shapeId" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_CommentPr"> + <xsd:sequence> + <xsd:element name="anchor" type="CT_ObjectAnchor" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="locked" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="defaultSize" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="print" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="disabled" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="autoFill" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="autoLine" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="altText" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="textHAlign" type="ST_TextHAlign" use="optional" default="left"/> + <xsd:attribute name="textVAlign" type="ST_TextVAlign" use="optional" default="top"/> + <xsd:attribute name="lockText" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="justLastX" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="autoScale" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:simpleType name="ST_TextHAlign"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="left"/> + <xsd:enumeration value="center"/> + <xsd:enumeration value="right"/> + <xsd:enumeration value="justify"/> + <xsd:enumeration value="distributed"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextVAlign"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="top"/> + <xsd:enumeration value="center"/> + <xsd:enumeration value="bottom"/> + <xsd:enumeration value="justify"/> + <xsd:enumeration value="distributed"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:element name="MapInfo" type="CT_MapInfo"/> + <xsd:complexType name="CT_MapInfo"> + <xsd:sequence> + <xsd:element name="Schema" type="CT_Schema" minOccurs="1" maxOccurs="unbounded"/> + <xsd:element name="Map" type="CT_Map" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="SelectionNamespaces" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Schema" mixed="true"> + <xsd:sequence> + <xsd:any/> + </xsd:sequence> + <xsd:attribute name="ID" type="xsd:string" use="required"/> + <xsd:attribute name="SchemaRef" type="xsd:string" use="optional"/> + <xsd:attribute name="Namespace" type="xsd:string" use="optional"/> + <xsd:attribute name="SchemaLanguage" type="xsd:token" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Map"> + <xsd:sequence> + <xsd:element name="DataBinding" type="CT_DataBinding" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="ID" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="Name" type="xsd:string" use="required"/> + <xsd:attribute name="RootElement" type="xsd:string" use="required"/> + <xsd:attribute name="SchemaID" type="xsd:string" use="required"/> + <xsd:attribute name="ShowImportExportValidationErrors" type="xsd:boolean" use="required"/> + <xsd:attribute name="AutoFit" type="xsd:boolean" use="required"/> + <xsd:attribute name="Append" type="xsd:boolean" use="required"/> + <xsd:attribute name="PreserveSortAFLayout" type="xsd:boolean" use="required"/> + <xsd:attribute name="PreserveFormat" type="xsd:boolean" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_DataBinding"> + <xsd:sequence> + <xsd:any/> + </xsd:sequence> + <xsd:attribute name="DataBindingName" type="xsd:string" use="optional"/> + <xsd:attribute name="FileBinding" type="xsd:boolean" use="optional"/> + <xsd:attribute name="ConnectionID" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="FileBindingName" type="xsd:string" use="optional"/> + <xsd:attribute name="DataBindingLoadMode" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:element name="connections" type="CT_Connections"/> + <xsd:complexType name="CT_Connections"> + <xsd:sequence> + <xsd:element name="connection" minOccurs="1" maxOccurs="unbounded" type="CT_Connection"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Connection"> + <xsd:sequence> + <xsd:element name="dbPr" minOccurs="0" maxOccurs="1" type="CT_DbPr"/> + <xsd:element name="olapPr" minOccurs="0" maxOccurs="1" type="CT_OlapPr"/> + <xsd:element name="webPr" minOccurs="0" maxOccurs="1" type="CT_WebPr"/> + <xsd:element name="textPr" minOccurs="0" maxOccurs="1" type="CT_TextPr"/> + <xsd:element name="parameters" minOccurs="0" maxOccurs="1" type="CT_Parameters"/> + <xsd:element name="extLst" minOccurs="0" maxOccurs="1" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="id" use="required" type="xsd:unsignedInt"/> + <xsd:attribute name="sourceFile" use="optional" type="s:ST_Xstring"/> + <xsd:attribute name="odcFile" use="optional" type="s:ST_Xstring"/> + <xsd:attribute name="keepAlive" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="interval" use="optional" type="xsd:unsignedInt" default="0"/> + <xsd:attribute name="name" use="optional" type="s:ST_Xstring"/> + <xsd:attribute name="description" use="optional" type="s:ST_Xstring"/> + <xsd:attribute name="type" use="optional" type="xsd:unsignedInt"/> + <xsd:attribute name="reconnectionMethod" use="optional" type="xsd:unsignedInt" default="1"/> + <xsd:attribute name="refreshedVersion" use="required" type="xsd:unsignedByte"/> + <xsd:attribute name="minRefreshableVersion" use="optional" type="xsd:unsignedByte" default="0"/> + <xsd:attribute name="savePassword" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="new" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="deleted" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="onlyUseConnectionFile" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="background" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="refreshOnLoad" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="saveData" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="credentials" use="optional" type="ST_CredMethod" default="integrated"/> + <xsd:attribute name="singleSignOnId" use="optional" type="s:ST_Xstring"/> + </xsd:complexType> + <xsd:simpleType name="ST_CredMethod"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="integrated"/> + <xsd:enumeration value="none"/> + <xsd:enumeration value="stored"/> + <xsd:enumeration value="prompt"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_DbPr"> + <xsd:attribute name="connection" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="command" use="optional" type="s:ST_Xstring"/> + <xsd:attribute name="serverCommand" use="optional" type="s:ST_Xstring"/> + <xsd:attribute name="commandType" use="optional" type="xsd:unsignedInt" default="2"/> + </xsd:complexType> + <xsd:complexType name="CT_OlapPr"> + <xsd:attribute name="local" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="localConnection" use="optional" type="s:ST_Xstring"/> + <xsd:attribute name="localRefresh" use="optional" type="xsd:boolean" default="true"/> + <xsd:attribute name="sendLocale" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="rowDrillCount" use="optional" type="xsd:unsignedInt"/> + <xsd:attribute name="serverFill" use="optional" type="xsd:boolean" default="true"/> + <xsd:attribute name="serverNumberFormat" use="optional" type="xsd:boolean" default="true"/> + <xsd:attribute name="serverFont" use="optional" type="xsd:boolean" default="true"/> + <xsd:attribute name="serverFontColor" use="optional" type="xsd:boolean" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_WebPr"> + <xsd:sequence> + <xsd:element name="tables" minOccurs="0" maxOccurs="1" type="CT_Tables"/> + </xsd:sequence> + <xsd:attribute name="xml" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="sourceData" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="parsePre" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="consecutive" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="firstRow" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="xl97" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="textDates" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="xl2000" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="url" use="optional" type="s:ST_Xstring"/> + <xsd:attribute name="post" use="optional" type="s:ST_Xstring"/> + <xsd:attribute name="htmlTables" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="htmlFormat" use="optional" type="ST_HtmlFmt" default="none"/> + <xsd:attribute name="editPage" use="optional" type="s:ST_Xstring"/> + </xsd:complexType> + <xsd:simpleType name="ST_HtmlFmt"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="rtf"/> + <xsd:enumeration value="all"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Parameters"> + <xsd:sequence> + <xsd:element name="parameter" minOccurs="1" maxOccurs="unbounded" type="CT_Parameter"/> + </xsd:sequence> + <xsd:attribute name="count" use="optional" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_Parameter"> + <xsd:attribute name="name" use="optional" type="s:ST_Xstring"/> + <xsd:attribute name="sqlType" use="optional" type="xsd:int" default="0"/> + <xsd:attribute name="parameterType" use="optional" type="ST_ParameterType" default="prompt"/> + <xsd:attribute name="refreshOnChange" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="prompt" use="optional" type="s:ST_Xstring"/> + <xsd:attribute name="boolean" use="optional" type="xsd:boolean"/> + <xsd:attribute name="double" use="optional" type="xsd:double"/> + <xsd:attribute name="integer" use="optional" type="xsd:int"/> + <xsd:attribute name="string" use="optional" type="s:ST_Xstring"/> + <xsd:attribute name="cell" use="optional" type="s:ST_Xstring"/> + </xsd:complexType> + <xsd:simpleType name="ST_ParameterType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="prompt"/> + <xsd:enumeration value="value"/> + <xsd:enumeration value="cell"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Tables"> + <xsd:choice minOccurs="1" maxOccurs="unbounded"> + <xsd:element name="m" type="CT_TableMissing"/> + <xsd:element name="s" type="CT_XStringElement"/> + <xsd:element name="x" type="CT_Index"/> + </xsd:choice> + <xsd:attribute name="count" use="optional" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_TableMissing"/> + <xsd:complexType name="CT_TextPr"> + <xsd:sequence> + <xsd:element name="textFields" minOccurs="0" maxOccurs="1" type="CT_TextFields"/> + </xsd:sequence> + <xsd:attribute name="prompt" use="optional" type="xsd:boolean" default="true"/> + <xsd:attribute name="fileType" use="optional" type="ST_FileType" default="win"/> + <xsd:attribute name="codePage" use="optional" type="xsd:unsignedInt" default="1252"/> + <xsd:attribute name="characterSet" use="optional" type="xsd:string"/> + <xsd:attribute name="firstRow" use="optional" type="xsd:unsignedInt" default="1"/> + <xsd:attribute name="sourceFile" use="optional" type="s:ST_Xstring" default=""/> + <xsd:attribute name="delimited" use="optional" type="xsd:boolean" default="true"/> + <xsd:attribute name="decimal" use="optional" type="s:ST_Xstring" default="."/> + <xsd:attribute name="thousands" use="optional" type="s:ST_Xstring" default=","/> + <xsd:attribute name="tab" use="optional" type="xsd:boolean" default="true"/> + <xsd:attribute name="space" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="comma" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="semicolon" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="consecutive" use="optional" type="xsd:boolean" default="false"/> + <xsd:attribute name="qualifier" use="optional" type="ST_Qualifier" default="doubleQuote"/> + <xsd:attribute name="delimiter" use="optional" type="s:ST_Xstring"/> + </xsd:complexType> + <xsd:simpleType name="ST_FileType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="mac"/> + <xsd:enumeration value="win"/> + <xsd:enumeration value="dos"/> + <xsd:enumeration value="lin"/> + <xsd:enumeration value="other"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Qualifier"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="doubleQuote"/> + <xsd:enumeration value="singleQuote"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TextFields"> + <xsd:sequence> + <xsd:element name="textField" minOccurs="1" maxOccurs="unbounded" type="CT_TextField"/> + </xsd:sequence> + <xsd:attribute name="count" use="optional" type="xsd:unsignedInt" default="1"/> + </xsd:complexType> + <xsd:complexType name="CT_TextField"> + <xsd:attribute name="type" use="optional" type="ST_ExternalConnectionType" default="general"/> + <xsd:attribute name="position" use="optional" type="xsd:unsignedInt" default="0"/> + </xsd:complexType> + <xsd:simpleType name="ST_ExternalConnectionType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="general"/> + <xsd:enumeration value="text"/> + <xsd:enumeration value="MDY"/> + <xsd:enumeration value="DMY"/> + <xsd:enumeration value="YMD"/> + <xsd:enumeration value="MYD"/> + <xsd:enumeration value="DYM"/> + <xsd:enumeration value="YDM"/> + <xsd:enumeration value="skip"/> + <xsd:enumeration value="EMD"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:element name="pivotCacheDefinition" type="CT_PivotCacheDefinition"/> + <xsd:element name="pivotCacheRecords" type="CT_PivotCacheRecords"/> + <xsd:element name="pivotTableDefinition" type="CT_pivotTableDefinition"/> + <xsd:complexType name="CT_PivotCacheDefinition"> + <xsd:sequence> + <xsd:element name="cacheSource" type="CT_CacheSource" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cacheFields" type="CT_CacheFields" minOccurs="1" maxOccurs="1"/> + <xsd:element name="cacheHierarchies" minOccurs="0" type="CT_CacheHierarchies"/> + <xsd:element name="kpis" minOccurs="0" type="CT_PCDKPIs"/> + <xsd:element name="tupleCache" minOccurs="0" type="CT_TupleCache"/> + <xsd:element name="calculatedItems" minOccurs="0" type="CT_CalculatedItems"/> + <xsd:element name="calculatedMembers" type="CT_CalculatedMembers" minOccurs="0"/> + <xsd:element name="dimensions" type="CT_Dimensions" minOccurs="0"/> + <xsd:element name="measureGroups" type="CT_MeasureGroups" minOccurs="0"/> + <xsd:element name="maps" type="CT_MeasureDimensionMaps" minOccurs="0"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute ref="r:id" use="optional"/> + <xsd:attribute name="invalid" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="saveData" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="refreshOnLoad" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="optimizeMemory" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="enableRefresh" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="refreshedBy" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="refreshedDate" type="xsd:double" use="optional"/> + <xsd:attribute name="refreshedDateIso" type="xsd:dateTime" use="optional"/> + <xsd:attribute name="backgroundQuery" type="xsd:boolean" default="false"/> + <xsd:attribute name="missingItemsLimit" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="createdVersion" type="xsd:unsignedByte" use="optional" default="0"/> + <xsd:attribute name="refreshedVersion" type="xsd:unsignedByte" use="optional" default="0"/> + <xsd:attribute name="minRefreshableVersion" type="xsd:unsignedByte" use="optional" default="0"/> + <xsd:attribute name="recordCount" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="upgradeOnRefresh" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="tupleCache" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="supportSubquery" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="supportAdvancedDrill" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_CacheFields"> + <xsd:sequence> + <xsd:element name="cacheField" type="CT_CacheField" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_CacheField"> + <xsd:sequence> + <xsd:element name="sharedItems" type="CT_SharedItems" minOccurs="0" maxOccurs="1"/> + <xsd:element name="fieldGroup" minOccurs="0" type="CT_FieldGroup"/> + <xsd:element name="mpMap" minOccurs="0" maxOccurs="unbounded" type="CT_X"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="caption" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="propertyName" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="serverField" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="uniqueList" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="numFmtId" type="ST_NumFmtId" use="optional"/> + <xsd:attribute name="formula" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="sqlType" type="xsd:int" use="optional" default="0"/> + <xsd:attribute name="hierarchy" type="xsd:int" use="optional" default="0"/> + <xsd:attribute name="level" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="databaseField" type="xsd:boolean" default="true"/> + <xsd:attribute name="mappingCount" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="memberPropertyField" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_CacheSource"> + <xsd:choice minOccurs="0" maxOccurs="1"> + <xsd:element name="worksheetSource" type="CT_WorksheetSource" minOccurs="1" maxOccurs="1"/> + <xsd:element name="consolidation" type="CT_Consolidation" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0"/> + </xsd:choice> + <xsd:attribute name="type" type="ST_SourceType" use="required"/> + <xsd:attribute name="connectionId" type="xsd:unsignedInt" default="0" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_SourceType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="worksheet"/> + <xsd:enumeration value="external"/> + <xsd:enumeration value="consolidation"/> + <xsd:enumeration value="scenario"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_WorksheetSource"> + <xsd:attribute name="ref" type="ST_Ref" use="optional"/> + <xsd:attribute name="name" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="sheet" type="s:ST_Xstring" use="optional"/> + <xsd:attribute ref="r:id" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Consolidation"> + <xsd:sequence> + <xsd:element name="pages" type="CT_Pages" minOccurs="0" maxOccurs="1"/> + <xsd:element name="rangeSets" type="CT_RangeSets" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="autoPage" type="xsd:boolean" default="true" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Pages"> + <xsd:sequence> + <xsd:element name="page" type="CT_PCDSCPage" minOccurs="1" maxOccurs="4"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_PCDSCPage"> + <xsd:sequence> + <xsd:element name="pageItem" type="CT_PageItem" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_PageItem"> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_RangeSets"> + <xsd:sequence> + <xsd:element name="rangeSet" type="CT_RangeSet" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_RangeSet"> + <xsd:attribute name="i1" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="i2" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="i3" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="i4" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="ref" type="ST_Ref" use="optional"/> + <xsd:attribute name="name" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="sheet" type="s:ST_Xstring" use="optional"/> + <xsd:attribute ref="r:id" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_SharedItems"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="m" type="CT_Missing" minOccurs="1" maxOccurs="1"/> + <xsd:element name="n" type="CT_Number" minOccurs="1" maxOccurs="1"/> + <xsd:element name="b" type="CT_Boolean" minOccurs="1" maxOccurs="1"/> + <xsd:element name="e" type="CT_Error" minOccurs="1" maxOccurs="1"/> + <xsd:element name="s" type="CT_String" minOccurs="1" maxOccurs="1"/> + <xsd:element name="d" type="CT_DateTime" minOccurs="1" maxOccurs="1"/> + </xsd:choice> + <xsd:attribute name="containsSemiMixedTypes" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="containsNonDate" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="containsDate" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="containsString" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="containsBlank" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="containsMixedTypes" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="containsNumber" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="containsInteger" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="minValue" type="xsd:double" use="optional"/> + <xsd:attribute name="maxValue" type="xsd:double" use="optional"/> + <xsd:attribute name="minDate" type="xsd:dateTime" use="optional"/> + <xsd:attribute name="maxDate" type="xsd:dateTime" use="optional"/> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="longText" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_Missing"> + <xsd:sequence> + <xsd:element name="tpls" minOccurs="0" maxOccurs="unbounded" type="CT_Tuples"/> + <xsd:element name="x" minOccurs="0" maxOccurs="unbounded" type="CT_X"/> + </xsd:sequence> + <xsd:attribute name="u" type="xsd:boolean"/> + <xsd:attribute name="f" type="xsd:boolean"/> + <xsd:attribute name="c" type="s:ST_Xstring"/> + <xsd:attribute name="cp" type="xsd:unsignedInt"/> + <xsd:attribute name="in" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="bc" type="ST_UnsignedIntHex" use="optional"/> + <xsd:attribute name="fc" type="ST_UnsignedIntHex" use="optional"/> + <xsd:attribute name="i" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="un" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="st" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="b" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_Number"> + <xsd:sequence> + <xsd:element name="tpls" minOccurs="0" maxOccurs="unbounded" type="CT_Tuples"/> + <xsd:element name="x" minOccurs="0" maxOccurs="unbounded" type="CT_X"/> + </xsd:sequence> + <xsd:attribute name="v" use="required" type="xsd:double"/> + <xsd:attribute name="u" type="xsd:boolean"/> + <xsd:attribute name="f" type="xsd:boolean"/> + <xsd:attribute name="c" type="s:ST_Xstring"/> + <xsd:attribute name="cp" type="xsd:unsignedInt"/> + <xsd:attribute name="in" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="bc" type="ST_UnsignedIntHex" use="optional"/> + <xsd:attribute name="fc" type="ST_UnsignedIntHex" use="optional"/> + <xsd:attribute name="i" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="un" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="st" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="b" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_Boolean"> + <xsd:sequence> + <xsd:element name="x" minOccurs="0" maxOccurs="unbounded" type="CT_X"/> + </xsd:sequence> + <xsd:attribute name="v" use="required" type="xsd:boolean"/> + <xsd:attribute name="u" type="xsd:boolean"/> + <xsd:attribute name="f" type="xsd:boolean"/> + <xsd:attribute name="c" type="s:ST_Xstring"/> + <xsd:attribute name="cp" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_Error"> + <xsd:sequence> + <xsd:element name="tpls" minOccurs="0" type="CT_Tuples"/> + <xsd:element name="x" minOccurs="0" maxOccurs="unbounded" type="CT_X"/> + </xsd:sequence> + <xsd:attribute name="v" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="u" type="xsd:boolean"/> + <xsd:attribute name="f" type="xsd:boolean"/> + <xsd:attribute name="c" type="s:ST_Xstring"/> + <xsd:attribute name="cp" type="xsd:unsignedInt"/> + <xsd:attribute name="in" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="bc" type="ST_UnsignedIntHex" use="optional"/> + <xsd:attribute name="fc" type="ST_UnsignedIntHex" use="optional"/> + <xsd:attribute name="i" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="un" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="st" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="b" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_String"> + <xsd:sequence> + <xsd:element name="tpls" minOccurs="0" maxOccurs="unbounded" type="CT_Tuples"/> + <xsd:element name="x" minOccurs="0" maxOccurs="unbounded" type="CT_X"/> + </xsd:sequence> + <xsd:attribute name="v" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="u" type="xsd:boolean"/> + <xsd:attribute name="f" type="xsd:boolean"/> + <xsd:attribute name="c" type="s:ST_Xstring"/> + <xsd:attribute name="cp" type="xsd:unsignedInt"/> + <xsd:attribute name="in" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="bc" type="ST_UnsignedIntHex" use="optional"/> + <xsd:attribute name="fc" type="ST_UnsignedIntHex" use="optional"/> + <xsd:attribute name="i" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="un" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="st" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="b" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_DateTime"> + <xsd:sequence> + <xsd:element name="x" minOccurs="0" maxOccurs="unbounded" type="CT_X"/> + </xsd:sequence> + <xsd:attribute name="v" use="required" type="xsd:dateTime"/> + <xsd:attribute name="u" type="xsd:boolean"/> + <xsd:attribute name="f" type="xsd:boolean"/> + <xsd:attribute name="c" type="s:ST_Xstring"/> + <xsd:attribute name="cp" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_FieldGroup"> + <xsd:sequence> + <xsd:element name="rangePr" minOccurs="0" type="CT_RangePr"/> + <xsd:element name="discretePr" minOccurs="0" type="CT_DiscretePr"/> + <xsd:element name="groupItems" minOccurs="0" type="CT_GroupItems"/> + </xsd:sequence> + <xsd:attribute name="par" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="base" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_RangePr"> + <xsd:attribute name="autoStart" type="xsd:boolean" default="true"/> + <xsd:attribute name="autoEnd" type="xsd:boolean" default="true"/> + <xsd:attribute name="groupBy" type="ST_GroupBy" default="range"/> + <xsd:attribute name="startNum" type="xsd:double"/> + <xsd:attribute name="endNum" type="xsd:double"/> + <xsd:attribute name="startDate" type="xsd:dateTime"/> + <xsd:attribute name="endDate" type="xsd:dateTime"/> + <xsd:attribute name="groupInterval" type="xsd:double" default="1"/> + </xsd:complexType> + <xsd:simpleType name="ST_GroupBy"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="range"/> + <xsd:enumeration value="seconds"/> + <xsd:enumeration value="minutes"/> + <xsd:enumeration value="hours"/> + <xsd:enumeration value="days"/> + <xsd:enumeration value="months"/> + <xsd:enumeration value="quarters"/> + <xsd:enumeration value="years"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_DiscretePr"> + <xsd:sequence> + <xsd:element name="x" maxOccurs="unbounded" type="CT_Index"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_GroupItems"> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="m" type="CT_Missing"/> + <xsd:element name="n" type="CT_Number"/> + <xsd:element name="b" type="CT_Boolean"/> + <xsd:element name="e" type="CT_Error"/> + <xsd:element name="s" type="CT_String"/> + <xsd:element name="d" type="CT_DateTime"/> + </xsd:choice> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_PivotCacheRecords"> + <xsd:sequence> + <xsd:element name="r" minOccurs="0" maxOccurs="unbounded" type="CT_Record"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_Record"> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="m" type="CT_Missing"/> + <xsd:element name="n" type="CT_Number"/> + <xsd:element name="b" type="CT_Boolean"/> + <xsd:element name="e" type="CT_Error"/> + <xsd:element name="s" type="CT_String"/> + <xsd:element name="d" type="CT_DateTime"/> + <xsd:element name="x" type="CT_Index"/> + </xsd:choice> + </xsd:complexType> + <xsd:complexType name="CT_PCDKPIs"> + <xsd:sequence> + <xsd:element name="kpi" minOccurs="0" maxOccurs="unbounded" type="CT_PCDKPI"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_PCDKPI"> + <xsd:attribute name="uniqueName" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="caption" use="optional" type="s:ST_Xstring"/> + <xsd:attribute name="displayFolder" type="s:ST_Xstring"/> + <xsd:attribute name="measureGroup" type="s:ST_Xstring"/> + <xsd:attribute name="parent" type="s:ST_Xstring"/> + <xsd:attribute name="value" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="goal" type="s:ST_Xstring"/> + <xsd:attribute name="status" type="s:ST_Xstring"/> + <xsd:attribute name="trend" type="s:ST_Xstring"/> + <xsd:attribute name="weight" type="s:ST_Xstring"/> + <xsd:attribute name="time" type="s:ST_Xstring"/> + </xsd:complexType> + <xsd:complexType name="CT_CacheHierarchies"> + <xsd:sequence> + <xsd:element name="cacheHierarchy" minOccurs="0" maxOccurs="unbounded" + type="CT_CacheHierarchy"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_CacheHierarchy"> + <xsd:sequence> + <xsd:element name="fieldsUsage" minOccurs="0" type="CT_FieldsUsage"/> + <xsd:element name="groupLevels" minOccurs="0" type="CT_GroupLevels"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="uniqueName" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="caption" use="optional" type="s:ST_Xstring"/> + <xsd:attribute name="measure" type="xsd:boolean" default="false"/> + <xsd:attribute name="set" type="xsd:boolean" default="false"/> + <xsd:attribute name="parentSet" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="iconSet" type="xsd:int" default="0"/> + <xsd:attribute name="attribute" type="xsd:boolean" default="false"/> + <xsd:attribute name="time" type="xsd:boolean" default="false"/> + <xsd:attribute name="keyAttribute" type="xsd:boolean" default="false"/> + <xsd:attribute name="defaultMemberUniqueName" type="s:ST_Xstring"/> + <xsd:attribute name="allUniqueName" type="s:ST_Xstring"/> + <xsd:attribute name="allCaption" type="s:ST_Xstring"/> + <xsd:attribute name="dimensionUniqueName" type="s:ST_Xstring"/> + <xsd:attribute name="displayFolder" type="s:ST_Xstring"/> + <xsd:attribute name="measureGroup" type="s:ST_Xstring"/> + <xsd:attribute name="measures" type="xsd:boolean" default="false"/> + <xsd:attribute name="count" use="required" type="xsd:unsignedInt"/> + <xsd:attribute name="oneField" type="xsd:boolean" default="false"/> + <xsd:attribute name="memberValueDatatype" use="optional" type="xsd:unsignedShort"/> + <xsd:attribute name="unbalanced" use="optional" type="xsd:boolean"/> + <xsd:attribute name="unbalancedGroup" use="optional" type="xsd:boolean"/> + <xsd:attribute name="hidden" type="xsd:boolean" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_FieldsUsage"> + <xsd:sequence> + <xsd:element name="fieldUsage" minOccurs="0" maxOccurs="unbounded" type="CT_FieldUsage"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_FieldUsage"> + <xsd:attribute name="x" use="required" type="xsd:int"/> + </xsd:complexType> + <xsd:complexType name="CT_GroupLevels"> + <xsd:sequence> + <xsd:element name="groupLevel" maxOccurs="unbounded" type="CT_GroupLevel"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_GroupLevel"> + <xsd:sequence> + <xsd:element name="groups" minOccurs="0" type="CT_Groups"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="uniqueName" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="caption" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="user" type="xsd:boolean" default="false"/> + <xsd:attribute name="customRollUp" type="xsd:boolean" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_Groups"> + <xsd:sequence> + <xsd:element name="group" maxOccurs="unbounded" type="CT_LevelGroup"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_LevelGroup"> + <xsd:sequence> + <xsd:element name="groupMembers" type="CT_GroupMembers"/> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="uniqueName" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="caption" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="uniqueParent" type="s:ST_Xstring"/> + <xsd:attribute name="id" type="xsd:int"/> + </xsd:complexType> + <xsd:complexType name="CT_GroupMembers"> + <xsd:sequence> + <xsd:element name="groupMember" maxOccurs="unbounded" type="CT_GroupMember"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_GroupMember"> + <xsd:attribute name="uniqueName" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="group" type="xsd:boolean" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_TupleCache"> + <xsd:sequence> + <xsd:element name="entries" minOccurs="0" type="CT_PCDSDTCEntries"/> + <xsd:element name="sets" minOccurs="0" type="CT_Sets"/> + <xsd:element name="queryCache" minOccurs="0" type="CT_QueryCache"/> + <xsd:element name="serverFormats" minOccurs="0" maxOccurs="1" type="CT_ServerFormats"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ServerFormat"> + <xsd:attribute name="culture" use="optional" type="s:ST_Xstring"/> + <xsd:attribute name="format" use="optional" type="s:ST_Xstring"/> + </xsd:complexType> + <xsd:complexType name="CT_ServerFormats"> + <xsd:sequence> + <xsd:element name="serverFormat" type="CT_ServerFormat" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_PCDSDTCEntries"> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="m" type="CT_Missing"/> + <xsd:element name="n" type="CT_Number"/> + <xsd:element name="e" type="CT_Error"/> + <xsd:element name="s" type="CT_String"/> + </xsd:choice> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_Tuples"> + <xsd:sequence> + <xsd:element name="tpl" type="CT_Tuple" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="c" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Tuple"> + <xsd:attribute name="fld" type="xsd:unsignedInt"/> + <xsd:attribute name="hier" type="xsd:unsignedInt"/> + <xsd:attribute name="item" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Sets"> + <xsd:sequence> + <xsd:element name="set" maxOccurs="unbounded" type="CT_Set"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_Set"> + <xsd:sequence> + <xsd:element name="tpls" minOccurs="0" maxOccurs="unbounded" type="CT_Tuples"/> + <xsd:element name="sortByTuple" minOccurs="0" type="CT_Tuples"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + <xsd:attribute name="maxRank" use="required" type="xsd:int"/> + <xsd:attribute name="setDefinition" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="sortType" type="ST_SortType" default="none"/> + <xsd:attribute name="queryFailed" type="xsd:boolean" default="false"/> + </xsd:complexType> + <xsd:simpleType name="ST_SortType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="ascending"/> + <xsd:enumeration value="descending"/> + <xsd:enumeration value="ascendingAlpha"/> + <xsd:enumeration value="descendingAlpha"/> + <xsd:enumeration value="ascendingNatural"/> + <xsd:enumeration value="descendingNatural"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_QueryCache"> + <xsd:sequence> + <xsd:element name="query" maxOccurs="unbounded" type="CT_Query"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_Query"> + <xsd:sequence> + <xsd:element name="tpls" minOccurs="0" type="CT_Tuples"/> + </xsd:sequence> + <xsd:attribute name="mdx" use="required" type="s:ST_Xstring"/> + </xsd:complexType> + <xsd:complexType name="CT_CalculatedItems"> + <xsd:sequence> + <xsd:element name="calculatedItem" maxOccurs="unbounded" type="CT_CalculatedItem"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_CalculatedItem"> + <xsd:sequence> + <xsd:element name="pivotArea" type="CT_PivotArea"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="field" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="formula" type="s:ST_Xstring"/> + </xsd:complexType> + <xsd:complexType name="CT_CalculatedMembers"> + <xsd:sequence> + <xsd:element name="calculatedMember" maxOccurs="unbounded" type="CT_CalculatedMember"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_CalculatedMember"> + <xsd:sequence minOccurs="0"> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="mdx" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="memberName" type="s:ST_Xstring"/> + <xsd:attribute name="hierarchy" type="s:ST_Xstring"/> + <xsd:attribute name="parent" type="s:ST_Xstring"/> + <xsd:attribute name="solveOrder" type="xsd:int" default="0"/> + <xsd:attribute name="set" type="xsd:boolean" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_pivotTableDefinition"> + <xsd:sequence> + <xsd:element name="location" type="CT_Location"/> + <xsd:element name="pivotFields" type="CT_PivotFields" minOccurs="0"/> + <xsd:element name="rowFields" type="CT_RowFields" minOccurs="0"/> + <xsd:element name="rowItems" type="CT_rowItems" minOccurs="0"/> + <xsd:element name="colFields" type="CT_ColFields" minOccurs="0"/> + <xsd:element name="colItems" type="CT_colItems" minOccurs="0"/> + <xsd:element name="pageFields" type="CT_PageFields" minOccurs="0"/> + <xsd:element name="dataFields" type="CT_DataFields" minOccurs="0"/> + <xsd:element name="formats" type="CT_Formats" minOccurs="0"/> + <xsd:element name="conditionalFormats" type="CT_ConditionalFormats" minOccurs="0"/> + <xsd:element name="chartFormats" type="CT_ChartFormats" minOccurs="0"/> + <xsd:element name="pivotHierarchies" type="CT_PivotHierarchies" minOccurs="0"/> + <xsd:element name="pivotTableStyleInfo" minOccurs="0" maxOccurs="1" type="CT_PivotTableStyle"/> + <xsd:element name="filters" minOccurs="0" maxOccurs="1" type="CT_PivotFilters"/> + <xsd:element name="rowHierarchiesUsage" type="CT_RowHierarchiesUsage" minOccurs="0" + maxOccurs="1"/> + <xsd:element name="colHierarchiesUsage" type="CT_ColHierarchiesUsage" minOccurs="0" + maxOccurs="1"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="cacheId" use="required" type="xsd:unsignedInt"/> + <xsd:attribute name="dataOnRows" type="xsd:boolean" default="false"/> + <xsd:attribute name="dataPosition" type="xsd:unsignedInt" use="optional"/> + <xsd:attributeGroup ref="AG_AutoFormat"/> + <xsd:attribute name="dataCaption" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="grandTotalCaption" type="s:ST_Xstring"/> + <xsd:attribute name="errorCaption" type="s:ST_Xstring"/> + <xsd:attribute name="showError" type="xsd:boolean" default="false"/> + <xsd:attribute name="missingCaption" type="s:ST_Xstring"/> + <xsd:attribute name="showMissing" type="xsd:boolean" default="true"/> + <xsd:attribute name="pageStyle" type="s:ST_Xstring"/> + <xsd:attribute name="pivotTableStyle" type="s:ST_Xstring"/> + <xsd:attribute name="vacatedStyle" type="s:ST_Xstring"/> + <xsd:attribute name="tag" type="s:ST_Xstring"/> + <xsd:attribute name="updatedVersion" type="xsd:unsignedByte" default="0"/> + <xsd:attribute name="minRefreshableVersion" type="xsd:unsignedByte" default="0"/> + <xsd:attribute name="asteriskTotals" type="xsd:boolean" default="false"/> + <xsd:attribute name="showItems" type="xsd:boolean" default="true"/> + <xsd:attribute name="editData" type="xsd:boolean" default="false"/> + <xsd:attribute name="disableFieldList" type="xsd:boolean" default="false"/> + <xsd:attribute name="showCalcMbrs" type="xsd:boolean" default="true"/> + <xsd:attribute name="visualTotals" type="xsd:boolean" default="true"/> + <xsd:attribute name="showMultipleLabel" type="xsd:boolean" default="true"/> + <xsd:attribute name="showDataDropDown" type="xsd:boolean" default="true"/> + <xsd:attribute name="showDrill" type="xsd:boolean" default="true"/> + <xsd:attribute name="printDrill" type="xsd:boolean" default="false"/> + <xsd:attribute name="showMemberPropertyTips" type="xsd:boolean" default="true"/> + <xsd:attribute name="showDataTips" type="xsd:boolean" default="true"/> + <xsd:attribute name="enableWizard" type="xsd:boolean" default="true"/> + <xsd:attribute name="enableDrill" type="xsd:boolean" default="true"/> + <xsd:attribute name="enableFieldProperties" type="xsd:boolean" default="true"/> + <xsd:attribute name="preserveFormatting" type="xsd:boolean" default="true"/> + <xsd:attribute name="useAutoFormatting" type="xsd:boolean" default="false"/> + <xsd:attribute name="pageWrap" type="xsd:unsignedInt" default="0"/> + <xsd:attribute name="pageOverThenDown" type="xsd:boolean" default="false"/> + <xsd:attribute name="subtotalHiddenItems" type="xsd:boolean" default="false"/> + <xsd:attribute name="rowGrandTotals" type="xsd:boolean" default="true"/> + <xsd:attribute name="colGrandTotals" type="xsd:boolean" default="true"/> + <xsd:attribute name="fieldPrintTitles" type="xsd:boolean" default="false"/> + <xsd:attribute name="itemPrintTitles" type="xsd:boolean" default="false"/> + <xsd:attribute name="mergeItem" type="xsd:boolean" default="false"/> + <xsd:attribute name="showDropZones" type="xsd:boolean" default="true"/> + <xsd:attribute name="createdVersion" type="xsd:unsignedByte" default="0"/> + <xsd:attribute name="indent" type="xsd:unsignedInt" default="1"/> + <xsd:attribute name="showEmptyRow" type="xsd:boolean" default="false"/> + <xsd:attribute name="showEmptyCol" type="xsd:boolean" default="false"/> + <xsd:attribute name="showHeaders" type="xsd:boolean" default="true"/> + <xsd:attribute name="compact" type="xsd:boolean" default="true"/> + <xsd:attribute name="outline" type="xsd:boolean" default="false"/> + <xsd:attribute name="outlineData" type="xsd:boolean" default="false"/> + <xsd:attribute name="compactData" type="xsd:boolean" default="true"/> + <xsd:attribute name="published" type="xsd:boolean" default="false"/> + <xsd:attribute name="gridDropZones" type="xsd:boolean" default="false"/> + <xsd:attribute name="immersive" type="xsd:boolean" default="true"/> + <xsd:attribute name="multipleFieldFilters" type="xsd:boolean" default="true"/> + <xsd:attribute name="chartFormat" type="xsd:unsignedInt" default="0"/> + <xsd:attribute name="rowHeaderCaption" type="s:ST_Xstring"/> + <xsd:attribute name="colHeaderCaption" type="s:ST_Xstring"/> + <xsd:attribute name="fieldListSortAscending" type="xsd:boolean" default="false"/> + <xsd:attribute name="mdxSubqueries" type="xsd:boolean" default="false"/> + <xsd:attribute name="customListSort" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_Location"> + <xsd:attribute name="ref" use="required" type="ST_Ref"/> + <xsd:attribute name="firstHeaderRow" use="required" type="xsd:unsignedInt"/> + <xsd:attribute name="firstDataRow" use="required" type="xsd:unsignedInt"/> + <xsd:attribute name="firstDataCol" use="required" type="xsd:unsignedInt"/> + <xsd:attribute name="rowPageCount" type="xsd:unsignedInt" default="0"/> + <xsd:attribute name="colPageCount" type="xsd:unsignedInt" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_PivotFields"> + <xsd:sequence> + <xsd:element name="pivotField" maxOccurs="unbounded" type="CT_PivotField"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_PivotField"> + <xsd:sequence> + <xsd:element name="items" minOccurs="0" type="CT_Items"/> + <xsd:element name="autoSortScope" minOccurs="0" type="CT_AutoSortScope"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="name" type="s:ST_Xstring"/> + <xsd:attribute name="axis" use="optional" type="ST_Axis"/> + <xsd:attribute name="dataField" type="xsd:boolean" default="false"/> + <xsd:attribute name="subtotalCaption" type="s:ST_Xstring"/> + <xsd:attribute name="showDropDowns" type="xsd:boolean" default="true"/> + <xsd:attribute name="hiddenLevel" type="xsd:boolean" default="false"/> + <xsd:attribute name="uniqueMemberProperty" type="s:ST_Xstring"/> + <xsd:attribute name="compact" type="xsd:boolean" default="true"/> + <xsd:attribute name="allDrilled" type="xsd:boolean" default="false"/> + <xsd:attribute name="numFmtId" type="ST_NumFmtId" use="optional"/> + <xsd:attribute name="outline" type="xsd:boolean" default="true"/> + <xsd:attribute name="subtotalTop" type="xsd:boolean" default="true"/> + <xsd:attribute name="dragToRow" type="xsd:boolean" default="true"/> + <xsd:attribute name="dragToCol" type="xsd:boolean" default="true"/> + <xsd:attribute name="multipleItemSelectionAllowed" type="xsd:boolean" default="false"/> + <xsd:attribute name="dragToPage" type="xsd:boolean" default="true"/> + <xsd:attribute name="dragToData" type="xsd:boolean" default="true"/> + <xsd:attribute name="dragOff" type="xsd:boolean" default="true"/> + <xsd:attribute name="showAll" type="xsd:boolean" default="true"/> + <xsd:attribute name="insertBlankRow" type="xsd:boolean" default="false"/> + <xsd:attribute name="serverField" type="xsd:boolean" default="false"/> + <xsd:attribute name="insertPageBreak" type="xsd:boolean" default="false"/> + <xsd:attribute name="autoShow" type="xsd:boolean" default="false"/> + <xsd:attribute name="topAutoShow" type="xsd:boolean" default="true"/> + <xsd:attribute name="hideNewItems" type="xsd:boolean" default="false"/> + <xsd:attribute name="measureFilter" type="xsd:boolean" default="false"/> + <xsd:attribute name="includeNewItemsInFilter" type="xsd:boolean" default="false"/> + <xsd:attribute name="itemPageCount" type="xsd:unsignedInt" default="10"/> + <xsd:attribute name="sortType" type="ST_FieldSortType" default="manual"/> + <xsd:attribute name="dataSourceSort" type="xsd:boolean" use="optional"/> + <xsd:attribute name="nonAutoSortDefault" type="xsd:boolean" default="false"/> + <xsd:attribute name="rankBy" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="defaultSubtotal" type="xsd:boolean" default="true"/> + <xsd:attribute name="sumSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="countASubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="avgSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="maxSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="minSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="productSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="countSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="stdDevSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="stdDevPSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="varSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="varPSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="showPropCell" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showPropTip" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showPropAsCaption" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="defaultAttributeDrillState" type="xsd:boolean" use="optional" + default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_AutoSortScope"> + <xsd:sequence> + <xsd:element name="pivotArea" type="CT_PivotArea"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Items"> + <xsd:sequence> + <xsd:element name="item" maxOccurs="unbounded" type="CT_Item"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_Item"> + <xsd:attribute name="n" type="s:ST_Xstring"/> + <xsd:attribute name="t" type="ST_ItemType" default="data"/> + <xsd:attribute name="h" type="xsd:boolean" default="false"/> + <xsd:attribute name="s" type="xsd:boolean" default="false"/> + <xsd:attribute name="sd" type="xsd:boolean" default="true"/> + <xsd:attribute name="f" type="xsd:boolean" default="false"/> + <xsd:attribute name="m" type="xsd:boolean" default="false"/> + <xsd:attribute name="c" type="xsd:boolean" default="false"/> + <xsd:attribute name="x" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="d" type="xsd:boolean" default="false"/> + <xsd:attribute name="e" type="xsd:boolean" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_PageFields"> + <xsd:sequence> + <xsd:element name="pageField" maxOccurs="unbounded" type="CT_PageField"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_PageField"> + <xsd:sequence minOccurs="0"> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="fld" use="required" type="xsd:int"/> + <xsd:attribute name="item" use="optional" type="xsd:unsignedInt"/> + <xsd:attribute name="hier" type="xsd:int"/> + <xsd:attribute name="name" type="s:ST_Xstring"/> + <xsd:attribute name="cap" type="s:ST_Xstring"/> + </xsd:complexType> + <xsd:complexType name="CT_DataFields"> + <xsd:sequence> + <xsd:element name="dataField" maxOccurs="unbounded" type="CT_DataField"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_DataField"> + <xsd:sequence> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="name" use="optional" type="s:ST_Xstring"/> + <xsd:attribute name="fld" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="subtotal" type="ST_DataConsolidateFunction" default="sum"/> + <xsd:attribute name="showDataAs" type="ST_ShowDataAs" default="normal"/> + <xsd:attribute name="baseField" type="xsd:int" default="-1"/> + <xsd:attribute name="baseItem" type="xsd:unsignedInt" default="1048832"/> + <xsd:attribute name="numFmtId" type="ST_NumFmtId" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_rowItems"> + <xsd:sequence> + <xsd:element name="i" maxOccurs="unbounded" type="CT_I"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_colItems"> + <xsd:sequence> + <xsd:element name="i" maxOccurs="unbounded" type="CT_I"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_I"> + <xsd:sequence> + <xsd:element name="x" minOccurs="0" maxOccurs="unbounded" type="CT_X"/> + </xsd:sequence> + <xsd:attribute name="t" type="ST_ItemType" default="data"/> + <xsd:attribute name="r" type="xsd:unsignedInt" default="0"/> + <xsd:attribute name="i" type="xsd:unsignedInt" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_X"> + <xsd:attribute name="v" type="xsd:int" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_RowFields"> + <xsd:sequence> + <xsd:element name="field" maxOccurs="unbounded" type="CT_Field"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_ColFields"> + <xsd:sequence> + <xsd:element name="field" maxOccurs="unbounded" type="CT_Field"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_Field"> + <xsd:attribute name="x" type="xsd:int" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Formats"> + <xsd:sequence> + <xsd:element name="format" maxOccurs="unbounded" type="CT_Format"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_Format"> + <xsd:sequence> + <xsd:element name="pivotArea" type="CT_PivotArea"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="action" type="ST_FormatAction" default="formatting"/> + <xsd:attribute name="dxfId" type="ST_DxfId" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_ConditionalFormats"> + <xsd:sequence> + <xsd:element name="conditionalFormat" maxOccurs="unbounded" type="CT_ConditionalFormat"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_ConditionalFormat"> + <xsd:sequence> + <xsd:element name="pivotAreas" type="CT_PivotAreas"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="scope" type="ST_Scope" default="selection"/> + <xsd:attribute name="type" type="ST_Type" default="none"/> + <xsd:attribute name="priority" use="required" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_PivotAreas"> + <xsd:sequence> + <xsd:element name="pivotArea" minOccurs="0" maxOccurs="unbounded" type="CT_PivotArea"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:simpleType name="ST_Scope"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="selection"/> + <xsd:enumeration value="data"/> + <xsd:enumeration value="field"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Type"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="all"/> + <xsd:enumeration value="row"/> + <xsd:enumeration value="column"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_ChartFormats"> + <xsd:sequence> + <xsd:element name="chartFormat" maxOccurs="unbounded" type="CT_ChartFormat"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_ChartFormat"> + <xsd:sequence> + <xsd:element name="pivotArea" type="CT_PivotArea"/> + </xsd:sequence> + <xsd:attribute name="chart" use="required" type="xsd:unsignedInt"/> + <xsd:attribute name="format" use="required" type="xsd:unsignedInt"/> + <xsd:attribute name="series" type="xsd:boolean" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_PivotHierarchies"> + <xsd:sequence> + <xsd:element name="pivotHierarchy" maxOccurs="unbounded" type="CT_PivotHierarchy"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_PivotHierarchy"> + <xsd:sequence> + <xsd:element name="mps" minOccurs="0" type="CT_MemberProperties"/> + <xsd:element name="members" minOccurs="0" maxOccurs="unbounded" type="CT_Members"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="outline" type="xsd:boolean" default="false"/> + <xsd:attribute name="multipleItemSelectionAllowed" type="xsd:boolean" default="false"/> + <xsd:attribute name="subtotalTop" type="xsd:boolean" default="false"/> + <xsd:attribute name="showInFieldList" type="xsd:boolean" default="true"/> + <xsd:attribute name="dragToRow" type="xsd:boolean" default="true"/> + <xsd:attribute name="dragToCol" type="xsd:boolean" default="true"/> + <xsd:attribute name="dragToPage" type="xsd:boolean" default="true"/> + <xsd:attribute name="dragToData" type="xsd:boolean" default="false"/> + <xsd:attribute name="dragOff" type="xsd:boolean" default="true"/> + <xsd:attribute name="includeNewItemsInFilter" type="xsd:boolean" default="false"/> + <xsd:attribute name="caption" type="s:ST_Xstring" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_RowHierarchiesUsage"> + <xsd:sequence> + <xsd:element name="rowHierarchyUsage" minOccurs="1" maxOccurs="unbounded" + type="CT_HierarchyUsage"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_ColHierarchiesUsage"> + <xsd:sequence> + <xsd:element name="colHierarchyUsage" minOccurs="1" maxOccurs="unbounded" + type="CT_HierarchyUsage"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_HierarchyUsage"> + <xsd:attribute name="hierarchyUsage" type="xsd:int" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_MemberProperties"> + <xsd:sequence> + <xsd:element name="mp" maxOccurs="unbounded" type="CT_MemberProperty"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_MemberProperty"> + <xsd:attribute name="name" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="showCell" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showTip" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showAsCaption" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="nameLen" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="pPos" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="pLen" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="level" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="field" use="required" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_Members"> + <xsd:sequence> + <xsd:element name="member" maxOccurs="unbounded" type="CT_Member"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + <xsd:attribute name="level" use="optional" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_Member"> + <xsd:attribute name="name" use="required" type="s:ST_Xstring"/> + </xsd:complexType> + <xsd:complexType name="CT_Dimensions"> + <xsd:sequence> + <xsd:element name="dimension" minOccurs="0" maxOccurs="unbounded" type="CT_PivotDimension"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_PivotDimension"> + <xsd:attribute name="measure" type="xsd:boolean" default="false"/> + <xsd:attribute name="name" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="uniqueName" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="caption" use="required" type="s:ST_Xstring"/> + </xsd:complexType> + <xsd:complexType name="CT_MeasureGroups"> + <xsd:sequence> + <xsd:element name="measureGroup" minOccurs="0" maxOccurs="unbounded" type="CT_MeasureGroup"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_MeasureDimensionMaps"> + <xsd:sequence> + <xsd:element name="map" minOccurs="0" maxOccurs="unbounded" type="CT_MeasureDimensionMap"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_MeasureGroup"> + <xsd:attribute name="name" use="required" type="s:ST_Xstring"/> + <xsd:attribute name="caption" use="required" type="s:ST_Xstring"/> + </xsd:complexType> + <xsd:complexType name="CT_MeasureDimensionMap"> + <xsd:attribute name="measureGroup" use="optional" type="xsd:unsignedInt"/> + <xsd:attribute name="dimension" use="optional" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_PivotTableStyle"> + <xsd:attribute name="name" type="xsd:string"/> + <xsd:attribute name="showRowHeaders" type="xsd:boolean"/> + <xsd:attribute name="showColHeaders" type="xsd:boolean"/> + <xsd:attribute name="showRowStripes" type="xsd:boolean"/> + <xsd:attribute name="showColStripes" type="xsd:boolean"/> + <xsd:attribute name="showLastColumn" type="xsd:boolean" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_PivotFilters"> + <xsd:sequence> + <xsd:element name="filter" minOccurs="0" maxOccurs="unbounded" type="CT_PivotFilter"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_PivotFilter"> + <xsd:sequence> + <xsd:element name="autoFilter" minOccurs="1" maxOccurs="1" type="CT_AutoFilter"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="fld" use="required" type="xsd:unsignedInt"/> + <xsd:attribute name="mpFld" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="type" use="required" type="ST_PivotFilterType"/> + <xsd:attribute name="evalOrder" use="optional" type="xsd:int" default="0"/> + <xsd:attribute name="id" use="required" type="xsd:unsignedInt"/> + <xsd:attribute name="iMeasureHier" use="optional" type="xsd:unsignedInt"/> + <xsd:attribute name="iMeasureFld" use="optional" type="xsd:unsignedInt"/> + <xsd:attribute name="name" type="s:ST_Xstring"/> + <xsd:attribute name="description" type="s:ST_Xstring"/> + <xsd:attribute name="stringValue1" type="s:ST_Xstring"/> + <xsd:attribute name="stringValue2" type="s:ST_Xstring"/> + </xsd:complexType> + <xsd:simpleType name="ST_ShowDataAs"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="normal"/> + <xsd:enumeration value="difference"/> + <xsd:enumeration value="percent"/> + <xsd:enumeration value="percentDiff"/> + <xsd:enumeration value="runTotal"/> + <xsd:enumeration value="percentOfRow"/> + <xsd:enumeration value="percentOfCol"/> + <xsd:enumeration value="percentOfTotal"/> + <xsd:enumeration value="index"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ItemType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="data"/> + <xsd:enumeration value="default"/> + <xsd:enumeration value="sum"/> + <xsd:enumeration value="countA"/> + <xsd:enumeration value="avg"/> + <xsd:enumeration value="max"/> + <xsd:enumeration value="min"/> + <xsd:enumeration value="product"/> + <xsd:enumeration value="count"/> + <xsd:enumeration value="stdDev"/> + <xsd:enumeration value="stdDevP"/> + <xsd:enumeration value="var"/> + <xsd:enumeration value="varP"/> + <xsd:enumeration value="grand"/> + <xsd:enumeration value="blank"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FormatAction"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="blank"/> + <xsd:enumeration value="formatting"/> + <xsd:enumeration value="drill"/> + <xsd:enumeration value="formula"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FieldSortType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="manual"/> + <xsd:enumeration value="ascending"/> + <xsd:enumeration value="descending"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PivotFilterType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="unknown"/> + <xsd:enumeration value="count"/> + <xsd:enumeration value="percent"/> + <xsd:enumeration value="sum"/> + <xsd:enumeration value="captionEqual"/> + <xsd:enumeration value="captionNotEqual"/> + <xsd:enumeration value="captionBeginsWith"/> + <xsd:enumeration value="captionNotBeginsWith"/> + <xsd:enumeration value="captionEndsWith"/> + <xsd:enumeration value="captionNotEndsWith"/> + <xsd:enumeration value="captionContains"/> + <xsd:enumeration value="captionNotContains"/> + <xsd:enumeration value="captionGreaterThan"/> + <xsd:enumeration value="captionGreaterThanOrEqual"/> + <xsd:enumeration value="captionLessThan"/> + <xsd:enumeration value="captionLessThanOrEqual"/> + <xsd:enumeration value="captionBetween"/> + <xsd:enumeration value="captionNotBetween"/> + <xsd:enumeration value="valueEqual"/> + <xsd:enumeration value="valueNotEqual"/> + <xsd:enumeration value="valueGreaterThan"/> + <xsd:enumeration value="valueGreaterThanOrEqual"/> + <xsd:enumeration value="valueLessThan"/> + <xsd:enumeration value="valueLessThanOrEqual"/> + <xsd:enumeration value="valueBetween"/> + <xsd:enumeration value="valueNotBetween"/> + <xsd:enumeration value="dateEqual"/> + <xsd:enumeration value="dateNotEqual"/> + <xsd:enumeration value="dateOlderThan"/> + <xsd:enumeration value="dateOlderThanOrEqual"/> + <xsd:enumeration value="dateNewerThan"/> + <xsd:enumeration value="dateNewerThanOrEqual"/> + <xsd:enumeration value="dateBetween"/> + <xsd:enumeration value="dateNotBetween"/> + <xsd:enumeration value="tomorrow"/> + <xsd:enumeration value="today"/> + <xsd:enumeration value="yesterday"/> + <xsd:enumeration value="nextWeek"/> + <xsd:enumeration value="thisWeek"/> + <xsd:enumeration value="lastWeek"/> + <xsd:enumeration value="nextMonth"/> + <xsd:enumeration value="thisMonth"/> + <xsd:enumeration value="lastMonth"/> + <xsd:enumeration value="nextQuarter"/> + <xsd:enumeration value="thisQuarter"/> + <xsd:enumeration value="lastQuarter"/> + <xsd:enumeration value="nextYear"/> + <xsd:enumeration value="thisYear"/> + <xsd:enumeration value="lastYear"/> + <xsd:enumeration value="yearToDate"/> + <xsd:enumeration value="Q1"/> + <xsd:enumeration value="Q2"/> + <xsd:enumeration value="Q3"/> + <xsd:enumeration value="Q4"/> + <xsd:enumeration value="M1"/> + <xsd:enumeration value="M2"/> + <xsd:enumeration value="M3"/> + <xsd:enumeration value="M4"/> + <xsd:enumeration value="M5"/> + <xsd:enumeration value="M6"/> + <xsd:enumeration value="M7"/> + <xsd:enumeration value="M8"/> + <xsd:enumeration value="M9"/> + <xsd:enumeration value="M10"/> + <xsd:enumeration value="M11"/> + <xsd:enumeration value="M12"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PivotArea"> + <xsd:sequence> + <xsd:element name="references" minOccurs="0" type="CT_PivotAreaReferences"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="field" use="optional" type="xsd:int"/> + <xsd:attribute name="type" type="ST_PivotAreaType" default="normal"/> + <xsd:attribute name="dataOnly" type="xsd:boolean" default="true"/> + <xsd:attribute name="labelOnly" type="xsd:boolean" default="false"/> + <xsd:attribute name="grandRow" type="xsd:boolean" default="false"/> + <xsd:attribute name="grandCol" type="xsd:boolean" default="false"/> + <xsd:attribute name="cacheIndex" type="xsd:boolean" default="false"/> + <xsd:attribute name="outline" type="xsd:boolean" default="true"/> + <xsd:attribute name="offset" type="ST_Ref"/> + <xsd:attribute name="collapsedLevelsAreSubtotals" type="xsd:boolean" default="false"/> + <xsd:attribute name="axis" type="ST_Axis" use="optional"/> + <xsd:attribute name="fieldPosition" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_PivotAreaType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="normal"/> + <xsd:enumeration value="data"/> + <xsd:enumeration value="all"/> + <xsd:enumeration value="origin"/> + <xsd:enumeration value="button"/> + <xsd:enumeration value="topEnd"/> + <xsd:enumeration value="topRight"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PivotAreaReferences"> + <xsd:sequence> + <xsd:element name="reference" maxOccurs="unbounded" type="CT_PivotAreaReference"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:complexType name="CT_PivotAreaReference"> + <xsd:sequence> + <xsd:element name="x" minOccurs="0" maxOccurs="unbounded" type="CT_Index"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="field" use="optional" type="xsd:unsignedInt"/> + <xsd:attribute name="count" type="xsd:unsignedInt"/> + <xsd:attribute name="selected" type="xsd:boolean" default="true"/> + <xsd:attribute name="byPosition" type="xsd:boolean" default="false"/> + <xsd:attribute name="relative" type="xsd:boolean" default="false"/> + <xsd:attribute name="defaultSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="sumSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="countASubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="avgSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="maxSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="minSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="productSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="countSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="stdDevSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="stdDevPSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="varSubtotal" type="xsd:boolean" default="false"/> + <xsd:attribute name="varPSubtotal" type="xsd:boolean" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_Index"> + <xsd:attribute name="v" use="required" type="xsd:unsignedInt"/> + </xsd:complexType> + <xsd:simpleType name="ST_Axis"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="axisRow"/> + <xsd:enumeration value="axisCol"/> + <xsd:enumeration value="axisPage"/> + <xsd:enumeration value="axisValues"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:element name="queryTable" type="CT_QueryTable"/> + <xsd:complexType name="CT_QueryTable"> + <xsd:sequence> + <xsd:element name="queryTableRefresh" type="CT_QueryTableRefresh" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="headers" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="rowNumbers" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="disableRefresh" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="backgroundRefresh" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="firstBackgroundRefresh" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="refreshOnLoad" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="growShrinkType" type="ST_GrowShrinkType" use="optional" + default="insertDelete"/> + <xsd:attribute name="fillFormulas" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="removeDataOnSave" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="disableEdit" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="preserveFormatting" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="adjustColumnWidth" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="intermediate" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="connectionId" type="xsd:unsignedInt" use="required"/> + <xsd:attributeGroup ref="AG_AutoFormat"/> + </xsd:complexType> + <xsd:complexType name="CT_QueryTableRefresh"> + <xsd:sequence> + <xsd:element name="queryTableFields" type="CT_QueryTableFields" minOccurs="1" maxOccurs="1"/> + <xsd:element name="queryTableDeletedFields" type="CT_QueryTableDeletedFields" minOccurs="0" + maxOccurs="1"/> + <xsd:element name="sortState" minOccurs="0" maxOccurs="1" type="CT_SortState"/> + <xsd:element name="extLst" minOccurs="0" maxOccurs="1" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="preserveSortFilterLayout" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="fieldIdWrapped" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="headersInLastRefresh" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="minimumVersion" type="xsd:unsignedByte" use="optional" default="0"/> + <xsd:attribute name="nextId" type="xsd:unsignedInt" use="optional" default="1"/> + <xsd:attribute name="unboundColumnsLeft" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="unboundColumnsRight" type="xsd:unsignedInt" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_QueryTableDeletedFields"> + <xsd:sequence> + <xsd:element name="deletedField" type="CT_DeletedField" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_DeletedField"> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_QueryTableFields"> + <xsd:sequence> + <xsd:element name="queryTableField" type="CT_QueryTableField" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_QueryTableField"> + <xsd:sequence minOccurs="0"> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="name" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="dataBound" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="rowNumbers" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="fillFormulas" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="clipped" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="tableColumnId" type="xsd:unsignedInt" default="0"/> + </xsd:complexType> + <xsd:simpleType name="ST_GrowShrinkType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="insertDelete"/> + <xsd:enumeration value="insertClear"/> + <xsd:enumeration value="overwriteClear"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:element name="sst" type="CT_Sst"/> + <xsd:complexType name="CT_Sst"> + <xsd:sequence> + <xsd:element name="si" type="CT_Rst" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="uniqueCount" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_PhoneticType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="halfwidthKatakana"/> + <xsd:enumeration value="fullwidthKatakana"/> + <xsd:enumeration value="Hiragana"/> + <xsd:enumeration value="noConversion"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PhoneticAlignment"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="noControl"/> + <xsd:enumeration value="left"/> + <xsd:enumeration value="center"/> + <xsd:enumeration value="distributed"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PhoneticRun"> + <xsd:sequence> + <xsd:element name="t" type="s:ST_Xstring" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="sb" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="eb" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_RElt"> + <xsd:sequence> + <xsd:element name="rPr" type="CT_RPrElt" minOccurs="0" maxOccurs="1"/> + <xsd:element name="t" type="s:ST_Xstring" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_RPrElt"> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="rFont" type="CT_FontName" minOccurs="0" maxOccurs="1"/> + <xsd:element name="charset" type="CT_IntProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="family" type="CT_IntProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="b" type="CT_BooleanProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="i" type="CT_BooleanProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="strike" type="CT_BooleanProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="outline" type="CT_BooleanProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="shadow" type="CT_BooleanProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="condense" type="CT_BooleanProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extend" type="CT_BooleanProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="color" type="CT_Color" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sz" type="CT_FontSize" minOccurs="0" maxOccurs="1"/> + <xsd:element name="u" type="CT_UnderlineProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="vertAlign" type="CT_VerticalAlignFontProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="scheme" type="CT_FontScheme" minOccurs="0" maxOccurs="1"/> + </xsd:choice> + </xsd:complexType> + <xsd:complexType name="CT_Rst"> + <xsd:sequence> + <xsd:element name="t" type="s:ST_Xstring" minOccurs="0" maxOccurs="1"/> + <xsd:element name="r" type="CT_RElt" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="rPh" type="CT_PhoneticRun" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="phoneticPr" minOccurs="0" maxOccurs="1" type="CT_PhoneticPr"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_PhoneticPr"> + <xsd:attribute name="fontId" type="ST_FontId" use="required"/> + <xsd:attribute name="type" type="ST_PhoneticType" use="optional" default="fullwidthKatakana"/> + <xsd:attribute name="alignment" type="ST_PhoneticAlignment" use="optional" default="left"/> + </xsd:complexType> + <xsd:element name="headers" type="CT_RevisionHeaders"/> + <xsd:element name="revisions" type="CT_Revisions"/> + <xsd:complexType name="CT_RevisionHeaders"> + <xsd:sequence> + <xsd:element name="header" type="CT_RevisionHeader" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="guid" type="s:ST_Guid" use="required"/> + <xsd:attribute name="lastGuid" type="s:ST_Guid" use="optional"/> + <xsd:attribute name="shared" type="xsd:boolean" default="true"/> + <xsd:attribute name="diskRevisions" type="xsd:boolean" default="false"/> + <xsd:attribute name="history" type="xsd:boolean" default="true"/> + <xsd:attribute name="trackRevisions" type="xsd:boolean" default="true"/> + <xsd:attribute name="exclusive" type="xsd:boolean" default="false"/> + <xsd:attribute name="revisionId" type="xsd:unsignedInt" default="0"/> + <xsd:attribute name="version" type="xsd:int" default="1"/> + <xsd:attribute name="keepChangeHistory" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="protected" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="preserveHistory" type="xsd:unsignedInt" default="30"/> + </xsd:complexType> + <xsd:complexType name="CT_Revisions"> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="rrc" type="CT_RevisionRowColumn" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="rm" type="CT_RevisionMove" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="rcv" type="CT_RevisionCustomView" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="rsnm" type="CT_RevisionSheetRename" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="ris" type="CT_RevisionInsertSheet" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="rcc" type="CT_RevisionCellChange" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="rfmt" type="CT_RevisionFormatting" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="raf" type="CT_RevisionAutoFormatting" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="rdn" type="CT_RevisionDefinedName" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="rcmt" type="CT_RevisionComment" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="rqt" type="CT_RevisionQueryTableField" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="rcft" type="CT_RevisionConflict" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:complexType> + <xsd:attributeGroup name="AG_RevData"> + <xsd:attribute name="rId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="ua" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="ra" type="xsd:boolean" use="optional" default="false"/> + </xsd:attributeGroup> + <xsd:complexType name="CT_RevisionHeader"> + <xsd:sequence> + <xsd:element name="sheetIdMap" minOccurs="1" maxOccurs="1" type="CT_SheetIdMap"/> + <xsd:element name="reviewedList" minOccurs="0" maxOccurs="1" type="CT_ReviewedRevisions"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="guid" type="s:ST_Guid" use="required"/> + <xsd:attribute name="dateTime" type="xsd:dateTime" use="required"/> + <xsd:attribute name="maxSheetId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="userName" type="s:ST_Xstring" use="required"/> + <xsd:attribute ref="r:id" use="required"/> + <xsd:attribute name="minRId" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="maxRId" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_SheetIdMap"> + <xsd:sequence> + <xsd:element name="sheetId" type="CT_SheetId" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_SheetId"> + <xsd:attribute name="val" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_ReviewedRevisions"> + <xsd:sequence> + <xsd:element name="reviewed" type="CT_Reviewed" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Reviewed"> + <xsd:attribute name="rId" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_UndoInfo"> + <xsd:attribute name="index" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="exp" type="ST_FormulaExpression" use="required"/> + <xsd:attribute name="ref3D" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="array" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="v" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="nf" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="cs" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="dr" type="ST_RefA" use="required"/> + <xsd:attribute name="dn" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="r" type="ST_CellRef" use="optional"/> + <xsd:attribute name="sId" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_RevisionRowColumn"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="undo" type="CT_UndoInfo" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="rcc" type="CT_RevisionCellChange" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="rfmt" type="CT_RevisionFormatting" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + <xsd:attributeGroup ref="AG_RevData"/> + <xsd:attribute name="sId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="eol" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="ref" type="ST_Ref" use="required"/> + <xsd:attribute name="action" type="ST_rwColActionType" use="required"/> + <xsd:attribute name="edge" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_RevisionMove"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="undo" type="CT_UndoInfo" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="rcc" type="CT_RevisionCellChange" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="rfmt" type="CT_RevisionFormatting" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + <xsd:attributeGroup ref="AG_RevData"/> + <xsd:attribute name="sheetId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="source" type="ST_Ref" use="required"/> + <xsd:attribute name="destination" type="ST_Ref" use="required"/> + <xsd:attribute name="sourceSheetId" type="xsd:unsignedInt" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_RevisionCustomView"> + <xsd:attribute name="guid" type="s:ST_Guid" use="required"/> + <xsd:attribute name="action" type="ST_RevisionAction" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_RevisionSheetRename"> + <xsd:sequence> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_RevData"/> + <xsd:attribute name="sheetId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="oldName" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="newName" type="s:ST_Xstring" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_RevisionInsertSheet"> + <xsd:attributeGroup ref="AG_RevData"/> + <xsd:attribute name="sheetId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="sheetPosition" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_RevisionCellChange"> + <xsd:sequence> + <xsd:element name="oc" type="CT_Cell" minOccurs="0" maxOccurs="1"/> + <xsd:element name="nc" type="CT_Cell" minOccurs="1" maxOccurs="1"/> + <xsd:element name="odxf" type="CT_Dxf" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ndxf" type="CT_Dxf" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_RevData"/> + <xsd:attribute name="sId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="odxf" type="xsd:boolean" default="false"/> + <xsd:attribute name="xfDxf" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="s" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="dxf" type="xsd:boolean" default="false"/> + <xsd:attribute name="numFmtId" type="ST_NumFmtId" use="optional"/> + <xsd:attribute name="quotePrefix" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="oldQuotePrefix" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="ph" type="xsd:boolean" default="false"/> + <xsd:attribute name="oldPh" type="xsd:boolean" default="false"/> + <xsd:attribute name="endOfListFormulaUpdate" type="xsd:boolean" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_RevisionFormatting"> + <xsd:sequence> + <xsd:element name="dxf" type="CT_Dxf" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="sheetId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="xfDxf" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="s" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="sqref" type="ST_Sqref" use="required"/> + <xsd:attribute name="start" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="length" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_RevisionAutoFormatting"> + <xsd:attribute name="sheetId" type="xsd:unsignedInt" use="required"/> + <xsd:attributeGroup ref="AG_AutoFormat"/> + <xsd:attribute name="ref" type="ST_Ref" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_RevisionComment"> + <xsd:attribute name="sheetId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="cell" type="ST_CellRef" use="required"/> + <xsd:attribute name="guid" type="s:ST_Guid" use="required"/> + <xsd:attribute name="action" type="ST_RevisionAction" default="add"/> + <xsd:attribute name="alwaysShow" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="old" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="hiddenRow" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="hiddenColumn" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="author" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="oldLength" type="xsd:unsignedInt" default="0"/> + <xsd:attribute name="newLength" type="xsd:unsignedInt" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_RevisionDefinedName"> + <xsd:sequence> + <xsd:element name="formula" type="ST_Formula" minOccurs="0" maxOccurs="1"/> + <xsd:element name="oldFormula" type="ST_Formula" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_RevData"/> + <xsd:attribute name="localSheetId" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="customView" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="function" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="oldFunction" type="xsd:boolean" default="false"/> + <xsd:attribute name="functionGroupId" type="xsd:unsignedByte" use="optional"/> + <xsd:attribute name="oldFunctionGroupId" type="xsd:unsignedByte" use="optional"/> + <xsd:attribute name="shortcutKey" type="xsd:unsignedByte" use="optional"/> + <xsd:attribute name="oldShortcutKey" type="xsd:unsignedByte" use="optional"/> + <xsd:attribute name="hidden" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="oldHidden" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="customMenu" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="oldCustomMenu" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="description" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="oldDescription" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="help" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="oldHelp" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="statusBar" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="oldStatusBar" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="comment" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="oldComment" type="s:ST_Xstring" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_RevisionConflict"> + <xsd:attributeGroup ref="AG_RevData"/> + <xsd:attribute name="sheetId" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_RevisionQueryTableField"> + <xsd:attribute name="sheetId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="ref" type="ST_Ref" use="required"/> + <xsd:attribute name="fieldId" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_rwColActionType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="insertRow"/> + <xsd:enumeration value="deleteRow"/> + <xsd:enumeration value="insertCol"/> + <xsd:enumeration value="deleteCol"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_RevisionAction"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="add"/> + <xsd:enumeration value="delete"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FormulaExpression"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="ref"/> + <xsd:enumeration value="refError"/> + <xsd:enumeration value="area"/> + <xsd:enumeration value="areaError"/> + <xsd:enumeration value="computedArea"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:element name="users" type="CT_Users"/> + <xsd:complexType name="CT_Users"> + <xsd:sequence> + <xsd:element name="userInfo" minOccurs="0" maxOccurs="256" type="CT_SharedUser"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_SharedUser"> + <xsd:sequence> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="guid" type="s:ST_Guid" use="required"/> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="id" type="xsd:int" use="required"/> + <xsd:attribute name="dateTime" type="xsd:dateTime" use="required"/> + </xsd:complexType> + <xsd:element name="worksheet" type="CT_Worksheet"/> + <xsd:element name="chartsheet" type="CT_Chartsheet"/> + <xsd:element name="dialogsheet" type="CT_Dialogsheet"/> + <xsd:complexType name="CT_Macrosheet"> + <xsd:sequence> + <xsd:element name="sheetPr" type="CT_SheetPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dimension" type="CT_SheetDimension" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sheetViews" type="CT_SheetViews" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sheetFormatPr" type="CT_SheetFormatPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cols" type="CT_Cols" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="sheetData" type="CT_SheetData" minOccurs="1" maxOccurs="1"/> + <xsd:element name="sheetProtection" type="CT_SheetProtection" minOccurs="0" maxOccurs="1"/> + <xsd:element name="autoFilter" type="CT_AutoFilter" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sortState" type="CT_SortState" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dataConsolidate" type="CT_DataConsolidate" minOccurs="0" maxOccurs="1"/> + <xsd:element name="customSheetViews" type="CT_CustomSheetViews" minOccurs="0" maxOccurs="1"/> + <xsd:element name="phoneticPr" type="CT_PhoneticPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="conditionalFormatting" type="CT_ConditionalFormatting" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element name="printOptions" type="CT_PrintOptions" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pageMargins" type="CT_PageMargins" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pageSetup" type="CT_PageSetup" minOccurs="0" maxOccurs="1"/> + <xsd:element name="headerFooter" type="CT_HeaderFooter" minOccurs="0" maxOccurs="1"/> + <xsd:element name="rowBreaks" type="CT_PageBreak" minOccurs="0" maxOccurs="1"/> + <xsd:element name="colBreaks" type="CT_PageBreak" minOccurs="0" maxOccurs="1"/> + <xsd:element name="customProperties" type="CT_CustomProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="drawing" type="CT_Drawing" minOccurs="0" maxOccurs="1"/> + <xsd:element name="legacyDrawing" type="CT_LegacyDrawing" minOccurs="0" maxOccurs="1"/> + <xsd:element name="legacyDrawingHF" type="CT_LegacyDrawing" minOccurs="0" maxOccurs="1"/> + <xsd:element name="drawingHF" type="CT_DrawingHF" minOccurs="0" maxOccurs="1"/> + <xsd:element name="picture" type="CT_SheetBackgroundPicture" minOccurs="0" maxOccurs="1"/> + <xsd:element name="oleObjects" type="CT_OleObjects" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Dialogsheet"> + <xsd:sequence> + <xsd:element name="sheetPr" minOccurs="0" type="CT_SheetPr"/> + <xsd:element name="sheetViews" minOccurs="0" type="CT_SheetViews"/> + <xsd:element name="sheetFormatPr" minOccurs="0" type="CT_SheetFormatPr"/> + <xsd:element name="sheetProtection" type="CT_SheetProtection" minOccurs="0" maxOccurs="1"/> + <xsd:element name="customSheetViews" minOccurs="0" type="CT_CustomSheetViews"/> + <xsd:element name="printOptions" minOccurs="0" type="CT_PrintOptions"/> + <xsd:element name="pageMargins" minOccurs="0" type="CT_PageMargins"/> + <xsd:element name="pageSetup" minOccurs="0" type="CT_PageSetup"/> + <xsd:element name="headerFooter" minOccurs="0" type="CT_HeaderFooter"/> + <xsd:element name="drawing" minOccurs="0" type="CT_Drawing"/> + <xsd:element name="legacyDrawing" minOccurs="0" type="CT_LegacyDrawing"/> + <xsd:element name="legacyDrawingHF" type="CT_LegacyDrawing" minOccurs="0" maxOccurs="1"/> + <xsd:element name="drawingHF" type="CT_DrawingHF" minOccurs="0" maxOccurs="1"/> + <xsd:element name="oleObjects" type="CT_OleObjects" minOccurs="0" maxOccurs="1"/> + <xsd:element name="controls" type="CT_Controls" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Worksheet"> + <xsd:sequence> + <xsd:element name="sheetPr" type="CT_SheetPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dimension" type="CT_SheetDimension" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sheetViews" type="CT_SheetViews" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sheetFormatPr" type="CT_SheetFormatPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cols" type="CT_Cols" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="sheetData" type="CT_SheetData" minOccurs="1" maxOccurs="1"/> + <xsd:element name="sheetCalcPr" type="CT_SheetCalcPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sheetProtection" type="CT_SheetProtection" minOccurs="0" maxOccurs="1"/> + <xsd:element name="protectedRanges" type="CT_ProtectedRanges" minOccurs="0" maxOccurs="1"/> + <xsd:element name="scenarios" type="CT_Scenarios" minOccurs="0" maxOccurs="1"/> + <xsd:element name="autoFilter" type="CT_AutoFilter" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sortState" type="CT_SortState" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dataConsolidate" type="CT_DataConsolidate" minOccurs="0" maxOccurs="1"/> + <xsd:element name="customSheetViews" type="CT_CustomSheetViews" minOccurs="0" maxOccurs="1"/> + <xsd:element name="mergeCells" type="CT_MergeCells" minOccurs="0" maxOccurs="1"/> + <xsd:element name="phoneticPr" type="CT_PhoneticPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="conditionalFormatting" type="CT_ConditionalFormatting" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element name="dataValidations" type="CT_DataValidations" minOccurs="0" maxOccurs="1"/> + <xsd:element name="hyperlinks" type="CT_Hyperlinks" minOccurs="0" maxOccurs="1"/> + <xsd:element name="printOptions" type="CT_PrintOptions" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pageMargins" type="CT_PageMargins" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pageSetup" type="CT_PageSetup" minOccurs="0" maxOccurs="1"/> + <xsd:element name="headerFooter" type="CT_HeaderFooter" minOccurs="0" maxOccurs="1"/> + <xsd:element name="rowBreaks" type="CT_PageBreak" minOccurs="0" maxOccurs="1"/> + <xsd:element name="colBreaks" type="CT_PageBreak" minOccurs="0" maxOccurs="1"/> + <xsd:element name="customProperties" type="CT_CustomProperties" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cellWatches" type="CT_CellWatches" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ignoredErrors" type="CT_IgnoredErrors" minOccurs="0" maxOccurs="1"/> + <xsd:element name="smartTags" type="CT_SmartTags" minOccurs="0" maxOccurs="1"/> + <xsd:element name="drawing" type="CT_Drawing" minOccurs="0" maxOccurs="1"/> + <xsd:element name="legacyDrawing" type="CT_LegacyDrawing" minOccurs="0" maxOccurs="1"/> + <xsd:element name="legacyDrawingHF" type="CT_LegacyDrawing" minOccurs="0" maxOccurs="1"/> + <xsd:element name="drawingHF" type="CT_DrawingHF" minOccurs="0" maxOccurs="1"/> + <xsd:element name="picture" type="CT_SheetBackgroundPicture" minOccurs="0" maxOccurs="1"/> + <xsd:element name="oleObjects" type="CT_OleObjects" minOccurs="0" maxOccurs="1"/> + <xsd:element name="controls" type="CT_Controls" minOccurs="0" maxOccurs="1"/> + <xsd:element name="webPublishItems" type="CT_WebPublishItems" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tableParts" type="CT_TableParts" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SheetData"> + <xsd:sequence> + <xsd:element name="row" type="CT_Row" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SheetCalcPr"> + <xsd:attribute name="fullCalcOnLoad" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_SheetFormatPr"> + <xsd:attribute name="baseColWidth" type="xsd:unsignedInt" use="optional" default="8"/> + <xsd:attribute name="defaultColWidth" type="xsd:double" use="optional"/> + <xsd:attribute name="defaultRowHeight" type="xsd:double" use="required"/> + <xsd:attribute name="customHeight" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="zeroHeight" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="thickTop" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="thickBottom" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="outlineLevelRow" type="xsd:unsignedByte" use="optional" default="0"/> + <xsd:attribute name="outlineLevelCol" type="xsd:unsignedByte" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_Cols"> + <xsd:sequence> + <xsd:element name="col" type="CT_Col" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Col"> + <xsd:attribute name="min" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="max" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="width" type="xsd:double" use="optional"/> + <xsd:attribute name="style" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="hidden" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="bestFit" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="customWidth" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="phonetic" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="outlineLevel" type="xsd:unsignedByte" use="optional" default="0"/> + <xsd:attribute name="collapsed" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:simpleType name="ST_CellSpan"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:simpleType name="ST_CellSpans"> + <xsd:list itemType="ST_CellSpan"/> + </xsd:simpleType> + <xsd:complexType name="CT_Row"> + <xsd:sequence> + <xsd:element name="c" type="CT_Cell" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="r" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="spans" type="ST_CellSpans" use="optional"/> + <xsd:attribute name="s" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="customFormat" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="ht" type="xsd:double" use="optional"/> + <xsd:attribute name="hidden" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="customHeight" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="outlineLevel" type="xsd:unsignedByte" use="optional" default="0"/> + <xsd:attribute name="collapsed" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="thickTop" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="thickBot" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="ph" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_Cell"> + <xsd:sequence> + <xsd:element name="f" type="CT_CellFormula" minOccurs="0" maxOccurs="1"/> + <xsd:element name="v" type="s:ST_Xstring" minOccurs="0" maxOccurs="1"/> + <xsd:element name="is" type="CT_Rst" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="r" type="ST_CellRef" use="optional"/> + <xsd:attribute name="s" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="t" type="ST_CellType" use="optional" default="n"/> + <xsd:attribute name="cm" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="vm" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="ph" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:simpleType name="ST_CellType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="b"/> + <xsd:enumeration value="n"/> + <xsd:enumeration value="e"/> + <xsd:enumeration value="s"/> + <xsd:enumeration value="str"/> + <xsd:enumeration value="inlineStr"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_CellFormulaType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="normal"/> + <xsd:enumeration value="array"/> + <xsd:enumeration value="dataTable"/> + <xsd:enumeration value="shared"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SheetPr"> + <xsd:sequence> + <xsd:element name="tabColor" type="CT_Color" minOccurs="0" maxOccurs="1"/> + <xsd:element name="outlinePr" type="CT_OutlinePr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pageSetUpPr" type="CT_PageSetUpPr" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="syncHorizontal" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="syncVertical" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="syncRef" type="ST_Ref" use="optional"/> + <xsd:attribute name="transitionEvaluation" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="transitionEntry" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="published" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="codeName" type="xsd:string" use="optional"/> + <xsd:attribute name="filterMode" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="enableFormatConditionsCalculation" type="xsd:boolean" use="optional" + default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_SheetDimension"> + <xsd:attribute name="ref" type="ST_Ref" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SheetViews"> + <xsd:sequence> + <xsd:element name="sheetView" type="CT_SheetView" minOccurs="1" maxOccurs="unbounded"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SheetView"> + <xsd:sequence> + <xsd:element name="pane" type="CT_Pane" minOccurs="0" maxOccurs="1"/> + <xsd:element name="selection" type="CT_Selection" minOccurs="0" maxOccurs="4"/> + <xsd:element name="pivotSelection" type="CT_PivotSelection" minOccurs="0" maxOccurs="4"/> + <xsd:element name="extLst" minOccurs="0" maxOccurs="1" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="windowProtection" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showFormulas" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showGridLines" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="showRowColHeaders" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="showZeros" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="rightToLeft" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="tabSelected" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showRuler" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="showOutlineSymbols" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="defaultGridColor" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="showWhiteSpace" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="view" type="ST_SheetViewType" use="optional" default="normal"/> + <xsd:attribute name="topLeftCell" type="ST_CellRef" use="optional"/> + <xsd:attribute name="colorId" type="xsd:unsignedInt" use="optional" default="64"/> + <xsd:attribute name="zoomScale" type="xsd:unsignedInt" use="optional" default="100"/> + <xsd:attribute name="zoomScaleNormal" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="zoomScaleSheetLayoutView" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="zoomScalePageLayoutView" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="workbookViewId" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Pane"> + <xsd:attribute name="xSplit" type="xsd:double" use="optional" default="0"/> + <xsd:attribute name="ySplit" type="xsd:double" use="optional" default="0"/> + <xsd:attribute name="topLeftCell" type="ST_CellRef" use="optional"/> + <xsd:attribute name="activePane" type="ST_Pane" use="optional" default="topLeft"/> + <xsd:attribute name="state" type="ST_PaneState" use="optional" default="split"/> + </xsd:complexType> + <xsd:complexType name="CT_PivotSelection"> + <xsd:sequence> + <xsd:element name="pivotArea" type="CT_PivotArea"/> + </xsd:sequence> + <xsd:attribute name="pane" type="ST_Pane" use="optional" default="topLeft"/> + <xsd:attribute name="showHeader" type="xsd:boolean" default="false"/> + <xsd:attribute name="label" type="xsd:boolean" default="false"/> + <xsd:attribute name="data" type="xsd:boolean" default="false"/> + <xsd:attribute name="extendable" type="xsd:boolean" default="false"/> + <xsd:attribute name="count" type="xsd:unsignedInt" default="0"/> + <xsd:attribute name="axis" type="ST_Axis" use="optional"/> + <xsd:attribute name="dimension" type="xsd:unsignedInt" default="0"/> + <xsd:attribute name="start" type="xsd:unsignedInt" default="0"/> + <xsd:attribute name="min" type="xsd:unsignedInt" default="0"/> + <xsd:attribute name="max" type="xsd:unsignedInt" default="0"/> + <xsd:attribute name="activeRow" type="xsd:unsignedInt" default="0"/> + <xsd:attribute name="activeCol" type="xsd:unsignedInt" default="0"/> + <xsd:attribute name="previousRow" type="xsd:unsignedInt" default="0"/> + <xsd:attribute name="previousCol" type="xsd:unsignedInt" default="0"/> + <xsd:attribute name="click" type="xsd:unsignedInt" default="0"/> + <xsd:attribute ref="r:id" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Selection"> + <xsd:attribute name="pane" type="ST_Pane" use="optional" default="topLeft"/> + <xsd:attribute name="activeCell" type="ST_CellRef" use="optional"/> + <xsd:attribute name="activeCellId" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="sqref" type="ST_Sqref" use="optional" default="A1"/> + </xsd:complexType> + <xsd:simpleType name="ST_Pane"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="bottomRight"/> + <xsd:enumeration value="topRight"/> + <xsd:enumeration value="bottomLeft"/> + <xsd:enumeration value="topLeft"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PageBreak"> + <xsd:sequence> + <xsd:element name="brk" type="CT_Break" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="manualBreakCount" type="xsd:unsignedInt" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_Break"> + <xsd:attribute name="id" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="min" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="max" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="man" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="pt" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:simpleType name="ST_SheetViewType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="normal"/> + <xsd:enumeration value="pageBreakPreview"/> + <xsd:enumeration value="pageLayout"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_OutlinePr"> + <xsd:attribute name="applyStyles" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="summaryBelow" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="summaryRight" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="showOutlineSymbols" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_PageSetUpPr"> + <xsd:attribute name="autoPageBreaks" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="fitToPage" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_DataConsolidate"> + <xsd:sequence> + <xsd:element name="dataRefs" type="CT_DataRefs" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="function" type="ST_DataConsolidateFunction" use="optional" default="sum"/> + <xsd:attribute name="startLabels" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="leftLabels" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="topLabels" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="link" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:simpleType name="ST_DataConsolidateFunction"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="average"/> + <xsd:enumeration value="count"/> + <xsd:enumeration value="countNums"/> + <xsd:enumeration value="max"/> + <xsd:enumeration value="min"/> + <xsd:enumeration value="product"/> + <xsd:enumeration value="stdDev"/> + <xsd:enumeration value="stdDevp"/> + <xsd:enumeration value="sum"/> + <xsd:enumeration value="var"/> + <xsd:enumeration value="varp"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_DataRefs"> + <xsd:sequence> + <xsd:element name="dataRef" type="CT_DataRef" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_DataRef"> + <xsd:attribute name="ref" type="ST_Ref" use="optional"/> + <xsd:attribute name="name" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="sheet" type="s:ST_Xstring" use="optional"/> + <xsd:attribute ref="r:id" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_MergeCells"> + <xsd:sequence> + <xsd:element name="mergeCell" type="CT_MergeCell" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_MergeCell"> + <xsd:attribute name="ref" type="ST_Ref" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SmartTags"> + <xsd:sequence> + <xsd:element name="cellSmartTags" type="CT_CellSmartTags" minOccurs="1" maxOccurs="unbounded" + /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_CellSmartTags"> + <xsd:sequence> + <xsd:element name="cellSmartTag" type="CT_CellSmartTag" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="r" type="ST_CellRef" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_CellSmartTag"> + <xsd:sequence> + <xsd:element name="cellSmartTagPr" minOccurs="0" maxOccurs="unbounded" + type="CT_CellSmartTagPr"/> + </xsd:sequence> + <xsd:attribute name="type" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="deleted" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="xmlBased" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_CellSmartTagPr"> + <xsd:attribute name="key" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="val" type="s:ST_Xstring" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Drawing"> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_LegacyDrawing"> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_DrawingHF"> + <xsd:attribute ref="r:id" use="required"/> + <xsd:attribute name="lho" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="lhe" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="lhf" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="cho" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="che" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="chf" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="rho" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="rhe" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="rhf" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="lfo" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="lfe" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="lff" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="cfo" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="cfe" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="cff" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="rfo" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="rfe" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="rff" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_CustomSheetViews"> + <xsd:sequence> + <xsd:element name="customSheetView" minOccurs="1" maxOccurs="unbounded" + type="CT_CustomSheetView"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_CustomSheetView"> + <xsd:sequence> + <xsd:element name="pane" type="CT_Pane" minOccurs="0" maxOccurs="1"/> + <xsd:element name="selection" type="CT_Selection" minOccurs="0" maxOccurs="1"/> + <xsd:element name="rowBreaks" type="CT_PageBreak" minOccurs="0" maxOccurs="1"/> + <xsd:element name="colBreaks" type="CT_PageBreak" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pageMargins" type="CT_PageMargins" minOccurs="0" maxOccurs="1"/> + <xsd:element name="printOptions" type="CT_PrintOptions" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pageSetup" type="CT_PageSetup" minOccurs="0" maxOccurs="1"/> + <xsd:element name="headerFooter" type="CT_HeaderFooter" minOccurs="0" maxOccurs="1"/> + <xsd:element name="autoFilter" type="CT_AutoFilter" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="guid" type="s:ST_Guid" use="required"/> + <xsd:attribute name="scale" type="xsd:unsignedInt" default="100"/> + <xsd:attribute name="colorId" type="xsd:unsignedInt" default="64"/> + <xsd:attribute name="showPageBreaks" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showFormulas" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showGridLines" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="showRowCol" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="outlineSymbols" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="zeroValues" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="fitToPage" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="printArea" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="filter" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showAutoFilter" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="hiddenRows" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="hiddenColumns" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="state" type="ST_SheetState" default="visible"/> + <xsd:attribute name="filterUnique" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="view" type="ST_SheetViewType" default="normal"/> + <xsd:attribute name="showRuler" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="topLeftCell" type="ST_CellRef" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_DataValidations"> + <xsd:sequence> + <xsd:element name="dataValidation" type="CT_DataValidation" minOccurs="1" + maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="disablePrompts" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="xWindow" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="yWindow" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_DataValidation"> + <xsd:sequence> + <xsd:element name="formula1" type="ST_Formula" minOccurs="0" maxOccurs="1"/> + <xsd:element name="formula2" type="ST_Formula" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="type" type="ST_DataValidationType" use="optional" default="none"/> + <xsd:attribute name="errorStyle" type="ST_DataValidationErrorStyle" use="optional" + default="stop"/> + <xsd:attribute name="imeMode" type="ST_DataValidationImeMode" use="optional" default="noControl"/> + <xsd:attribute name="operator" type="ST_DataValidationOperator" use="optional" default="between"/> + <xsd:attribute name="allowBlank" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showDropDown" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showInputMessage" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showErrorMessage" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="errorTitle" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="error" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="promptTitle" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="prompt" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="sqref" type="ST_Sqref" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_DataValidationType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="whole"/> + <xsd:enumeration value="decimal"/> + <xsd:enumeration value="list"/> + <xsd:enumeration value="date"/> + <xsd:enumeration value="time"/> + <xsd:enumeration value="textLength"/> + <xsd:enumeration value="custom"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_DataValidationOperator"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="between"/> + <xsd:enumeration value="notBetween"/> + <xsd:enumeration value="equal"/> + <xsd:enumeration value="notEqual"/> + <xsd:enumeration value="lessThan"/> + <xsd:enumeration value="lessThanOrEqual"/> + <xsd:enumeration value="greaterThan"/> + <xsd:enumeration value="greaterThanOrEqual"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_DataValidationErrorStyle"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="stop"/> + <xsd:enumeration value="warning"/> + <xsd:enumeration value="information"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_DataValidationImeMode"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="noControl"/> + <xsd:enumeration value="off"/> + <xsd:enumeration value="on"/> + <xsd:enumeration value="disabled"/> + <xsd:enumeration value="hiragana"/> + <xsd:enumeration value="fullKatakana"/> + <xsd:enumeration value="halfKatakana"/> + <xsd:enumeration value="fullAlpha"/> + <xsd:enumeration value="halfAlpha"/> + <xsd:enumeration value="fullHangul"/> + <xsd:enumeration value="halfHangul"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_CfType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="expression"/> + <xsd:enumeration value="cellIs"/> + <xsd:enumeration value="colorScale"/> + <xsd:enumeration value="dataBar"/> + <xsd:enumeration value="iconSet"/> + <xsd:enumeration value="top10"/> + <xsd:enumeration value="uniqueValues"/> + <xsd:enumeration value="duplicateValues"/> + <xsd:enumeration value="containsText"/> + <xsd:enumeration value="notContainsText"/> + <xsd:enumeration value="beginsWith"/> + <xsd:enumeration value="endsWith"/> + <xsd:enumeration value="containsBlanks"/> + <xsd:enumeration value="notContainsBlanks"/> + <xsd:enumeration value="containsErrors"/> + <xsd:enumeration value="notContainsErrors"/> + <xsd:enumeration value="timePeriod"/> + <xsd:enumeration value="aboveAverage"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TimePeriod"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="today"/> + <xsd:enumeration value="yesterday"/> + <xsd:enumeration value="tomorrow"/> + <xsd:enumeration value="last7Days"/> + <xsd:enumeration value="thisMonth"/> + <xsd:enumeration value="lastMonth"/> + <xsd:enumeration value="nextMonth"/> + <xsd:enumeration value="thisWeek"/> + <xsd:enumeration value="lastWeek"/> + <xsd:enumeration value="nextWeek"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ConditionalFormattingOperator"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="lessThan"/> + <xsd:enumeration value="lessThanOrEqual"/> + <xsd:enumeration value="equal"/> + <xsd:enumeration value="notEqual"/> + <xsd:enumeration value="greaterThanOrEqual"/> + <xsd:enumeration value="greaterThan"/> + <xsd:enumeration value="between"/> + <xsd:enumeration value="notBetween"/> + <xsd:enumeration value="containsText"/> + <xsd:enumeration value="notContains"/> + <xsd:enumeration value="beginsWith"/> + <xsd:enumeration value="endsWith"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_CfvoType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="num"/> + <xsd:enumeration value="percent"/> + <xsd:enumeration value="max"/> + <xsd:enumeration value="min"/> + <xsd:enumeration value="formula"/> + <xsd:enumeration value="percentile"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_ConditionalFormatting"> + <xsd:sequence> + <xsd:element name="cfRule" type="CT_CfRule" minOccurs="1" maxOccurs="unbounded"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="pivot" type="xsd:boolean" default="false"/> + <xsd:attribute name="sqref" type="ST_Sqref"/> + </xsd:complexType> + <xsd:complexType name="CT_CfRule"> + <xsd:sequence> + <xsd:element name="formula" type="ST_Formula" minOccurs="0" maxOccurs="3"/> + <xsd:element name="colorScale" type="CT_ColorScale" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dataBar" type="CT_DataBar" minOccurs="0" maxOccurs="1"/> + <xsd:element name="iconSet" type="CT_IconSet" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="type" type="ST_CfType"/> + <xsd:attribute name="dxfId" type="ST_DxfId" use="optional"/> + <xsd:attribute name="priority" type="xsd:int" use="required"/> + <xsd:attribute name="stopIfTrue" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="aboveAverage" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="percent" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="bottom" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="operator" type="ST_ConditionalFormattingOperator" use="optional"/> + <xsd:attribute name="text" type="xsd:string" use="optional"/> + <xsd:attribute name="timePeriod" type="ST_TimePeriod" use="optional"/> + <xsd:attribute name="rank" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="stdDev" type="xsd:int" use="optional"/> + <xsd:attribute name="equalAverage" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_Hyperlinks"> + <xsd:sequence> + <xsd:element name="hyperlink" type="CT_Hyperlink" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Hyperlink"> + <xsd:attribute name="ref" type="ST_Ref" use="required"/> + <xsd:attribute ref="r:id" use="optional"/> + <xsd:attribute name="location" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="tooltip" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="display" type="s:ST_Xstring" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_CellFormula"> + <xsd:simpleContent> + <xsd:extension base="ST_Formula"> + <xsd:attribute name="t" type="ST_CellFormulaType" use="optional" default="normal"/> + <xsd:attribute name="aca" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="ref" type="ST_Ref" use="optional"/> + <xsd:attribute name="dt2D" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="dtr" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="del1" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="del2" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="r1" type="ST_CellRef" use="optional"/> + <xsd:attribute name="r2" type="ST_CellRef" use="optional"/> + <xsd:attribute name="ca" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="si" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="bx" type="xsd:boolean" use="optional" default="false"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:complexType name="CT_ColorScale"> + <xsd:sequence> + <xsd:element name="cfvo" type="CT_Cfvo" minOccurs="2" maxOccurs="unbounded"/> + <xsd:element name="color" type="CT_Color" minOccurs="2" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DataBar"> + <xsd:sequence> + <xsd:element name="cfvo" type="CT_Cfvo" minOccurs="2" maxOccurs="2"/> + <xsd:element name="color" type="CT_Color" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="minLength" type="xsd:unsignedInt" use="optional" default="10"/> + <xsd:attribute name="maxLength" type="xsd:unsignedInt" use="optional" default="90"/> + <xsd:attribute name="showValue" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_IconSet"> + <xsd:sequence> + <xsd:element name="cfvo" type="CT_Cfvo" minOccurs="2" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="iconSet" type="ST_IconSetType" use="optional" default="3TrafficLights1"/> + <xsd:attribute name="showValue" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="percent" type="xsd:boolean" default="true"/> + <xsd:attribute name="reverse" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_Cfvo"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="type" type="ST_CfvoType" use="required"/> + <xsd:attribute name="val" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="gte" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_PageMargins"> + <xsd:attribute name="left" type="xsd:double" use="required"/> + <xsd:attribute name="right" type="xsd:double" use="required"/> + <xsd:attribute name="top" type="xsd:double" use="required"/> + <xsd:attribute name="bottom" type="xsd:double" use="required"/> + <xsd:attribute name="header" type="xsd:double" use="required"/> + <xsd:attribute name="footer" type="xsd:double" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_PrintOptions"> + <xsd:attribute name="horizontalCentered" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="verticalCentered" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="headings" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="gridLines" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="gridLinesSet" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_PageSetup"> + <xsd:attribute name="paperSize" type="xsd:unsignedInt" use="optional" default="1"/> + <xsd:attribute name="paperHeight" type="s:ST_PositiveUniversalMeasure" use="optional"/> + <xsd:attribute name="paperWidth" type="s:ST_PositiveUniversalMeasure" use="optional"/> + <xsd:attribute name="scale" type="xsd:unsignedInt" use="optional" default="100"/> + <xsd:attribute name="firstPageNumber" type="xsd:unsignedInt" use="optional" default="1"/> + <xsd:attribute name="fitToWidth" type="xsd:unsignedInt" use="optional" default="1"/> + <xsd:attribute name="fitToHeight" type="xsd:unsignedInt" use="optional" default="1"/> + <xsd:attribute name="pageOrder" type="ST_PageOrder" use="optional" default="downThenOver"/> + <xsd:attribute name="orientation" type="ST_Orientation" use="optional" default="default"/> + <xsd:attribute name="usePrinterDefaults" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="blackAndWhite" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="draft" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="cellComments" type="ST_CellComments" use="optional" default="none"/> + <xsd:attribute name="useFirstPageNumber" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="errors" type="ST_PrintError" use="optional" default="displayed"/> + <xsd:attribute name="horizontalDpi" type="xsd:unsignedInt" use="optional" default="600"/> + <xsd:attribute name="verticalDpi" type="xsd:unsignedInt" use="optional" default="600"/> + <xsd:attribute name="copies" type="xsd:unsignedInt" use="optional" default="1"/> + <xsd:attribute ref="r:id" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_PageOrder"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="downThenOver"/> + <xsd:enumeration value="overThenDown"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Orientation"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="default"/> + <xsd:enumeration value="portrait"/> + <xsd:enumeration value="landscape"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_CellComments"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="asDisplayed"/> + <xsd:enumeration value="atEnd"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_HeaderFooter"> + <xsd:sequence> + <xsd:element name="oddHeader" type="s:ST_Xstring" minOccurs="0" maxOccurs="1"/> + <xsd:element name="oddFooter" type="s:ST_Xstring" minOccurs="0" maxOccurs="1"/> + <xsd:element name="evenHeader" type="s:ST_Xstring" minOccurs="0" maxOccurs="1"/> + <xsd:element name="evenFooter" type="s:ST_Xstring" minOccurs="0" maxOccurs="1"/> + <xsd:element name="firstHeader" type="s:ST_Xstring" minOccurs="0" maxOccurs="1"/> + <xsd:element name="firstFooter" type="s:ST_Xstring" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="differentOddEven" type="xsd:boolean" default="false"/> + <xsd:attribute name="differentFirst" type="xsd:boolean" default="false"/> + <xsd:attribute name="scaleWithDoc" type="xsd:boolean" default="true"/> + <xsd:attribute name="alignWithMargins" type="xsd:boolean" default="true"/> + </xsd:complexType> + <xsd:simpleType name="ST_PrintError"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="displayed"/> + <xsd:enumeration value="blank"/> + <xsd:enumeration value="dash"/> + <xsd:enumeration value="NA"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Scenarios"> + <xsd:sequence> + <xsd:element name="scenario" type="CT_Scenario" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="current" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="show" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="sqref" type="ST_Sqref" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_SheetProtection"> + <xsd:attribute name="password" type="ST_UnsignedShortHex" use="optional"/> + <xsd:attribute name="algorithmName" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="hashValue" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="saltValue" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="spinCount" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="sheet" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="objects" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="scenarios" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="formatCells" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="formatColumns" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="formatRows" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="insertColumns" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="insertRows" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="insertHyperlinks" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="deleteColumns" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="deleteRows" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="selectLockedCells" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="sort" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="autoFilter" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="pivotTables" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="selectUnlockedCells" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_ProtectedRanges"> + <xsd:sequence> + <xsd:element name="protectedRange" type="CT_ProtectedRange" minOccurs="1" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ProtectedRange"> + <xsd:sequence> + <xsd:element name="securityDescriptor" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="password" type="ST_UnsignedShortHex" use="optional"/> + <xsd:attribute name="sqref" type="ST_Sqref" use="required"/> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="securityDescriptor" type="xsd:string" use="optional"/> + <xsd:attribute name="algorithmName" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="hashValue" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="saltValue" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="spinCount" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Scenario"> + <xsd:sequence> + <xsd:element name="inputCells" type="CT_InputCells" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="locked" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="hidden" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="user" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="comment" type="s:ST_Xstring" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_InputCells"> + <xsd:attribute name="r" type="ST_CellRef" use="required"/> + <xsd:attribute name="deleted" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="undone" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="val" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="numFmtId" type="ST_NumFmtId" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_CellWatches"> + <xsd:sequence> + <xsd:element name="cellWatch" type="CT_CellWatch" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_CellWatch"> + <xsd:attribute name="r" type="ST_CellRef" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Chartsheet"> + <xsd:sequence> + <xsd:element name="sheetPr" type="CT_ChartsheetPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sheetViews" type="CT_ChartsheetViews" minOccurs="1" maxOccurs="1"/> + <xsd:element name="sheetProtection" type="CT_ChartsheetProtection" minOccurs="0" maxOccurs="1"/> + <xsd:element name="customSheetViews" type="CT_CustomChartsheetViews" minOccurs="0" + maxOccurs="1"/> + <xsd:element name="pageMargins" minOccurs="0" type="CT_PageMargins"/> + <xsd:element name="pageSetup" type="CT_CsPageSetup" minOccurs="0" maxOccurs="1"/> + <xsd:element name="headerFooter" minOccurs="0" type="CT_HeaderFooter"/> + <xsd:element name="drawing" type="CT_Drawing" minOccurs="1" maxOccurs="1"/> + <xsd:element name="legacyDrawing" type="CT_LegacyDrawing" minOccurs="0" maxOccurs="1"/> + <xsd:element name="legacyDrawingHF" type="CT_LegacyDrawing" minOccurs="0" maxOccurs="1"/> + <xsd:element name="drawingHF" type="CT_DrawingHF" minOccurs="0" maxOccurs="1"/> + <xsd:element name="picture" type="CT_SheetBackgroundPicture" minOccurs="0" maxOccurs="1"/> + <xsd:element name="webPublishItems" type="CT_WebPublishItems" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ChartsheetPr"> + <xsd:sequence> + <xsd:element name="tabColor" type="CT_Color" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="published" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="codeName" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_ChartsheetViews"> + <xsd:sequence> + <xsd:element name="sheetView" type="CT_ChartsheetView" minOccurs="1" maxOccurs="unbounded"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ChartsheetView"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="tabSelected" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="zoomScale" type="xsd:unsignedInt" default="100" use="optional"/> + <xsd:attribute name="workbookViewId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="zoomToFit" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_ChartsheetProtection"> + <xsd:attribute name="password" type="ST_UnsignedShortHex" use="optional"/> + <xsd:attribute name="algorithmName" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="hashValue" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="saltValue" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="spinCount" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="content" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="objects" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_CsPageSetup"> + <xsd:attribute name="paperSize" type="xsd:unsignedInt" use="optional" default="1"/> + <xsd:attribute name="paperHeight" type="s:ST_PositiveUniversalMeasure" use="optional"/> + <xsd:attribute name="paperWidth" type="s:ST_PositiveUniversalMeasure" use="optional"/> + <xsd:attribute name="firstPageNumber" type="xsd:unsignedInt" use="optional" default="1"/> + <xsd:attribute name="orientation" type="ST_Orientation" use="optional" default="default"/> + <xsd:attribute name="usePrinterDefaults" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="blackAndWhite" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="draft" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="useFirstPageNumber" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="horizontalDpi" type="xsd:unsignedInt" use="optional" default="600"/> + <xsd:attribute name="verticalDpi" type="xsd:unsignedInt" use="optional" default="600"/> + <xsd:attribute name="copies" type="xsd:unsignedInt" use="optional" default="1"/> + <xsd:attribute ref="r:id" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_CustomChartsheetViews"> + <xsd:sequence> + <xsd:element name="customSheetView" minOccurs="0" maxOccurs="unbounded" + type="CT_CustomChartsheetView"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_CustomChartsheetView"> + <xsd:sequence> + <xsd:element name="pageMargins" type="CT_PageMargins" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pageSetup" type="CT_CsPageSetup" minOccurs="0" maxOccurs="1"/> + <xsd:element name="headerFooter" type="CT_HeaderFooter" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="guid" type="s:ST_Guid" use="required"/> + <xsd:attribute name="scale" type="xsd:unsignedInt" default="100"/> + <xsd:attribute name="state" type="ST_SheetState" default="visible"/> + <xsd:attribute name="zoomToFit" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_CustomProperties"> + <xsd:sequence> + <xsd:element name="customPr" type="CT_CustomProperty" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_CustomProperty"> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_OleObjects"> + <xsd:sequence> + <xsd:element name="oleObject" type="CT_OleObject" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_OleObject"> + <xsd:sequence> + <xsd:element name="objectPr" type="CT_ObjectPr" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="progId" type="xsd:string" use="optional"/> + <xsd:attribute name="dvAspect" type="ST_DvAspect" use="optional" default="DVASPECT_CONTENT"/> + <xsd:attribute name="link" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="oleUpdate" type="ST_OleUpdate" use="optional"/> + <xsd:attribute name="autoLoad" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="shapeId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute ref="r:id" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_ObjectPr"> + <xsd:sequence> + <xsd:element name="anchor" type="CT_ObjectAnchor" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="locked" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="defaultSize" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="print" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="disabled" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="uiObject" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="autoFill" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="autoLine" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="autoPict" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="macro" type="ST_Formula" use="optional"/> + <xsd:attribute name="altText" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="dde" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute ref="r:id" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_DvAspect"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="DVASPECT_CONTENT"/> + <xsd:enumeration value="DVASPECT_ICON"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_OleUpdate"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="OLEUPDATE_ALWAYS"/> + <xsd:enumeration value="OLEUPDATE_ONCALL"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_WebPublishItems"> + <xsd:sequence> + <xsd:element name="webPublishItem" type="CT_WebPublishItem" minOccurs="1" + maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_WebPublishItem"> + <xsd:attribute name="id" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="divId" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="sourceType" type="ST_WebSourceType" use="required"/> + <xsd:attribute name="sourceRef" type="ST_Ref" use="optional"/> + <xsd:attribute name="sourceObject" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="destinationFile" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="title" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="autoRepublish" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_Controls"> + <xsd:sequence> + <xsd:element name="control" type="CT_Control" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Control"> + <xsd:sequence> + <xsd:element name="controlPr" type="CT_ControlPr" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="shapeId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute ref="r:id" use="required"/> + <xsd:attribute name="name" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_ControlPr"> + <xsd:sequence> + <xsd:element name="anchor" type="CT_ObjectAnchor" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="locked" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="defaultSize" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="print" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="disabled" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="recalcAlways" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="uiObject" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="autoFill" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="autoLine" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="autoPict" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="macro" type="ST_Formula" use="optional"/> + <xsd:attribute name="altText" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="linkedCell" type="ST_Formula" use="optional"/> + <xsd:attribute name="listFillRange" type="ST_Formula" use="optional"/> + <xsd:attribute name="cf" type="s:ST_Xstring" use="optional" default="pict"/> + <xsd:attribute ref="r:id" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_WebSourceType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="sheet"/> + <xsd:enumeration value="printArea"/> + <xsd:enumeration value="autoFilter"/> + <xsd:enumeration value="range"/> + <xsd:enumeration value="chart"/> + <xsd:enumeration value="pivotTable"/> + <xsd:enumeration value="query"/> + <xsd:enumeration value="label"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_IgnoredErrors"> + <xsd:sequence> + <xsd:element name="ignoredError" type="CT_IgnoredError" minOccurs="1" maxOccurs="unbounded"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_IgnoredError"> + <xsd:attribute name="sqref" type="ST_Sqref" use="required"/> + <xsd:attribute name="evalError" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="twoDigitTextYear" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="numberStoredAsText" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="formula" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="formulaRange" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="unlockedFormula" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="emptyCellReference" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="listDataValidation" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="calculatedColumn" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:simpleType name="ST_PaneState"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="split"/> + <xsd:enumeration value="frozen"/> + <xsd:enumeration value="frozenSplit"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TableParts"> + <xsd:sequence> + <xsd:element name="tablePart" type="CT_TablePart" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TablePart"> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:element name="metadata" type="CT_Metadata"/> + <xsd:complexType name="CT_Metadata"> + <xsd:sequence> + <xsd:element name="metadataTypes" type="CT_MetadataTypes" minOccurs="0" maxOccurs="1"/> + <xsd:element name="metadataStrings" type="CT_MetadataStrings" minOccurs="0" maxOccurs="1"/> + <xsd:element name="mdxMetadata" type="CT_MdxMetadata" minOccurs="0" maxOccurs="1"/> + <xsd:element name="futureMetadata" type="CT_FutureMetadata" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element name="cellMetadata" type="CT_MetadataBlocks" minOccurs="0" maxOccurs="1"/> + <xsd:element name="valueMetadata" type="CT_MetadataBlocks" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" minOccurs="0" maxOccurs="1" type="CT_ExtensionList"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_MetadataTypes"> + <xsd:sequence> + <xsd:element name="metadataType" type="CT_MetadataType" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_MetadataType"> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="minSupportedVersion" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="ghostRow" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="ghostCol" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="edit" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="delete" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="copy" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="pasteAll" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="pasteFormulas" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="pasteValues" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="pasteFormats" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="pasteComments" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="pasteDataValidation" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="pasteBorders" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="pasteColWidths" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="pasteNumberFormats" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="merge" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="splitFirst" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="splitAll" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="rowColShift" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="clearAll" type="xsd:boolean" default="false"/> + <xsd:attribute name="clearFormats" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="clearContents" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="clearComments" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="assign" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="coerce" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="adjust" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="cellMeta" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_MetadataBlocks"> + <xsd:sequence> + <xsd:element name="bk" type="CT_MetadataBlock" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_MetadataBlock"> + <xsd:sequence> + <xsd:element name="rc" type="CT_MetadataRecord" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_MetadataRecord"> + <xsd:attribute name="t" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="v" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_FutureMetadata"> + <xsd:sequence> + <xsd:element name="bk" type="CT_FutureMetadataBlock" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="extLst" minOccurs="0" maxOccurs="1" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_FutureMetadataBlock"> + <xsd:sequence> + <xsd:element name="extLst" minOccurs="0" maxOccurs="1" type="CT_ExtensionList"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_MdxMetadata"> + <xsd:sequence> + <xsd:element name="mdx" type="CT_Mdx" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_Mdx"> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="t" type="CT_MdxTuple"/> + <xsd:element name="ms" type="CT_MdxSet"/> + <xsd:element name="p" type="CT_MdxMemeberProp"/> + <xsd:element name="k" type="CT_MdxKPI"/> + </xsd:choice> + <xsd:attribute name="n" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="f" type="ST_MdxFunctionType" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_MdxFunctionType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="m"/> + <xsd:enumeration value="v"/> + <xsd:enumeration value="s"/> + <xsd:enumeration value="c"/> + <xsd:enumeration value="r"/> + <xsd:enumeration value="p"/> + <xsd:enumeration value="k"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_MdxTuple"> + <xsd:sequence> + <xsd:element name="n" type="CT_MetadataStringIndex" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="c" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="ct" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="si" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="fi" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="bc" type="ST_UnsignedIntHex" use="optional"/> + <xsd:attribute name="fc" type="ST_UnsignedIntHex" use="optional"/> + <xsd:attribute name="i" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="u" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="st" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="b" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_MdxSet"> + <xsd:sequence> + <xsd:element name="n" type="CT_MetadataStringIndex" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="ns" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="c" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="o" type="ST_MdxSetOrder" use="optional" default="u"/> + </xsd:complexType> + <xsd:simpleType name="ST_MdxSetOrder"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="u"/> + <xsd:enumeration value="a"/> + <xsd:enumeration value="d"/> + <xsd:enumeration value="aa"/> + <xsd:enumeration value="ad"/> + <xsd:enumeration value="na"/> + <xsd:enumeration value="nd"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_MdxMemeberProp"> + <xsd:attribute name="n" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="np" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_MdxKPI"> + <xsd:attribute name="n" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="np" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="p" type="ST_MdxKPIProperty" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_MdxKPIProperty"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="v"/> + <xsd:enumeration value="g"/> + <xsd:enumeration value="s"/> + <xsd:enumeration value="t"/> + <xsd:enumeration value="w"/> + <xsd:enumeration value="m"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_MetadataStringIndex"> + <xsd:attribute name="x" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="s" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_MetadataStrings"> + <xsd:sequence> + <xsd:element name="s" type="CT_XStringElement" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional" default="0"/> + </xsd:complexType> + <xsd:element name="singleXmlCells" type="CT_SingleXmlCells"/> + <xsd:complexType name="CT_SingleXmlCells"> + <xsd:sequence> + <xsd:element name="singleXmlCell" type="CT_SingleXmlCell" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SingleXmlCell"> + <xsd:sequence> + <xsd:element name="xmlCellPr" type="CT_XmlCellPr" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="r" type="ST_CellRef" use="required"/> + <xsd:attribute name="connectionId" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_XmlCellPr"> + <xsd:sequence> + <xsd:element name="xmlPr" type="CT_XmlPr" minOccurs="1" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="uniqueName" type="s:ST_Xstring" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_XmlPr"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="mapId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="xpath" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="xmlDataType" type="ST_XmlDataType" use="required"/> + </xsd:complexType> + <xsd:element name="styleSheet" type="CT_Stylesheet"/> + <xsd:complexType name="CT_Stylesheet"> + <xsd:sequence> + <xsd:element name="numFmts" type="CT_NumFmts" minOccurs="0" maxOccurs="1"/> + <xsd:element name="fonts" type="CT_Fonts" minOccurs="0" maxOccurs="1"/> + <xsd:element name="fills" type="CT_Fills" minOccurs="0" maxOccurs="1"/> + <xsd:element name="borders" type="CT_Borders" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cellStyleXfs" type="CT_CellStyleXfs" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cellXfs" type="CT_CellXfs" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cellStyles" type="CT_CellStyles" minOccurs="0" maxOccurs="1"/> + <xsd:element name="dxfs" type="CT_Dxfs" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tableStyles" type="CT_TableStyles" minOccurs="0" maxOccurs="1"/> + <xsd:element name="colors" type="CT_Colors" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_CellAlignment"> + <xsd:attribute name="horizontal" type="ST_HorizontalAlignment" use="optional"/> + <xsd:attribute name="vertical" type="ST_VerticalAlignment" default="bottom" use="optional"/> + <xsd:attribute name="textRotation" type="ST_TextRotation" use="optional"/> + <xsd:attribute name="wrapText" type="xsd:boolean" use="optional"/> + <xsd:attribute name="indent" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="relativeIndent" type="xsd:int" use="optional"/> + <xsd:attribute name="justifyLastLine" type="xsd:boolean" use="optional"/> + <xsd:attribute name="shrinkToFit" type="xsd:boolean" use="optional"/> + <xsd:attribute name="readingOrder" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_TextRotation"> + <xsd:union> + <xsd:simpleType> + <xsd:restriction base="xsd:nonNegativeInteger"> + <xsd:maxInclusive value="180"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType> + <xsd:restriction base="xsd:nonNegativeInteger"> + <xsd:enumeration value="255"/> + </xsd:restriction> + </xsd:simpleType> + </xsd:union> + </xsd:simpleType> + <xsd:simpleType name="ST_BorderStyle"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="thin"/> + <xsd:enumeration value="medium"/> + <xsd:enumeration value="dashed"/> + <xsd:enumeration value="dotted"/> + <xsd:enumeration value="thick"/> + <xsd:enumeration value="double"/> + <xsd:enumeration value="hair"/> + <xsd:enumeration value="mediumDashed"/> + <xsd:enumeration value="dashDot"/> + <xsd:enumeration value="mediumDashDot"/> + <xsd:enumeration value="dashDotDot"/> + <xsd:enumeration value="mediumDashDotDot"/> + <xsd:enumeration value="slantDashDot"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Borders"> + <xsd:sequence> + <xsd:element name="border" type="CT_Border" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Border"> + <xsd:sequence> + <xsd:element name="start" type="CT_BorderPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="end" type="CT_BorderPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="left" type="CT_BorderPr" minOccurs="0"/> + <xsd:element name="right" type="CT_BorderPr" minOccurs="0"/> + <xsd:element name="top" type="CT_BorderPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="bottom" type="CT_BorderPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="diagonal" type="CT_BorderPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="vertical" type="CT_BorderPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="horizontal" type="CT_BorderPr" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="diagonalUp" type="xsd:boolean" use="optional"/> + <xsd:attribute name="diagonalDown" type="xsd:boolean" use="optional"/> + <xsd:attribute name="outline" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_BorderPr"> + <xsd:sequence> + <xsd:element name="color" type="CT_Color" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="style" type="ST_BorderStyle" use="optional" default="none"/> + </xsd:complexType> + <xsd:complexType name="CT_CellProtection"> + <xsd:attribute name="locked" type="xsd:boolean" use="optional"/> + <xsd:attribute name="hidden" type="xsd:boolean" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Fonts"> + <xsd:sequence> + <xsd:element name="font" type="CT_Font" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Fills"> + <xsd:sequence> + <xsd:element name="fill" type="CT_Fill" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Fill"> + <xsd:choice minOccurs="1" maxOccurs="1"> + <xsd:element name="patternFill" type="CT_PatternFill" minOccurs="0" maxOccurs="1"/> + <xsd:element name="gradientFill" type="CT_GradientFill" minOccurs="0" maxOccurs="1"/> + </xsd:choice> + </xsd:complexType> + <xsd:complexType name="CT_PatternFill"> + <xsd:sequence> + <xsd:element name="fgColor" type="CT_Color" minOccurs="0" maxOccurs="1"/> + <xsd:element name="bgColor" type="CT_Color" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="patternType" type="ST_PatternType" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Color"> + <xsd:attribute name="auto" type="xsd:boolean" use="optional"/> + <xsd:attribute name="indexed" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="rgb" type="ST_UnsignedIntHex" use="optional"/> + <xsd:attribute name="theme" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="tint" type="xsd:double" use="optional" default="0.0"/> + </xsd:complexType> + <xsd:simpleType name="ST_PatternType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="solid"/> + <xsd:enumeration value="mediumGray"/> + <xsd:enumeration value="darkGray"/> + <xsd:enumeration value="lightGray"/> + <xsd:enumeration value="darkHorizontal"/> + <xsd:enumeration value="darkVertical"/> + <xsd:enumeration value="darkDown"/> + <xsd:enumeration value="darkUp"/> + <xsd:enumeration value="darkGrid"/> + <xsd:enumeration value="darkTrellis"/> + <xsd:enumeration value="lightHorizontal"/> + <xsd:enumeration value="lightVertical"/> + <xsd:enumeration value="lightDown"/> + <xsd:enumeration value="lightUp"/> + <xsd:enumeration value="lightGrid"/> + <xsd:enumeration value="lightTrellis"/> + <xsd:enumeration value="gray125"/> + <xsd:enumeration value="gray0625"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_GradientFill"> + <xsd:sequence> + <xsd:element name="stop" type="CT_GradientStop" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="type" type="ST_GradientType" use="optional" default="linear"/> + <xsd:attribute name="degree" type="xsd:double" use="optional" default="0"/> + <xsd:attribute name="left" type="xsd:double" use="optional" default="0"/> + <xsd:attribute name="right" type="xsd:double" use="optional" default="0"/> + <xsd:attribute name="top" type="xsd:double" use="optional" default="0"/> + <xsd:attribute name="bottom" type="xsd:double" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_GradientStop"> + <xsd:sequence> + <xsd:element name="color" type="CT_Color" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="position" type="xsd:double" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_GradientType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="linear"/> + <xsd:enumeration value="path"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_HorizontalAlignment"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="general"/> + <xsd:enumeration value="left"/> + <xsd:enumeration value="center"/> + <xsd:enumeration value="right"/> + <xsd:enumeration value="fill"/> + <xsd:enumeration value="justify"/> + <xsd:enumeration value="centerContinuous"/> + <xsd:enumeration value="distributed"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_VerticalAlignment"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="top"/> + <xsd:enumeration value="center"/> + <xsd:enumeration value="bottom"/> + <xsd:enumeration value="justify"/> + <xsd:enumeration value="distributed"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_NumFmts"> + <xsd:sequence> + <xsd:element name="numFmt" type="CT_NumFmt" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_NumFmt"> + <xsd:attribute name="numFmtId" type="ST_NumFmtId" use="required"/> + <xsd:attribute name="formatCode" type="s:ST_Xstring" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_CellStyleXfs"> + <xsd:sequence> + <xsd:element name="xf" type="CT_Xf" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_CellXfs"> + <xsd:sequence> + <xsd:element name="xf" type="CT_Xf" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Xf"> + <xsd:sequence> + <xsd:element name="alignment" type="CT_CellAlignment" minOccurs="0" maxOccurs="1"/> + <xsd:element name="protection" type="CT_CellProtection" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="numFmtId" type="ST_NumFmtId" use="optional"/> + <xsd:attribute name="fontId" type="ST_FontId" use="optional"/> + <xsd:attribute name="fillId" type="ST_FillId" use="optional"/> + <xsd:attribute name="borderId" type="ST_BorderId" use="optional"/> + <xsd:attribute name="xfId" type="ST_CellStyleXfId" use="optional"/> + <xsd:attribute name="quotePrefix" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="pivotButton" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="applyNumberFormat" type="xsd:boolean" use="optional"/> + <xsd:attribute name="applyFont" type="xsd:boolean" use="optional"/> + <xsd:attribute name="applyFill" type="xsd:boolean" use="optional"/> + <xsd:attribute name="applyBorder" type="xsd:boolean" use="optional"/> + <xsd:attribute name="applyAlignment" type="xsd:boolean" use="optional"/> + <xsd:attribute name="applyProtection" type="xsd:boolean" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_CellStyles"> + <xsd:sequence> + <xsd:element name="cellStyle" type="CT_CellStyle" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_CellStyle"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="name" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="xfId" type="ST_CellStyleXfId" use="required"/> + <xsd:attribute name="builtinId" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="iLevel" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="hidden" type="xsd:boolean" use="optional"/> + <xsd:attribute name="customBuiltin" type="xsd:boolean" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Dxfs"> + <xsd:sequence> + <xsd:element name="dxf" type="CT_Dxf" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Dxf"> + <xsd:sequence> + <xsd:element name="font" type="CT_Font" minOccurs="0" maxOccurs="1"/> + <xsd:element name="numFmt" type="CT_NumFmt" minOccurs="0" maxOccurs="1"/> + <xsd:element name="fill" type="CT_Fill" minOccurs="0" maxOccurs="1"/> + <xsd:element name="alignment" type="CT_CellAlignment" minOccurs="0" maxOccurs="1"/> + <xsd:element name="border" type="CT_Border" minOccurs="0" maxOccurs="1"/> + <xsd:element name="protection" type="CT_CellProtection" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_NumFmtId"> + <xsd:restriction base="xsd:unsignedInt"/> + </xsd:simpleType> + <xsd:simpleType name="ST_FontId"> + <xsd:restriction base="xsd:unsignedInt"/> + </xsd:simpleType> + <xsd:simpleType name="ST_FillId"> + <xsd:restriction base="xsd:unsignedInt"/> + </xsd:simpleType> + <xsd:simpleType name="ST_BorderId"> + <xsd:restriction base="xsd:unsignedInt"/> + </xsd:simpleType> + <xsd:simpleType name="ST_CellStyleXfId"> + <xsd:restriction base="xsd:unsignedInt"/> + </xsd:simpleType> + <xsd:simpleType name="ST_DxfId"> + <xsd:restriction base="xsd:unsignedInt"/> + </xsd:simpleType> + <xsd:complexType name="CT_Colors"> + <xsd:sequence> + <xsd:element name="indexedColors" type="CT_IndexedColors" minOccurs="0" maxOccurs="1"/> + <xsd:element name="mruColors" type="CT_MRUColors" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_IndexedColors"> + <xsd:sequence> + <xsd:element name="rgbColor" type="CT_RgbColor" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_MRUColors"> + <xsd:sequence> + <xsd:element name="color" type="CT_Color" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_RgbColor"> + <xsd:attribute name="rgb" type="ST_UnsignedIntHex" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TableStyles"> + <xsd:sequence> + <xsd:element name="tableStyle" type="CT_TableStyle" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="defaultTableStyle" type="xsd:string" use="optional"/> + <xsd:attribute name="defaultPivotStyle" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TableStyle"> + <xsd:sequence> + <xsd:element name="tableStyleElement" type="CT_TableStyleElement" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + <xsd:attribute name="pivot" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="table" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TableStyleElement"> + <xsd:attribute name="type" type="ST_TableStyleType" use="required"/> + <xsd:attribute name="size" type="xsd:unsignedInt" use="optional" default="1"/> + <xsd:attribute name="dxfId" type="ST_DxfId" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_TableStyleType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="wholeTable"/> + <xsd:enumeration value="headerRow"/> + <xsd:enumeration value="totalRow"/> + <xsd:enumeration value="firstColumn"/> + <xsd:enumeration value="lastColumn"/> + <xsd:enumeration value="firstRowStripe"/> + <xsd:enumeration value="secondRowStripe"/> + <xsd:enumeration value="firstColumnStripe"/> + <xsd:enumeration value="secondColumnStripe"/> + <xsd:enumeration value="firstHeaderCell"/> + <xsd:enumeration value="lastHeaderCell"/> + <xsd:enumeration value="firstTotalCell"/> + <xsd:enumeration value="lastTotalCell"/> + <xsd:enumeration value="firstSubtotalColumn"/> + <xsd:enumeration value="secondSubtotalColumn"/> + <xsd:enumeration value="thirdSubtotalColumn"/> + <xsd:enumeration value="firstSubtotalRow"/> + <xsd:enumeration value="secondSubtotalRow"/> + <xsd:enumeration value="thirdSubtotalRow"/> + <xsd:enumeration value="blankRow"/> + <xsd:enumeration value="firstColumnSubheading"/> + <xsd:enumeration value="secondColumnSubheading"/> + <xsd:enumeration value="thirdColumnSubheading"/> + <xsd:enumeration value="firstRowSubheading"/> + <xsd:enumeration value="secondRowSubheading"/> + <xsd:enumeration value="thirdRowSubheading"/> + <xsd:enumeration value="pageFieldLabels"/> + <xsd:enumeration value="pageFieldValues"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_BooleanProperty"> + <xsd:attribute name="val" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:complexType name="CT_FontSize"> + <xsd:attribute name="val" type="xsd:double" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_IntProperty"> + <xsd:attribute name="val" type="xsd:int" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_FontName"> + <xsd:attribute name="val" type="s:ST_Xstring" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_VerticalAlignFontProperty"> + <xsd:attribute name="val" type="s:ST_VerticalAlignRun" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_FontScheme"> + <xsd:attribute name="val" type="ST_FontScheme" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_FontScheme"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="major"/> + <xsd:enumeration value="minor"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_UnderlineProperty"> + <xsd:attribute name="val" type="ST_UnderlineValues" use="optional" default="single"/> + </xsd:complexType> + <xsd:simpleType name="ST_UnderlineValues"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="single"/> + <xsd:enumeration value="double"/> + <xsd:enumeration value="singleAccounting"/> + <xsd:enumeration value="doubleAccounting"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Font"> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="name" type="CT_FontName" minOccurs="0" maxOccurs="1"/> + <xsd:element name="charset" type="CT_IntProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="family" type="CT_FontFamily" minOccurs="0" maxOccurs="1"/> + <xsd:element name="b" type="CT_BooleanProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="i" type="CT_BooleanProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="strike" type="CT_BooleanProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="outline" type="CT_BooleanProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="shadow" type="CT_BooleanProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="condense" type="CT_BooleanProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extend" type="CT_BooleanProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="color" type="CT_Color" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sz" type="CT_FontSize" minOccurs="0" maxOccurs="1"/> + <xsd:element name="u" type="CT_UnderlineProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="vertAlign" type="CT_VerticalAlignFontProperty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="scheme" type="CT_FontScheme" minOccurs="0" maxOccurs="1"/> + </xsd:choice> + </xsd:complexType> + <xsd:complexType name="CT_FontFamily"> + <xsd:attribute name="val" type="ST_FontFamily" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_FontFamily"> + <xsd:restriction base="xsd:integer"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="14"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:attributeGroup name="AG_AutoFormat"> + <xsd:attribute name="autoFormatId" type="xsd:unsignedInt"/> + <xsd:attribute name="applyNumberFormats" type="xsd:boolean"/> + <xsd:attribute name="applyBorderFormats" type="xsd:boolean"/> + <xsd:attribute name="applyFontFormats" type="xsd:boolean"/> + <xsd:attribute name="applyPatternFormats" type="xsd:boolean"/> + <xsd:attribute name="applyAlignmentFormats" type="xsd:boolean"/> + <xsd:attribute name="applyWidthHeightFormats" type="xsd:boolean"/> + </xsd:attributeGroup> + <xsd:element name="externalLink" type="CT_ExternalLink"/> + <xsd:complexType name="CT_ExternalLink"> + <xsd:sequence> + <xsd:choice> + <xsd:element name="externalBook" type="CT_ExternalBook" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ddeLink" type="CT_DdeLink" minOccurs="0" maxOccurs="1"/> + <xsd:element name="oleLink" type="CT_OleLink" minOccurs="0" maxOccurs="1"/> + </xsd:choice> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ExternalBook"> + <xsd:sequence> + <xsd:element name="sheetNames" type="CT_ExternalSheetNames" minOccurs="0" maxOccurs="1"/> + <xsd:element name="definedNames" type="CT_ExternalDefinedNames" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sheetDataSet" type="CT_ExternalSheetDataSet" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_ExternalSheetNames"> + <xsd:sequence> + <xsd:element name="sheetName" minOccurs="1" maxOccurs="unbounded" type="CT_ExternalSheetName" + /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ExternalSheetName"> + <xsd:attribute name="val" type="s:ST_Xstring"/> + </xsd:complexType> + <xsd:complexType name="CT_ExternalDefinedNames"> + <xsd:sequence> + <xsd:element name="definedName" type="CT_ExternalDefinedName" minOccurs="0" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ExternalDefinedName"> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="refersTo" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="sheetId" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_ExternalSheetDataSet"> + <xsd:sequence> + <xsd:element name="sheetData" type="CT_ExternalSheetData" minOccurs="1" maxOccurs="unbounded" + /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ExternalSheetData"> + <xsd:sequence> + <xsd:element name="row" type="CT_ExternalRow" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="sheetId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="refreshError" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_ExternalRow"> + <xsd:sequence> + <xsd:element name="cell" type="CT_ExternalCell" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="r" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_ExternalCell"> + <xsd:sequence> + <xsd:element name="v" type="s:ST_Xstring" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="r" type="ST_CellRef" use="optional"/> + <xsd:attribute name="t" type="ST_CellType" use="optional" default="n"/> + <xsd:attribute name="vm" type="xsd:unsignedInt" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_DdeLink"> + <xsd:sequence> + <xsd:element name="ddeItems" type="CT_DdeItems" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="ddeService" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="ddeTopic" type="s:ST_Xstring" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_DdeItems"> + <xsd:sequence> + <xsd:element name="ddeItem" type="CT_DdeItem" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DdeItem"> + <xsd:sequence> + <xsd:element name="values" type="CT_DdeValues" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="name" type="s:ST_Xstring" default="0"/> + <xsd:attribute name="ole" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="advise" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="preferPic" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_DdeValues"> + <xsd:sequence> + <xsd:element name="value" minOccurs="1" maxOccurs="unbounded" type="CT_DdeValue"/> + </xsd:sequence> + <xsd:attribute name="rows" type="xsd:unsignedInt" use="optional" default="1"/> + <xsd:attribute name="cols" type="xsd:unsignedInt" use="optional" default="1"/> + </xsd:complexType> + <xsd:complexType name="CT_DdeValue"> + <xsd:sequence> + <xsd:element name="val" type="s:ST_Xstring" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="t" type="ST_DdeValueType" use="optional" default="n"/> + </xsd:complexType> + <xsd:simpleType name="ST_DdeValueType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="nil"/> + <xsd:enumeration value="b"/> + <xsd:enumeration value="n"/> + <xsd:enumeration value="e"/> + <xsd:enumeration value="str"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_OleLink"> + <xsd:sequence> + <xsd:element name="oleItems" type="CT_OleItems" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute ref="r:id" use="required"/> + <xsd:attribute name="progId" type="s:ST_Xstring" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_OleItems"> + <xsd:sequence> + <xsd:element name="oleItem" type="CT_OleItem" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_OleItem"> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="icon" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="advise" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="preferPic" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:element name="table" type="CT_Table"/> + <xsd:complexType name="CT_Table"> + <xsd:sequence> + <xsd:element name="autoFilter" type="CT_AutoFilter" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sortState" type="CT_SortState" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tableColumns" type="CT_TableColumns" minOccurs="1" maxOccurs="1"/> + <xsd:element name="tableStyleInfo" type="CT_TableStyleInfo" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="name" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="displayName" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="comment" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="ref" type="ST_Ref" use="required"/> + <xsd:attribute name="tableType" type="ST_TableType" use="optional" default="worksheet"/> + <xsd:attribute name="headerRowCount" type="xsd:unsignedInt" use="optional" default="1"/> + <xsd:attribute name="insertRow" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="insertRowShift" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="totalsRowCount" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="totalsRowShown" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="published" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="headerRowDxfId" type="ST_DxfId" use="optional"/> + <xsd:attribute name="dataDxfId" type="ST_DxfId" use="optional"/> + <xsd:attribute name="totalsRowDxfId" type="ST_DxfId" use="optional"/> + <xsd:attribute name="headerRowBorderDxfId" type="ST_DxfId" use="optional"/> + <xsd:attribute name="tableBorderDxfId" type="ST_DxfId" use="optional"/> + <xsd:attribute name="totalsRowBorderDxfId" type="ST_DxfId" use="optional"/> + <xsd:attribute name="headerRowCellStyle" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="dataCellStyle" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="totalsRowCellStyle" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="connectionId" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_TableType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="worksheet"/> + <xsd:enumeration value="xml"/> + <xsd:enumeration value="queryTable"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TableStyleInfo"> + <xsd:attribute name="name" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="showFirstColumn" type="xsd:boolean" use="optional"/> + <xsd:attribute name="showLastColumn" type="xsd:boolean" use="optional"/> + <xsd:attribute name="showRowStripes" type="xsd:boolean" use="optional"/> + <xsd:attribute name="showColumnStripes" type="xsd:boolean" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TableColumns"> + <xsd:sequence> + <xsd:element name="tableColumn" type="CT_TableColumn" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TableColumn"> + <xsd:sequence> + <xsd:element name="calculatedColumnFormula" type="CT_TableFormula" minOccurs="0" maxOccurs="1"/> + <xsd:element name="totalsRowFormula" type="CT_TableFormula" minOccurs="0" maxOccurs="1"/> + <xsd:element name="xmlColumnPr" type="CT_XmlColumnPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="uniqueName" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="totalsRowFunction" type="ST_TotalsRowFunction" use="optional" + default="none"/> + <xsd:attribute name="totalsRowLabel" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="queryTableFieldId" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="headerRowDxfId" type="ST_DxfId" use="optional"/> + <xsd:attribute name="dataDxfId" type="ST_DxfId" use="optional"/> + <xsd:attribute name="totalsRowDxfId" type="ST_DxfId" use="optional"/> + <xsd:attribute name="headerRowCellStyle" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="dataCellStyle" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="totalsRowCellStyle" type="s:ST_Xstring" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_TableFormula"> + <xsd:simpleContent> + <xsd:extension base="ST_Formula"> + <xsd:attribute name="array" type="xsd:boolean" default="false"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:simpleType name="ST_TotalsRowFunction"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="sum"/> + <xsd:enumeration value="min"/> + <xsd:enumeration value="max"/> + <xsd:enumeration value="average"/> + <xsd:enumeration value="count"/> + <xsd:enumeration value="countNums"/> + <xsd:enumeration value="stdDev"/> + <xsd:enumeration value="var"/> + <xsd:enumeration value="custom"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_XmlColumnPr"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="mapId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="xpath" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="denormalized" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="xmlDataType" type="ST_XmlDataType" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_XmlDataType"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:element name="volTypes" type="CT_VolTypes"/> + <xsd:complexType name="CT_VolTypes"> + <xsd:sequence> + <xsd:element name="volType" type="CT_VolType" minOccurs="1" maxOccurs="unbounded"/> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_VolType"> + <xsd:sequence> + <xsd:element name="main" type="CT_VolMain" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="type" type="ST_VolDepType" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_VolMain"> + <xsd:sequence> + <xsd:element name="tp" type="CT_VolTopic" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="first" type="s:ST_Xstring" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_VolTopic"> + <xsd:sequence> + <xsd:element name="v" type="s:ST_Xstring" minOccurs="1" maxOccurs="1"/> + <xsd:element name="stp" type="s:ST_Xstring" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="tr" type="CT_VolTopicRef" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="t" type="ST_VolValueType" use="optional" default="n"/> + </xsd:complexType> + <xsd:complexType name="CT_VolTopicRef"> + <xsd:attribute name="r" type="ST_CellRef" use="required"/> + <xsd:attribute name="s" type="xsd:unsignedInt" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_VolDepType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="realTimeData"/> + <xsd:enumeration value="olapFunctions"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_VolValueType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="b"/> + <xsd:enumeration value="n"/> + <xsd:enumeration value="e"/> + <xsd:enumeration value="s"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:element name="workbook" type="CT_Workbook"/> + <xsd:complexType name="CT_Workbook"> + <xsd:sequence> + <xsd:element name="fileVersion" type="CT_FileVersion" minOccurs="0" maxOccurs="1"/> + <xsd:element name="fileSharing" type="CT_FileSharing" minOccurs="0" maxOccurs="1"/> + <xsd:element name="workbookPr" type="CT_WorkbookPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="workbookProtection" type="CT_WorkbookProtection" minOccurs="0" + maxOccurs="1"/> + <xsd:element name="bookViews" type="CT_BookViews" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sheets" type="CT_Sheets" minOccurs="1" maxOccurs="1"/> + <xsd:element name="functionGroups" type="CT_FunctionGroups" minOccurs="0" maxOccurs="1"/> + <xsd:element name="externalReferences" type="CT_ExternalReferences" minOccurs="0" + maxOccurs="1"/> + <xsd:element name="definedNames" type="CT_DefinedNames" minOccurs="0" maxOccurs="1"/> + <xsd:element name="calcPr" type="CT_CalcPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="oleSize" type="CT_OleSize" minOccurs="0" maxOccurs="1"/> + <xsd:element name="customWorkbookViews" type="CT_CustomWorkbookViews" minOccurs="0" + maxOccurs="1"/> + <xsd:element name="pivotCaches" type="CT_PivotCaches" minOccurs="0" maxOccurs="1"/> + <xsd:element name="smartTagPr" type="CT_SmartTagPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="smartTagTypes" type="CT_SmartTagTypes" minOccurs="0" maxOccurs="1"/> + <xsd:element name="webPublishing" type="CT_WebPublishing" minOccurs="0" maxOccurs="1"/> + <xsd:element name="fileRecoveryPr" type="CT_FileRecoveryPr" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element name="webPublishObjects" type="CT_WebPublishObjects" minOccurs="0" maxOccurs="1"/> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="conformance" type="s:ST_ConformanceClass"/> + </xsd:complexType> + <xsd:complexType name="CT_FileVersion"> + <xsd:attribute name="appName" type="xsd:string" use="optional"/> + <xsd:attribute name="lastEdited" type="xsd:string" use="optional"/> + <xsd:attribute name="lowestEdited" type="xsd:string" use="optional"/> + <xsd:attribute name="rupBuild" type="xsd:string" use="optional"/> + <xsd:attribute name="codeName" type="s:ST_Guid" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_BookViews"> + <xsd:sequence> + <xsd:element name="workbookView" type="CT_BookView" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_BookView"> + <xsd:sequence> + <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="visibility" type="ST_Visibility" use="optional" default="visible"/> + <xsd:attribute name="minimized" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showHorizontalScroll" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="showVerticalScroll" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="showSheetTabs" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="xWindow" type="xsd:int" use="optional"/> + <xsd:attribute name="yWindow" type="xsd:int" use="optional"/> + <xsd:attribute name="windowWidth" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="windowHeight" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="tabRatio" type="xsd:unsignedInt" use="optional" default="600"/> + <xsd:attribute name="firstSheet" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="activeTab" type="xsd:unsignedInt" use="optional" default="0"/> + <xsd:attribute name="autoFilterDateGrouping" type="xsd:boolean" use="optional" default="true"/> + </xsd:complexType> + <xsd:simpleType name="ST_Visibility"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="visible"/> + <xsd:enumeration value="hidden"/> + <xsd:enumeration value="veryHidden"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_CustomWorkbookViews"> + <xsd:sequence> + <xsd:element name="customWorkbookView" minOccurs="1" maxOccurs="unbounded" + type="CT_CustomWorkbookView"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_CustomWorkbookView"> + <xsd:sequence> + <xsd:element name="extLst" minOccurs="0" type="CT_ExtensionList"/> + </xsd:sequence> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="guid" type="s:ST_Guid" use="required"/> + <xsd:attribute name="autoUpdate" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="mergeInterval" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="changesSavedWin" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="onlySync" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="personalView" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="includePrintSettings" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="includeHiddenRowCol" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="maximized" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="minimized" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showHorizontalScroll" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="showVerticalScroll" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="showSheetTabs" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="xWindow" type="xsd:int" use="optional" default="0"/> + <xsd:attribute name="yWindow" type="xsd:int" use="optional" default="0"/> + <xsd:attribute name="windowWidth" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="windowHeight" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="tabRatio" type="xsd:unsignedInt" use="optional" default="600"/> + <xsd:attribute name="activeSheetId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="showFormulaBar" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="showStatusbar" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="showComments" type="ST_Comments" use="optional" default="commIndicator"/> + <xsd:attribute name="showObjects" type="ST_Objects" use="optional" default="all"/> + </xsd:complexType> + <xsd:simpleType name="ST_Comments"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="commNone"/> + <xsd:enumeration value="commIndicator"/> + <xsd:enumeration value="commIndAndComment"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Objects"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="all"/> + <xsd:enumeration value="placeholders"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Sheets"> + <xsd:sequence> + <xsd:element name="sheet" type="CT_Sheet" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Sheet"> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="sheetId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="state" type="ST_SheetState" use="optional" default="visible"/> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_SheetState"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="visible"/> + <xsd:enumeration value="hidden"/> + <xsd:enumeration value="veryHidden"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_WorkbookPr"> + <xsd:attribute name="date1904" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showObjects" type="ST_Objects" use="optional" default="all"/> + <xsd:attribute name="showBorderUnselectedTables" type="xsd:boolean" use="optional" + default="true"/> + <xsd:attribute name="filterPrivacy" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="promptedSolutions" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showInkAnnotation" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="backupFile" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="saveExternalLinkValues" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="updateLinks" type="ST_UpdateLinks" use="optional" default="userSet"/> + <xsd:attribute name="codeName" type="xsd:string" use="optional"/> + <xsd:attribute name="hidePivotFieldList" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="showPivotChartFilter" type="xsd:boolean" default="false"/> + <xsd:attribute name="allowRefreshQuery" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="publishItems" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="checkCompatibility" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="autoCompressPictures" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="refreshAllConnections" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="defaultThemeVersion" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_UpdateLinks"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="userSet"/> + <xsd:enumeration value="never"/> + <xsd:enumeration value="always"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SmartTagPr"> + <xsd:attribute name="embed" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="show" type="ST_SmartTagShow" use="optional" default="all"/> + </xsd:complexType> + <xsd:simpleType name="ST_SmartTagShow"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="all"/> + <xsd:enumeration value="none"/> + <xsd:enumeration value="noIndicator"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SmartTagTypes"> + <xsd:sequence> + <xsd:element name="smartTagType" type="CT_SmartTagType" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SmartTagType"> + <xsd:attribute name="namespaceUri" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="name" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="url" type="s:ST_Xstring" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_FileRecoveryPr"> + <xsd:attribute name="autoRecover" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="crashSave" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="dataExtractLoad" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="repairLoad" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> + <xsd:complexType name="CT_CalcPr"> + <xsd:attribute name="calcId" type="xsd:unsignedInt"/> + <xsd:attribute name="calcMode" type="ST_CalcMode" use="optional" default="auto"/> + <xsd:attribute name="fullCalcOnLoad" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="refMode" type="ST_RefMode" use="optional" default="A1"/> + <xsd:attribute name="iterate" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="iterateCount" type="xsd:unsignedInt" use="optional" default="100"/> + <xsd:attribute name="iterateDelta" type="xsd:double" use="optional" default="0.001"/> + <xsd:attribute name="fullPrecision" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="calcCompleted" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="calcOnSave" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="concurrentCalc" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="concurrentManualCount" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="forceFullCalc" type="xsd:boolean" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_CalcMode"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="manual"/> + <xsd:enumeration value="auto"/> + <xsd:enumeration value="autoNoTable"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_RefMode"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="A1"/> + <xsd:enumeration value="R1C1"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_DefinedNames"> + <xsd:sequence> + <xsd:element name="definedName" type="CT_DefinedName" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DefinedName"> + <xsd:simpleContent> + <xsd:extension base="ST_Formula"> + <xsd:attribute name="name" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="comment" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="customMenu" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="description" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="help" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="statusBar" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="localSheetId" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="hidden" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="function" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="vbProcedure" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="xlm" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="functionGroupId" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="shortcutKey" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="publishToServer" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="workbookParameter" type="xsd:boolean" use="optional" default="false"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:complexType name="CT_ExternalReferences"> + <xsd:sequence> + <xsd:element name="externalReference" type="CT_ExternalReference" minOccurs="1" + maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ExternalReference"> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SheetBackgroundPicture"> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_PivotCaches"> + <xsd:sequence> + <xsd:element name="pivotCache" type="CT_PivotCache" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_PivotCache"> + <xsd:attribute name="cacheId" type="xsd:unsignedInt" use="required"/> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_FileSharing"> + <xsd:attribute name="readOnlyRecommended" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="userName" type="s:ST_Xstring"/> + <xsd:attribute name="reservationPassword" type="ST_UnsignedShortHex"/> + <xsd:attribute name="algorithmName" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="hashValue" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="saltValue" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="spinCount" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_OleSize"> + <xsd:attribute name="ref" type="ST_Ref" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_WorkbookProtection"> + <xsd:attribute name="workbookPassword" type="ST_UnsignedShortHex" use="optional"/> + <xsd:attribute name="workbookPasswordCharacterSet" type="xsd:string" use="optional"/> + <xsd:attribute name="revisionsPassword" type="ST_UnsignedShortHex" use="optional"/> + <xsd:attribute name="revisionsPasswordCharacterSet" type="xsd:string" use="optional"/> + <xsd:attribute name="lockStructure" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="lockWindows" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="lockRevision" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="revisionsAlgorithmName" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="revisionsHashValue" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="revisionsSaltValue" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="revisionsSpinCount" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="workbookAlgorithmName" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="workbookHashValue" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="workbookSaltValue" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="workbookSpinCount" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_WebPublishing"> + <xsd:attribute name="css" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="thicket" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="longFileNames" type="xsd:boolean" use="optional" default="true"/> + <xsd:attribute name="vml" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="allowPng" type="xsd:boolean" use="optional" default="false"/> + <xsd:attribute name="targetScreenSize" type="ST_TargetScreenSize" use="optional" + default="800x600"/> + <xsd:attribute name="dpi" type="xsd:unsignedInt" use="optional" default="96"/> + <xsd:attribute name="codePage" type="xsd:unsignedInt" use="optional"/> + <xsd:attribute name="characterSet" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_TargetScreenSize"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="544x376"/> + <xsd:enumeration value="640x480"/> + <xsd:enumeration value="720x512"/> + <xsd:enumeration value="800x600"/> + <xsd:enumeration value="1024x768"/> + <xsd:enumeration value="1152x882"/> + <xsd:enumeration value="1152x900"/> + <xsd:enumeration value="1280x1024"/> + <xsd:enumeration value="1600x1200"/> + <xsd:enumeration value="1800x1440"/> + <xsd:enumeration value="1920x1200"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_FunctionGroups"> + <xsd:sequence maxOccurs="unbounded"> + <xsd:element name="functionGroup" type="CT_FunctionGroup" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="builtInGroupCount" type="xsd:unsignedInt" default="16" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_FunctionGroup"> + <xsd:attribute name="name" type="s:ST_Xstring"/> + </xsd:complexType> + <xsd:complexType name="CT_WebPublishObjects"> + <xsd:sequence> + <xsd:element name="webPublishObject" type="CT_WebPublishObject" minOccurs="1" + maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="count" type="xsd:unsignedInt" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_WebPublishObject"> + <xsd:attribute name="id" type="xsd:unsignedInt" use="required"/> + <xsd:attribute name="divId" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="sourceObject" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="destinationFile" type="s:ST_Xstring" use="required"/> + <xsd:attribute name="title" type="s:ST_Xstring" use="optional"/> + <xsd:attribute name="autoRepublish" type="xsd:boolean" use="optional" default="false"/> + </xsd:complexType> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd new file mode 100644 index 0000000..8821dd1 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd @@ -0,0 +1,570 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:schemas-microsoft-com:vml" + xmlns:pvml="urn:schemas-microsoft-com:office:powerpoint" + xmlns:o="urn:schemas-microsoft-com:office:office" + xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" + xmlns:w10="urn:schemas-microsoft-com:office:word" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns:x="urn:schemas-microsoft-com:office:excel" + xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + targetNamespace="urn:schemas-microsoft-com:vml" elementFormDefault="qualified" + attributeFormDefault="unqualified"> + <xsd:import namespace="urn:schemas-microsoft-com:office:office" + schemaLocation="vml-officeDrawing.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main" + schemaLocation="wml.xsd"/> + <xsd:import namespace="urn:schemas-microsoft-com:office:word" + schemaLocation="vml-wordprocessingDrawing.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + schemaLocation="shared-relationshipReference.xsd"/> + <xsd:import namespace="urn:schemas-microsoft-com:office:excel" + schemaLocation="vml-spreadsheetDrawing.xsd"/> + <xsd:import namespace="urn:schemas-microsoft-com:office:powerpoint" + schemaLocation="vml-presentationDrawing.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + schemaLocation="shared-commonSimpleTypes.xsd"/> + <xsd:attributeGroup name="AG_Id"> + <xsd:attribute name="id" type="xsd:string" use="optional"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_Style"> + <xsd:attribute name="style" type="xsd:string" use="optional"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_Type"> + <xsd:attribute name="type" type="xsd:string" use="optional"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_Adj"> + <xsd:attribute name="adj" type="xsd:string" use="optional"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_Path"> + <xsd:attribute name="path" type="xsd:string" use="optional"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_Fill"> + <xsd:attribute name="filled" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="fillcolor" type="s:ST_ColorType" use="optional"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_Chromakey"> + <xsd:attribute name="chromakey" type="s:ST_ColorType" use="optional"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_Ext"> + <xsd:attribute name="ext" form="qualified" type="ST_Ext"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_CoreAttributes"> + <xsd:attributeGroup ref="AG_Id"/> + <xsd:attributeGroup ref="AG_Style"/> + <xsd:attribute name="href" type="xsd:string" use="optional"/> + <xsd:attribute name="target" type="xsd:string" use="optional"/> + <xsd:attribute name="class" type="xsd:string" use="optional"/> + <xsd:attribute name="title" type="xsd:string" use="optional"/> + <xsd:attribute name="alt" type="xsd:string" use="optional"/> + <xsd:attribute name="coordsize" type="xsd:string" use="optional"/> + <xsd:attribute name="coordorigin" type="xsd:string" use="optional"/> + <xsd:attribute name="wrapcoords" type="xsd:string" use="optional"/> + <xsd:attribute name="print" type="s:ST_TrueFalse" use="optional"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_ShapeAttributes"> + <xsd:attributeGroup ref="AG_Chromakey"/> + <xsd:attributeGroup ref="AG_Fill"/> + <xsd:attribute name="opacity" type="xsd:string" use="optional"/> + <xsd:attribute name="stroked" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="strokecolor" type="s:ST_ColorType" use="optional"/> + <xsd:attribute name="strokeweight" type="xsd:string" use="optional"/> + <xsd:attribute name="insetpen" type="s:ST_TrueFalse" use="optional"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_OfficeCoreAttributes"> + <xsd:attribute ref="o:spid"/> + <xsd:attribute ref="o:oned"/> + <xsd:attribute ref="o:regroupid"/> + <xsd:attribute ref="o:doubleclicknotify"/> + <xsd:attribute ref="o:button"/> + <xsd:attribute ref="o:userhidden"/> + <xsd:attribute ref="o:bullet"/> + <xsd:attribute ref="o:hr"/> + <xsd:attribute ref="o:hrstd"/> + <xsd:attribute ref="o:hrnoshade"/> + <xsd:attribute ref="o:hrpct"/> + <xsd:attribute ref="o:hralign"/> + <xsd:attribute ref="o:allowincell"/> + <xsd:attribute ref="o:allowoverlap"/> + <xsd:attribute ref="o:userdrawn"/> + <xsd:attribute ref="o:bordertopcolor"/> + <xsd:attribute ref="o:borderleftcolor"/> + <xsd:attribute ref="o:borderbottomcolor"/> + <xsd:attribute ref="o:borderrightcolor"/> + <xsd:attribute ref="o:dgmlayout"/> + <xsd:attribute ref="o:dgmnodekind"/> + <xsd:attribute ref="o:dgmlayoutmru"/> + <xsd:attribute ref="o:insetmode"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_OfficeShapeAttributes"> + <xsd:attribute ref="o:spt"/> + <xsd:attribute ref="o:connectortype"/> + <xsd:attribute ref="o:bwmode"/> + <xsd:attribute ref="o:bwpure"/> + <xsd:attribute ref="o:bwnormal"/> + <xsd:attribute ref="o:forcedash"/> + <xsd:attribute ref="o:oleicon"/> + <xsd:attribute ref="o:ole"/> + <xsd:attribute ref="o:preferrelative"/> + <xsd:attribute ref="o:cliptowrap"/> + <xsd:attribute ref="o:clip"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_AllCoreAttributes"> + <xsd:attributeGroup ref="AG_CoreAttributes"/> + <xsd:attributeGroup ref="AG_OfficeCoreAttributes"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_AllShapeAttributes"> + <xsd:attributeGroup ref="AG_ShapeAttributes"/> + <xsd:attributeGroup ref="AG_OfficeShapeAttributes"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_ImageAttributes"> + <xsd:attribute name="src" type="xsd:string" use="optional"/> + <xsd:attribute name="cropleft" type="xsd:string" use="optional"/> + <xsd:attribute name="croptop" type="xsd:string" use="optional"/> + <xsd:attribute name="cropright" type="xsd:string" use="optional"/> + <xsd:attribute name="cropbottom" type="xsd:string" use="optional"/> + <xsd:attribute name="gain" type="xsd:string" use="optional"/> + <xsd:attribute name="blacklevel" type="xsd:string" use="optional"/> + <xsd:attribute name="gamma" type="xsd:string" use="optional"/> + <xsd:attribute name="grayscale" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="bilevel" type="s:ST_TrueFalse" use="optional"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_StrokeAttributes"> + <xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="weight" type="xsd:string" use="optional"/> + <xsd:attribute name="color" type="s:ST_ColorType" use="optional"/> + <xsd:attribute name="opacity" type="xsd:string" use="optional"/> + <xsd:attribute name="linestyle" type="ST_StrokeLineStyle" use="optional"/> + <xsd:attribute name="miterlimit" type="xsd:decimal" use="optional"/> + <xsd:attribute name="joinstyle" type="ST_StrokeJoinStyle" use="optional"/> + <xsd:attribute name="endcap" type="ST_StrokeEndCap" use="optional"/> + <xsd:attribute name="dashstyle" type="xsd:string" use="optional"/> + <xsd:attribute name="filltype" type="ST_FillType" use="optional"/> + <xsd:attribute name="src" type="xsd:string" use="optional"/> + <xsd:attribute name="imageaspect" type="ST_ImageAspect" use="optional"/> + <xsd:attribute name="imagesize" type="xsd:string" use="optional"/> + <xsd:attribute name="imagealignshape" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="color2" type="s:ST_ColorType" use="optional"/> + <xsd:attribute name="startarrow" type="ST_StrokeArrowType" use="optional"/> + <xsd:attribute name="startarrowwidth" type="ST_StrokeArrowWidth" use="optional"/> + <xsd:attribute name="startarrowlength" type="ST_StrokeArrowLength" use="optional"/> + <xsd:attribute name="endarrow" type="ST_StrokeArrowType" use="optional"/> + <xsd:attribute name="endarrowwidth" type="ST_StrokeArrowWidth" use="optional"/> + <xsd:attribute name="endarrowlength" type="ST_StrokeArrowLength" use="optional"/> + <xsd:attribute ref="o:href"/> + <xsd:attribute ref="o:althref"/> + <xsd:attribute ref="o:title"/> + <xsd:attribute ref="o:forcedash"/> + <xsd:attribute ref="r:id" use="optional"/> + <xsd:attribute name="insetpen" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute ref="o:relid"/> + </xsd:attributeGroup> + <xsd:group name="EG_ShapeElements"> + <xsd:choice> + <xsd:element ref="path"/> + <xsd:element ref="formulas"/> + <xsd:element ref="handles"/> + <xsd:element ref="fill"/> + <xsd:element ref="stroke"/> + <xsd:element ref="shadow"/> + <xsd:element ref="textbox"/> + <xsd:element ref="textpath"/> + <xsd:element ref="imagedata"/> + <xsd:element ref="o:skew"/> + <xsd:element ref="o:extrusion"/> + <xsd:element ref="o:callout"/> + <xsd:element ref="o:lock"/> + <xsd:element ref="o:clippath"/> + <xsd:element ref="o:signatureline"/> + <xsd:element ref="w10:wrap"/> + <xsd:element ref="w10:anchorlock"/> + <xsd:element ref="w10:bordertop"/> + <xsd:element ref="w10:borderbottom"/> + <xsd:element ref="w10:borderleft"/> + <xsd:element ref="w10:borderright"/> + <xsd:element ref="x:ClientData" minOccurs="0"/> + <xsd:element ref="pvml:textdata" minOccurs="0"/> + </xsd:choice> + </xsd:group> + <xsd:element name="shape" type="CT_Shape"/> + <xsd:element name="shapetype" type="CT_Shapetype"/> + <xsd:element name="group" type="CT_Group"/> + <xsd:element name="background" type="CT_Background"/> + <xsd:complexType name="CT_Shape"> + <xsd:choice maxOccurs="unbounded"> + <xsd:group ref="EG_ShapeElements"/> + <xsd:element ref="o:ink"/> + <xsd:element ref="pvml:iscomment"/> + <xsd:element ref="o:equationxml"/> + </xsd:choice> + <xsd:attributeGroup ref="AG_AllCoreAttributes"/> + <xsd:attributeGroup ref="AG_AllShapeAttributes"/> + <xsd:attributeGroup ref="AG_Type"/> + <xsd:attributeGroup ref="AG_Adj"/> + <xsd:attributeGroup ref="AG_Path"/> + <xsd:attribute ref="o:gfxdata"/> + <xsd:attribute name="equationxml" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Shapetype"> + <xsd:sequence> + <xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element ref="o:complex" minOccurs="0"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_AllCoreAttributes"/> + <xsd:attributeGroup ref="AG_AllShapeAttributes"/> + <xsd:attributeGroup ref="AG_Adj"/> + <xsd:attributeGroup ref="AG_Path"/> + <xsd:attribute ref="o:master"/> + </xsd:complexType> + <xsd:complexType name="CT_Group"> + <xsd:choice maxOccurs="unbounded"> + <xsd:group ref="EG_ShapeElements"/> + <xsd:element ref="group"/> + <xsd:element ref="shape"/> + <xsd:element ref="shapetype"/> + <xsd:element ref="arc"/> + <xsd:element ref="curve"/> + <xsd:element ref="image"/> + <xsd:element ref="line"/> + <xsd:element ref="oval"/> + <xsd:element ref="polyline"/> + <xsd:element ref="rect"/> + <xsd:element ref="roundrect"/> + <xsd:element ref="o:diagram"/> + </xsd:choice> + <xsd:attributeGroup ref="AG_AllCoreAttributes"/> + <xsd:attributeGroup ref="AG_Fill"/> + <xsd:attribute name="editas" type="ST_EditAs" use="optional"/> + <xsd:attribute ref="o:tableproperties"/> + <xsd:attribute ref="o:tablelimits"/> + </xsd:complexType> + <xsd:complexType name="CT_Background"> + <xsd:sequence> + <xsd:element ref="fill" minOccurs="0"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_Id"/> + <xsd:attributeGroup ref="AG_Fill"/> + <xsd:attribute ref="o:bwmode"/> + <xsd:attribute ref="o:bwpure"/> + <xsd:attribute ref="o:bwnormal"/> + <xsd:attribute ref="o:targetscreensize"/> + </xsd:complexType> + <xsd:element name="fill" type="CT_Fill"/> + <xsd:element name="formulas" type="CT_Formulas"/> + <xsd:element name="handles" type="CT_Handles"/> + <xsd:element name="imagedata" type="CT_ImageData"/> + <xsd:element name="path" type="CT_Path"/> + <xsd:element name="textbox" type="CT_Textbox"/> + <xsd:element name="shadow" type="CT_Shadow"/> + <xsd:element name="stroke" type="CT_Stroke"/> + <xsd:element name="textpath" type="CT_TextPath"/> + <xsd:complexType name="CT_Fill"> + <xsd:sequence> + <xsd:element ref="o:fill" minOccurs="0"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_Id"/> + <xsd:attribute name="type" type="ST_FillType" use="optional"/> + <xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="color" type="s:ST_ColorType" use="optional"/> + <xsd:attribute name="opacity" type="xsd:string" use="optional"/> + <xsd:attribute name="color2" type="s:ST_ColorType" use="optional"/> + <xsd:attribute name="src" type="xsd:string" use="optional"/> + <xsd:attribute ref="o:href"/> + <xsd:attribute ref="o:althref"/> + <xsd:attribute name="size" type="xsd:string" use="optional"/> + <xsd:attribute name="origin" type="xsd:string" use="optional"/> + <xsd:attribute name="position" type="xsd:string" use="optional"/> + <xsd:attribute name="aspect" type="ST_ImageAspect" use="optional"/> + <xsd:attribute name="colors" type="xsd:string" use="optional"/> + <xsd:attribute name="angle" type="xsd:decimal" use="optional"/> + <xsd:attribute name="alignshape" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="focus" type="xsd:string" use="optional"/> + <xsd:attribute name="focussize" type="xsd:string" use="optional"/> + <xsd:attribute name="focusposition" type="xsd:string" use="optional"/> + <xsd:attribute name="method" type="ST_FillMethod" use="optional"/> + <xsd:attribute ref="o:detectmouseclick"/> + <xsd:attribute ref="o:title"/> + <xsd:attribute ref="o:opacity2"/> + <xsd:attribute name="recolor" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="rotate" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute ref="r:id" use="optional"/> + <xsd:attribute ref="o:relid" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Formulas"> + <xsd:sequence> + <xsd:element name="f" type="CT_F" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_F"> + <xsd:attribute name="eqn" type="xsd:string"/> + </xsd:complexType> + <xsd:complexType name="CT_Handles"> + <xsd:sequence> + <xsd:element name="h" type="CT_H" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_H"> + <xsd:attribute name="position" type="xsd:string"/> + <xsd:attribute name="polar" type="xsd:string"/> + <xsd:attribute name="map" type="xsd:string"/> + <xsd:attribute name="invx" type="s:ST_TrueFalse"/> + <xsd:attribute name="invy" type="s:ST_TrueFalse"/> + <xsd:attribute name="switch" type="s:ST_TrueFalseBlank"/> + <xsd:attribute name="xrange" type="xsd:string"/> + <xsd:attribute name="yrange" type="xsd:string"/> + <xsd:attribute name="radiusrange" type="xsd:string"/> + </xsd:complexType> + <xsd:complexType name="CT_ImageData"> + <xsd:attributeGroup ref="AG_Id"/> + <xsd:attributeGroup ref="AG_ImageAttributes"/> + <xsd:attributeGroup ref="AG_Chromakey"/> + <xsd:attribute name="embosscolor" type="s:ST_ColorType" use="optional"/> + <xsd:attribute name="recolortarget" type="s:ST_ColorType"/> + <xsd:attribute ref="o:href"/> + <xsd:attribute ref="o:althref"/> + <xsd:attribute ref="o:title"/> + <xsd:attribute ref="o:oleid"/> + <xsd:attribute ref="o:detectmouseclick"/> + <xsd:attribute ref="o:movie"/> + <xsd:attribute ref="o:relid"/> + <xsd:attribute ref="r:id"/> + <xsd:attribute ref="r:pict"/> + <xsd:attribute ref="r:href"/> + </xsd:complexType> + <xsd:complexType name="CT_Path"> + <xsd:attributeGroup ref="AG_Id"/> + <xsd:attribute name="v" type="xsd:string" use="optional"/> + <xsd:attribute name="limo" type="xsd:string" use="optional"/> + <xsd:attribute name="textboxrect" type="xsd:string" use="optional"/> + <xsd:attribute name="fillok" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="strokeok" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="shadowok" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="arrowok" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="gradientshapeok" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="textpathok" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="insetpenok" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute ref="o:connecttype"/> + <xsd:attribute ref="o:connectlocs"/> + <xsd:attribute ref="o:connectangles"/> + <xsd:attribute ref="o:extrusionok"/> + </xsd:complexType> + <xsd:complexType name="CT_Shadow"> + <xsd:attributeGroup ref="AG_Id"/> + <xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="type" type="ST_ShadowType" use="optional"/> + <xsd:attribute name="obscured" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="color" type="s:ST_ColorType" use="optional"/> + <xsd:attribute name="opacity" type="xsd:string" use="optional"/> + <xsd:attribute name="offset" type="xsd:string" use="optional"/> + <xsd:attribute name="color2" type="s:ST_ColorType" use="optional"/> + <xsd:attribute name="offset2" type="xsd:string" use="optional"/> + <xsd:attribute name="origin" type="xsd:string" use="optional"/> + <xsd:attribute name="matrix" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Stroke"> + <xsd:sequence> + <xsd:element ref="o:left" minOccurs="0"/> + <xsd:element ref="o:top" minOccurs="0"/> + <xsd:element ref="o:right" minOccurs="0"/> + <xsd:element ref="o:bottom" minOccurs="0"/> + <xsd:element ref="o:column" minOccurs="0"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_Id"/> + <xsd:attributeGroup ref="AG_StrokeAttributes"/> + </xsd:complexType> + <xsd:complexType name="CT_Textbox"> + <xsd:choice> + <xsd:element ref="w:txbxContent" minOccurs="0"/> + <xsd:any namespace="##local" processContents="skip"/> + </xsd:choice> + <xsd:attributeGroup ref="AG_Id"/> + <xsd:attributeGroup ref="AG_Style"/> + <xsd:attribute name="inset" type="xsd:string" use="optional"/> + <xsd:attribute ref="o:singleclick"/> + <xsd:attribute ref="o:insetmode"/> + </xsd:complexType> + <xsd:complexType name="CT_TextPath"> + <xsd:attributeGroup ref="AG_Id"/> + <xsd:attributeGroup ref="AG_Style"/> + <xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="fitshape" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="fitpath" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="trim" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="xscale" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="string" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:element name="arc" type="CT_Arc"/> + <xsd:element name="curve" type="CT_Curve"/> + <xsd:element name="image" type="CT_Image"/> + <xsd:element name="line" type="CT_Line"/> + <xsd:element name="oval" type="CT_Oval"/> + <xsd:element name="polyline" type="CT_PolyLine"/> + <xsd:element name="rect" type="CT_Rect"/> + <xsd:element name="roundrect" type="CT_RoundRect"/> + <xsd:complexType name="CT_Arc"> + <xsd:sequence> + <xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_AllCoreAttributes"/> + <xsd:attributeGroup ref="AG_AllShapeAttributes"/> + <xsd:attribute name="startAngle" type="xsd:decimal" use="optional"/> + <xsd:attribute name="endAngle" type="xsd:decimal" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Curve"> + <xsd:sequence> + <xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_AllCoreAttributes"/> + <xsd:attributeGroup ref="AG_AllShapeAttributes"/> + <xsd:attribute name="from" type="xsd:string" use="optional"/> + <xsd:attribute name="control1" type="xsd:string" use="optional"/> + <xsd:attribute name="control2" type="xsd:string" use="optional"/> + <xsd:attribute name="to" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Image"> + <xsd:sequence> + <xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_AllCoreAttributes"/> + <xsd:attributeGroup ref="AG_AllShapeAttributes"/> + <xsd:attributeGroup ref="AG_ImageAttributes"/> + </xsd:complexType> + <xsd:complexType name="CT_Line"> + <xsd:sequence> + <xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_AllCoreAttributes"/> + <xsd:attributeGroup ref="AG_AllShapeAttributes"/> + <xsd:attribute name="from" type="xsd:string" use="optional"/> + <xsd:attribute name="to" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Oval"> + <xsd:choice maxOccurs="unbounded"> + <xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + <xsd:attributeGroup ref="AG_AllCoreAttributes"/> + <xsd:attributeGroup ref="AG_AllShapeAttributes"/> + </xsd:complexType> + <xsd:complexType name="CT_PolyLine"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:group ref="EG_ShapeElements"/> + <xsd:element ref="o:ink"/> + </xsd:choice> + <xsd:attributeGroup ref="AG_AllCoreAttributes"/> + <xsd:attributeGroup ref="AG_AllShapeAttributes"/> + <xsd:attribute name="points" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Rect"> + <xsd:choice maxOccurs="unbounded"> + <xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + <xsd:attributeGroup ref="AG_AllCoreAttributes"/> + <xsd:attributeGroup ref="AG_AllShapeAttributes"/> + </xsd:complexType> + <xsd:complexType name="CT_RoundRect"> + <xsd:choice maxOccurs="unbounded"> + <xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + <xsd:attributeGroup ref="AG_AllCoreAttributes"/> + <xsd:attributeGroup ref="AG_AllShapeAttributes"/> + <xsd:attribute name="arcsize" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_Ext"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="view"/> + <xsd:enumeration value="edit"/> + <xsd:enumeration value="backwardCompatible"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FillType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="solid"/> + <xsd:enumeration value="gradient"/> + <xsd:enumeration value="gradientRadial"/> + <xsd:enumeration value="tile"/> + <xsd:enumeration value="pattern"/> + <xsd:enumeration value="frame"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FillMethod"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="linear"/> + <xsd:enumeration value="sigma"/> + <xsd:enumeration value="any"/> + <xsd:enumeration value="linear sigma"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ShadowType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="single"/> + <xsd:enumeration value="double"/> + <xsd:enumeration value="emboss"/> + <xsd:enumeration value="perspective"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_StrokeLineStyle"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="single"/> + <xsd:enumeration value="thinThin"/> + <xsd:enumeration value="thinThick"/> + <xsd:enumeration value="thickThin"/> + <xsd:enumeration value="thickBetweenThin"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_StrokeJoinStyle"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="round"/> + <xsd:enumeration value="bevel"/> + <xsd:enumeration value="miter"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_StrokeEndCap"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="flat"/> + <xsd:enumeration value="square"/> + <xsd:enumeration value="round"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_StrokeArrowLength"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="short"/> + <xsd:enumeration value="medium"/> + <xsd:enumeration value="long"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_StrokeArrowWidth"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="narrow"/> + <xsd:enumeration value="medium"/> + <xsd:enumeration value="wide"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_StrokeArrowType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="block"/> + <xsd:enumeration value="classic"/> + <xsd:enumeration value="oval"/> + <xsd:enumeration value="diamond"/> + <xsd:enumeration value="open"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ImageAspect"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="ignore"/> + <xsd:enumeration value="atMost"/> + <xsd:enumeration value="atLeast"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_EditAs"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="canvas"/> + <xsd:enumeration value="orgchart"/> + <xsd:enumeration value="radial"/> + <xsd:enumeration value="cycle"/> + <xsd:enumeration value="stacked"/> + <xsd:enumeration value="venn"/> + <xsd:enumeration value="bullseye"/> + </xsd:restriction> + </xsd:simpleType> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd new file mode 100644 index 0000000..ca2575c --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd @@ -0,0 +1,509 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="urn:schemas-microsoft-com:office:office" xmlns:v="urn:schemas-microsoft-com:vml" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + targetNamespace="urn:schemas-microsoft-com:office:office" elementFormDefault="qualified" + attributeFormDefault="unqualified"> + <xsd:import namespace="urn:schemas-microsoft-com:vml" schemaLocation="vml-main.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + schemaLocation="shared-relationshipReference.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + schemaLocation="shared-commonSimpleTypes.xsd"/> + <xsd:attribute name="bwmode" type="ST_BWMode"/> + <xsd:attribute name="bwpure" type="ST_BWMode"/> + <xsd:attribute name="bwnormal" type="ST_BWMode"/> + <xsd:attribute name="targetscreensize" type="ST_ScreenSize"/> + <xsd:attribute name="insetmode" type="ST_InsetMode" default="custom"/> + <xsd:attribute name="spt" type="xsd:float"/> + <xsd:attribute name="wrapcoords" type="xsd:string"/> + <xsd:attribute name="oned" type="s:ST_TrueFalse"/> + <xsd:attribute name="regroupid" type="xsd:integer"/> + <xsd:attribute name="doubleclicknotify" type="s:ST_TrueFalse"/> + <xsd:attribute name="connectortype" type="ST_ConnectorType" default="straight"/> + <xsd:attribute name="button" type="s:ST_TrueFalse"/> + <xsd:attribute name="userhidden" type="s:ST_TrueFalse"/> + <xsd:attribute name="forcedash" type="s:ST_TrueFalse"/> + <xsd:attribute name="oleicon" type="s:ST_TrueFalse"/> + <xsd:attribute name="ole" type="s:ST_TrueFalseBlank"/> + <xsd:attribute name="preferrelative" type="s:ST_TrueFalse"/> + <xsd:attribute name="cliptowrap" type="s:ST_TrueFalse"/> + <xsd:attribute name="clip" type="s:ST_TrueFalse"/> + <xsd:attribute name="bullet" type="s:ST_TrueFalse"/> + <xsd:attribute name="hr" type="s:ST_TrueFalse"/> + <xsd:attribute name="hrstd" type="s:ST_TrueFalse"/> + <xsd:attribute name="hrnoshade" type="s:ST_TrueFalse"/> + <xsd:attribute name="hrpct" type="xsd:float"/> + <xsd:attribute name="hralign" type="ST_HrAlign" default="left"/> + <xsd:attribute name="allowincell" type="s:ST_TrueFalse"/> + <xsd:attribute name="allowoverlap" type="s:ST_TrueFalse"/> + <xsd:attribute name="userdrawn" type="s:ST_TrueFalse"/> + <xsd:attribute name="bordertopcolor" type="xsd:string"/> + <xsd:attribute name="borderleftcolor" type="xsd:string"/> + <xsd:attribute name="borderbottomcolor" type="xsd:string"/> + <xsd:attribute name="borderrightcolor" type="xsd:string"/> + <xsd:attribute name="connecttype" type="ST_ConnectType"/> + <xsd:attribute name="connectlocs" type="xsd:string"/> + <xsd:attribute name="connectangles" type="xsd:string"/> + <xsd:attribute name="master" type="xsd:string"/> + <xsd:attribute name="extrusionok" type="s:ST_TrueFalse"/> + <xsd:attribute name="href" type="xsd:string"/> + <xsd:attribute name="althref" type="xsd:string"/> + <xsd:attribute name="title" type="xsd:string"/> + <xsd:attribute name="singleclick" type="s:ST_TrueFalse"/> + <xsd:attribute name="oleid" type="xsd:float"/> + <xsd:attribute name="detectmouseclick" type="s:ST_TrueFalse"/> + <xsd:attribute name="movie" type="xsd:float"/> + <xsd:attribute name="spid" type="xsd:string"/> + <xsd:attribute name="opacity2" type="xsd:string"/> + <xsd:attribute name="relid" type="r:ST_RelationshipId"/> + <xsd:attribute name="dgmlayout" type="ST_DiagramLayout"/> + <xsd:attribute name="dgmnodekind" type="xsd:integer"/> + <xsd:attribute name="dgmlayoutmru" type="ST_DiagramLayout"/> + <xsd:attribute name="gfxdata" type="xsd:base64Binary"/> + <xsd:attribute name="tableproperties" type="xsd:string"/> + <xsd:attribute name="tablelimits" type="xsd:string"/> + <xsd:element name="shapedefaults" type="CT_ShapeDefaults"/> + <xsd:element name="shapelayout" type="CT_ShapeLayout"/> + <xsd:element name="signatureline" type="CT_SignatureLine"/> + <xsd:element name="ink" type="CT_Ink"/> + <xsd:element name="diagram" type="CT_Diagram"/> + <xsd:element name="equationxml" type="CT_EquationXml"/> + <xsd:complexType name="CT_ShapeDefaults"> + <xsd:all minOccurs="0"> + <xsd:element ref="v:fill" minOccurs="0"/> + <xsd:element ref="v:stroke" minOccurs="0"/> + <xsd:element ref="v:textbox" minOccurs="0"/> + <xsd:element ref="v:shadow" minOccurs="0"/> + <xsd:element ref="skew" minOccurs="0"/> + <xsd:element ref="extrusion" minOccurs="0"/> + <xsd:element ref="callout" minOccurs="0"/> + <xsd:element ref="lock" minOccurs="0"/> + <xsd:element name="colormru" minOccurs="0" type="CT_ColorMru"/> + <xsd:element name="colormenu" minOccurs="0" type="CT_ColorMenu"/> + </xsd:all> + <xsd:attributeGroup ref="v:AG_Ext"/> + <xsd:attribute name="spidmax" type="xsd:integer" use="optional"/> + <xsd:attribute name="style" type="xsd:string" use="optional"/> + <xsd:attribute name="fill" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="fillcolor" type="s:ST_ColorType" use="optional"/> + <xsd:attribute name="stroke" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="strokecolor" type="s:ST_ColorType"/> + <xsd:attribute name="allowincell" form="qualified" type="s:ST_TrueFalse"/> + </xsd:complexType> + <xsd:complexType name="CT_Ink"> + <xsd:sequence/> + <xsd:attribute name="i" type="xsd:string"/> + <xsd:attribute name="annotation" type="s:ST_TrueFalse"/> + <xsd:attribute name="contentType" type="ST_ContentType" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_SignatureLine"> + <xsd:attributeGroup ref="v:AG_Ext"/> + <xsd:attribute name="issignatureline" type="s:ST_TrueFalse"/> + <xsd:attribute name="id" type="s:ST_Guid"/> + <xsd:attribute name="provid" type="s:ST_Guid"/> + <xsd:attribute name="signinginstructionsset" type="s:ST_TrueFalse"/> + <xsd:attribute name="allowcomments" type="s:ST_TrueFalse"/> + <xsd:attribute name="showsigndate" type="s:ST_TrueFalse"/> + <xsd:attribute name="suggestedsigner" type="xsd:string" form="qualified"/> + <xsd:attribute name="suggestedsigner2" type="xsd:string" form="qualified"/> + <xsd:attribute name="suggestedsigneremail" type="xsd:string" form="qualified"/> + <xsd:attribute name="signinginstructions" type="xsd:string"/> + <xsd:attribute name="addlxml" type="xsd:string"/> + <xsd:attribute name="sigprovurl" type="xsd:string"/> + </xsd:complexType> + <xsd:complexType name="CT_ShapeLayout"> + <xsd:all> + <xsd:element name="idmap" type="CT_IdMap" minOccurs="0"/> + <xsd:element name="regrouptable" type="CT_RegroupTable" minOccurs="0"/> + <xsd:element name="rules" type="CT_Rules" minOccurs="0"/> + </xsd:all> + <xsd:attributeGroup ref="v:AG_Ext"/> + </xsd:complexType> + <xsd:complexType name="CT_IdMap"> + <xsd:attributeGroup ref="v:AG_Ext"/> + <xsd:attribute name="data" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_RegroupTable"> + <xsd:sequence> + <xsd:element name="entry" type="CT_Entry" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attributeGroup ref="v:AG_Ext"/> + </xsd:complexType> + <xsd:complexType name="CT_Entry"> + <xsd:attribute name="new" type="xsd:int" use="optional"/> + <xsd:attribute name="old" type="xsd:int" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Rules"> + <xsd:sequence> + <xsd:element name="r" type="CT_R" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attributeGroup ref="v:AG_Ext"/> + </xsd:complexType> + <xsd:complexType name="CT_R"> + <xsd:sequence> + <xsd:element name="proxy" type="CT_Proxy" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:string" use="required"/> + <xsd:attribute name="type" type="ST_RType" use="optional"/> + <xsd:attribute name="how" type="ST_How" use="optional"/> + <xsd:attribute name="idref" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Proxy"> + <xsd:attribute name="start" type="s:ST_TrueFalseBlank" use="optional" default="false"/> + <xsd:attribute name="end" type="s:ST_TrueFalseBlank" use="optional" default="false"/> + <xsd:attribute name="idref" type="xsd:string" use="optional"/> + <xsd:attribute name="connectloc" type="xsd:int" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Diagram"> + <xsd:sequence> + <xsd:element name="relationtable" type="CT_RelationTable" minOccurs="0"/> + </xsd:sequence> + <xsd:attributeGroup ref="v:AG_Ext"/> + <xsd:attribute name="dgmstyle" type="xsd:integer" use="optional"/> + <xsd:attribute name="autoformat" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="reverse" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="autolayout" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="dgmscalex" type="xsd:integer" use="optional"/> + <xsd:attribute name="dgmscaley" type="xsd:integer" use="optional"/> + <xsd:attribute name="dgmfontsize" type="xsd:integer" use="optional"/> + <xsd:attribute name="constrainbounds" type="xsd:string" use="optional"/> + <xsd:attribute name="dgmbasetextscale" type="xsd:integer" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_EquationXml"> + <xsd:sequence> + <xsd:any namespace="##any"/> + </xsd:sequence> + <xsd:attribute name="contentType" type="ST_AlternateMathContentType" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_AlternateMathContentType"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:complexType name="CT_RelationTable"> + <xsd:sequence> + <xsd:element name="rel" type="CT_Relation" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attributeGroup ref="v:AG_Ext"/> + </xsd:complexType> + <xsd:complexType name="CT_Relation"> + <xsd:attributeGroup ref="v:AG_Ext"/> + <xsd:attribute name="idsrc" type="xsd:string" use="optional"/> + <xsd:attribute name="iddest" type="xsd:string" use="optional"/> + <xsd:attribute name="idcntr" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_ColorMru"> + <xsd:attributeGroup ref="v:AG_Ext"/> + <xsd:attribute name="colors" type="xsd:string"/> + </xsd:complexType> + <xsd:complexType name="CT_ColorMenu"> + <xsd:attributeGroup ref="v:AG_Ext"/> + <xsd:attribute name="strokecolor" type="s:ST_ColorType"/> + <xsd:attribute name="fillcolor" type="s:ST_ColorType"/> + <xsd:attribute name="shadowcolor" type="s:ST_ColorType"/> + <xsd:attribute name="extrusioncolor" type="s:ST_ColorType"/> + </xsd:complexType> + <xsd:element name="skew" type="CT_Skew"/> + <xsd:element name="extrusion" type="CT_Extrusion"/> + <xsd:element name="callout" type="CT_Callout"/> + <xsd:element name="lock" type="CT_Lock"/> + <xsd:element name="OLEObject" type="CT_OLEObject"/> + <xsd:element name="complex" type="CT_Complex"/> + <xsd:element name="left" type="CT_StrokeChild"/> + <xsd:element name="top" type="CT_StrokeChild"/> + <xsd:element name="right" type="CT_StrokeChild"/> + <xsd:element name="bottom" type="CT_StrokeChild"/> + <xsd:element name="column" type="CT_StrokeChild"/> + <xsd:element name="clippath" type="CT_ClipPath"/> + <xsd:element name="fill" type="CT_Fill"/> + <xsd:complexType name="CT_Skew"> + <xsd:attributeGroup ref="v:AG_Ext"/> + <xsd:attribute name="id" type="xsd:string" use="optional"/> + <xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="offset" type="xsd:string" use="optional"/> + <xsd:attribute name="origin" type="xsd:string" use="optional"/> + <xsd:attribute name="matrix" type="xsd:string" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Extrusion"> + <xsd:attributeGroup ref="v:AG_Ext"/> + <xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="type" type="ST_ExtrusionType" default="parallel" use="optional"/> + <xsd:attribute name="render" type="ST_ExtrusionRender" default="solid" use="optional"/> + <xsd:attribute name="viewpointorigin" type="xsd:string" use="optional"/> + <xsd:attribute name="viewpoint" type="xsd:string" use="optional"/> + <xsd:attribute name="plane" type="ST_ExtrusionPlane" default="XY" use="optional"/> + <xsd:attribute name="skewangle" type="xsd:float" use="optional"/> + <xsd:attribute name="skewamt" type="xsd:string" use="optional"/> + <xsd:attribute name="foredepth" type="xsd:string" use="optional"/> + <xsd:attribute name="backdepth" type="xsd:string" use="optional"/> + <xsd:attribute name="orientation" type="xsd:string" use="optional"/> + <xsd:attribute name="orientationangle" type="xsd:float" use="optional"/> + <xsd:attribute name="lockrotationcenter" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="autorotationcenter" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="rotationcenter" type="xsd:string" use="optional"/> + <xsd:attribute name="rotationangle" type="xsd:string" use="optional"/> + <xsd:attribute name="colormode" type="ST_ColorMode" use="optional"/> + <xsd:attribute name="color" type="s:ST_ColorType" use="optional"/> + <xsd:attribute name="shininess" type="xsd:float" use="optional"/> + <xsd:attribute name="specularity" type="xsd:string" use="optional"/> + <xsd:attribute name="diffusity" type="xsd:string" use="optional"/> + <xsd:attribute name="metal" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="edge" type="xsd:string" use="optional"/> + <xsd:attribute name="facet" type="xsd:string" use="optional"/> + <xsd:attribute name="lightface" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="brightness" type="xsd:string" use="optional"/> + <xsd:attribute name="lightposition" type="xsd:string" use="optional"/> + <xsd:attribute name="lightlevel" type="xsd:string" use="optional"/> + <xsd:attribute name="lightharsh" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="lightposition2" type="xsd:string" use="optional"/> + <xsd:attribute name="lightlevel2" type="xsd:string" use="optional"/> + <xsd:attribute name="lightharsh2" type="s:ST_TrueFalse" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Callout"> + <xsd:attributeGroup ref="v:AG_Ext"/> + <xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="type" type="xsd:string" use="optional"/> + <xsd:attribute name="gap" type="xsd:string" use="optional"/> + <xsd:attribute name="angle" type="ST_Angle" use="optional"/> + <xsd:attribute name="dropauto" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="drop" type="ST_CalloutDrop" use="optional"/> + <xsd:attribute name="distance" type="xsd:string" use="optional"/> + <xsd:attribute name="lengthspecified" type="s:ST_TrueFalse" default="f" use="optional"/> + <xsd:attribute name="length" type="xsd:string" use="optional"/> + <xsd:attribute name="accentbar" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="textborder" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="minusx" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="minusy" type="s:ST_TrueFalse" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Lock"> + <xsd:attributeGroup ref="v:AG_Ext"/> + <xsd:attribute name="position" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="selection" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="grouping" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="ungrouping" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="rotation" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="cropping" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="verticies" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="adjusthandles" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="text" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="aspectratio" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="shapetype" type="s:ST_TrueFalse" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_OLEObject"> + <xsd:sequence> + <xsd:element name="LinkType" type="ST_OLELinkType" minOccurs="0"/> + <xsd:element name="LockedField" type="s:ST_TrueFalseBlank" minOccurs="0"/> + <xsd:element name="FieldCodes" type="xsd:string" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="Type" type="ST_OLEType" use="optional"/> + <xsd:attribute name="ProgID" type="xsd:string" use="optional"/> + <xsd:attribute name="ShapeID" type="xsd:string" use="optional"/> + <xsd:attribute name="DrawAspect" type="ST_OLEDrawAspect" use="optional"/> + <xsd:attribute name="ObjectID" type="xsd:string" use="optional"/> + <xsd:attribute ref="r:id" use="optional"/> + <xsd:attribute name="UpdateMode" type="ST_OLEUpdateMode" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Complex"> + <xsd:attributeGroup ref="v:AG_Ext"/> + </xsd:complexType> + <xsd:complexType name="CT_StrokeChild"> + <xsd:attributeGroup ref="v:AG_Ext"/> + <xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="weight" type="xsd:string" use="optional"/> + <xsd:attribute name="color" type="s:ST_ColorType" use="optional"/> + <xsd:attribute name="color2" type="s:ST_ColorType" use="optional"/> + <xsd:attribute name="opacity" type="xsd:string" use="optional"/> + <xsd:attribute name="linestyle" type="v:ST_StrokeLineStyle" use="optional"/> + <xsd:attribute name="miterlimit" type="xsd:decimal" use="optional"/> + <xsd:attribute name="joinstyle" type="v:ST_StrokeJoinStyle" use="optional"/> + <xsd:attribute name="endcap" type="v:ST_StrokeEndCap" use="optional"/> + <xsd:attribute name="dashstyle" type="xsd:string" use="optional"/> + <xsd:attribute name="insetpen" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="filltype" type="v:ST_FillType" use="optional"/> + <xsd:attribute name="src" type="xsd:string" use="optional"/> + <xsd:attribute name="imageaspect" type="v:ST_ImageAspect" use="optional"/> + <xsd:attribute name="imagesize" type="xsd:string" use="optional"/> + <xsd:attribute name="imagealignshape" type="s:ST_TrueFalse" use="optional"/> + <xsd:attribute name="startarrow" type="v:ST_StrokeArrowType" use="optional"/> + <xsd:attribute name="startarrowwidth" type="v:ST_StrokeArrowWidth" use="optional"/> + <xsd:attribute name="startarrowlength" type="v:ST_StrokeArrowLength" use="optional"/> + <xsd:attribute name="endarrow" type="v:ST_StrokeArrowType" use="optional"/> + <xsd:attribute name="endarrowwidth" type="v:ST_StrokeArrowWidth" use="optional"/> + <xsd:attribute name="endarrowlength" type="v:ST_StrokeArrowLength" use="optional"/> + <xsd:attribute ref="href"/> + <xsd:attribute ref="althref"/> + <xsd:attribute ref="title"/> + <xsd:attribute ref="forcedash"/> + </xsd:complexType> + <xsd:complexType name="CT_ClipPath"> + <xsd:attribute name="v" type="xsd:string" use="required" form="qualified"/> + </xsd:complexType> + <xsd:complexType name="CT_Fill"> + <xsd:attributeGroup ref="v:AG_Ext"/> + <xsd:attribute name="type" type="ST_FillType"/> + </xsd:complexType> + <xsd:simpleType name="ST_RType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="arc"/> + <xsd:enumeration value="callout"/> + <xsd:enumeration value="connector"/> + <xsd:enumeration value="align"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_How"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="top"/> + <xsd:enumeration value="middle"/> + <xsd:enumeration value="bottom"/> + <xsd:enumeration value="left"/> + <xsd:enumeration value="center"/> + <xsd:enumeration value="right"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_BWMode"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="color"/> + <xsd:enumeration value="auto"/> + <xsd:enumeration value="grayScale"/> + <xsd:enumeration value="lightGrayscale"/> + <xsd:enumeration value="inverseGray"/> + <xsd:enumeration value="grayOutline"/> + <xsd:enumeration value="highContrast"/> + <xsd:enumeration value="black"/> + <xsd:enumeration value="white"/> + <xsd:enumeration value="hide"/> + <xsd:enumeration value="undrawn"/> + <xsd:enumeration value="blackTextAndLines"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ScreenSize"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="544,376"/> + <xsd:enumeration value="640,480"/> + <xsd:enumeration value="720,512"/> + <xsd:enumeration value="800,600"/> + <xsd:enumeration value="1024,768"/> + <xsd:enumeration value="1152,862"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_InsetMode"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="auto"/> + <xsd:enumeration value="custom"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ColorMode"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="auto"/> + <xsd:enumeration value="custom"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ContentType"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:simpleType name="ST_DiagramLayout"> + <xsd:restriction base="xsd:integer"> + <xsd:enumeration value="0"/> + <xsd:enumeration value="1"/> + <xsd:enumeration value="2"/> + <xsd:enumeration value="3"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ExtrusionType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="perspective"/> + <xsd:enumeration value="parallel"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ExtrusionRender"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="solid"/> + <xsd:enumeration value="wireFrame"/> + <xsd:enumeration value="boundingCube"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ExtrusionPlane"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="XY"/> + <xsd:enumeration value="ZX"/> + <xsd:enumeration value="YZ"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Angle"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="any"/> + <xsd:enumeration value="30"/> + <xsd:enumeration value="45"/> + <xsd:enumeration value="60"/> + <xsd:enumeration value="90"/> + <xsd:enumeration value="auto"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_CalloutDrop"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:simpleType name="ST_CalloutPlacement"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="top"/> + <xsd:enumeration value="center"/> + <xsd:enumeration value="bottom"/> + <xsd:enumeration value="user"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ConnectorType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="straight"/> + <xsd:enumeration value="elbow"/> + <xsd:enumeration value="curved"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_HrAlign"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="left"/> + <xsd:enumeration value="right"/> + <xsd:enumeration value="center"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_ConnectType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="rect"/> + <xsd:enumeration value="segments"/> + <xsd:enumeration value="custom"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_OLELinkType"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:simpleType name="ST_OLEType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="Embed"/> + <xsd:enumeration value="Link"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_OLEDrawAspect"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="Content"/> + <xsd:enumeration value="Icon"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_OLEUpdateMode"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="Always"/> + <xsd:enumeration value="OnCall"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FillType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="gradientCenter"/> + <xsd:enumeration value="solid"/> + <xsd:enumeration value="pattern"/> + <xsd:enumeration value="tile"/> + <xsd:enumeration value="frame"/> + <xsd:enumeration value="gradientUnscaled"/> + <xsd:enumeration value="gradientRadial"/> + <xsd:enumeration value="gradient"/> + <xsd:enumeration value="background"/> + </xsd:restriction> + </xsd:simpleType> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd new file mode 100644 index 0000000..dd079e6 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="urn:schemas-microsoft-com:office:powerpoint" + targetNamespace="urn:schemas-microsoft-com:office:powerpoint" elementFormDefault="qualified" + attributeFormDefault="unqualified"> + <xsd:element name="iscomment" type="CT_Empty"/> + <xsd:element name="textdata" type="CT_Rel"/> + <xsd:complexType name="CT_Empty"/> + <xsd:complexType name="CT_Rel"> + <xsd:attribute name="id" type="xsd:string"/> + </xsd:complexType> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd new file mode 100644 index 0000000..3dd6cf6 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="urn:schemas-microsoft-com:office:excel" + xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + targetNamespace="urn:schemas-microsoft-com:office:excel" elementFormDefault="qualified" + attributeFormDefault="unqualified"> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + schemaLocation="shared-commonSimpleTypes.xsd"/> + <xsd:element name="ClientData" type="CT_ClientData"/> + <xsd:complexType name="CT_ClientData"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="MoveWithCells" type="s:ST_TrueFalseBlank"/> + <xsd:element name="SizeWithCells" type="s:ST_TrueFalseBlank"/> + <xsd:element name="Anchor" type="xsd:string"/> + <xsd:element name="Locked" type="s:ST_TrueFalseBlank"/> + <xsd:element name="DefaultSize" type="s:ST_TrueFalseBlank"/> + <xsd:element name="PrintObject" type="s:ST_TrueFalseBlank"/> + <xsd:element name="Disabled" type="s:ST_TrueFalseBlank"/> + <xsd:element name="AutoFill" type="s:ST_TrueFalseBlank"/> + <xsd:element name="AutoLine" type="s:ST_TrueFalseBlank"/> + <xsd:element name="AutoPict" type="s:ST_TrueFalseBlank"/> + <xsd:element name="FmlaMacro" type="xsd:string"/> + <xsd:element name="TextHAlign" type="xsd:string"/> + <xsd:element name="TextVAlign" type="xsd:string"/> + <xsd:element name="LockText" type="s:ST_TrueFalseBlank"/> + <xsd:element name="JustLastX" type="s:ST_TrueFalseBlank"/> + <xsd:element name="SecretEdit" type="s:ST_TrueFalseBlank"/> + <xsd:element name="Default" type="s:ST_TrueFalseBlank"/> + <xsd:element name="Help" type="s:ST_TrueFalseBlank"/> + <xsd:element name="Cancel" type="s:ST_TrueFalseBlank"/> + <xsd:element name="Dismiss" type="s:ST_TrueFalseBlank"/> + <xsd:element name="Accel" type="xsd:integer"/> + <xsd:element name="Accel2" type="xsd:integer"/> + <xsd:element name="Row" type="xsd:integer"/> + <xsd:element name="Column" type="xsd:integer"/> + <xsd:element name="Visible" type="s:ST_TrueFalseBlank"/> + <xsd:element name="RowHidden" type="s:ST_TrueFalseBlank"/> + <xsd:element name="ColHidden" type="s:ST_TrueFalseBlank"/> + <xsd:element name="VTEdit" type="xsd:integer"/> + <xsd:element name="MultiLine" type="s:ST_TrueFalseBlank"/> + <xsd:element name="VScroll" type="s:ST_TrueFalseBlank"/> + <xsd:element name="ValidIds" type="s:ST_TrueFalseBlank"/> + <xsd:element name="FmlaRange" type="xsd:string"/> + <xsd:element name="WidthMin" type="xsd:integer"/> + <xsd:element name="Sel" type="xsd:integer"/> + <xsd:element name="NoThreeD2" type="s:ST_TrueFalseBlank"/> + <xsd:element name="SelType" type="xsd:string"/> + <xsd:element name="MultiSel" type="xsd:string"/> + <xsd:element name="LCT" type="xsd:string"/> + <xsd:element name="ListItem" type="xsd:string"/> + <xsd:element name="DropStyle" type="xsd:string"/> + <xsd:element name="Colored" type="s:ST_TrueFalseBlank"/> + <xsd:element name="DropLines" type="xsd:integer"/> + <xsd:element name="Checked" type="xsd:integer"/> + <xsd:element name="FmlaLink" type="xsd:string"/> + <xsd:element name="FmlaPict" type="xsd:string"/> + <xsd:element name="NoThreeD" type="s:ST_TrueFalseBlank"/> + <xsd:element name="FirstButton" type="s:ST_TrueFalseBlank"/> + <xsd:element name="FmlaGroup" type="xsd:string"/> + <xsd:element name="Val" type="xsd:integer"/> + <xsd:element name="Min" type="xsd:integer"/> + <xsd:element name="Max" type="xsd:integer"/> + <xsd:element name="Inc" type="xsd:integer"/> + <xsd:element name="Page" type="xsd:integer"/> + <xsd:element name="Horiz" type="s:ST_TrueFalseBlank"/> + <xsd:element name="Dx" type="xsd:integer"/> + <xsd:element name="MapOCX" type="s:ST_TrueFalseBlank"/> + <xsd:element name="CF" type="ST_CF"/> + <xsd:element name="Camera" type="s:ST_TrueFalseBlank"/> + <xsd:element name="RecalcAlways" type="s:ST_TrueFalseBlank"/> + <xsd:element name="AutoScale" type="s:ST_TrueFalseBlank"/> + <xsd:element name="DDE" type="s:ST_TrueFalseBlank"/> + <xsd:element name="UIObj" type="s:ST_TrueFalseBlank"/> + <xsd:element name="ScriptText" type="xsd:string"/> + <xsd:element name="ScriptExtended" type="xsd:string"/> + <xsd:element name="ScriptLanguage" type="xsd:nonNegativeInteger"/> + <xsd:element name="ScriptLocation" type="xsd:nonNegativeInteger"/> + <xsd:element name="FmlaTxbx" type="xsd:string"/> + </xsd:choice> + <xsd:attribute name="ObjectType" type="ST_ObjectType" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_CF"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:simpleType name="ST_ObjectType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="Button"/> + <xsd:enumeration value="Checkbox"/> + <xsd:enumeration value="Dialog"/> + <xsd:enumeration value="Drop"/> + <xsd:enumeration value="Edit"/> + <xsd:enumeration value="GBox"/> + <xsd:enumeration value="Label"/> + <xsd:enumeration value="LineA"/> + <xsd:enumeration value="List"/> + <xsd:enumeration value="Movie"/> + <xsd:enumeration value="Note"/> + <xsd:enumeration value="Pict"/> + <xsd:enumeration value="Radio"/> + <xsd:enumeration value="RectA"/> + <xsd:enumeration value="Scroll"/> + <xsd:enumeration value="Spin"/> + <xsd:enumeration value="Shape"/> + <xsd:enumeration value="Group"/> + <xsd:enumeration value="Rect"/> + </xsd:restriction> + </xsd:simpleType> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd new file mode 100644 index 0000000..f1041e3 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd @@ -0,0 +1,96 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns="urn:schemas-microsoft-com:office:word" + targetNamespace="urn:schemas-microsoft-com:office:word" elementFormDefault="qualified" + attributeFormDefault="unqualified"> + <xsd:element name="bordertop" type="CT_Border"/> + <xsd:element name="borderleft" type="CT_Border"/> + <xsd:element name="borderright" type="CT_Border"/> + <xsd:element name="borderbottom" type="CT_Border"/> + <xsd:complexType name="CT_Border"> + <xsd:attribute name="type" type="ST_BorderType" use="optional"/> + <xsd:attribute name="width" type="xsd:positiveInteger" use="optional"/> + <xsd:attribute name="shadow" type="ST_BorderShadow" use="optional"/> + </xsd:complexType> + <xsd:element name="wrap" type="CT_Wrap"/> + <xsd:complexType name="CT_Wrap"> + <xsd:attribute name="type" type="ST_WrapType" use="optional"/> + <xsd:attribute name="side" type="ST_WrapSide" use="optional"/> + <xsd:attribute name="anchorx" type="ST_HorizontalAnchor" use="optional"/> + <xsd:attribute name="anchory" type="ST_VerticalAnchor" use="optional"/> + </xsd:complexType> + <xsd:element name="anchorlock" type="CT_AnchorLock"/> + <xsd:complexType name="CT_AnchorLock"/> + <xsd:simpleType name="ST_BorderType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="single"/> + <xsd:enumeration value="thick"/> + <xsd:enumeration value="double"/> + <xsd:enumeration value="hairline"/> + <xsd:enumeration value="dot"/> + <xsd:enumeration value="dash"/> + <xsd:enumeration value="dotDash"/> + <xsd:enumeration value="dashDotDot"/> + <xsd:enumeration value="triple"/> + <xsd:enumeration value="thinThickSmall"/> + <xsd:enumeration value="thickThinSmall"/> + <xsd:enumeration value="thickBetweenThinSmall"/> + <xsd:enumeration value="thinThick"/> + <xsd:enumeration value="thickThin"/> + <xsd:enumeration value="thickBetweenThin"/> + <xsd:enumeration value="thinThickLarge"/> + <xsd:enumeration value="thickThinLarge"/> + <xsd:enumeration value="thickBetweenThinLarge"/> + <xsd:enumeration value="wave"/> + <xsd:enumeration value="doubleWave"/> + <xsd:enumeration value="dashedSmall"/> + <xsd:enumeration value="dashDotStroked"/> + <xsd:enumeration value="threeDEmboss"/> + <xsd:enumeration value="threeDEngrave"/> + <xsd:enumeration value="HTMLOutset"/> + <xsd:enumeration value="HTMLInset"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_BorderShadow"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="t"/> + <xsd:enumeration value="true"/> + <xsd:enumeration value="f"/> + <xsd:enumeration value="false"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_WrapType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="topAndBottom"/> + <xsd:enumeration value="square"/> + <xsd:enumeration value="none"/> + <xsd:enumeration value="tight"/> + <xsd:enumeration value="through"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_WrapSide"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="both"/> + <xsd:enumeration value="left"/> + <xsd:enumeration value="right"/> + <xsd:enumeration value="largest"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_HorizontalAnchor"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="margin"/> + <xsd:enumeration value="page"/> + <xsd:enumeration value="text"/> + <xsd:enumeration value="char"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_VerticalAnchor"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="margin"/> + <xsd:enumeration value="page"/> + <xsd:enumeration value="text"/> + <xsd:enumeration value="line"/> + </xsd:restriction> + </xsd:simpleType> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd new file mode 100644 index 0000000..9c5b7a6 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd @@ -0,0 +1,3646 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" + xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main" + xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" + xmlns="http://schemas.openxmlformats.org/wordprocessingml/2006/main" + xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all" + targetNamespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> + <xsd:import namespace="http://schemas.openxmlformats.org/markup-compatibility/2006" schemaLocation="../mce/mc.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" + schemaLocation="dml-wordprocessingDrawing.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/math" + schemaLocation="shared-math.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships" + schemaLocation="shared-relationshipReference.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" + schemaLocation="shared-commonSimpleTypes.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/schemaLibrary/2006/main" + schemaLocation="shared-customXmlSchemaProperties.xsd"/> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace"/> + <xsd:complexType name="CT_Empty"/> + <xsd:complexType name="CT_OnOff"> + <xsd:attribute name="val" type="s:ST_OnOff"/> + </xsd:complexType> + <xsd:simpleType name="ST_LongHexNumber"> + <xsd:restriction base="xsd:hexBinary"> + <xsd:length value="4"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_LongHexNumber"> + <xsd:attribute name="val" type="ST_LongHexNumber" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_ShortHexNumber"> + <xsd:restriction base="xsd:hexBinary"> + <xsd:length value="2"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_UcharHexNumber"> + <xsd:restriction base="xsd:hexBinary"> + <xsd:length value="1"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Charset"> + <xsd:attribute name="val" type="ST_UcharHexNumber" use="optional"/> + <xsd:attribute name="characterSet" type="s:ST_String" use="optional" default="ISO-8859-1"/> + </xsd:complexType> + <xsd:simpleType name="ST_DecimalNumberOrPercent"> + <xsd:union memberTypes="ST_UnqualifiedPercentage s:ST_Percentage"/> + </xsd:simpleType> + <xsd:simpleType name="ST_UnqualifiedPercentage"> + <xsd:restriction base="xsd:decimal"/> + </xsd:simpleType> + <xsd:simpleType name="ST_DecimalNumber"> + <xsd:restriction base="xsd:integer"/> + </xsd:simpleType> + <xsd:complexType name="CT_DecimalNumber"> + <xsd:attribute name="val" type="ST_DecimalNumber" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_UnsignedDecimalNumber"> + <xsd:attribute name="val" type="s:ST_UnsignedDecimalNumber" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_DecimalNumberOrPrecent"> + <xsd:attribute name="val" type="ST_DecimalNumberOrPercent" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TwipsMeasure"> + <xsd:attribute name="val" type="s:ST_TwipsMeasure" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_SignedTwipsMeasure"> + <xsd:union memberTypes="xsd:integer s:ST_UniversalMeasure"/> + </xsd:simpleType> + <xsd:complexType name="CT_SignedTwipsMeasure"> + <xsd:attribute name="val" type="ST_SignedTwipsMeasure" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_PixelsMeasure"> + <xsd:restriction base="s:ST_UnsignedDecimalNumber"/> + </xsd:simpleType> + <xsd:complexType name="CT_PixelsMeasure"> + <xsd:attribute name="val" type="ST_PixelsMeasure" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_HpsMeasure"> + <xsd:union memberTypes="s:ST_UnsignedDecimalNumber s:ST_PositiveUniversalMeasure"/> + </xsd:simpleType> + <xsd:complexType name="CT_HpsMeasure"> + <xsd:attribute name="val" type="ST_HpsMeasure" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_SignedHpsMeasure"> + <xsd:union memberTypes="xsd:integer s:ST_UniversalMeasure"/> + </xsd:simpleType> + <xsd:complexType name="CT_SignedHpsMeasure"> + <xsd:attribute name="val" type="ST_SignedHpsMeasure" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_DateTime"> + <xsd:restriction base="xsd:dateTime"/> + </xsd:simpleType> + <xsd:simpleType name="ST_MacroName"> + <xsd:restriction base="xsd:string"> + <xsd:maxLength value="33"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_MacroName"> + <xsd:attribute name="val" use="required" type="ST_MacroName"/> + </xsd:complexType> + <xsd:simpleType name="ST_EighthPointMeasure"> + <xsd:restriction base="s:ST_UnsignedDecimalNumber"/> + </xsd:simpleType> + <xsd:simpleType name="ST_PointMeasure"> + <xsd:restriction base="s:ST_UnsignedDecimalNumber"/> + </xsd:simpleType> + <xsd:complexType name="CT_String"> + <xsd:attribute name="val" type="s:ST_String" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_TextScale"> + <xsd:union memberTypes="ST_TextScalePercent ST_TextScaleDecimal"/> + </xsd:simpleType> + <xsd:simpleType name="ST_TextScalePercent"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="0*(600|([0-5]?[0-9]?[0-9]))%"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TextScaleDecimal"> + <xsd:restriction base="xsd:integer"> + <xsd:minInclusive value="0"/> + <xsd:maxInclusive value="600"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TextScale"> + <xsd:attribute name="val" type="ST_TextScale"/> + </xsd:complexType> + <xsd:simpleType name="ST_HighlightColor"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="black"/> + <xsd:enumeration value="blue"/> + <xsd:enumeration value="cyan"/> + <xsd:enumeration value="green"/> + <xsd:enumeration value="magenta"/> + <xsd:enumeration value="red"/> + <xsd:enumeration value="yellow"/> + <xsd:enumeration value="white"/> + <xsd:enumeration value="darkBlue"/> + <xsd:enumeration value="darkCyan"/> + <xsd:enumeration value="darkGreen"/> + <xsd:enumeration value="darkMagenta"/> + <xsd:enumeration value="darkRed"/> + <xsd:enumeration value="darkYellow"/> + <xsd:enumeration value="darkGray"/> + <xsd:enumeration value="lightGray"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Highlight"> + <xsd:attribute name="val" type="ST_HighlightColor" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_HexColorAuto"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="auto"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_HexColor"> + <xsd:union memberTypes="ST_HexColorAuto s:ST_HexColorRGB"/> + </xsd:simpleType> + <xsd:complexType name="CT_Color"> + <xsd:attribute name="val" type="ST_HexColor" use="required"/> + <xsd:attribute name="themeColor" type="ST_ThemeColor" use="optional"/> + <xsd:attribute name="themeTint" type="ST_UcharHexNumber" use="optional"/> + <xsd:attribute name="themeShade" type="ST_UcharHexNumber" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Lang"> + <xsd:attribute name="val" type="s:ST_Lang" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Guid"> + <xsd:attribute name="val" type="s:ST_Guid"/> + </xsd:complexType> + <xsd:simpleType name="ST_Underline"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="single"/> + <xsd:enumeration value="words"/> + <xsd:enumeration value="double"/> + <xsd:enumeration value="thick"/> + <xsd:enumeration value="dotted"/> + <xsd:enumeration value="dottedHeavy"/> + <xsd:enumeration value="dash"/> + <xsd:enumeration value="dashedHeavy"/> + <xsd:enumeration value="dashLong"/> + <xsd:enumeration value="dashLongHeavy"/> + <xsd:enumeration value="dotDash"/> + <xsd:enumeration value="dashDotHeavy"/> + <xsd:enumeration value="dotDotDash"/> + <xsd:enumeration value="dashDotDotHeavy"/> + <xsd:enumeration value="wave"/> + <xsd:enumeration value="wavyHeavy"/> + <xsd:enumeration value="wavyDouble"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Underline"> + <xsd:attribute name="val" type="ST_Underline" use="optional"/> + <xsd:attribute name="color" type="ST_HexColor" use="optional" default="auto"/> + <xsd:attribute name="themeColor" type="ST_ThemeColor" use="optional"/> + <xsd:attribute name="themeTint" type="ST_UcharHexNumber" use="optional"/> + <xsd:attribute name="themeShade" type="ST_UcharHexNumber" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_TextEffect"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="blinkBackground"/> + <xsd:enumeration value="lights"/> + <xsd:enumeration value="antsBlack"/> + <xsd:enumeration value="antsRed"/> + <xsd:enumeration value="shimmer"/> + <xsd:enumeration value="sparkle"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TextEffect"> + <xsd:attribute name="val" type="ST_TextEffect" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_Border"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="nil"/> + <xsd:enumeration value="none"/> + <xsd:enumeration value="single"/> + <xsd:enumeration value="thick"/> + <xsd:enumeration value="double"/> + <xsd:enumeration value="dotted"/> + <xsd:enumeration value="dashed"/> + <xsd:enumeration value="dotDash"/> + <xsd:enumeration value="dotDotDash"/> + <xsd:enumeration value="triple"/> + <xsd:enumeration value="thinThickSmallGap"/> + <xsd:enumeration value="thickThinSmallGap"/> + <xsd:enumeration value="thinThickThinSmallGap"/> + <xsd:enumeration value="thinThickMediumGap"/> + <xsd:enumeration value="thickThinMediumGap"/> + <xsd:enumeration value="thinThickThinMediumGap"/> + <xsd:enumeration value="thinThickLargeGap"/> + <xsd:enumeration value="thickThinLargeGap"/> + <xsd:enumeration value="thinThickThinLargeGap"/> + <xsd:enumeration value="wave"/> + <xsd:enumeration value="doubleWave"/> + <xsd:enumeration value="dashSmallGap"/> + <xsd:enumeration value="dashDotStroked"/> + <xsd:enumeration value="threeDEmboss"/> + <xsd:enumeration value="threeDEngrave"/> + <xsd:enumeration value="outset"/> + <xsd:enumeration value="inset"/> + <xsd:enumeration value="apples"/> + <xsd:enumeration value="archedScallops"/> + <xsd:enumeration value="babyPacifier"/> + <xsd:enumeration value="babyRattle"/> + <xsd:enumeration value="balloons3Colors"/> + <xsd:enumeration value="balloonsHotAir"/> + <xsd:enumeration value="basicBlackDashes"/> + <xsd:enumeration value="basicBlackDots"/> + <xsd:enumeration value="basicBlackSquares"/> + <xsd:enumeration value="basicThinLines"/> + <xsd:enumeration value="basicWhiteDashes"/> + <xsd:enumeration value="basicWhiteDots"/> + <xsd:enumeration value="basicWhiteSquares"/> + <xsd:enumeration value="basicWideInline"/> + <xsd:enumeration value="basicWideMidline"/> + <xsd:enumeration value="basicWideOutline"/> + <xsd:enumeration value="bats"/> + <xsd:enumeration value="birds"/> + <xsd:enumeration value="birdsFlight"/> + <xsd:enumeration value="cabins"/> + <xsd:enumeration value="cakeSlice"/> + <xsd:enumeration value="candyCorn"/> + <xsd:enumeration value="celticKnotwork"/> + <xsd:enumeration value="certificateBanner"/> + <xsd:enumeration value="chainLink"/> + <xsd:enumeration value="champagneBottle"/> + <xsd:enumeration value="checkedBarBlack"/> + <xsd:enumeration value="checkedBarColor"/> + <xsd:enumeration value="checkered"/> + <xsd:enumeration value="christmasTree"/> + <xsd:enumeration value="circlesLines"/> + <xsd:enumeration value="circlesRectangles"/> + <xsd:enumeration value="classicalWave"/> + <xsd:enumeration value="clocks"/> + <xsd:enumeration value="compass"/> + <xsd:enumeration value="confetti"/> + <xsd:enumeration value="confettiGrays"/> + <xsd:enumeration value="confettiOutline"/> + <xsd:enumeration value="confettiStreamers"/> + <xsd:enumeration value="confettiWhite"/> + <xsd:enumeration value="cornerTriangles"/> + <xsd:enumeration value="couponCutoutDashes"/> + <xsd:enumeration value="couponCutoutDots"/> + <xsd:enumeration value="crazyMaze"/> + <xsd:enumeration value="creaturesButterfly"/> + <xsd:enumeration value="creaturesFish"/> + <xsd:enumeration value="creaturesInsects"/> + <xsd:enumeration value="creaturesLadyBug"/> + <xsd:enumeration value="crossStitch"/> + <xsd:enumeration value="cup"/> + <xsd:enumeration value="decoArch"/> + <xsd:enumeration value="decoArchColor"/> + <xsd:enumeration value="decoBlocks"/> + <xsd:enumeration value="diamondsGray"/> + <xsd:enumeration value="doubleD"/> + <xsd:enumeration value="doubleDiamonds"/> + <xsd:enumeration value="earth1"/> + <xsd:enumeration value="earth2"/> + <xsd:enumeration value="earth3"/> + <xsd:enumeration value="eclipsingSquares1"/> + <xsd:enumeration value="eclipsingSquares2"/> + <xsd:enumeration value="eggsBlack"/> + <xsd:enumeration value="fans"/> + <xsd:enumeration value="film"/> + <xsd:enumeration value="firecrackers"/> + <xsd:enumeration value="flowersBlockPrint"/> + <xsd:enumeration value="flowersDaisies"/> + <xsd:enumeration value="flowersModern1"/> + <xsd:enumeration value="flowersModern2"/> + <xsd:enumeration value="flowersPansy"/> + <xsd:enumeration value="flowersRedRose"/> + <xsd:enumeration value="flowersRoses"/> + <xsd:enumeration value="flowersTeacup"/> + <xsd:enumeration value="flowersTiny"/> + <xsd:enumeration value="gems"/> + <xsd:enumeration value="gingerbreadMan"/> + <xsd:enumeration value="gradient"/> + <xsd:enumeration value="handmade1"/> + <xsd:enumeration value="handmade2"/> + <xsd:enumeration value="heartBalloon"/> + <xsd:enumeration value="heartGray"/> + <xsd:enumeration value="hearts"/> + <xsd:enumeration value="heebieJeebies"/> + <xsd:enumeration value="holly"/> + <xsd:enumeration value="houseFunky"/> + <xsd:enumeration value="hypnotic"/> + <xsd:enumeration value="iceCreamCones"/> + <xsd:enumeration value="lightBulb"/> + <xsd:enumeration value="lightning1"/> + <xsd:enumeration value="lightning2"/> + <xsd:enumeration value="mapPins"/> + <xsd:enumeration value="mapleLeaf"/> + <xsd:enumeration value="mapleMuffins"/> + <xsd:enumeration value="marquee"/> + <xsd:enumeration value="marqueeToothed"/> + <xsd:enumeration value="moons"/> + <xsd:enumeration value="mosaic"/> + <xsd:enumeration value="musicNotes"/> + <xsd:enumeration value="northwest"/> + <xsd:enumeration value="ovals"/> + <xsd:enumeration value="packages"/> + <xsd:enumeration value="palmsBlack"/> + <xsd:enumeration value="palmsColor"/> + <xsd:enumeration value="paperClips"/> + <xsd:enumeration value="papyrus"/> + <xsd:enumeration value="partyFavor"/> + <xsd:enumeration value="partyGlass"/> + <xsd:enumeration value="pencils"/> + <xsd:enumeration value="people"/> + <xsd:enumeration value="peopleWaving"/> + <xsd:enumeration value="peopleHats"/> + <xsd:enumeration value="poinsettias"/> + <xsd:enumeration value="postageStamp"/> + <xsd:enumeration value="pumpkin1"/> + <xsd:enumeration value="pushPinNote2"/> + <xsd:enumeration value="pushPinNote1"/> + <xsd:enumeration value="pyramids"/> + <xsd:enumeration value="pyramidsAbove"/> + <xsd:enumeration value="quadrants"/> + <xsd:enumeration value="rings"/> + <xsd:enumeration value="safari"/> + <xsd:enumeration value="sawtooth"/> + <xsd:enumeration value="sawtoothGray"/> + <xsd:enumeration value="scaredCat"/> + <xsd:enumeration value="seattle"/> + <xsd:enumeration value="shadowedSquares"/> + <xsd:enumeration value="sharksTeeth"/> + <xsd:enumeration value="shorebirdTracks"/> + <xsd:enumeration value="skyrocket"/> + <xsd:enumeration value="snowflakeFancy"/> + <xsd:enumeration value="snowflakes"/> + <xsd:enumeration value="sombrero"/> + <xsd:enumeration value="southwest"/> + <xsd:enumeration value="stars"/> + <xsd:enumeration value="starsTop"/> + <xsd:enumeration value="stars3d"/> + <xsd:enumeration value="starsBlack"/> + <xsd:enumeration value="starsShadowed"/> + <xsd:enumeration value="sun"/> + <xsd:enumeration value="swirligig"/> + <xsd:enumeration value="tornPaper"/> + <xsd:enumeration value="tornPaperBlack"/> + <xsd:enumeration value="trees"/> + <xsd:enumeration value="triangleParty"/> + <xsd:enumeration value="triangles"/> + <xsd:enumeration value="triangle1"/> + <xsd:enumeration value="triangle2"/> + <xsd:enumeration value="triangleCircle1"/> + <xsd:enumeration value="triangleCircle2"/> + <xsd:enumeration value="shapes1"/> + <xsd:enumeration value="shapes2"/> + <xsd:enumeration value="twistedLines1"/> + <xsd:enumeration value="twistedLines2"/> + <xsd:enumeration value="vine"/> + <xsd:enumeration value="waveline"/> + <xsd:enumeration value="weavingAngles"/> + <xsd:enumeration value="weavingBraid"/> + <xsd:enumeration value="weavingRibbon"/> + <xsd:enumeration value="weavingStrips"/> + <xsd:enumeration value="whiteFlowers"/> + <xsd:enumeration value="woodwork"/> + <xsd:enumeration value="xIllusions"/> + <xsd:enumeration value="zanyTriangles"/> + <xsd:enumeration value="zigZag"/> + <xsd:enumeration value="zigZagStitch"/> + <xsd:enumeration value="custom"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Border"> + <xsd:attribute name="val" type="ST_Border" use="required"/> + <xsd:attribute name="color" type="ST_HexColor" use="optional" default="auto"/> + <xsd:attribute name="themeColor" type="ST_ThemeColor" use="optional"/> + <xsd:attribute name="themeTint" type="ST_UcharHexNumber" use="optional"/> + <xsd:attribute name="themeShade" type="ST_UcharHexNumber" use="optional"/> + <xsd:attribute name="sz" type="ST_EighthPointMeasure" use="optional"/> + <xsd:attribute name="space" type="ST_PointMeasure" use="optional" default="0"/> + <xsd:attribute name="shadow" type="s:ST_OnOff" use="optional"/> + <xsd:attribute name="frame" type="s:ST_OnOff" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_Shd"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="nil"/> + <xsd:enumeration value="clear"/> + <xsd:enumeration value="solid"/> + <xsd:enumeration value="horzStripe"/> + <xsd:enumeration value="vertStripe"/> + <xsd:enumeration value="reverseDiagStripe"/> + <xsd:enumeration value="diagStripe"/> + <xsd:enumeration value="horzCross"/> + <xsd:enumeration value="diagCross"/> + <xsd:enumeration value="thinHorzStripe"/> + <xsd:enumeration value="thinVertStripe"/> + <xsd:enumeration value="thinReverseDiagStripe"/> + <xsd:enumeration value="thinDiagStripe"/> + <xsd:enumeration value="thinHorzCross"/> + <xsd:enumeration value="thinDiagCross"/> + <xsd:enumeration value="pct5"/> + <xsd:enumeration value="pct10"/> + <xsd:enumeration value="pct12"/> + <xsd:enumeration value="pct15"/> + <xsd:enumeration value="pct20"/> + <xsd:enumeration value="pct25"/> + <xsd:enumeration value="pct30"/> + <xsd:enumeration value="pct35"/> + <xsd:enumeration value="pct37"/> + <xsd:enumeration value="pct40"/> + <xsd:enumeration value="pct45"/> + <xsd:enumeration value="pct50"/> + <xsd:enumeration value="pct55"/> + <xsd:enumeration value="pct60"/> + <xsd:enumeration value="pct62"/> + <xsd:enumeration value="pct65"/> + <xsd:enumeration value="pct70"/> + <xsd:enumeration value="pct75"/> + <xsd:enumeration value="pct80"/> + <xsd:enumeration value="pct85"/> + <xsd:enumeration value="pct87"/> + <xsd:enumeration value="pct90"/> + <xsd:enumeration value="pct95"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Shd"> + <xsd:attribute name="val" type="ST_Shd" use="required"/> + <xsd:attribute name="color" type="ST_HexColor" use="optional"/> + <xsd:attribute name="themeColor" type="ST_ThemeColor" use="optional"/> + <xsd:attribute name="themeTint" type="ST_UcharHexNumber" use="optional"/> + <xsd:attribute name="themeShade" type="ST_UcharHexNumber" use="optional"/> + <xsd:attribute name="fill" type="ST_HexColor" use="optional"/> + <xsd:attribute name="themeFill" type="ST_ThemeColor" use="optional"/> + <xsd:attribute name="themeFillTint" type="ST_UcharHexNumber" use="optional"/> + <xsd:attribute name="themeFillShade" type="ST_UcharHexNumber" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_VerticalAlignRun"> + <xsd:attribute name="val" type="s:ST_VerticalAlignRun" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_FitText"> + <xsd:attribute name="val" type="s:ST_TwipsMeasure" use="required"/> + <xsd:attribute name="id" type="ST_DecimalNumber" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_Em"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="dot"/> + <xsd:enumeration value="comma"/> + <xsd:enumeration value="circle"/> + <xsd:enumeration value="underDot"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Em"> + <xsd:attribute name="val" type="ST_Em" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Language"> + <xsd:attribute name="val" type="s:ST_Lang" use="optional"/> + <xsd:attribute name="eastAsia" type="s:ST_Lang" use="optional"/> + <xsd:attribute name="bidi" type="s:ST_Lang" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_CombineBrackets"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="round"/> + <xsd:enumeration value="square"/> + <xsd:enumeration value="angle"/> + <xsd:enumeration value="curly"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_EastAsianLayout"> + <xsd:attribute name="id" type="ST_DecimalNumber" use="optional"/> + <xsd:attribute name="combine" type="s:ST_OnOff" use="optional"/> + <xsd:attribute name="combineBrackets" type="ST_CombineBrackets" use="optional"/> + <xsd:attribute name="vert" type="s:ST_OnOff" use="optional"/> + <xsd:attribute name="vertCompress" type="s:ST_OnOff" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_HeightRule"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="auto"/> + <xsd:enumeration value="exact"/> + <xsd:enumeration value="atLeast"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Wrap"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="auto"/> + <xsd:enumeration value="notBeside"/> + <xsd:enumeration value="around"/> + <xsd:enumeration value="tight"/> + <xsd:enumeration value="through"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_VAnchor"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="text"/> + <xsd:enumeration value="margin"/> + <xsd:enumeration value="page"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_HAnchor"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="text"/> + <xsd:enumeration value="margin"/> + <xsd:enumeration value="page"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_DropCap"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="drop"/> + <xsd:enumeration value="margin"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_FramePr"> + <xsd:attribute name="dropCap" type="ST_DropCap" use="optional"/> + <xsd:attribute name="lines" type="ST_DecimalNumber" use="optional"/> + <xsd:attribute name="w" type="s:ST_TwipsMeasure" use="optional"/> + <xsd:attribute name="h" type="s:ST_TwipsMeasure" use="optional"/> + <xsd:attribute name="vSpace" type="s:ST_TwipsMeasure" use="optional"/> + <xsd:attribute name="hSpace" type="s:ST_TwipsMeasure" use="optional"/> + <xsd:attribute name="wrap" type="ST_Wrap" use="optional"/> + <xsd:attribute name="hAnchor" type="ST_HAnchor" use="optional"/> + <xsd:attribute name="vAnchor" type="ST_VAnchor" use="optional"/> + <xsd:attribute name="x" type="ST_SignedTwipsMeasure" use="optional"/> + <xsd:attribute name="xAlign" type="s:ST_XAlign" use="optional"/> + <xsd:attribute name="y" type="ST_SignedTwipsMeasure" use="optional"/> + <xsd:attribute name="yAlign" type="s:ST_YAlign" use="optional"/> + <xsd:attribute name="hRule" type="ST_HeightRule" use="optional"/> + <xsd:attribute name="anchorLock" type="s:ST_OnOff" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_TabJc"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="clear"/> + <xsd:enumeration value="start"/> + <xsd:enumeration value="center"/> + <xsd:enumeration value="end"/> + <xsd:enumeration value="decimal"/> + <xsd:enumeration value="bar"/> + <xsd:enumeration value="num"/> + <xsd:enumeration value="left"/> + <xsd:enumeration value="right"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_TabTlc"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="dot"/> + <xsd:enumeration value="hyphen"/> + <xsd:enumeration value="underscore"/> + <xsd:enumeration value="heavy"/> + <xsd:enumeration value="middleDot"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TabStop"> + <xsd:attribute name="val" type="ST_TabJc" use="required"/> + <xsd:attribute name="leader" type="ST_TabTlc" use="optional"/> + <xsd:attribute name="pos" type="ST_SignedTwipsMeasure" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_LineSpacingRule"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="auto"/> + <xsd:enumeration value="exact"/> + <xsd:enumeration value="atLeast"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Spacing"> + <xsd:attribute name="before" type="s:ST_TwipsMeasure" use="optional" default="0"/> + <xsd:attribute name="beforeLines" type="ST_DecimalNumber" use="optional" default="0"/> + <xsd:attribute name="beforeAutospacing" type="s:ST_OnOff" use="optional" default="off"/> + <xsd:attribute name="after" type="s:ST_TwipsMeasure" use="optional" default="0"/> + <xsd:attribute name="afterLines" type="ST_DecimalNumber" use="optional" default="0"/> + <xsd:attribute name="afterAutospacing" type="s:ST_OnOff" use="optional" default="off"/> + <xsd:attribute name="line" type="ST_SignedTwipsMeasure" use="optional" default="0"/> + <xsd:attribute name="lineRule" type="ST_LineSpacingRule" use="optional" default="auto"/> + </xsd:complexType> + <xsd:complexType name="CT_Ind"> + <xsd:attribute name="start" type="ST_SignedTwipsMeasure" use="optional"/> + <xsd:attribute name="startChars" type="ST_DecimalNumber" use="optional"/> + <xsd:attribute name="end" type="ST_SignedTwipsMeasure" use="optional"/> + <xsd:attribute name="endChars" type="ST_DecimalNumber" use="optional"/> + <xsd:attribute name="left" type="ST_SignedTwipsMeasure" use="optional"/> + <xsd:attribute name="leftChars" type="ST_DecimalNumber" use="optional"/> + <xsd:attribute name="right" type="ST_SignedTwipsMeasure" use="optional"/> + <xsd:attribute name="rightChars" type="ST_DecimalNumber" use="optional"/> + <xsd:attribute name="hanging" type="s:ST_TwipsMeasure" use="optional"/> + <xsd:attribute name="hangingChars" type="ST_DecimalNumber" use="optional"/> + <xsd:attribute name="firstLine" type="s:ST_TwipsMeasure" use="optional"/> + <xsd:attribute name="firstLineChars" type="ST_DecimalNumber" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_Jc"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="start"/> + <xsd:enumeration value="center"/> + <xsd:enumeration value="end"/> + <xsd:enumeration value="both"/> + <xsd:enumeration value="mediumKashida"/> + <xsd:enumeration value="distribute"/> + <xsd:enumeration value="numTab"/> + <xsd:enumeration value="highKashida"/> + <xsd:enumeration value="lowKashida"/> + <xsd:enumeration value="thaiDistribute"/> + <xsd:enumeration value="left"/> + <xsd:enumeration value="right"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_JcTable"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="center"/> + <xsd:enumeration value="end"/> + <xsd:enumeration value="left"/> + <xsd:enumeration value="right"/> + <xsd:enumeration value="start"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Jc"> + <xsd:attribute name="val" type="ST_Jc" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_JcTable"> + <xsd:attribute name="val" type="ST_JcTable" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_View"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="print"/> + <xsd:enumeration value="outline"/> + <xsd:enumeration value="masterPages"/> + <xsd:enumeration value="normal"/> + <xsd:enumeration value="web"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_View"> + <xsd:attribute name="val" type="ST_View" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_Zoom"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="fullPage"/> + <xsd:enumeration value="bestFit"/> + <xsd:enumeration value="textFit"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Zoom"> + <xsd:attribute name="val" type="ST_Zoom" use="optional"/> + <xsd:attribute name="percent" type="ST_DecimalNumberOrPercent" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_WritingStyle"> + <xsd:attribute name="lang" type="s:ST_Lang" use="required"/> + <xsd:attribute name="vendorID" type="s:ST_String" use="required"/> + <xsd:attribute name="dllVersion" type="s:ST_String" use="required"/> + <xsd:attribute name="nlCheck" type="s:ST_OnOff" use="optional" default="off"/> + <xsd:attribute name="checkStyle" type="s:ST_OnOff" use="required"/> + <xsd:attribute name="appName" type="s:ST_String" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_Proof"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="clean"/> + <xsd:enumeration value="dirty"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Proof"> + <xsd:attribute name="spelling" type="ST_Proof" use="optional"/> + <xsd:attribute name="grammar" type="ST_Proof" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_DocType"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:complexType name="CT_DocType"> + <xsd:attribute name="val" type="ST_DocType" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_DocProtect"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="readOnly"/> + <xsd:enumeration value="comments"/> + <xsd:enumeration value="trackedChanges"/> + <xsd:enumeration value="forms"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:attributeGroup name="AG_Password"> + <xsd:attribute name="algorithmName" type="s:ST_String" use="optional"/> + <xsd:attribute name="hashValue" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="saltValue" type="xsd:base64Binary" use="optional"/> + <xsd:attribute name="spinCount" type="ST_DecimalNumber" use="optional"/> + </xsd:attributeGroup> + <xsd:attributeGroup name="AG_TransitionalPassword"> + <xsd:attribute name="cryptProviderType" type="s:ST_CryptProv"/> + <xsd:attribute name="cryptAlgorithmClass" type="s:ST_AlgClass"/> + <xsd:attribute name="cryptAlgorithmType" type="s:ST_AlgType"/> + <xsd:attribute name="cryptAlgorithmSid" type="ST_DecimalNumber"/> + <xsd:attribute name="cryptSpinCount" type="ST_DecimalNumber"/> + <xsd:attribute name="cryptProvider" type="s:ST_String"/> + <xsd:attribute name="algIdExt" type="ST_LongHexNumber"/> + <xsd:attribute name="algIdExtSource" type="s:ST_String"/> + <xsd:attribute name="cryptProviderTypeExt" type="ST_LongHexNumber"/> + <xsd:attribute name="cryptProviderTypeExtSource" type="s:ST_String"/> + <xsd:attribute name="hash" type="xsd:base64Binary"/> + <xsd:attribute name="salt" type="xsd:base64Binary"/> + </xsd:attributeGroup> + <xsd:complexType name="CT_DocProtect"> + <xsd:attribute name="edit" type="ST_DocProtect" use="optional"/> + <xsd:attribute name="formatting" type="s:ST_OnOff" use="optional"/> + <xsd:attribute name="enforcement" type="s:ST_OnOff"/> + <xsd:attributeGroup ref="AG_Password"/> + <xsd:attributeGroup ref="AG_TransitionalPassword"/> + </xsd:complexType> + <xsd:simpleType name="ST_MailMergeDocType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="catalog"/> + <xsd:enumeration value="envelopes"/> + <xsd:enumeration value="mailingLabels"/> + <xsd:enumeration value="formLetters"/> + <xsd:enumeration value="email"/> + <xsd:enumeration value="fax"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_MailMergeDocType"> + <xsd:attribute name="val" type="ST_MailMergeDocType" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_MailMergeDataType"> + <xsd:restriction base="xsd:string"/> + </xsd:simpleType> + <xsd:complexType name="CT_MailMergeDataType"> + <xsd:attribute name="val" type="ST_MailMergeDataType" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_MailMergeDest"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="newDocument"/> + <xsd:enumeration value="printer"/> + <xsd:enumeration value="email"/> + <xsd:enumeration value="fax"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_MailMergeDest"> + <xsd:attribute name="val" type="ST_MailMergeDest" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_MailMergeOdsoFMDFieldType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="null"/> + <xsd:enumeration value="dbColumn"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_MailMergeOdsoFMDFieldType"> + <xsd:attribute name="val" type="ST_MailMergeOdsoFMDFieldType" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TrackChangesView"> + <xsd:attribute name="markup" type="s:ST_OnOff" use="optional"/> + <xsd:attribute name="comments" type="s:ST_OnOff" use="optional"/> + <xsd:attribute name="insDel" type="s:ST_OnOff" use="optional"/> + <xsd:attribute name="formatting" type="s:ST_OnOff" use="optional"/> + <xsd:attribute name="inkAnnotations" type="s:ST_OnOff" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Kinsoku"> + <xsd:attribute name="lang" type="s:ST_Lang" use="required"/> + <xsd:attribute name="val" type="s:ST_String" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_TextDirection"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="tb"/> + <xsd:enumeration value="rl"/> + <xsd:enumeration value="lr"/> + <xsd:enumeration value="tbV"/> + <xsd:enumeration value="rlV"/> + <xsd:enumeration value="lrV"/> + <xsd:enumeration value="btLr"/> + <xsd:enumeration value="lrTb"/> + <xsd:enumeration value="lrTbV"/> + <xsd:enumeration value="tbLrV"/> + <xsd:enumeration value="tbRl"/> + <xsd:enumeration value="tbRlV"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TextDirection"> + <xsd:attribute name="val" type="ST_TextDirection" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_TextAlignment"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="top"/> + <xsd:enumeration value="center"/> + <xsd:enumeration value="baseline"/> + <xsd:enumeration value="bottom"/> + <xsd:enumeration value="auto"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TextAlignment"> + <xsd:attribute name="val" type="ST_TextAlignment" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_DisplacedByCustomXml"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="next"/> + <xsd:enumeration value="prev"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_AnnotationVMerge"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="cont"/> + <xsd:enumeration value="rest"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Markup"> + <xsd:attribute name="id" type="ST_DecimalNumber" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TrackChange"> + <xsd:complexContent> + <xsd:extension base="CT_Markup"> + <xsd:attribute name="author" type="s:ST_String" use="required"/> + <xsd:attribute name="date" type="ST_DateTime" use="optional"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_CellMergeTrackChange"> + <xsd:complexContent> + <xsd:extension base="CT_TrackChange"> + <xsd:attribute name="vMerge" type="ST_AnnotationVMerge" use="optional"/> + <xsd:attribute name="vMergeOrig" type="ST_AnnotationVMerge" use="optional"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_TrackChangeRange"> + <xsd:complexContent> + <xsd:extension base="CT_TrackChange"> + <xsd:attribute name="displacedByCustomXml" type="ST_DisplacedByCustomXml" use="optional"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_MarkupRange"> + <xsd:complexContent> + <xsd:extension base="CT_Markup"> + <xsd:attribute name="displacedByCustomXml" type="ST_DisplacedByCustomXml" use="optional"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_BookmarkRange"> + <xsd:complexContent> + <xsd:extension base="CT_MarkupRange"> + <xsd:attribute name="colFirst" type="ST_DecimalNumber" use="optional"/> + <xsd:attribute name="colLast" type="ST_DecimalNumber" use="optional"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_Bookmark"> + <xsd:complexContent> + <xsd:extension base="CT_BookmarkRange"> + <xsd:attribute name="name" type="s:ST_String" use="required"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_MoveBookmark"> + <xsd:complexContent> + <xsd:extension base="CT_Bookmark"> + <xsd:attribute name="author" type="s:ST_String" use="required"/> + <xsd:attribute name="date" type="ST_DateTime" use="required"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_Comment"> + <xsd:complexContent> + <xsd:extension base="CT_TrackChange"> + <xsd:sequence> + <xsd:group ref="EG_BlockLevelElts" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="initials" type="s:ST_String" use="optional"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_TrackChangeNumbering"> + <xsd:complexContent> + <xsd:extension base="CT_TrackChange"> + <xsd:attribute name="original" type="s:ST_String" use="optional"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_TblPrExChange"> + <xsd:complexContent> + <xsd:extension base="CT_TrackChange"> + <xsd:sequence> + <xsd:element name="tblPrEx" type="CT_TblPrExBase" minOccurs="1"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_TcPrChange"> + <xsd:complexContent> + <xsd:extension base="CT_TrackChange"> + <xsd:sequence> + <xsd:element name="tcPr" type="CT_TcPrInner" minOccurs="1"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_TrPrChange"> + <xsd:complexContent> + <xsd:extension base="CT_TrackChange"> + <xsd:sequence> + <xsd:element name="trPr" type="CT_TrPrBase" minOccurs="1"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_TblGridChange"> + <xsd:complexContent> + <xsd:extension base="CT_Markup"> + <xsd:sequence> + <xsd:element name="tblGrid" type="CT_TblGridBase"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_TblPrChange"> + <xsd:complexContent> + <xsd:extension base="CT_TrackChange"> + <xsd:sequence> + <xsd:element name="tblPr" type="CT_TblPrBase"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_SectPrChange"> + <xsd:complexContent> + <xsd:extension base="CT_TrackChange"> + <xsd:sequence> + <xsd:element name="sectPr" type="CT_SectPrBase" minOccurs="0"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_PPrChange"> + <xsd:complexContent> + <xsd:extension base="CT_TrackChange"> + <xsd:sequence> + <xsd:element name="pPr" type="CT_PPrBase" minOccurs="1"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_RPrChange"> + <xsd:complexContent> + <xsd:extension base="CT_TrackChange"> + <xsd:sequence> + <xsd:element name="rPr" type="CT_RPrOriginal" minOccurs="1"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_ParaRPrChange"> + <xsd:complexContent> + <xsd:extension base="CT_TrackChange"> + <xsd:sequence> + <xsd:element name="rPr" type="CT_ParaRPrOriginal" minOccurs="1"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_RunTrackChange"> + <xsd:complexContent> + <xsd:extension base="CT_TrackChange"> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:group ref="EG_ContentRunContent"/> + <xsd:group ref="m:EG_OMathMathElements"/> + </xsd:choice> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:group name="EG_PContentMath"> + <xsd:choice> + <xsd:group ref="EG_PContentBase" minOccurs="0" maxOccurs="unbounded"/> + <xsd:group ref="EG_ContentRunContentBase" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:group> + <xsd:group name="EG_PContentBase"> + <xsd:choice> + <xsd:element name="customXml" type="CT_CustomXmlRun"/> + <xsd:element name="fldSimple" type="CT_SimpleField" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="hyperlink" type="CT_Hyperlink"/> + </xsd:choice> + </xsd:group> + <xsd:group name="EG_ContentRunContentBase"> + <xsd:choice> + <xsd:element name="smartTag" type="CT_SmartTagRun"/> + <xsd:element name="sdt" type="CT_SdtRun"/> + <xsd:group ref="EG_RunLevelElts" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:group> + <xsd:group name="EG_CellMarkupElements"> + <xsd:choice> + <xsd:element name="cellIns" type="CT_TrackChange" minOccurs="0"/> + <xsd:element name="cellDel" type="CT_TrackChange" minOccurs="0"/> + <xsd:element name="cellMerge" type="CT_CellMergeTrackChange" minOccurs="0"/> + </xsd:choice> + </xsd:group> + <xsd:group name="EG_RangeMarkupElements"> + <xsd:choice> + <xsd:element name="bookmarkStart" type="CT_Bookmark"/> + <xsd:element name="bookmarkEnd" type="CT_MarkupRange"/> + <xsd:element name="moveFromRangeStart" type="CT_MoveBookmark"/> + <xsd:element name="moveFromRangeEnd" type="CT_MarkupRange"/> + <xsd:element name="moveToRangeStart" type="CT_MoveBookmark"/> + <xsd:element name="moveToRangeEnd" type="CT_MarkupRange"/> + <xsd:element name="commentRangeStart" type="CT_MarkupRange"/> + <xsd:element name="commentRangeEnd" type="CT_MarkupRange"/> + <xsd:element name="customXmlInsRangeStart" type="CT_TrackChange"/> + <xsd:element name="customXmlInsRangeEnd" type="CT_Markup"/> + <xsd:element name="customXmlDelRangeStart" type="CT_TrackChange"/> + <xsd:element name="customXmlDelRangeEnd" type="CT_Markup"/> + <xsd:element name="customXmlMoveFromRangeStart" type="CT_TrackChange"/> + <xsd:element name="customXmlMoveFromRangeEnd" type="CT_Markup"/> + <xsd:element name="customXmlMoveToRangeStart" type="CT_TrackChange"/> + <xsd:element name="customXmlMoveToRangeEnd" type="CT_Markup"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_NumPr"> + <xsd:sequence> + <xsd:element name="ilvl" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="numId" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="numberingChange" type="CT_TrackChangeNumbering" minOccurs="0"/> + <xsd:element name="ins" type="CT_TrackChange" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_PBdr"> + <xsd:sequence> + <xsd:element name="top" type="CT_Border" minOccurs="0"/> + <xsd:element name="left" type="CT_Border" minOccurs="0"/> + <xsd:element name="bottom" type="CT_Border" minOccurs="0"/> + <xsd:element name="right" type="CT_Border" minOccurs="0"/> + <xsd:element name="between" type="CT_Border" minOccurs="0"/> + <xsd:element name="bar" type="CT_Border" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Tabs"> + <xsd:sequence> + <xsd:element name="tab" type="CT_TabStop" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_TextboxTightWrap"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="allLines"/> + <xsd:enumeration value="firstAndLastLine"/> + <xsd:enumeration value="firstLineOnly"/> + <xsd:enumeration value="lastLineOnly"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TextboxTightWrap"> + <xsd:attribute name="val" type="ST_TextboxTightWrap" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_PPrBase"> + <xsd:sequence> + <xsd:element name="pStyle" type="CT_String" minOccurs="0"/> + <xsd:element name="keepNext" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="keepLines" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="pageBreakBefore" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="framePr" type="CT_FramePr" minOccurs="0"/> + <xsd:element name="widowControl" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="numPr" type="CT_NumPr" minOccurs="0"/> + <xsd:element name="suppressLineNumbers" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="pBdr" type="CT_PBdr" minOccurs="0"/> + <xsd:element name="shd" type="CT_Shd" minOccurs="0"/> + <xsd:element name="tabs" type="CT_Tabs" minOccurs="0"/> + <xsd:element name="suppressAutoHyphens" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="kinsoku" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="wordWrap" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="overflowPunct" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="topLinePunct" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="autoSpaceDE" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="autoSpaceDN" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="bidi" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="adjustRightInd" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="snapToGrid" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="spacing" type="CT_Spacing" minOccurs="0"/> + <xsd:element name="ind" type="CT_Ind" minOccurs="0"/> + <xsd:element name="contextualSpacing" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="mirrorIndents" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="suppressOverlap" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="jc" type="CT_Jc" minOccurs="0"/> + <xsd:element name="textDirection" type="CT_TextDirection" minOccurs="0"/> + <xsd:element name="textAlignment" type="CT_TextAlignment" minOccurs="0"/> + <xsd:element name="textboxTightWrap" type="CT_TextboxTightWrap" minOccurs="0"/> + <xsd:element name="outlineLvl" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="divId" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="cnfStyle" type="CT_Cnf" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_PPr"> + <xsd:complexContent> + <xsd:extension base="CT_PPrBase"> + <xsd:sequence> + <xsd:element name="rPr" type="CT_ParaRPr" minOccurs="0"/> + <xsd:element name="sectPr" type="CT_SectPr" minOccurs="0"/> + <xsd:element name="pPrChange" type="CT_PPrChange" minOccurs="0"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_PPrGeneral"> + <xsd:complexContent> + <xsd:extension base="CT_PPrBase"> + <xsd:sequence> + <xsd:element name="pPrChange" type="CT_PPrChange" minOccurs="0"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_Control"> + <xsd:attribute name="name" type="s:ST_String" use="optional"/> + <xsd:attribute name="shapeid" type="s:ST_String" use="optional"/> + <xsd:attribute ref="r:id" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Background"> + <xsd:sequence> + <xsd:sequence maxOccurs="unbounded"> + <xsd:any processContents="lax" namespace="urn:schemas-microsoft-com:vml" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:any processContents="lax" namespace="urn:schemas-microsoft-com:office:office" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:element name="drawing" type="CT_Drawing" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="color" type="ST_HexColor" use="optional" default="auto"/> + <xsd:attribute name="themeColor" type="ST_ThemeColor" use="optional"/> + <xsd:attribute name="themeTint" type="ST_UcharHexNumber" use="optional"/> + <xsd:attribute name="themeShade" type="ST_UcharHexNumber" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Rel"> + <xsd:attribute ref="r:id" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Object"> + <xsd:sequence> + <xsd:sequence maxOccurs="unbounded"> + <xsd:any processContents="lax" namespace="urn:schemas-microsoft-com:vml" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:any processContents="lax" namespace="urn:schemas-microsoft-com:office:office" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:element name="drawing" type="CT_Drawing" minOccurs="0"/> + <xsd:choice minOccurs="0"> + <xsd:element name="control" type="CT_Control"/> + <xsd:element name="objectLink" type="CT_ObjectLink"/> + <xsd:element name="objectEmbed" type="CT_ObjectEmbed"/> + <xsd:element name="movie" type="CT_Rel"/> + </xsd:choice> + </xsd:sequence> + <xsd:attribute name="dxaOrig" type="s:ST_TwipsMeasure" use="optional"/> + <xsd:attribute name="dyaOrig" type="s:ST_TwipsMeasure" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Picture"> + <xsd:sequence> + <xsd:sequence maxOccurs="unbounded"> + <xsd:any processContents="lax" namespace="urn:schemas-microsoft-com:vml" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:any processContents="lax" namespace="urn:schemas-microsoft-com:office:office" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:element name="movie" type="CT_Rel" minOccurs="0"/> + <xsd:element name="control" type="CT_Control" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ObjectEmbed"> + <xsd:attribute name="drawAspect" type="ST_ObjectDrawAspect" use="optional"/> + <xsd:attribute ref="r:id" use="required"/> + <xsd:attribute name="progId" type="s:ST_String" use="optional"/> + <xsd:attribute name="shapeId" type="s:ST_String" use="optional"/> + <xsd:attribute name="fieldCodes" type="s:ST_String" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_ObjectDrawAspect"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="content"/> + <xsd:enumeration value="icon"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_ObjectLink"> + <xsd:complexContent> + <xsd:extension base="CT_ObjectEmbed"> + <xsd:attribute name="updateMode" type="ST_ObjectUpdateMode" use="required"/> + <xsd:attribute name="lockedField" type="s:ST_OnOff" use="optional"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:simpleType name="ST_ObjectUpdateMode"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="always"/> + <xsd:enumeration value="onCall"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Drawing"> + <xsd:choice minOccurs="1" maxOccurs="unbounded"> + <xsd:element ref="wp:anchor" minOccurs="0"/> + <xsd:element ref="wp:inline" minOccurs="0"/> + </xsd:choice> + </xsd:complexType> + <xsd:complexType name="CT_SimpleField"> + <xsd:sequence> + <xsd:element name="fldData" type="CT_Text" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_PContent" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="instr" type="s:ST_String" use="required"/> + <xsd:attribute name="fldLock" type="s:ST_OnOff"/> + <xsd:attribute name="dirty" type="s:ST_OnOff"/> + </xsd:complexType> + <xsd:simpleType name="ST_FldCharType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="begin"/> + <xsd:enumeration value="separate"/> + <xsd:enumeration value="end"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_InfoTextType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="text"/> + <xsd:enumeration value="autoText"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FFHelpTextVal"> + <xsd:restriction base="xsd:string"> + <xsd:maxLength value="256"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FFStatusTextVal"> + <xsd:restriction base="xsd:string"> + <xsd:maxLength value="140"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FFName"> + <xsd:restriction base="xsd:string"> + <xsd:maxLength value="65"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FFTextType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="regular"/> + <xsd:enumeration value="number"/> + <xsd:enumeration value="date"/> + <xsd:enumeration value="currentTime"/> + <xsd:enumeration value="currentDate"/> + <xsd:enumeration value="calculated"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_FFTextType"> + <xsd:attribute name="val" type="ST_FFTextType" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_FFName"> + <xsd:attribute name="val" type="ST_FFName"/> + </xsd:complexType> + <xsd:complexType name="CT_FldChar"> + <xsd:choice> + <xsd:element name="fldData" type="CT_Text" minOccurs="0" maxOccurs="1"/> + <xsd:element name="ffData" type="CT_FFData" minOccurs="0" maxOccurs="1"/> + <xsd:element name="numberingChange" type="CT_TrackChangeNumbering" minOccurs="0"/> + </xsd:choice> + <xsd:attribute name="fldCharType" type="ST_FldCharType" use="required"/> + <xsd:attribute name="fldLock" type="s:ST_OnOff"/> + <xsd:attribute name="dirty" type="s:ST_OnOff"/> + </xsd:complexType> + <xsd:complexType name="CT_Hyperlink"> + <xsd:group ref="EG_PContent" minOccurs="0" maxOccurs="unbounded"/> + <xsd:attribute name="tgtFrame" type="s:ST_String" use="optional"/> + <xsd:attribute name="tooltip" type="s:ST_String" use="optional"/> + <xsd:attribute name="docLocation" type="s:ST_String" use="optional"/> + <xsd:attribute name="history" type="s:ST_OnOff" use="optional"/> + <xsd:attribute name="anchor" type="s:ST_String" use="optional"/> + <xsd:attribute ref="r:id"/> + </xsd:complexType> + <xsd:complexType name="CT_FFData"> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="name" type="CT_FFName"/> + <xsd:element name="label" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="tabIndex" type="CT_UnsignedDecimalNumber" minOccurs="0"/> + <xsd:element name="enabled" type="CT_OnOff"/> + <xsd:element name="calcOnExit" type="CT_OnOff"/> + <xsd:element name="entryMacro" type="CT_MacroName" minOccurs="0" maxOccurs="1"/> + <xsd:element name="exitMacro" type="CT_MacroName" minOccurs="0" maxOccurs="1"/> + <xsd:element name="helpText" type="CT_FFHelpText" minOccurs="0" maxOccurs="1"/> + <xsd:element name="statusText" type="CT_FFStatusText" minOccurs="0" maxOccurs="1"/> + <xsd:choice> + <xsd:element name="checkBox" type="CT_FFCheckBox"/> + <xsd:element name="ddList" type="CT_FFDDList"/> + <xsd:element name="textInput" type="CT_FFTextInput"/> + </xsd:choice> + </xsd:choice> + </xsd:complexType> + <xsd:complexType name="CT_FFHelpText"> + <xsd:attribute name="type" type="ST_InfoTextType"/> + <xsd:attribute name="val" type="ST_FFHelpTextVal"/> + </xsd:complexType> + <xsd:complexType name="CT_FFStatusText"> + <xsd:attribute name="type" type="ST_InfoTextType"/> + <xsd:attribute name="val" type="ST_FFStatusTextVal"/> + </xsd:complexType> + <xsd:complexType name="CT_FFCheckBox"> + <xsd:sequence> + <xsd:choice> + <xsd:element name="size" type="CT_HpsMeasure"/> + <xsd:element name="sizeAuto" type="CT_OnOff"/> + </xsd:choice> + <xsd:element name="default" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="checked" type="CT_OnOff" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_FFDDList"> + <xsd:sequence> + <xsd:element name="result" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="default" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="listEntry" type="CT_String" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_FFTextInput"> + <xsd:sequence> + <xsd:element name="type" type="CT_FFTextType" minOccurs="0"/> + <xsd:element name="default" type="CT_String" minOccurs="0"/> + <xsd:element name="maxLength" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="format" type="CT_String" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_SectionMark"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="nextPage"/> + <xsd:enumeration value="nextColumn"/> + <xsd:enumeration value="continuous"/> + <xsd:enumeration value="evenPage"/> + <xsd:enumeration value="oddPage"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SectType"> + <xsd:attribute name="val" type="ST_SectionMark"/> + </xsd:complexType> + <xsd:complexType name="CT_PaperSource"> + <xsd:attribute name="first" type="ST_DecimalNumber"/> + <xsd:attribute name="other" type="ST_DecimalNumber"/> + </xsd:complexType> + <xsd:simpleType name="ST_NumberFormat"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="decimal"/> + <xsd:enumeration value="upperRoman"/> + <xsd:enumeration value="lowerRoman"/> + <xsd:enumeration value="upperLetter"/> + <xsd:enumeration value="lowerLetter"/> + <xsd:enumeration value="ordinal"/> + <xsd:enumeration value="cardinalText"/> + <xsd:enumeration value="ordinalText"/> + <xsd:enumeration value="hex"/> + <xsd:enumeration value="chicago"/> + <xsd:enumeration value="ideographDigital"/> + <xsd:enumeration value="japaneseCounting"/> + <xsd:enumeration value="aiueo"/> + <xsd:enumeration value="iroha"/> + <xsd:enumeration value="decimalFullWidth"/> + <xsd:enumeration value="decimalHalfWidth"/> + <xsd:enumeration value="japaneseLegal"/> + <xsd:enumeration value="japaneseDigitalTenThousand"/> + <xsd:enumeration value="decimalEnclosedCircle"/> + <xsd:enumeration value="decimalFullWidth2"/> + <xsd:enumeration value="aiueoFullWidth"/> + <xsd:enumeration value="irohaFullWidth"/> + <xsd:enumeration value="decimalZero"/> + <xsd:enumeration value="bullet"/> + <xsd:enumeration value="ganada"/> + <xsd:enumeration value="chosung"/> + <xsd:enumeration value="decimalEnclosedFullstop"/> + <xsd:enumeration value="decimalEnclosedParen"/> + <xsd:enumeration value="decimalEnclosedCircleChinese"/> + <xsd:enumeration value="ideographEnclosedCircle"/> + <xsd:enumeration value="ideographTraditional"/> + <xsd:enumeration value="ideographZodiac"/> + <xsd:enumeration value="ideographZodiacTraditional"/> + <xsd:enumeration value="taiwaneseCounting"/> + <xsd:enumeration value="ideographLegalTraditional"/> + <xsd:enumeration value="taiwaneseCountingThousand"/> + <xsd:enumeration value="taiwaneseDigital"/> + <xsd:enumeration value="chineseCounting"/> + <xsd:enumeration value="chineseLegalSimplified"/> + <xsd:enumeration value="chineseCountingThousand"/> + <xsd:enumeration value="koreanDigital"/> + <xsd:enumeration value="koreanCounting"/> + <xsd:enumeration value="koreanLegal"/> + <xsd:enumeration value="koreanDigital2"/> + <xsd:enumeration value="vietnameseCounting"/> + <xsd:enumeration value="russianLower"/> + <xsd:enumeration value="russianUpper"/> + <xsd:enumeration value="none"/> + <xsd:enumeration value="numberInDash"/> + <xsd:enumeration value="hebrew1"/> + <xsd:enumeration value="hebrew2"/> + <xsd:enumeration value="arabicAlpha"/> + <xsd:enumeration value="arabicAbjad"/> + <xsd:enumeration value="hindiVowels"/> + <xsd:enumeration value="hindiConsonants"/> + <xsd:enumeration value="hindiNumbers"/> + <xsd:enumeration value="hindiCounting"/> + <xsd:enumeration value="thaiLetters"/> + <xsd:enumeration value="thaiNumbers"/> + <xsd:enumeration value="thaiCounting"/> + <xsd:enumeration value="bahtText"/> + <xsd:enumeration value="dollarText"/> + <xsd:enumeration value="custom"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PageOrientation"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="portrait"/> + <xsd:enumeration value="landscape"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PageSz"> + <xsd:attribute name="w" type="s:ST_TwipsMeasure"/> + <xsd:attribute name="h" type="s:ST_TwipsMeasure"/> + <xsd:attribute name="orient" type="ST_PageOrientation" use="optional"/> + <xsd:attribute name="code" type="ST_DecimalNumber" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_PageMar"> + <xsd:attribute name="top" type="ST_SignedTwipsMeasure" use="required"/> + <xsd:attribute name="right" type="s:ST_TwipsMeasure" use="required"/> + <xsd:attribute name="bottom" type="ST_SignedTwipsMeasure" use="required"/> + <xsd:attribute name="left" type="s:ST_TwipsMeasure" use="required"/> + <xsd:attribute name="header" type="s:ST_TwipsMeasure" use="required"/> + <xsd:attribute name="footer" type="s:ST_TwipsMeasure" use="required"/> + <xsd:attribute name="gutter" type="s:ST_TwipsMeasure" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_PageBorderZOrder"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="front"/> + <xsd:enumeration value="back"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PageBorderDisplay"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="allPages"/> + <xsd:enumeration value="firstPage"/> + <xsd:enumeration value="notFirstPage"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PageBorderOffset"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="page"/> + <xsd:enumeration value="text"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PageBorders"> + <xsd:sequence> + <xsd:element name="top" type="CT_TopPageBorder" minOccurs="0"/> + <xsd:element name="left" type="CT_PageBorder" minOccurs="0"/> + <xsd:element name="bottom" type="CT_BottomPageBorder" minOccurs="0"/> + <xsd:element name="right" type="CT_PageBorder" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="zOrder" type="ST_PageBorderZOrder" use="optional" default="front"/> + <xsd:attribute name="display" type="ST_PageBorderDisplay" use="optional"/> + <xsd:attribute name="offsetFrom" type="ST_PageBorderOffset" use="optional" default="text"/> + </xsd:complexType> + <xsd:complexType name="CT_PageBorder"> + <xsd:complexContent> + <xsd:extension base="CT_Border"> + <xsd:attribute ref="r:id" use="optional"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_BottomPageBorder"> + <xsd:complexContent> + <xsd:extension base="CT_PageBorder"> + <xsd:attribute ref="r:bottomLeft" use="optional"/> + <xsd:attribute ref="r:bottomRight" use="optional"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_TopPageBorder"> + <xsd:complexContent> + <xsd:extension base="CT_PageBorder"> + <xsd:attribute ref="r:topLeft" use="optional"/> + <xsd:attribute ref="r:topRight" use="optional"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:simpleType name="ST_ChapterSep"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="hyphen"/> + <xsd:enumeration value="period"/> + <xsd:enumeration value="colon"/> + <xsd:enumeration value="emDash"/> + <xsd:enumeration value="enDash"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_LineNumberRestart"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="newPage"/> + <xsd:enumeration value="newSection"/> + <xsd:enumeration value="continuous"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_LineNumber"> + <xsd:attribute name="countBy" type="ST_DecimalNumber" use="optional"/> + <xsd:attribute name="start" type="ST_DecimalNumber" use="optional" default="1"/> + <xsd:attribute name="distance" type="s:ST_TwipsMeasure" use="optional"/> + <xsd:attribute name="restart" type="ST_LineNumberRestart" use="optional" default="newPage"/> + </xsd:complexType> + <xsd:complexType name="CT_PageNumber"> + <xsd:attribute name="fmt" type="ST_NumberFormat" use="optional" default="decimal"/> + <xsd:attribute name="start" type="ST_DecimalNumber" use="optional"/> + <xsd:attribute name="chapStyle" type="ST_DecimalNumber" use="optional"/> + <xsd:attribute name="chapSep" type="ST_ChapterSep" use="optional" default="hyphen"/> + </xsd:complexType> + <xsd:complexType name="CT_Column"> + <xsd:attribute name="w" type="s:ST_TwipsMeasure" use="optional"/> + <xsd:attribute name="space" type="s:ST_TwipsMeasure" use="optional" default="0"/> + </xsd:complexType> + <xsd:complexType name="CT_Columns"> + <xsd:sequence minOccurs="0"> + <xsd:element name="col" type="CT_Column" maxOccurs="45"/> + </xsd:sequence> + <xsd:attribute name="equalWidth" type="s:ST_OnOff" use="optional"/> + <xsd:attribute name="space" type="s:ST_TwipsMeasure" use="optional" default="720"/> + <xsd:attribute name="num" type="ST_DecimalNumber" use="optional" default="1"/> + <xsd:attribute name="sep" type="s:ST_OnOff" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_VerticalJc"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="top"/> + <xsd:enumeration value="center"/> + <xsd:enumeration value="both"/> + <xsd:enumeration value="bottom"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_VerticalJc"> + <xsd:attribute name="val" type="ST_VerticalJc" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_DocGrid"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="default"/> + <xsd:enumeration value="lines"/> + <xsd:enumeration value="linesAndChars"/> + <xsd:enumeration value="snapToChars"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_DocGrid"> + <xsd:attribute name="type" type="ST_DocGrid"/> + <xsd:attribute name="linePitch" type="ST_DecimalNumber"/> + <xsd:attribute name="charSpace" type="ST_DecimalNumber"/> + </xsd:complexType> + <xsd:simpleType name="ST_HdrFtr"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="even"/> + <xsd:enumeration value="default"/> + <xsd:enumeration value="first"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_FtnEdn"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="normal"/> + <xsd:enumeration value="separator"/> + <xsd:enumeration value="continuationSeparator"/> + <xsd:enumeration value="continuationNotice"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_HdrFtrRef"> + <xsd:complexContent> + <xsd:extension base="CT_Rel"> + <xsd:attribute name="type" type="ST_HdrFtr" use="required"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:group name="EG_HdrFtrReferences"> + <xsd:choice> + <xsd:element name="headerReference" type="CT_HdrFtrRef" minOccurs="0"/> + <xsd:element name="footerReference" type="CT_HdrFtrRef" minOccurs="0"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_HdrFtr"> + <xsd:group ref="EG_BlockLevelElts" minOccurs="1" maxOccurs="unbounded"/> + </xsd:complexType> + <xsd:group name="EG_SectPrContents"> + <xsd:sequence> + <xsd:element name="footnotePr" type="CT_FtnProps" minOccurs="0"/> + <xsd:element name="endnotePr" type="CT_EdnProps" minOccurs="0"/> + <xsd:element name="type" type="CT_SectType" minOccurs="0"/> + <xsd:element name="pgSz" type="CT_PageSz" minOccurs="0"/> + <xsd:element name="pgMar" type="CT_PageMar" minOccurs="0"/> + <xsd:element name="paperSrc" type="CT_PaperSource" minOccurs="0"/> + <xsd:element name="pgBorders" type="CT_PageBorders" minOccurs="0"/> + <xsd:element name="lnNumType" type="CT_LineNumber" minOccurs="0"/> + <xsd:element name="pgNumType" type="CT_PageNumber" minOccurs="0"/> + <xsd:element name="cols" type="CT_Columns" minOccurs="0"/> + <xsd:element name="formProt" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="vAlign" type="CT_VerticalJc" minOccurs="0"/> + <xsd:element name="noEndnote" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="titlePg" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="textDirection" type="CT_TextDirection" minOccurs="0"/> + <xsd:element name="bidi" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="rtlGutter" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="docGrid" type="CT_DocGrid" minOccurs="0"/> + <xsd:element name="printerSettings" type="CT_Rel" minOccurs="0"/> + </xsd:sequence> + </xsd:group> + <xsd:attributeGroup name="AG_SectPrAttributes"> + <xsd:attribute name="rsidRPr" type="ST_LongHexNumber"/> + <xsd:attribute name="rsidDel" type="ST_LongHexNumber"/> + <xsd:attribute name="rsidR" type="ST_LongHexNumber"/> + <xsd:attribute name="rsidSect" type="ST_LongHexNumber"/> + </xsd:attributeGroup> + <xsd:complexType name="CT_SectPrBase"> + <xsd:sequence> + <xsd:group ref="EG_SectPrContents" minOccurs="0"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_SectPrAttributes"/> + </xsd:complexType> + <xsd:complexType name="CT_SectPr"> + <xsd:sequence> + <xsd:group ref="EG_HdrFtrReferences" minOccurs="0" maxOccurs="6"/> + <xsd:group ref="EG_SectPrContents" minOccurs="0"/> + <xsd:element name="sectPrChange" type="CT_SectPrChange" minOccurs="0"/> + </xsd:sequence> + <xsd:attributeGroup ref="AG_SectPrAttributes"/> + </xsd:complexType> + <xsd:simpleType name="ST_BrType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="page"/> + <xsd:enumeration value="column"/> + <xsd:enumeration value="textWrapping"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_BrClear"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="left"/> + <xsd:enumeration value="right"/> + <xsd:enumeration value="all"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Br"> + <xsd:attribute name="type" type="ST_BrType" use="optional"/> + <xsd:attribute name="clear" type="ST_BrClear" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_PTabAlignment"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="left"/> + <xsd:enumeration value="center"/> + <xsd:enumeration value="right"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PTabRelativeTo"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="margin"/> + <xsd:enumeration value="indent"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PTabLeader"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="dot"/> + <xsd:enumeration value="hyphen"/> + <xsd:enumeration value="underscore"/> + <xsd:enumeration value="middleDot"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_PTab"> + <xsd:attribute name="alignment" type="ST_PTabAlignment" use="required"/> + <xsd:attribute name="relativeTo" type="ST_PTabRelativeTo" use="required"/> + <xsd:attribute name="leader" type="ST_PTabLeader" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Sym"> + <xsd:attribute name="font" type="s:ST_String"/> + <xsd:attribute name="char" type="ST_ShortHexNumber"/> + </xsd:complexType> + <xsd:simpleType name="ST_ProofErr"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="spellStart"/> + <xsd:enumeration value="spellEnd"/> + <xsd:enumeration value="gramStart"/> + <xsd:enumeration value="gramEnd"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_ProofErr"> + <xsd:attribute name="type" type="ST_ProofErr" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_EdGrp"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="everyone"/> + <xsd:enumeration value="administrators"/> + <xsd:enumeration value="contributors"/> + <xsd:enumeration value="editors"/> + <xsd:enumeration value="owners"/> + <xsd:enumeration value="current"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Perm"> + <xsd:attribute name="id" type="s:ST_String" use="required"/> + <xsd:attribute name="displacedByCustomXml" type="ST_DisplacedByCustomXml" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_PermStart"> + <xsd:complexContent> + <xsd:extension base="CT_Perm"> + <xsd:attribute name="edGrp" type="ST_EdGrp" use="optional"/> + <xsd:attribute name="ed" type="s:ST_String" use="optional"/> + <xsd:attribute name="colFirst" type="ST_DecimalNumber" use="optional"/> + <xsd:attribute name="colLast" type="ST_DecimalNumber" use="optional"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_Text"> + <xsd:simpleContent> + <xsd:extension base="s:ST_String"> + <xsd:attribute ref="xml:space" use="optional"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:group name="EG_RunInnerContent"> + <xsd:choice> + <xsd:element name="br" type="CT_Br"/> + <xsd:element name="t" type="CT_Text"/> + <xsd:element name="contentPart" type="CT_Rel"/> + <xsd:element name="delText" type="CT_Text"/> + <xsd:element name="instrText" type="CT_Text"/> + <xsd:element name="delInstrText" type="CT_Text"/> + <xsd:element name="noBreakHyphen" type="CT_Empty"/> + <xsd:element name="softHyphen" type="CT_Empty" minOccurs="0"/> + <xsd:element name="dayShort" type="CT_Empty" minOccurs="0"/> + <xsd:element name="monthShort" type="CT_Empty" minOccurs="0"/> + <xsd:element name="yearShort" type="CT_Empty" minOccurs="0"/> + <xsd:element name="dayLong" type="CT_Empty" minOccurs="0"/> + <xsd:element name="monthLong" type="CT_Empty" minOccurs="0"/> + <xsd:element name="yearLong" type="CT_Empty" minOccurs="0"/> + <xsd:element name="annotationRef" type="CT_Empty" minOccurs="0"/> + <xsd:element name="footnoteRef" type="CT_Empty" minOccurs="0"/> + <xsd:element name="endnoteRef" type="CT_Empty" minOccurs="0"/> + <xsd:element name="separator" type="CT_Empty" minOccurs="0"/> + <xsd:element name="continuationSeparator" type="CT_Empty" minOccurs="0"/> + <xsd:element name="sym" type="CT_Sym" minOccurs="0"/> + <xsd:element name="pgNum" type="CT_Empty" minOccurs="0"/> + <xsd:element name="cr" type="CT_Empty" minOccurs="0"/> + <xsd:element name="tab" type="CT_Empty" minOccurs="0"/> + <xsd:element name="object" type="CT_Object"/> + <xsd:element name="pict" type="CT_Picture"/> + <xsd:element name="fldChar" type="CT_FldChar"/> + <xsd:element name="ruby" type="CT_Ruby"/> + <xsd:element name="footnoteReference" type="CT_FtnEdnRef"/> + <xsd:element name="endnoteReference" type="CT_FtnEdnRef"/> + <xsd:element name="commentReference" type="CT_Markup"/> + <xsd:element name="drawing" type="CT_Drawing"/> + <xsd:element name="ptab" type="CT_PTab" minOccurs="0"/> + <xsd:element name="lastRenderedPageBreak" type="CT_Empty" minOccurs="0" maxOccurs="1"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_R"> + <xsd:sequence> + <xsd:group ref="EG_RPr" minOccurs="0"/> + <xsd:group ref="EG_RunInnerContent" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="rsidRPr" type="ST_LongHexNumber"/> + <xsd:attribute name="rsidDel" type="ST_LongHexNumber"/> + <xsd:attribute name="rsidR" type="ST_LongHexNumber"/> + </xsd:complexType> + <xsd:simpleType name="ST_Hint"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="default"/> + <xsd:enumeration value="eastAsia"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_Theme"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="majorEastAsia"/> + <xsd:enumeration value="majorBidi"/> + <xsd:enumeration value="majorAscii"/> + <xsd:enumeration value="majorHAnsi"/> + <xsd:enumeration value="minorEastAsia"/> + <xsd:enumeration value="minorBidi"/> + <xsd:enumeration value="minorAscii"/> + <xsd:enumeration value="minorHAnsi"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Fonts"> + <xsd:attribute name="hint" type="ST_Hint"/> + <xsd:attribute name="ascii" type="s:ST_String"/> + <xsd:attribute name="hAnsi" type="s:ST_String"/> + <xsd:attribute name="eastAsia" type="s:ST_String"/> + <xsd:attribute name="cs" type="s:ST_String"/> + <xsd:attribute name="asciiTheme" type="ST_Theme"/> + <xsd:attribute name="hAnsiTheme" type="ST_Theme"/> + <xsd:attribute name="eastAsiaTheme" type="ST_Theme"/> + <xsd:attribute name="cstheme" type="ST_Theme"/> + </xsd:complexType> + <xsd:group name="EG_RPrBase"> + <xsd:choice> + <xsd:element name="rStyle" type="CT_String"/> + <xsd:element name="rFonts" type="CT_Fonts"/> + <xsd:element name="b" type="CT_OnOff"/> + <xsd:element name="bCs" type="CT_OnOff"/> + <xsd:element name="i" type="CT_OnOff"/> + <xsd:element name="iCs" type="CT_OnOff"/> + <xsd:element name="caps" type="CT_OnOff"/> + <xsd:element name="smallCaps" type="CT_OnOff"/> + <xsd:element name="strike" type="CT_OnOff"/> + <xsd:element name="dstrike" type="CT_OnOff"/> + <xsd:element name="outline" type="CT_OnOff"/> + <xsd:element name="shadow" type="CT_OnOff"/> + <xsd:element name="emboss" type="CT_OnOff"/> + <xsd:element name="imprint" type="CT_OnOff"/> + <xsd:element name="noProof" type="CT_OnOff"/> + <xsd:element name="snapToGrid" type="CT_OnOff"/> + <xsd:element name="vanish" type="CT_OnOff"/> + <xsd:element name="webHidden" type="CT_OnOff"/> + <xsd:element name="color" type="CT_Color"/> + <xsd:element name="spacing" type="CT_SignedTwipsMeasure"/> + <xsd:element name="w" type="CT_TextScale"/> + <xsd:element name="kern" type="CT_HpsMeasure"/> + <xsd:element name="position" type="CT_SignedHpsMeasure"/> + <xsd:element name="sz" type="CT_HpsMeasure"/> + <xsd:element name="szCs" type="CT_HpsMeasure"/> + <xsd:element name="highlight" type="CT_Highlight"/> + <xsd:element name="u" type="CT_Underline"/> + <xsd:element name="effect" type="CT_TextEffect"/> + <xsd:element name="bdr" type="CT_Border"/> + <xsd:element name="shd" type="CT_Shd"/> + <xsd:element name="fitText" type="CT_FitText"/> + <xsd:element name="vertAlign" type="CT_VerticalAlignRun"/> + <xsd:element name="rtl" type="CT_OnOff"/> + <xsd:element name="cs" type="CT_OnOff"/> + <xsd:element name="em" type="CT_Em"/> + <xsd:element name="lang" type="CT_Language"/> + <xsd:element name="eastAsianLayout" type="CT_EastAsianLayout"/> + <xsd:element name="specVanish" type="CT_OnOff"/> + <xsd:element name="oMath" type="CT_OnOff"/> + </xsd:choice> + </xsd:group> + <xsd:group name="EG_RPrContent"> + <xsd:sequence> + <xsd:group ref="EG_RPrBase" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="rPrChange" type="CT_RPrChange" minOccurs="0"/> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_RPr"> + <xsd:sequence> + <xsd:group ref="EG_RPrContent" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_RPr"> + <xsd:sequence> + <xsd:element name="rPr" type="CT_RPr" minOccurs="0"/> + </xsd:sequence> + </xsd:group> + <xsd:group name="EG_RPrMath"> + <xsd:choice> + <xsd:group ref="EG_RPr"/> + <xsd:element name="ins" type="CT_MathCtrlIns"/> + <xsd:element name="del" type="CT_MathCtrlDel"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_MathCtrlIns"> + <xsd:complexContent> + <xsd:extension base="CT_TrackChange"> + <xsd:choice minOccurs="0"> + <xsd:element name="del" type="CT_RPrChange" minOccurs="1"/> + <xsd:element name="rPr" type="CT_RPr" minOccurs="1"/> + </xsd:choice> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_MathCtrlDel"> + <xsd:complexContent> + <xsd:extension base="CT_TrackChange"> + <xsd:choice minOccurs="0"> + <xsd:element name="rPr" type="CT_RPr" minOccurs="1"/> + </xsd:choice> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_RPrOriginal"> + <xsd:sequence> + <xsd:group ref="EG_RPrBase" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ParaRPrOriginal"> + <xsd:sequence> + <xsd:group ref="EG_ParaRPrTrackChanges" minOccurs="0"/> + <xsd:group ref="EG_RPrBase" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ParaRPr"> + <xsd:sequence> + <xsd:group ref="EG_ParaRPrTrackChanges" minOccurs="0"/> + <xsd:group ref="EG_RPrBase" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="rPrChange" type="CT_ParaRPrChange" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_ParaRPrTrackChanges"> + <xsd:sequence> + <xsd:element name="ins" type="CT_TrackChange" minOccurs="0"/> + <xsd:element name="del" type="CT_TrackChange" minOccurs="0"/> + <xsd:element name="moveFrom" type="CT_TrackChange" minOccurs="0"/> + <xsd:element name="moveTo" type="CT_TrackChange" minOccurs="0"/> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_AltChunk"> + <xsd:sequence> + <xsd:element name="altChunkPr" type="CT_AltChunkPr" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute ref="r:id" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_AltChunkPr"> + <xsd:sequence> + <xsd:element name="matchSrc" type="CT_OnOff" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_RubyAlign"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="center"/> + <xsd:enumeration value="distributeLetter"/> + <xsd:enumeration value="distributeSpace"/> + <xsd:enumeration value="left"/> + <xsd:enumeration value="right"/> + <xsd:enumeration value="rightVertical"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_RubyAlign"> + <xsd:attribute name="val" type="ST_RubyAlign" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_RubyPr"> + <xsd:sequence> + <xsd:element name="rubyAlign" type="CT_RubyAlign"/> + <xsd:element name="hps" type="CT_HpsMeasure"/> + <xsd:element name="hpsRaise" type="CT_HpsMeasure"/> + <xsd:element name="hpsBaseText" type="CT_HpsMeasure"/> + <xsd:element name="lid" type="CT_Lang"/> + <xsd:element name="dirty" type="CT_OnOff" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_RubyContent"> + <xsd:choice> + <xsd:element name="r" type="CT_R"/> + <xsd:group ref="EG_RunLevelElts" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_RubyContent"> + <xsd:group ref="EG_RubyContent" minOccurs="0" maxOccurs="unbounded"/> + </xsd:complexType> + <xsd:complexType name="CT_Ruby"> + <xsd:sequence> + <xsd:element name="rubyPr" type="CT_RubyPr"/> + <xsd:element name="rt" type="CT_RubyContent"/> + <xsd:element name="rubyBase" type="CT_RubyContent"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_Lock"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="sdtLocked"/> + <xsd:enumeration value="contentLocked"/> + <xsd:enumeration value="unlocked"/> + <xsd:enumeration value="sdtContentLocked"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Lock"> + <xsd:attribute name="val" type="ST_Lock"/> + </xsd:complexType> + <xsd:complexType name="CT_SdtListItem"> + <xsd:attribute name="displayText" type="s:ST_String"/> + <xsd:attribute name="value" type="s:ST_String"/> + </xsd:complexType> + <xsd:simpleType name="ST_SdtDateMappingType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="text"/> + <xsd:enumeration value="date"/> + <xsd:enumeration value="dateTime"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SdtDateMappingType"> + <xsd:attribute name="val" type="ST_SdtDateMappingType"/> + </xsd:complexType> + <xsd:complexType name="CT_CalendarType"> + <xsd:attribute name="val" type="s:ST_CalendarType"/> + </xsd:complexType> + <xsd:complexType name="CT_SdtDate"> + <xsd:sequence> + <xsd:element name="dateFormat" type="CT_String" minOccurs="0"/> + <xsd:element name="lid" type="CT_Lang" minOccurs="0"/> + <xsd:element name="storeMappedDataAs" type="CT_SdtDateMappingType" minOccurs="0"/> + <xsd:element name="calendar" type="CT_CalendarType" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="fullDate" type="ST_DateTime" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_SdtComboBox"> + <xsd:sequence> + <xsd:element name="listItem" type="CT_SdtListItem" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="lastValue" type="s:ST_String" use="optional" default=""/> + </xsd:complexType> + <xsd:complexType name="CT_SdtDocPart"> + <xsd:sequence> + <xsd:element name="docPartGallery" type="CT_String" minOccurs="0"/> + <xsd:element name="docPartCategory" type="CT_String" minOccurs="0"/> + <xsd:element name="docPartUnique" type="CT_OnOff" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SdtDropDownList"> + <xsd:sequence> + <xsd:element name="listItem" type="CT_SdtListItem" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="lastValue" type="s:ST_String" use="optional" default=""/> + </xsd:complexType> + <xsd:complexType name="CT_Placeholder"> + <xsd:sequence> + <xsd:element name="docPart" type="CT_String"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SdtText"> + <xsd:attribute name="multiLine" type="s:ST_OnOff"/> + </xsd:complexType> + <xsd:complexType name="CT_DataBinding"> + <xsd:attribute name="prefixMappings" type="s:ST_String"/> + <xsd:attribute name="xpath" type="s:ST_String" use="required"/> + <xsd:attribute name="storeItemID" type="s:ST_String" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SdtPr"> + <xsd:sequence> + <xsd:element name="rPr" type="CT_RPr" minOccurs="0"/> + <xsd:element name="alias" type="CT_String" minOccurs="0"/> + <xsd:element name="tag" type="CT_String" minOccurs="0"/> + <xsd:element name="id" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="lock" type="CT_Lock" minOccurs="0"/> + <xsd:element name="placeholder" type="CT_Placeholder" minOccurs="0"/> + <xsd:element name="temporary" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="showingPlcHdr" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="dataBinding" type="CT_DataBinding" minOccurs="0"/> + <xsd:element name="label" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="tabIndex" type="CT_UnsignedDecimalNumber" minOccurs="0"/> + <xsd:choice minOccurs="0" maxOccurs="1"> + <xsd:element name="equation" type="CT_Empty"/> + <xsd:element name="comboBox" type="CT_SdtComboBox"/> + <xsd:element name="date" type="CT_SdtDate"/> + <xsd:element name="docPartObj" type="CT_SdtDocPart"/> + <xsd:element name="docPartList" type="CT_SdtDocPart"/> + <xsd:element name="dropDownList" type="CT_SdtDropDownList"/> + <xsd:element name="picture" type="CT_Empty"/> + <xsd:element name="richText" type="CT_Empty"/> + <xsd:element name="text" type="CT_SdtText"/> + <xsd:element name="citation" type="CT_Empty"/> + <xsd:element name="group" type="CT_Empty"/> + <xsd:element name="bibliography" type="CT_Empty"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SdtEndPr"> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="rPr" type="CT_RPr" minOccurs="0"/> + </xsd:choice> + </xsd:complexType> + <xsd:group name="EG_ContentRunContent"> + <xsd:choice> + <xsd:element name="customXml" type="CT_CustomXmlRun"/> + <xsd:element name="smartTag" type="CT_SmartTagRun"/> + <xsd:element name="sdt" type="CT_SdtRun"/> + <xsd:element name="dir" type="CT_DirContentRun"/> + <xsd:element name="bdo" type="CT_BdoContentRun"/> + <xsd:element name="r" type="CT_R"/> + <xsd:group ref="EG_RunLevelElts" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_DirContentRun"> + <xsd:group ref="EG_PContent" minOccurs="0" maxOccurs="unbounded"/> + <xsd:attribute name="val" type="ST_Direction" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_BdoContentRun"> + <xsd:group ref="EG_PContent" minOccurs="0" maxOccurs="unbounded"/> + <xsd:attribute name="val" type="ST_Direction" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_Direction"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="ltr"/> + <xsd:enumeration value="rtl"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_SdtContentRun"> + <xsd:group ref="EG_PContent" minOccurs="0" maxOccurs="unbounded"/> + </xsd:complexType> + <xsd:group name="EG_ContentBlockContent"> + <xsd:choice> + <xsd:element name="customXml" type="CT_CustomXmlBlock"/> + <xsd:element name="sdt" type="CT_SdtBlock"/> + <xsd:element name="p" type="CT_P" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="tbl" type="CT_Tbl" minOccurs="0" maxOccurs="unbounded"/> + <xsd:group ref="EG_RunLevelElts" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_SdtContentBlock"> + <xsd:group ref="EG_ContentBlockContent" minOccurs="0" maxOccurs="unbounded"/> + </xsd:complexType> + <xsd:group name="EG_ContentRowContent"> + <xsd:choice> + <xsd:element name="tr" type="CT_Row" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="customXml" type="CT_CustomXmlRow"/> + <xsd:element name="sdt" type="CT_SdtRow"/> + <xsd:group ref="EG_RunLevelElts" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_SdtContentRow"> + <xsd:group ref="EG_ContentRowContent" minOccurs="0" maxOccurs="unbounded"/> + </xsd:complexType> + <xsd:group name="EG_ContentCellContent"> + <xsd:choice> + <xsd:element name="tc" type="CT_Tc" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="customXml" type="CT_CustomXmlCell"/> + <xsd:element name="sdt" type="CT_SdtCell"/> + <xsd:group ref="EG_RunLevelElts" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_SdtContentCell"> + <xsd:group ref="EG_ContentCellContent" minOccurs="0" maxOccurs="unbounded"/> + </xsd:complexType> + <xsd:complexType name="CT_SdtBlock"> + <xsd:sequence> + <xsd:element name="sdtPr" type="CT_SdtPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sdtEndPr" type="CT_SdtEndPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sdtContent" type="CT_SdtContentBlock" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SdtRun"> + <xsd:sequence> + <xsd:element name="sdtPr" type="CT_SdtPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sdtEndPr" type="CT_SdtEndPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sdtContent" type="CT_SdtContentRun" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SdtCell"> + <xsd:sequence> + <xsd:element name="sdtPr" type="CT_SdtPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sdtEndPr" type="CT_SdtEndPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sdtContent" type="CT_SdtContentCell" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_SdtRow"> + <xsd:sequence> + <xsd:element name="sdtPr" type="CT_SdtPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sdtEndPr" type="CT_SdtEndPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sdtContent" type="CT_SdtContentRow" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Attr"> + <xsd:attribute name="uri" type="s:ST_String"/> + <xsd:attribute name="name" type="s:ST_String" use="required"/> + <xsd:attribute name="val" type="s:ST_String" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_CustomXmlRun"> + <xsd:sequence> + <xsd:element name="customXmlPr" type="CT_CustomXmlPr" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_PContent" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="uri" type="s:ST_String"/> + <xsd:attribute name="element" type="s:ST_XmlName" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SmartTagRun"> + <xsd:sequence> + <xsd:element name="smartTagPr" type="CT_SmartTagPr" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_PContent" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="uri" type="s:ST_String"/> + <xsd:attribute name="element" type="s:ST_XmlName" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_CustomXmlBlock"> + <xsd:sequence> + <xsd:element name="customXmlPr" type="CT_CustomXmlPr" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_ContentBlockContent" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="uri" type="s:ST_String"/> + <xsd:attribute name="element" type="s:ST_XmlName" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_CustomXmlPr"> + <xsd:sequence> + <xsd:element name="placeholder" type="CT_String" minOccurs="0"/> + <xsd:element name="attr" type="CT_Attr" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_CustomXmlRow"> + <xsd:sequence> + <xsd:element name="customXmlPr" type="CT_CustomXmlPr" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_ContentRowContent" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="uri" type="s:ST_String"/> + <xsd:attribute name="element" type="s:ST_XmlName" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_CustomXmlCell"> + <xsd:sequence> + <xsd:element name="customXmlPr" type="CT_CustomXmlPr" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_ContentCellContent" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="uri" type="s:ST_String"/> + <xsd:attribute name="element" type="s:ST_XmlName" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SmartTagPr"> + <xsd:sequence> + <xsd:element name="attr" type="CT_Attr" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_PContent"> + <xsd:choice> + <xsd:group ref="EG_ContentRunContent" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="fldSimple" type="CT_SimpleField" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="hyperlink" type="CT_Hyperlink"/> + <xsd:element name="subDoc" type="CT_Rel"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_P"> + <xsd:sequence> + <xsd:element name="pPr" type="CT_PPr" minOccurs="0"/> + <xsd:group ref="EG_PContent" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="rsidRPr" type="ST_LongHexNumber"/> + <xsd:attribute name="rsidR" type="ST_LongHexNumber"/> + <xsd:attribute name="rsidDel" type="ST_LongHexNumber"/> + <xsd:attribute name="rsidP" type="ST_LongHexNumber"/> + <xsd:attribute name="rsidRDefault" type="ST_LongHexNumber"/> + </xsd:complexType> + <xsd:simpleType name="ST_TblWidth"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="nil"/> + <xsd:enumeration value="pct"/> + <xsd:enumeration value="dxa"/> + <xsd:enumeration value="auto"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Height"> + <xsd:attribute name="val" type="s:ST_TwipsMeasure"/> + <xsd:attribute name="hRule" type="ST_HeightRule"/> + </xsd:complexType> + <xsd:simpleType name="ST_MeasurementOrPercent"> + <xsd:union memberTypes="ST_DecimalNumberOrPercent s:ST_UniversalMeasure"/> + </xsd:simpleType> + <xsd:complexType name="CT_TblWidth"> + <xsd:attribute name="w" type="ST_MeasurementOrPercent"/> + <xsd:attribute name="type" type="ST_TblWidth"/> + </xsd:complexType> + <xsd:complexType name="CT_TblGridCol"> + <xsd:attribute name="w" type="s:ST_TwipsMeasure"/> + </xsd:complexType> + <xsd:complexType name="CT_TblGridBase"> + <xsd:sequence> + <xsd:element name="gridCol" type="CT_TblGridCol" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TblGrid"> + <xsd:complexContent> + <xsd:extension base="CT_TblGridBase"> + <xsd:sequence> + <xsd:element name="tblGridChange" type="CT_TblGridChange" minOccurs="0"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_TcBorders"> + <xsd:sequence> + <xsd:element name="top" type="CT_Border" minOccurs="0"/> + <xsd:element name="start" type="CT_Border" minOccurs="0"/> + <xsd:element name="left" type="CT_Border" minOccurs="0"/> + <xsd:element name="bottom" type="CT_Border" minOccurs="0"/> + <xsd:element name="end" type="CT_Border" minOccurs="0"/> + <xsd:element name="right" type="CT_Border" minOccurs="0"/> + <xsd:element name="insideH" type="CT_Border" minOccurs="0"/> + <xsd:element name="insideV" type="CT_Border" minOccurs="0"/> + <xsd:element name="tl2br" type="CT_Border" minOccurs="0"/> + <xsd:element name="tr2bl" type="CT_Border" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TcMar"> + <xsd:sequence> + <xsd:element name="top" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="start" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="left" type="CT_TblWidth" minOccurs="0"/> + <xsd:element name="bottom" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="end" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="right" type="CT_TblWidth" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_Merge"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="continue"/> + <xsd:enumeration value="restart"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_VMerge"> + <xsd:attribute name="val" type="ST_Merge"/> + </xsd:complexType> + <xsd:complexType name="CT_HMerge"> + <xsd:attribute name="val" type="ST_Merge"/> + </xsd:complexType> + <xsd:complexType name="CT_TcPrBase"> + <xsd:sequence> + <xsd:element name="cnfStyle" type="CT_Cnf" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tcW" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="gridSpan" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="hMerge" type="CT_HMerge" minOccurs="0"/> + <xsd:element name="vMerge" type="CT_VMerge" minOccurs="0"/> + <xsd:element name="tcBorders" type="CT_TcBorders" minOccurs="0" maxOccurs="1"/> + <xsd:element name="shd" type="CT_Shd" minOccurs="0"/> + <xsd:element name="noWrap" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="tcMar" type="CT_TcMar" minOccurs="0" maxOccurs="1"/> + <xsd:element name="textDirection" type="CT_TextDirection" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tcFitText" type="CT_OnOff" minOccurs="0" maxOccurs="1"/> + <xsd:element name="vAlign" type="CT_VerticalJc" minOccurs="0"/> + <xsd:element name="hideMark" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="headers" type="CT_Headers" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TcPr"> + <xsd:complexContent> + <xsd:extension base="CT_TcPrInner"> + <xsd:sequence> + <xsd:element name="tcPrChange" type="CT_TcPrChange" minOccurs="0"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_TcPrInner"> + <xsd:complexContent> + <xsd:extension base="CT_TcPrBase"> + <xsd:sequence> + <xsd:group ref="EG_CellMarkupElements" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_Tc"> + <xsd:sequence> + <xsd:element name="tcPr" type="CT_TcPr" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_BlockLevelElts" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="id" type="s:ST_String" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_Cnf"> + <xsd:restriction base="xsd:string"> + <xsd:length value="12"/> + <xsd:pattern value="[01]*"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Cnf"> + <xsd:attribute name="val" type="ST_Cnf"/> + <xsd:attribute name="firstRow" type="s:ST_OnOff"/> + <xsd:attribute name="lastRow" type="s:ST_OnOff"/> + <xsd:attribute name="firstColumn" type="s:ST_OnOff"/> + <xsd:attribute name="lastColumn" type="s:ST_OnOff"/> + <xsd:attribute name="oddVBand" type="s:ST_OnOff"/> + <xsd:attribute name="evenVBand" type="s:ST_OnOff"/> + <xsd:attribute name="oddHBand" type="s:ST_OnOff"/> + <xsd:attribute name="evenHBand" type="s:ST_OnOff"/> + <xsd:attribute name="firstRowFirstColumn" type="s:ST_OnOff"/> + <xsd:attribute name="firstRowLastColumn" type="s:ST_OnOff"/> + <xsd:attribute name="lastRowFirstColumn" type="s:ST_OnOff"/> + <xsd:attribute name="lastRowLastColumn" type="s:ST_OnOff"/> + </xsd:complexType> + <xsd:complexType name="CT_Headers"> + <xsd:sequence minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="header" type="CT_String"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TrPrBase"> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="cnfStyle" type="CT_Cnf" minOccurs="0" maxOccurs="1"/> + <xsd:element name="divId" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="gridBefore" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="gridAfter" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="wBefore" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="wAfter" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="cantSplit" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="trHeight" type="CT_Height" minOccurs="0"/> + <xsd:element name="tblHeader" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="tblCellSpacing" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="jc" type="CT_JcTable" minOccurs="0" maxOccurs="1"/> + <xsd:element name="hidden" type="CT_OnOff" minOccurs="0"/> + </xsd:choice> + </xsd:complexType> + <xsd:complexType name="CT_TrPr"> + <xsd:complexContent> + <xsd:extension base="CT_TrPrBase"> + <xsd:sequence> + <xsd:element name="ins" type="CT_TrackChange" minOccurs="0"/> + <xsd:element name="del" type="CT_TrackChange" minOccurs="0"/> + <xsd:element name="trPrChange" type="CT_TrPrChange" minOccurs="0"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_Row"> + <xsd:sequence> + <xsd:element name="tblPrEx" type="CT_TblPrEx" minOccurs="0" maxOccurs="1"/> + <xsd:element name="trPr" type="CT_TrPr" minOccurs="0" maxOccurs="1"/> + <xsd:group ref="EG_ContentCellContent" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="rsidRPr" type="ST_LongHexNumber"/> + <xsd:attribute name="rsidR" type="ST_LongHexNumber"/> + <xsd:attribute name="rsidDel" type="ST_LongHexNumber"/> + <xsd:attribute name="rsidTr" type="ST_LongHexNumber"/> + </xsd:complexType> + <xsd:simpleType name="ST_TblLayoutType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="fixed"/> + <xsd:enumeration value="autofit"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TblLayoutType"> + <xsd:attribute name="type" type="ST_TblLayoutType"/> + </xsd:complexType> + <xsd:simpleType name="ST_TblOverlap"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="never"/> + <xsd:enumeration value="overlap"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TblOverlap"> + <xsd:attribute name="val" type="ST_TblOverlap" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_TblPPr"> + <xsd:attribute name="leftFromText" type="s:ST_TwipsMeasure"/> + <xsd:attribute name="rightFromText" type="s:ST_TwipsMeasure"/> + <xsd:attribute name="topFromText" type="s:ST_TwipsMeasure"/> + <xsd:attribute name="bottomFromText" type="s:ST_TwipsMeasure"/> + <xsd:attribute name="vertAnchor" type="ST_VAnchor"/> + <xsd:attribute name="horzAnchor" type="ST_HAnchor"/> + <xsd:attribute name="tblpXSpec" type="s:ST_XAlign"/> + <xsd:attribute name="tblpX" type="ST_SignedTwipsMeasure"/> + <xsd:attribute name="tblpYSpec" type="s:ST_YAlign"/> + <xsd:attribute name="tblpY" type="ST_SignedTwipsMeasure"/> + </xsd:complexType> + <xsd:complexType name="CT_TblCellMar"> + <xsd:sequence> + <xsd:element name="top" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="start" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="left" type="CT_TblWidth" minOccurs="0"/> + <xsd:element name="bottom" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="end" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="right" type="CT_TblWidth" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TblBorders"> + <xsd:sequence> + <xsd:element name="top" type="CT_Border" minOccurs="0"/> + <xsd:element name="start" type="CT_Border" minOccurs="0"/> + <xsd:element name="left" type="CT_Border" minOccurs="0"/> + <xsd:element name="bottom" type="CT_Border" minOccurs="0"/> + <xsd:element name="end" type="CT_Border" minOccurs="0"/> + <xsd:element name="right" type="CT_Border" minOccurs="0"/> + <xsd:element name="insideH" type="CT_Border" minOccurs="0"/> + <xsd:element name="insideV" type="CT_Border" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TblPrBase"> + <xsd:sequence> + <xsd:element name="tblStyle" type="CT_String" minOccurs="0"/> + <xsd:element name="tblpPr" type="CT_TblPPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblOverlap" type="CT_TblOverlap" minOccurs="0" maxOccurs="1"/> + <xsd:element name="bidiVisual" type="CT_OnOff" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblStyleRowBandSize" type="CT_DecimalNumber" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblStyleColBandSize" type="CT_DecimalNumber" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblW" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="jc" type="CT_JcTable" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblCellSpacing" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblInd" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblBorders" type="CT_TblBorders" minOccurs="0" maxOccurs="1"/> + <xsd:element name="shd" type="CT_Shd" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblLayout" type="CT_TblLayoutType" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblCellMar" type="CT_TblCellMar" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblLook" type="CT_TblLook" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblCaption" type="CT_String" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblDescription" type="CT_String" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TblPr"> + <xsd:complexContent> + <xsd:extension base="CT_TblPrBase"> + <xsd:sequence> + <xsd:element name="tblPrChange" type="CT_TblPrChange" minOccurs="0"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_TblPrExBase"> + <xsd:sequence> + <xsd:element name="tblW" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="jc" type="CT_JcTable" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblCellSpacing" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblInd" type="CT_TblWidth" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblBorders" type="CT_TblBorders" minOccurs="0" maxOccurs="1"/> + <xsd:element name="shd" type="CT_Shd" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblLayout" type="CT_TblLayoutType" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblCellMar" type="CT_TblCellMar" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblLook" type="CT_TblLook" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TblPrEx"> + <xsd:complexContent> + <xsd:extension base="CT_TblPrExBase"> + <xsd:sequence> + <xsd:element name="tblPrExChange" type="CT_TblPrExChange" minOccurs="0"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_Tbl"> + <xsd:sequence> + <xsd:group ref="EG_RangeMarkupElements" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="tblPr" type="CT_TblPr"/> + <xsd:element name="tblGrid" type="CT_TblGrid"/> + <xsd:group ref="EG_ContentRowContent" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TblLook"> + <xsd:attribute name="firstRow" type="s:ST_OnOff"/> + <xsd:attribute name="lastRow" type="s:ST_OnOff"/> + <xsd:attribute name="firstColumn" type="s:ST_OnOff"/> + <xsd:attribute name="lastColumn" type="s:ST_OnOff"/> + <xsd:attribute name="noHBand" type="s:ST_OnOff"/> + <xsd:attribute name="noVBand" type="s:ST_OnOff"/> + <xsd:attribute name="val" type="ST_ShortHexNumber"/> + </xsd:complexType> + <xsd:simpleType name="ST_FtnPos"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="pageBottom"/> + <xsd:enumeration value="beneathText"/> + <xsd:enumeration value="sectEnd"/> + <xsd:enumeration value="docEnd"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_FtnPos"> + <xsd:attribute name="val" type="ST_FtnPos" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_EdnPos"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="sectEnd"/> + <xsd:enumeration value="docEnd"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_EdnPos"> + <xsd:attribute name="val" type="ST_EdnPos" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_NumFmt"> + <xsd:attribute name="val" type="ST_NumberFormat" use="required"/> + <xsd:attribute name="format" type="s:ST_String" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_RestartNumber"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="continuous"/> + <xsd:enumeration value="eachSect"/> + <xsd:enumeration value="eachPage"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_NumRestart"> + <xsd:attribute name="val" type="ST_RestartNumber" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_FtnEdnRef"> + <xsd:attribute name="customMarkFollows" type="s:ST_OnOff" use="optional"/> + <xsd:attribute name="id" use="required" type="ST_DecimalNumber"/> + </xsd:complexType> + <xsd:complexType name="CT_FtnEdnSepRef"> + <xsd:attribute name="id" type="ST_DecimalNumber" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_FtnEdn"> + <xsd:sequence> + <xsd:group ref="EG_BlockLevelElts" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="type" type="ST_FtnEdn" use="optional"/> + <xsd:attribute name="id" type="ST_DecimalNumber" use="required"/> + </xsd:complexType> + <xsd:group name="EG_FtnEdnNumProps"> + <xsd:sequence> + <xsd:element name="numStart" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="numRestart" type="CT_NumRestart" minOccurs="0"/> + </xsd:sequence> + </xsd:group> + <xsd:complexType name="CT_FtnProps"> + <xsd:sequence> + <xsd:element name="pos" type="CT_FtnPos" minOccurs="0"/> + <xsd:element name="numFmt" type="CT_NumFmt" minOccurs="0"/> + <xsd:group ref="EG_FtnEdnNumProps" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_EdnProps"> + <xsd:sequence> + <xsd:element name="pos" type="CT_EdnPos" minOccurs="0"/> + <xsd:element name="numFmt" type="CT_NumFmt" minOccurs="0"/> + <xsd:group ref="EG_FtnEdnNumProps" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_FtnDocProps"> + <xsd:complexContent> + <xsd:extension base="CT_FtnProps"> + <xsd:sequence> + <xsd:element name="footnote" type="CT_FtnEdnSepRef" minOccurs="0" maxOccurs="3"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_EdnDocProps"> + <xsd:complexContent> + <xsd:extension base="CT_EdnProps"> + <xsd:sequence> + <xsd:element name="endnote" type="CT_FtnEdnSepRef" minOccurs="0" maxOccurs="3"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_RecipientData"> + <xsd:sequence> + <xsd:element name="active" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="column" type="CT_DecimalNumber" minOccurs="1"/> + <xsd:element name="uniqueTag" type="CT_Base64Binary" minOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Base64Binary"> + <xsd:attribute name="val" type="xsd:base64Binary" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Recipients"> + <xsd:sequence> + <xsd:element name="recipientData" type="CT_RecipientData" minOccurs="1" maxOccurs="unbounded" + /> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="recipients" type="CT_Recipients"/> + <xsd:complexType name="CT_OdsoFieldMapData"> + <xsd:sequence> + <xsd:element name="type" type="CT_MailMergeOdsoFMDFieldType" minOccurs="0"/> + <xsd:element name="name" type="CT_String" minOccurs="0"/> + <xsd:element name="mappedName" type="CT_String" minOccurs="0"/> + <xsd:element name="column" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="lid" type="CT_Lang" minOccurs="0"/> + <xsd:element name="dynamicAddress" type="CT_OnOff" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_MailMergeSourceType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="database"/> + <xsd:enumeration value="addressBook"/> + <xsd:enumeration value="document1"/> + <xsd:enumeration value="document2"/> + <xsd:enumeration value="text"/> + <xsd:enumeration value="email"/> + <xsd:enumeration value="native"/> + <xsd:enumeration value="legacy"/> + <xsd:enumeration value="master"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_MailMergeSourceType"> + <xsd:attribute name="val" use="required" type="ST_MailMergeSourceType"/> + </xsd:complexType> + <xsd:complexType name="CT_Odso"> + <xsd:sequence> + <xsd:element name="udl" type="CT_String" minOccurs="0"/> + <xsd:element name="table" type="CT_String" minOccurs="0"/> + <xsd:element name="src" type="CT_Rel" minOccurs="0"/> + <xsd:element name="colDelim" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="type" type="CT_MailMergeSourceType" minOccurs="0"/> + <xsd:element name="fHdr" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="fieldMapData" type="CT_OdsoFieldMapData" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element name="recipientData" type="CT_Rel" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_MailMerge"> + <xsd:sequence> + <xsd:element name="mainDocumentType" type="CT_MailMergeDocType" minOccurs="1"/> + <xsd:element name="linkToQuery" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="dataType" type="CT_MailMergeDataType" minOccurs="1"/> + <xsd:element name="connectString" type="CT_String" minOccurs="0"/> + <xsd:element name="query" type="CT_String" minOccurs="0"/> + <xsd:element name="dataSource" type="CT_Rel" minOccurs="0"/> + <xsd:element name="headerSource" type="CT_Rel" minOccurs="0"/> + <xsd:element name="doNotSuppressBlankLines" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="destination" type="CT_MailMergeDest" minOccurs="0"/> + <xsd:element name="addressFieldName" type="CT_String" minOccurs="0"/> + <xsd:element name="mailSubject" type="CT_String" minOccurs="0"/> + <xsd:element name="mailAsAttachment" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="viewMergedData" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="activeRecord" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="checkErrors" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="odso" type="CT_Odso" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_TargetScreenSz"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="544x376"/> + <xsd:enumeration value="640x480"/> + <xsd:enumeration value="720x512"/> + <xsd:enumeration value="800x600"/> + <xsd:enumeration value="1024x768"/> + <xsd:enumeration value="1152x882"/> + <xsd:enumeration value="1152x900"/> + <xsd:enumeration value="1280x1024"/> + <xsd:enumeration value="1600x1200"/> + <xsd:enumeration value="1800x1440"/> + <xsd:enumeration value="1920x1200"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TargetScreenSz"> + <xsd:attribute name="val" type="ST_TargetScreenSz" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Compat"> + <xsd:sequence> + <xsd:element name="useSingleBorderforContiguousCells" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="wpJustification" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="noTabHangInd" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="noLeading" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="spaceForUL" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="noColumnBalance" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="balanceSingleByteDoubleByteWidth" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="noExtraLineSpacing" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotLeaveBackslashAlone" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="ulTrailSpace" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotExpandShiftReturn" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="spacingInWholePoints" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="lineWrapLikeWord6" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="printBodyTextBeforeHeader" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="printColBlack" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="wpSpaceWidth" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="showBreaksInFrames" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="subFontBySize" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="suppressBottomSpacing" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="suppressTopSpacing" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="suppressSpacingAtTopOfPage" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="suppressTopSpacingWP" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="suppressSpBfAfterPgBrk" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="swapBordersFacingPages" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="convMailMergeEsc" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="truncateFontHeightsLikeWP6" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="mwSmallCaps" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="usePrinterMetrics" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotSuppressParagraphBorders" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="wrapTrailSpaces" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="footnoteLayoutLikeWW8" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="shapeLayoutLikeWW8" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="alignTablesRowByRow" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="forgetLastTabAlignment" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="adjustLineHeightInTable" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="autoSpaceLikeWord95" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="noSpaceRaiseLower" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotUseHTMLParagraphAutoSpacing" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="layoutRawTableWidth" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="layoutTableRowsApart" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="useWord97LineBreakRules" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotBreakWrappedTables" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotSnapToGridInCell" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="selectFldWithFirstOrLastChar" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="applyBreakingRules" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotWrapTextWithPunct" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotUseEastAsianBreakRules" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="useWord2002TableStyleRules" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="growAutofit" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="useFELayout" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="useNormalStyleForList" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotUseIndentAsNumberingTabStop" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="useAltKinsokuLineBreakRules" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="allowSpaceOfSameStyleInTable" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotSuppressIndentation" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotAutofitConstrainedTables" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="autofitToFirstFixedWidthCell" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="underlineTabInNumList" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="displayHangulFixedWidth" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="splitPgBreakAndParaMark" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotVertAlignCellWithSp" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotBreakConstrainedForcedTable" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotVertAlignInTxbx" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="useAnsiKerningPairs" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="cachedColBalance" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="compatSetting" type="CT_CompatSetting" minOccurs="0" maxOccurs="unbounded" + /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_CompatSetting"> + <xsd:attribute name="name" type="s:ST_String"/> + <xsd:attribute name="uri" type="s:ST_String"/> + <xsd:attribute name="val" type="s:ST_String"/> + </xsd:complexType> + <xsd:complexType name="CT_DocVar"> + <xsd:attribute name="name" type="s:ST_String" use="required"/> + <xsd:attribute name="val" type="s:ST_String" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_DocVars"> + <xsd:sequence> + <xsd:element name="docVar" type="CT_DocVar" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DocRsids"> + <xsd:sequence> + <xsd:element name="rsidRoot" type="CT_LongHexNumber" minOccurs="0" maxOccurs="1"/> + <xsd:element name="rsid" type="CT_LongHexNumber" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_CharacterSpacing"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="doNotCompress"/> + <xsd:enumeration value="compressPunctuation"/> + <xsd:enumeration value="compressPunctuationAndJapaneseKana"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_CharacterSpacing"> + <xsd:attribute name="val" type="ST_CharacterSpacing" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SaveThroughXslt"> + <xsd:attribute ref="r:id" use="optional"/> + <xsd:attribute name="solutionID" type="s:ST_String" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_RPrDefault"> + <xsd:sequence> + <xsd:element name="rPr" type="CT_RPr" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_PPrDefault"> + <xsd:sequence> + <xsd:element name="pPr" type="CT_PPrGeneral" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DocDefaults"> + <xsd:sequence> + <xsd:element name="rPrDefault" type="CT_RPrDefault" minOccurs="0"/> + <xsd:element name="pPrDefault" type="CT_PPrDefault" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_WmlColorSchemeIndex"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="dark1"/> + <xsd:enumeration value="light1"/> + <xsd:enumeration value="dark2"/> + <xsd:enumeration value="light2"/> + <xsd:enumeration value="accent1"/> + <xsd:enumeration value="accent2"/> + <xsd:enumeration value="accent3"/> + <xsd:enumeration value="accent4"/> + <xsd:enumeration value="accent5"/> + <xsd:enumeration value="accent6"/> + <xsd:enumeration value="hyperlink"/> + <xsd:enumeration value="followedHyperlink"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_ColorSchemeMapping"> + <xsd:attribute name="bg1" type="ST_WmlColorSchemeIndex"/> + <xsd:attribute name="t1" type="ST_WmlColorSchemeIndex"/> + <xsd:attribute name="bg2" type="ST_WmlColorSchemeIndex"/> + <xsd:attribute name="t2" type="ST_WmlColorSchemeIndex"/> + <xsd:attribute name="accent1" type="ST_WmlColorSchemeIndex"/> + <xsd:attribute name="accent2" type="ST_WmlColorSchemeIndex"/> + <xsd:attribute name="accent3" type="ST_WmlColorSchemeIndex"/> + <xsd:attribute name="accent4" type="ST_WmlColorSchemeIndex"/> + <xsd:attribute name="accent5" type="ST_WmlColorSchemeIndex"/> + <xsd:attribute name="accent6" type="ST_WmlColorSchemeIndex"/> + <xsd:attribute name="hyperlink" type="ST_WmlColorSchemeIndex"/> + <xsd:attribute name="followedHyperlink" type="ST_WmlColorSchemeIndex"/> + </xsd:complexType> + <xsd:complexType name="CT_ReadingModeInkLockDown"> + <xsd:attribute name="actualPg" type="s:ST_OnOff" use="required"/> + <xsd:attribute name="w" type="ST_PixelsMeasure" use="required"/> + <xsd:attribute name="h" type="ST_PixelsMeasure" use="required"/> + <xsd:attribute name="fontSz" type="ST_DecimalNumberOrPercent" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_WriteProtection"> + <xsd:attribute name="recommended" type="s:ST_OnOff" use="optional"/> + <xsd:attributeGroup ref="AG_Password"/> + <xsd:attributeGroup ref="AG_TransitionalPassword"/> + </xsd:complexType> + <xsd:complexType name="CT_Settings"> + <xsd:sequence> + <xsd:element name="writeProtection" type="CT_WriteProtection" minOccurs="0"/> + <xsd:element name="view" type="CT_View" minOccurs="0"/> + <xsd:element name="zoom" type="CT_Zoom" minOccurs="0"/> + <xsd:element name="removePersonalInformation" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="removeDateAndTime" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotDisplayPageBoundaries" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="displayBackgroundShape" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="printPostScriptOverText" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="printFractionalCharacterWidth" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="printFormsData" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="embedTrueTypeFonts" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="embedSystemFonts" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="saveSubsetFonts" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="saveFormsData" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="mirrorMargins" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="alignBordersAndEdges" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="bordersDoNotSurroundHeader" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="bordersDoNotSurroundFooter" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="gutterAtTop" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="hideSpellingErrors" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="hideGrammaticalErrors" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="activeWritingStyle" type="CT_WritingStyle" minOccurs="0" + maxOccurs="unbounded"/> + <xsd:element name="proofState" type="CT_Proof" minOccurs="0"/> + <xsd:element name="formsDesign" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="attachedTemplate" type="CT_Rel" minOccurs="0"/> + <xsd:element name="linkStyles" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="stylePaneFormatFilter" type="CT_StylePaneFilter" minOccurs="0"/> + <xsd:element name="stylePaneSortMethod" type="CT_StyleSort" minOccurs="0"/> + <xsd:element name="documentType" type="CT_DocType" minOccurs="0"/> + <xsd:element name="mailMerge" type="CT_MailMerge" minOccurs="0"/> + <xsd:element name="revisionView" type="CT_TrackChangesView" minOccurs="0"/> + <xsd:element name="trackRevisions" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotTrackMoves" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotTrackFormatting" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="documentProtection" type="CT_DocProtect" minOccurs="0"/> + <xsd:element name="autoFormatOverride" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="styleLockTheme" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="styleLockQFSet" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="defaultTabStop" type="CT_TwipsMeasure" minOccurs="0"/> + <xsd:element name="autoHyphenation" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="consecutiveHyphenLimit" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="hyphenationZone" type="CT_TwipsMeasure" minOccurs="0"/> + <xsd:element name="doNotHyphenateCaps" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="showEnvelope" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="summaryLength" type="CT_DecimalNumberOrPrecent" minOccurs="0"/> + <xsd:element name="clickAndTypeStyle" type="CT_String" minOccurs="0"/> + <xsd:element name="defaultTableStyle" type="CT_String" minOccurs="0"/> + <xsd:element name="evenAndOddHeaders" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="bookFoldRevPrinting" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="bookFoldPrinting" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="bookFoldPrintingSheets" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="drawingGridHorizontalSpacing" type="CT_TwipsMeasure" minOccurs="0"/> + <xsd:element name="drawingGridVerticalSpacing" type="CT_TwipsMeasure" minOccurs="0"/> + <xsd:element name="displayHorizontalDrawingGridEvery" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="displayVerticalDrawingGridEvery" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="doNotUseMarginsForDrawingGridOrigin" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="drawingGridHorizontalOrigin" type="CT_TwipsMeasure" minOccurs="0"/> + <xsd:element name="drawingGridVerticalOrigin" type="CT_TwipsMeasure" minOccurs="0"/> + <xsd:element name="doNotShadeFormData" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="noPunctuationKerning" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="characterSpacingControl" type="CT_CharacterSpacing" minOccurs="0"/> + <xsd:element name="printTwoOnOne" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="strictFirstAndLastChars" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="noLineBreaksAfter" type="CT_Kinsoku" minOccurs="0"/> + <xsd:element name="noLineBreaksBefore" type="CT_Kinsoku" minOccurs="0"/> + <xsd:element name="savePreviewPicture" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotValidateAgainstSchema" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="saveInvalidXml" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="ignoreMixedContent" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="alwaysShowPlaceholderText" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotDemarcateInvalidXml" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="saveXmlDataOnly" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="useXSLTWhenSaving" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="saveThroughXslt" type="CT_SaveThroughXslt" minOccurs="0"/> + <xsd:element name="showXMLTags" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="alwaysMergeEmptyNamespace" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="updateFields" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="hdrShapeDefaults" type="CT_ShapeDefaults" minOccurs="0"/> + <xsd:element name="footnotePr" type="CT_FtnDocProps" minOccurs="0"/> + <xsd:element name="endnotePr" type="CT_EdnDocProps" minOccurs="0"/> + <xsd:element name="compat" type="CT_Compat" minOccurs="0"/> + <xsd:element name="docVars" type="CT_DocVars" minOccurs="0"/> + <xsd:element name="rsids" type="CT_DocRsids" minOccurs="0"/> + <xsd:element ref="m:mathPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="attachedSchema" type="CT_String" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="themeFontLang" type="CT_Language" minOccurs="0" maxOccurs="1"/> + <xsd:element name="clrSchemeMapping" type="CT_ColorSchemeMapping" minOccurs="0"/> + <xsd:element name="doNotIncludeSubdocsInStats" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotAutoCompressPictures" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="forceUpgrade" type="CT_Empty" minOccurs="0" maxOccurs="1"/> + <xsd:element name="captions" type="CT_Captions" minOccurs="0" maxOccurs="1"/> + <xsd:element name="readModeInkLockDown" type="CT_ReadingModeInkLockDown" minOccurs="0"/> + <xsd:element name="smartTagType" type="CT_SmartTagType" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element ref="sl:schemaLibrary" minOccurs="0" maxOccurs="1"/> + <xsd:element name="shapeDefaults" type="CT_ShapeDefaults" minOccurs="0"/> + <xsd:element name="doNotEmbedSmartTags" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="decimalSymbol" type="CT_String" minOccurs="0" maxOccurs="1"/> + <xsd:element name="listSeparator" type="CT_String" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_StyleSort"> + <xsd:attribute name="val" type="ST_StyleSort" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_StylePaneFilter"> + <xsd:attribute name="allStyles" type="s:ST_OnOff"/> + <xsd:attribute name="customStyles" type="s:ST_OnOff"/> + <xsd:attribute name="latentStyles" type="s:ST_OnOff"/> + <xsd:attribute name="stylesInUse" type="s:ST_OnOff"/> + <xsd:attribute name="headingStyles" type="s:ST_OnOff"/> + <xsd:attribute name="numberingStyles" type="s:ST_OnOff"/> + <xsd:attribute name="tableStyles" type="s:ST_OnOff"/> + <xsd:attribute name="directFormattingOnRuns" type="s:ST_OnOff"/> + <xsd:attribute name="directFormattingOnParagraphs" type="s:ST_OnOff"/> + <xsd:attribute name="directFormattingOnNumbering" type="s:ST_OnOff"/> + <xsd:attribute name="directFormattingOnTables" type="s:ST_OnOff"/> + <xsd:attribute name="clearFormatting" type="s:ST_OnOff"/> + <xsd:attribute name="top3HeadingStyles" type="s:ST_OnOff"/> + <xsd:attribute name="visibleStyles" type="s:ST_OnOff"/> + <xsd:attribute name="alternateStyleNames" type="s:ST_OnOff"/> + <xsd:attribute name="val" type="ST_ShortHexNumber"/> + </xsd:complexType> + <xsd:simpleType name="ST_StyleSort"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="name"/> + <xsd:enumeration value="priority"/> + <xsd:enumeration value="default"/> + <xsd:enumeration value="font"/> + <xsd:enumeration value="basedOn"/> + <xsd:enumeration value="type"/> + <xsd:enumeration value="0000"/> + <xsd:enumeration value="0001"/> + <xsd:enumeration value="0002"/> + <xsd:enumeration value="0003"/> + <xsd:enumeration value="0004"/> + <xsd:enumeration value="0005"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_WebSettings"> + <xsd:sequence> + <xsd:element name="frameset" type="CT_Frameset" minOccurs="0"/> + <xsd:element name="divs" type="CT_Divs" minOccurs="0"/> + <xsd:element name="encoding" type="CT_String" minOccurs="0"/> + <xsd:element name="optimizeForBrowser" type="CT_OptimizeForBrowser" minOccurs="0"/> + <xsd:element name="relyOnVML" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="allowPNG" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotRelyOnCSS" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotSaveAsSingleFile" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotOrganizeInFolder" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="doNotUseLongFileNames" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="pixelsPerInch" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="targetScreenSz" type="CT_TargetScreenSz" minOccurs="0"/> + <xsd:element name="saveSmartTagsAsXml" type="CT_OnOff" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_FrameScrollbar"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="on"/> + <xsd:enumeration value="off"/> + <xsd:enumeration value="auto"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_FrameScrollbar"> + <xsd:attribute name="val" type="ST_FrameScrollbar" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_OptimizeForBrowser"> + <xsd:complexContent> + <xsd:extension base="CT_OnOff"> + <xsd:attribute name="target" type="s:ST_String" use="optional"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_Frame"> + <xsd:sequence> + <xsd:element name="sz" type="CT_String" minOccurs="0"/> + <xsd:element name="name" type="CT_String" minOccurs="0"/> + <xsd:element name="title" type="CT_String" minOccurs="0"/> + <xsd:element name="longDesc" type="CT_Rel" minOccurs="0"/> + <xsd:element name="sourceFileName" type="CT_Rel" minOccurs="0"/> + <xsd:element name="marW" type="CT_PixelsMeasure" minOccurs="0"/> + <xsd:element name="marH" type="CT_PixelsMeasure" minOccurs="0"/> + <xsd:element name="scrollbar" type="CT_FrameScrollbar" minOccurs="0"/> + <xsd:element name="noResizeAllowed" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="linkedToFile" type="CT_OnOff" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_FrameLayout"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="rows"/> + <xsd:enumeration value="cols"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_FrameLayout"> + <xsd:attribute name="val" type="ST_FrameLayout" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_FramesetSplitbar"> + <xsd:sequence> + <xsd:element name="w" type="CT_TwipsMeasure" minOccurs="0"/> + <xsd:element name="color" type="CT_Color" minOccurs="0"/> + <xsd:element name="noBorder" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="flatBorders" type="CT_OnOff" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Frameset"> + <xsd:sequence> + <xsd:element name="sz" type="CT_String" minOccurs="0"/> + <xsd:element name="framesetSplitbar" type="CT_FramesetSplitbar" minOccurs="0"/> + <xsd:element name="frameLayout" type="CT_FrameLayout" minOccurs="0"/> + <xsd:element name="title" type="CT_String" minOccurs="0"/> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="frameset" type="CT_Frameset" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="frame" type="CT_Frame" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_NumPicBullet"> + <xsd:choice> + <xsd:element name="pict" type="CT_Picture"/> + <xsd:element name="drawing" type="CT_Drawing"/> + </xsd:choice> + <xsd:attribute name="numPicBulletId" type="ST_DecimalNumber" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_LevelSuffix"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="tab"/> + <xsd:enumeration value="space"/> + <xsd:enumeration value="nothing"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_LevelSuffix"> + <xsd:attribute name="val" type="ST_LevelSuffix" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_LevelText"> + <xsd:attribute name="val" type="s:ST_String" use="optional"/> + <xsd:attribute name="null" type="s:ST_OnOff" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_LvlLegacy"> + <xsd:attribute name="legacy" type="s:ST_OnOff" use="optional"/> + <xsd:attribute name="legacySpace" type="s:ST_TwipsMeasure" use="optional"/> + <xsd:attribute name="legacyIndent" type="ST_SignedTwipsMeasure" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_Lvl"> + <xsd:sequence> + <xsd:element name="start" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="numFmt" type="CT_NumFmt" minOccurs="0"/> + <xsd:element name="lvlRestart" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="pStyle" type="CT_String" minOccurs="0"/> + <xsd:element name="isLgl" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="suff" type="CT_LevelSuffix" minOccurs="0"/> + <xsd:element name="lvlText" type="CT_LevelText" minOccurs="0"/> + <xsd:element name="lvlPicBulletId" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="legacy" type="CT_LvlLegacy" minOccurs="0"/> + <xsd:element name="lvlJc" type="CT_Jc" minOccurs="0"/> + <xsd:element name="pPr" type="CT_PPrGeneral" minOccurs="0"/> + <xsd:element name="rPr" type="CT_RPr" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="ilvl" type="ST_DecimalNumber" use="required"/> + <xsd:attribute name="tplc" type="ST_LongHexNumber" use="optional"/> + <xsd:attribute name="tentative" type="s:ST_OnOff" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_MultiLevelType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="singleLevel"/> + <xsd:enumeration value="multilevel"/> + <xsd:enumeration value="hybridMultilevel"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_MultiLevelType"> + <xsd:attribute name="val" type="ST_MultiLevelType" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_AbstractNum"> + <xsd:sequence> + <xsd:element name="nsid" type="CT_LongHexNumber" minOccurs="0"/> + <xsd:element name="multiLevelType" type="CT_MultiLevelType" minOccurs="0"/> + <xsd:element name="tmpl" type="CT_LongHexNumber" minOccurs="0"/> + <xsd:element name="name" type="CT_String" minOccurs="0"/> + <xsd:element name="styleLink" type="CT_String" minOccurs="0"/> + <xsd:element name="numStyleLink" type="CT_String" minOccurs="0"/> + <xsd:element name="lvl" type="CT_Lvl" minOccurs="0" maxOccurs="9"/> + </xsd:sequence> + <xsd:attribute name="abstractNumId" type="ST_DecimalNumber" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_NumLvl"> + <xsd:sequence> + <xsd:element name="startOverride" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="lvl" type="CT_Lvl" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="ilvl" type="ST_DecimalNumber" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Num"> + <xsd:sequence> + <xsd:element name="abstractNumId" type="CT_DecimalNumber" minOccurs="1"/> + <xsd:element name="lvlOverride" type="CT_NumLvl" minOccurs="0" maxOccurs="9"/> + </xsd:sequence> + <xsd:attribute name="numId" type="ST_DecimalNumber" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Numbering"> + <xsd:sequence> + <xsd:element name="numPicBullet" type="CT_NumPicBullet" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="abstractNum" type="CT_AbstractNum" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="num" type="CT_Num" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="numIdMacAtCleanup" type="CT_DecimalNumber" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_TblStyleOverrideType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="wholeTable"/> + <xsd:enumeration value="firstRow"/> + <xsd:enumeration value="lastRow"/> + <xsd:enumeration value="firstCol"/> + <xsd:enumeration value="lastCol"/> + <xsd:enumeration value="band1Vert"/> + <xsd:enumeration value="band2Vert"/> + <xsd:enumeration value="band1Horz"/> + <xsd:enumeration value="band2Horz"/> + <xsd:enumeration value="neCell"/> + <xsd:enumeration value="nwCell"/> + <xsd:enumeration value="seCell"/> + <xsd:enumeration value="swCell"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_TblStylePr"> + <xsd:sequence> + <xsd:element name="pPr" type="CT_PPrGeneral" minOccurs="0"/> + <xsd:element name="rPr" type="CT_RPr" minOccurs="0"/> + <xsd:element name="tblPr" type="CT_TblPrBase" minOccurs="0"/> + <xsd:element name="trPr" type="CT_TrPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tcPr" type="CT_TcPr" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="type" type="ST_TblStyleOverrideType" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_StyleType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="paragraph"/> + <xsd:enumeration value="character"/> + <xsd:enumeration value="table"/> + <xsd:enumeration value="numbering"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Style"> + <xsd:sequence> + <xsd:element name="name" type="CT_String" minOccurs="0" maxOccurs="1"/> + <xsd:element name="aliases" type="CT_String" minOccurs="0"/> + <xsd:element name="basedOn" type="CT_String" minOccurs="0"/> + <xsd:element name="next" type="CT_String" minOccurs="0"/> + <xsd:element name="link" type="CT_String" minOccurs="0"/> + <xsd:element name="autoRedefine" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="hidden" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="uiPriority" type="CT_DecimalNumber" minOccurs="0"/> + <xsd:element name="semiHidden" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="unhideWhenUsed" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="qFormat" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="locked" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="personal" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="personalCompose" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="personalReply" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="rsid" type="CT_LongHexNumber" minOccurs="0"/> + <xsd:element name="pPr" type="CT_PPrGeneral" minOccurs="0" maxOccurs="1"/> + <xsd:element name="rPr" type="CT_RPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblPr" type="CT_TblPrBase" minOccurs="0" maxOccurs="1"/> + <xsd:element name="trPr" type="CT_TrPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tcPr" type="CT_TcPr" minOccurs="0" maxOccurs="1"/> + <xsd:element name="tblStylePr" type="CT_TblStylePr" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="type" type="ST_StyleType" use="optional"/> + <xsd:attribute name="styleId" type="s:ST_String" use="optional"/> + <xsd:attribute name="default" type="s:ST_OnOff" use="optional"/> + <xsd:attribute name="customStyle" type="s:ST_OnOff" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_LsdException"> + <xsd:attribute name="name" type="s:ST_String" use="required"/> + <xsd:attribute name="locked" type="s:ST_OnOff"/> + <xsd:attribute name="uiPriority" type="ST_DecimalNumber"/> + <xsd:attribute name="semiHidden" type="s:ST_OnOff"/> + <xsd:attribute name="unhideWhenUsed" type="s:ST_OnOff"/> + <xsd:attribute name="qFormat" type="s:ST_OnOff"/> + </xsd:complexType> + <xsd:complexType name="CT_LatentStyles"> + <xsd:sequence> + <xsd:element name="lsdException" type="CT_LsdException" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="defLockedState" type="s:ST_OnOff"/> + <xsd:attribute name="defUIPriority" type="ST_DecimalNumber"/> + <xsd:attribute name="defSemiHidden" type="s:ST_OnOff"/> + <xsd:attribute name="defUnhideWhenUsed" type="s:ST_OnOff"/> + <xsd:attribute name="defQFormat" type="s:ST_OnOff"/> + <xsd:attribute name="count" type="ST_DecimalNumber"/> + </xsd:complexType> + <xsd:complexType name="CT_Styles"> + <xsd:sequence> + <xsd:element name="docDefaults" type="CT_DocDefaults" minOccurs="0"/> + <xsd:element name="latentStyles" type="CT_LatentStyles" minOccurs="0" maxOccurs="1"/> + <xsd:element name="style" type="CT_Style" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Panose"> + <xsd:attribute name="val" type="s:ST_Panose" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_FontFamily"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="decorative"/> + <xsd:enumeration value="modern"/> + <xsd:enumeration value="roman"/> + <xsd:enumeration value="script"/> + <xsd:enumeration value="swiss"/> + <xsd:enumeration value="auto"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_FontFamily"> + <xsd:attribute name="val" type="ST_FontFamily" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_Pitch"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="fixed"/> + <xsd:enumeration value="variable"/> + <xsd:enumeration value="default"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Pitch"> + <xsd:attribute name="val" type="ST_Pitch" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_FontSig"> + <xsd:attribute name="usb0" use="required" type="ST_LongHexNumber"/> + <xsd:attribute name="usb1" use="required" type="ST_LongHexNumber"/> + <xsd:attribute name="usb2" use="required" type="ST_LongHexNumber"/> + <xsd:attribute name="usb3" use="required" type="ST_LongHexNumber"/> + <xsd:attribute name="csb0" use="required" type="ST_LongHexNumber"/> + <xsd:attribute name="csb1" use="required" type="ST_LongHexNumber"/> + </xsd:complexType> + <xsd:complexType name="CT_FontRel"> + <xsd:complexContent> + <xsd:extension base="CT_Rel"> + <xsd:attribute name="fontKey" type="s:ST_Guid"/> + <xsd:attribute name="subsetted" type="s:ST_OnOff"/> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_Font"> + <xsd:sequence> + <xsd:element name="altName" type="CT_String" minOccurs="0" maxOccurs="1"/> + <xsd:element name="panose1" type="CT_Panose" minOccurs="0" maxOccurs="1"/> + <xsd:element name="charset" type="CT_Charset" minOccurs="0" maxOccurs="1"/> + <xsd:element name="family" type="CT_FontFamily" minOccurs="0" maxOccurs="1"/> + <xsd:element name="notTrueType" type="CT_OnOff" minOccurs="0" maxOccurs="1"/> + <xsd:element name="pitch" type="CT_Pitch" minOccurs="0" maxOccurs="1"/> + <xsd:element name="sig" type="CT_FontSig" minOccurs="0" maxOccurs="1"/> + <xsd:element name="embedRegular" type="CT_FontRel" minOccurs="0" maxOccurs="1"/> + <xsd:element name="embedBold" type="CT_FontRel" minOccurs="0" maxOccurs="1"/> + <xsd:element name="embedItalic" type="CT_FontRel" minOccurs="0" maxOccurs="1"/> + <xsd:element name="embedBoldItalic" type="CT_FontRel" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="name" type="s:ST_String" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_FontsList"> + <xsd:sequence> + <xsd:element name="font" type="CT_Font" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DivBdr"> + <xsd:sequence> + <xsd:element name="top" type="CT_Border" minOccurs="0"/> + <xsd:element name="left" type="CT_Border" minOccurs="0"/> + <xsd:element name="bottom" type="CT_Border" minOccurs="0"/> + <xsd:element name="right" type="CT_Border" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Div"> + <xsd:sequence> + <xsd:element name="blockQuote" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="bodyDiv" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="marLeft" type="CT_SignedTwipsMeasure"/> + <xsd:element name="marRight" type="CT_SignedTwipsMeasure"/> + <xsd:element name="marTop" type="CT_SignedTwipsMeasure"/> + <xsd:element name="marBottom" type="CT_SignedTwipsMeasure"/> + <xsd:element name="divBdr" type="CT_DivBdr" minOccurs="0"/> + <xsd:element name="divsChild" type="CT_Divs" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="id" type="ST_DecimalNumber" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Divs"> + <xsd:sequence minOccurs="1" maxOccurs="unbounded"> + <xsd:element name="div" type="CT_Div"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TxbxContent"> + <xsd:group ref="EG_BlockLevelElts" minOccurs="1" maxOccurs="unbounded"/> + </xsd:complexType> + <xsd:element name="txbxContent" type="CT_TxbxContent"/> + <xsd:group name="EG_MathContent"> + <xsd:choice> + <xsd:element ref="m:oMathPara"/> + <xsd:element ref="m:oMath"/> + </xsd:choice> + </xsd:group> + <xsd:group name="EG_BlockLevelChunkElts"> + <xsd:choice> + <xsd:group ref="EG_ContentBlockContent" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:group> + <xsd:group name="EG_BlockLevelElts"> + <xsd:choice> + <xsd:group ref="EG_BlockLevelChunkElts" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="altChunk" type="CT_AltChunk" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:group> + <xsd:group name="EG_RunLevelElts"> + <xsd:choice> + <xsd:element name="proofErr" minOccurs="0" type="CT_ProofErr"/> + <xsd:element name="permStart" minOccurs="0" type="CT_PermStart"/> + <xsd:element name="permEnd" minOccurs="0" type="CT_Perm"/> + <xsd:group ref="EG_RangeMarkupElements" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="ins" type="CT_RunTrackChange" minOccurs="0"/> + <xsd:element name="del" type="CT_RunTrackChange" minOccurs="0"/> + <xsd:element name="moveFrom" type="CT_RunTrackChange"/> + <xsd:element name="moveTo" type="CT_RunTrackChange"/> + <xsd:group ref="EG_MathContent" minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_Body"> + <xsd:sequence> + <xsd:group ref="EG_BlockLevelElts" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="sectPr" minOccurs="0" maxOccurs="1" type="CT_SectPr"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_ShapeDefaults"> + <xsd:choice maxOccurs="unbounded"> + <xsd:any processContents="lax" namespace="urn:schemas-microsoft-com:office:office" + minOccurs="0" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:complexType> + <xsd:complexType name="CT_Comments"> + <xsd:sequence> + <xsd:element name="comment" type="CT_Comment" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="comments" type="CT_Comments"/> + <xsd:complexType name="CT_Footnotes"> + <xsd:sequence maxOccurs="unbounded"> + <xsd:element name="footnote" type="CT_FtnEdn" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="footnotes" type="CT_Footnotes"/> + <xsd:complexType name="CT_Endnotes"> + <xsd:sequence maxOccurs="unbounded"> + <xsd:element name="endnote" type="CT_FtnEdn" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="endnotes" type="CT_Endnotes"/> + <xsd:element name="hdr" type="CT_HdrFtr"/> + <xsd:element name="ftr" type="CT_HdrFtr"/> + <xsd:complexType name="CT_SmartTagType"> + <xsd:attribute name="namespaceuri" type="s:ST_String"/> + <xsd:attribute name="name" type="s:ST_String"/> + <xsd:attribute name="url" type="s:ST_String"/> + </xsd:complexType> + <xsd:simpleType name="ST_ThemeColor"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="dark1"/> + <xsd:enumeration value="light1"/> + <xsd:enumeration value="dark2"/> + <xsd:enumeration value="light2"/> + <xsd:enumeration value="accent1"/> + <xsd:enumeration value="accent2"/> + <xsd:enumeration value="accent3"/> + <xsd:enumeration value="accent4"/> + <xsd:enumeration value="accent5"/> + <xsd:enumeration value="accent6"/> + <xsd:enumeration value="hyperlink"/> + <xsd:enumeration value="followedHyperlink"/> + <xsd:enumeration value="none"/> + <xsd:enumeration value="background1"/> + <xsd:enumeration value="text1"/> + <xsd:enumeration value="background2"/> + <xsd:enumeration value="text2"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_DocPartBehavior"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="content"/> + <xsd:enumeration value="p"/> + <xsd:enumeration value="pg"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_DocPartBehavior"> + <xsd:attribute name="val" use="required" type="ST_DocPartBehavior"/> + </xsd:complexType> + <xsd:complexType name="CT_DocPartBehaviors"> + <xsd:choice> + <xsd:element name="behavior" type="CT_DocPartBehavior" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:complexType> + <xsd:simpleType name="ST_DocPartType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="normal"/> + <xsd:enumeration value="autoExp"/> + <xsd:enumeration value="toolbar"/> + <xsd:enumeration value="speller"/> + <xsd:enumeration value="formFld"/> + <xsd:enumeration value="bbPlcHdr"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_DocPartType"> + <xsd:attribute name="val" use="required" type="ST_DocPartType"/> + </xsd:complexType> + <xsd:complexType name="CT_DocPartTypes"> + <xsd:choice> + <xsd:element name="type" type="CT_DocPartType" maxOccurs="unbounded"/> + </xsd:choice> + <xsd:attribute name="all" type="s:ST_OnOff" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_DocPartGallery"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="placeholder"/> + <xsd:enumeration value="any"/> + <xsd:enumeration value="default"/> + <xsd:enumeration value="docParts"/> + <xsd:enumeration value="coverPg"/> + <xsd:enumeration value="eq"/> + <xsd:enumeration value="ftrs"/> + <xsd:enumeration value="hdrs"/> + <xsd:enumeration value="pgNum"/> + <xsd:enumeration value="tbls"/> + <xsd:enumeration value="watermarks"/> + <xsd:enumeration value="autoTxt"/> + <xsd:enumeration value="txtBox"/> + <xsd:enumeration value="pgNumT"/> + <xsd:enumeration value="pgNumB"/> + <xsd:enumeration value="pgNumMargins"/> + <xsd:enumeration value="tblOfContents"/> + <xsd:enumeration value="bib"/> + <xsd:enumeration value="custQuickParts"/> + <xsd:enumeration value="custCoverPg"/> + <xsd:enumeration value="custEq"/> + <xsd:enumeration value="custFtrs"/> + <xsd:enumeration value="custHdrs"/> + <xsd:enumeration value="custPgNum"/> + <xsd:enumeration value="custTbls"/> + <xsd:enumeration value="custWatermarks"/> + <xsd:enumeration value="custAutoTxt"/> + <xsd:enumeration value="custTxtBox"/> + <xsd:enumeration value="custPgNumT"/> + <xsd:enumeration value="custPgNumB"/> + <xsd:enumeration value="custPgNumMargins"/> + <xsd:enumeration value="custTblOfContents"/> + <xsd:enumeration value="custBib"/> + <xsd:enumeration value="custom1"/> + <xsd:enumeration value="custom2"/> + <xsd:enumeration value="custom3"/> + <xsd:enumeration value="custom4"/> + <xsd:enumeration value="custom5"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_DocPartGallery"> + <xsd:attribute name="val" type="ST_DocPartGallery" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_DocPartCategory"> + <xsd:sequence> + <xsd:element name="name" type="CT_String" minOccurs="1" maxOccurs="1"/> + <xsd:element name="gallery" type="CT_DocPartGallery" minOccurs="1" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DocPartName"> + <xsd:attribute name="val" type="s:ST_String" use="required"/> + <xsd:attribute name="decorated" type="s:ST_OnOff" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_DocPartPr"> + <xsd:all> + <xsd:element name="name" type="CT_DocPartName" minOccurs="1"/> + <xsd:element name="style" type="CT_String" minOccurs="0"/> + <xsd:element name="category" type="CT_DocPartCategory" minOccurs="0"/> + <xsd:element name="types" type="CT_DocPartTypes" minOccurs="0"/> + <xsd:element name="behaviors" type="CT_DocPartBehaviors" minOccurs="0"/> + <xsd:element name="description" type="CT_String" minOccurs="0"/> + <xsd:element name="guid" type="CT_Guid" minOccurs="0"/> + </xsd:all> + </xsd:complexType> + <xsd:complexType name="CT_DocPart"> + <xsd:sequence> + <xsd:element name="docPartPr" type="CT_DocPartPr" minOccurs="0"/> + <xsd:element name="docPartBody" type="CT_Body" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DocParts"> + <xsd:choice> + <xsd:element name="docPart" type="CT_DocPart" minOccurs="1" maxOccurs="unbounded"/> + </xsd:choice> + </xsd:complexType> + <xsd:element name="settings" type="CT_Settings"/> + <xsd:element name="webSettings" type="CT_WebSettings"/> + <xsd:element name="fonts" type="CT_FontsList"/> + <xsd:element name="numbering" type="CT_Numbering"/> + <xsd:element name="styles" type="CT_Styles"/> + <xsd:simpleType name="ST_CaptionPos"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="above"/> + <xsd:enumeration value="below"/> + <xsd:enumeration value="left"/> + <xsd:enumeration value="right"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Caption"> + <xsd:attribute name="name" type="s:ST_String" use="required"/> + <xsd:attribute name="pos" type="ST_CaptionPos" use="optional"/> + <xsd:attribute name="chapNum" type="s:ST_OnOff" use="optional"/> + <xsd:attribute name="heading" type="ST_DecimalNumber" use="optional"/> + <xsd:attribute name="noLabel" type="s:ST_OnOff" use="optional"/> + <xsd:attribute name="numFmt" type="ST_NumberFormat" use="optional"/> + <xsd:attribute name="sep" type="ST_ChapterSep" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_AutoCaption"> + <xsd:attribute name="name" type="s:ST_String" use="required"/> + <xsd:attribute name="caption" type="s:ST_String" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_AutoCaptions"> + <xsd:sequence> + <xsd:element name="autoCaption" type="CT_AutoCaption" minOccurs="1" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Captions"> + <xsd:sequence> + <xsd:element name="caption" type="CT_Caption" minOccurs="1" maxOccurs="unbounded"/> + <xsd:element name="autoCaptions" type="CT_AutoCaptions" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_DocumentBase"> + <xsd:sequence> + <xsd:element name="background" type="CT_Background" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Document"> + <xsd:complexContent> + <xsd:extension base="CT_DocumentBase"> + <xsd:sequence> + <xsd:element name="body" type="CT_Body" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="conformance" type="s:ST_ConformanceClass"/> + <xsd:attribute ref="mc:Ignorable" use="optional" /> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:complexType name="CT_GlossaryDocument"> + <xsd:complexContent> + <xsd:extension base="CT_DocumentBase"> + <xsd:sequence> + <xsd:element name="docParts" type="CT_DocParts" minOccurs="0"/> + </xsd:sequence> + </xsd:extension> + </xsd:complexContent> + </xsd:complexType> + <xsd:element name="document" type="CT_Document"/> + <xsd:element name="glossaryDocument" type="CT_GlossaryDocument"/> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd new file mode 100644 index 0000000..0f13678 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd @@ -0,0 +1,116 @@ +<?xml version='1.0'?> +<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="en"> + + <xs:annotation> + <xs:documentation> + See http://www.w3.org/XML/1998/namespace.html and + http://www.w3.org/TR/REC-xml for information about this namespace. + + This schema document describes the XML namespace, in a form + suitable for import by other schema documents. + + Note that local names in this namespace are intended to be defined + only by the World Wide Web Consortium or its subgroups. The + following names are currently defined in this namespace and should + not be used with conflicting semantics by any Working Group, + specification, or document instance: + + base (as an attribute name): denotes an attribute whose value + provides a URI to be used as the base for interpreting any + relative URIs in the scope of the element on which it + appears; its value is inherited. This name is reserved + by virtue of its definition in the XML Base specification. + + lang (as an attribute name): denotes an attribute whose value + is a language code for the natural language of the content of + any element; its value is inherited. This name is reserved + by virtue of its definition in the XML specification. + + space (as an attribute name): denotes an attribute whose + value is a keyword indicating what whitespace processing + discipline is intended for the content of the element; its + value is inherited. This name is reserved by virtue of its + definition in the XML specification. + + Father (in any context at all): denotes Jon Bosak, the chair of + the original XML Working Group. This name is reserved by + the following decision of the W3C XML Plenary and + XML Coordination groups: + + In appreciation for his vision, leadership and dedication + the W3C XML Plenary on this 10th day of February, 2000 + reserves for Jon Bosak in perpetuity the XML name + xml:Father + </xs:documentation> + </xs:annotation> + + <xs:annotation> + <xs:documentation>This schema defines attributes and an attribute group + suitable for use by + schemas wishing to allow xml:base, xml:lang or xml:space attributes + on elements they define. + + To enable this, such a schema must import this schema + for the XML namespace, e.g. as follows: + <schema . . .> + . . . + <import namespace="http://www.w3.org/XML/1998/namespace" + schemaLocation="http://www.w3.org/2001/03/xml.xsd"/> + + Subsequently, qualified reference to any of the attributes + or the group defined below will have the desired effect, e.g. + + <type . . .> + . . . + <attributeGroup ref="xml:specialAttrs"/> + + will define a type which will schema-validate an instance + element with any of those attributes</xs:documentation> + </xs:annotation> + + <xs:annotation> + <xs:documentation>In keeping with the XML Schema WG's standard versioning + policy, this schema document will persist at + http://www.w3.org/2001/03/xml.xsd. + At the date of issue it can also be found at + http://www.w3.org/2001/xml.xsd. + The schema document at that URI may however change in the future, + in order to remain compatible with the latest version of XML Schema + itself. In other words, if the XML Schema namespace changes, the version + of this document at + http://www.w3.org/2001/xml.xsd will change + accordingly; the version at + http://www.w3.org/2001/03/xml.xsd will not change. + </xs:documentation> + </xs:annotation> + + <xs:attribute name="lang" type="xs:language"> + <xs:annotation> + <xs:documentation>In due course, we should install the relevant ISO 2- and 3-letter + codes as the enumerated possible values . . .</xs:documentation> + </xs:annotation> + </xs:attribute> + + <xs:attribute name="space" default="preserve"> + <xs:simpleType> + <xs:restriction base="xs:NCName"> + <xs:enumeration value="default"/> + <xs:enumeration value="preserve"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + + <xs:attribute name="base" type="xs:anyURI"> + <xs:annotation> + <xs:documentation>See http://www.w3.org/TR/xmlbase/ for + information about this attribute.</xs:documentation> + </xs:annotation> + </xs:attribute> + + <xs:attributeGroup name="specialAttrs"> + <xs:attribute ref="xml:base"/> + <xs:attribute ref="xml:lang"/> + <xs:attribute ref="xml:space"/> + </xs:attributeGroup> + +</xs:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd b/.claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd new file mode 100644 index 0000000..a6de9d2 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<xs:schema xmlns="http://schemas.openxmlformats.org/package/2006/content-types" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://schemas.openxmlformats.org/package/2006/content-types" + elementFormDefault="qualified" attributeFormDefault="unqualified" blockDefault="#all"> + + <xs:element name="Types" type="CT_Types"/> + <xs:element name="Default" type="CT_Default"/> + <xs:element name="Override" type="CT_Override"/> + + <xs:complexType name="CT_Types"> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="Default"/> + <xs:element ref="Override"/> + </xs:choice> + </xs:complexType> + + <xs:complexType name="CT_Default"> + <xs:attribute name="Extension" type="ST_Extension" use="required"/> + <xs:attribute name="ContentType" type="ST_ContentType" use="required"/> + </xs:complexType> + + <xs:complexType name="CT_Override"> + <xs:attribute name="ContentType" type="ST_ContentType" use="required"/> + <xs:attribute name="PartName" type="xs:anyURI" use="required"/> + </xs:complexType> + + <xs:simpleType name="ST_ContentType"> + <xs:restriction base="xs:string"> + <xs:pattern + value="(((([\p{IsBasicLatin}-[\p{Cc}\(\)<>@,;:\\"/\[\]\?=\{\}\s\t]])+))/((([\p{IsBasicLatin}-[\p{Cc}\(\)<>@,;:\\"/\[\]\?=\{\}\s\t]])+))((\s+)*;(\s+)*(((([\p{IsBasicLatin}-[\p{Cc}\(\)<>@,;:\\"/\[\]\?=\{\}\s\t]])+))=((([\p{IsBasicLatin}-[\p{Cc}\(\)<>@,;:\\"/\[\]\?=\{\}\s\t]])+)|("(([\p{IsLatin-1Supplement}\p{IsBasicLatin}-[\p{Cc}"\n\r]]|(\s+))|(\\[\p{IsBasicLatin}]))*"))))*)" + /> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="ST_Extension"> + <xs:restriction base="xs:string"> + <xs:pattern + value="([!$&'\(\)\*\+,:=]|(%[0-9a-fA-F][0-9a-fA-F])|[:@]|[a-zA-Z0-9\-_~])+"/> + </xs:restriction> + </xs:simpleType> +</xs:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd b/.claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd new file mode 100644 index 0000000..10e978b --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema targetNamespace="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" + xmlns="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" + xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:dcterms="http://purl.org/dc/terms/" elementFormDefault="qualified" blockDefault="#all"> + + <xs:import namespace="http://purl.org/dc/elements/1.1/" + schemaLocation="http://dublincore.org/schemas/xmls/qdc/2003/04/02/dc.xsd"/> + <xs:import namespace="http://purl.org/dc/terms/" + schemaLocation="http://dublincore.org/schemas/xmls/qdc/2003/04/02/dcterms.xsd"/> + <xs:import id="xml" namespace="http://www.w3.org/XML/1998/namespace"/> + + <xs:element name="coreProperties" type="CT_CoreProperties"/> + + <xs:complexType name="CT_CoreProperties"> + <xs:all> + <xs:element name="category" minOccurs="0" maxOccurs="1" type="xs:string"/> + <xs:element name="contentStatus" minOccurs="0" maxOccurs="1" type="xs:string"/> + <xs:element ref="dcterms:created" minOccurs="0" maxOccurs="1"/> + <xs:element ref="dc:creator" minOccurs="0" maxOccurs="1"/> + <xs:element ref="dc:description" minOccurs="0" maxOccurs="1"/> + <xs:element ref="dc:identifier" minOccurs="0" maxOccurs="1"/> + <xs:element name="keywords" minOccurs="0" maxOccurs="1" type="CT_Keywords"/> + <xs:element ref="dc:language" minOccurs="0" maxOccurs="1"/> + <xs:element name="lastModifiedBy" minOccurs="0" maxOccurs="1" type="xs:string"/> + <xs:element name="lastPrinted" minOccurs="0" maxOccurs="1" type="xs:dateTime"/> + <xs:element ref="dcterms:modified" minOccurs="0" maxOccurs="1"/> + <xs:element name="revision" minOccurs="0" maxOccurs="1" type="xs:string"/> + <xs:element ref="dc:subject" minOccurs="0" maxOccurs="1"/> + <xs:element ref="dc:title" minOccurs="0" maxOccurs="1"/> + <xs:element name="version" minOccurs="0" maxOccurs="1" type="xs:string"/> + </xs:all> + </xs:complexType> + + <xs:complexType name="CT_Keywords" mixed="true"> + <xs:sequence> + <xs:element name="value" minOccurs="0" maxOccurs="unbounded" type="CT_Keyword"/> + </xs:sequence> + <xs:attribute ref="xml:lang" use="optional"/> + </xs:complexType> + + <xs:complexType name="CT_Keyword"> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute ref="xml:lang" use="optional"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + +</xs:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd b/.claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd new file mode 100644 index 0000000..4248bf7 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsd:schema xmlns="http://schemas.openxmlformats.org/package/2006/digital-signature" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://schemas.openxmlformats.org/package/2006/digital-signature" + elementFormDefault="qualified" attributeFormDefault="unqualified" blockDefault="#all"> + + <xsd:element name="SignatureTime" type="CT_SignatureTime"/> + <xsd:element name="RelationshipReference" type="CT_RelationshipReference"/> + <xsd:element name="RelationshipsGroupReference" type="CT_RelationshipsGroupReference"/> + + <xsd:complexType name="CT_SignatureTime"> + <xsd:sequence> + <xsd:element name="Format" type="ST_Format"/> + <xsd:element name="Value" type="ST_Value"/> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="CT_RelationshipReference"> + <xsd:simpleContent> + <xsd:extension base="xsd:string"> + <xsd:attribute name="SourceId" type="xsd:string" use="required"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + + <xsd:complexType name="CT_RelationshipsGroupReference"> + <xsd:simpleContent> + <xsd:extension base="xsd:string"> + <xsd:attribute name="SourceType" type="xsd:anyURI" use="required"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + + <xsd:simpleType name="ST_Format"> + <xsd:restriction base="xsd:string"> + <xsd:pattern + value="(YYYY)|(YYYY-MM)|(YYYY-MM-DD)|(YYYY-MM-DDThh:mmTZD)|(YYYY-MM-DDThh:mm:ssTZD)|(YYYY-MM-DDThh:mm:ss.sTZD)" + /> + </xsd:restriction> + </xsd:simpleType> + + <xsd:simpleType name="ST_Value"> + <xsd:restriction base="xsd:string"> + <xsd:pattern + value="(([0-9][0-9][0-9][0-9]))|(([0-9][0-9][0-9][0-9])-((0[1-9])|(1(0|1|2))))|(([0-9][0-9][0-9][0-9])-((0[1-9])|(1(0|1|2)))-((0[1-9])|(1[0-9])|(2[0-9])|(3(0|1))))|(([0-9][0-9][0-9][0-9])-((0[1-9])|(1(0|1|2)))-((0[1-9])|(1[0-9])|(2[0-9])|(3(0|1)))T((0[0-9])|(1[0-9])|(2(0|1|2|3))):((0[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9]))(((\+|-)((0[0-9])|(1[0-9])|(2(0|1|2|3))):((0[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9])))|Z))|(([0-9][0-9][0-9][0-9])-((0[1-9])|(1(0|1|2)))-((0[1-9])|(1[0-9])|(2[0-9])|(3(0|1)))T((0[0-9])|(1[0-9])|(2(0|1|2|3))):((0[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9])):((0[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9]))(((\+|-)((0[0-9])|(1[0-9])|(2(0|1|2|3))):((0[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9])))|Z))|(([0-9][0-9][0-9][0-9])-((0[1-9])|(1(0|1|2)))-((0[1-9])|(1[0-9])|(2[0-9])|(3(0|1)))T((0[0-9])|(1[0-9])|(2(0|1|2|3))):((0[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9])):(((0[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9]))\.[0-9])(((\+|-)((0[0-9])|(1[0-9])|(2(0|1|2|3))):((0[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9])))|Z))" + /> + </xsd:restriction> + </xsd:simpleType> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd b/.claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd new file mode 100644 index 0000000..5649746 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<xsd:schema xmlns="http://schemas.openxmlformats.org/package/2006/relationships" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://schemas.openxmlformats.org/package/2006/relationships" + elementFormDefault="qualified" attributeFormDefault="unqualified" blockDefault="#all"> + + <xsd:element name="Relationships" type="CT_Relationships"/> + <xsd:element name="Relationship" type="CT_Relationship"/> + + <xsd:complexType name="CT_Relationships"> + <xsd:sequence> + <xsd:element ref="Relationship" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="CT_Relationship"> + <xsd:simpleContent> + <xsd:extension base="xsd:string"> + <xsd:attribute name="TargetMode" type="ST_TargetMode" use="optional"/> + <xsd:attribute name="Target" type="xsd:anyURI" use="required"/> + <xsd:attribute name="Type" type="xsd:anyURI" use="required"/> + <xsd:attribute name="Id" type="xsd:ID" use="required"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + + <xsd:simpleType name="ST_TargetMode"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="External"/> + <xsd:enumeration value="Internal"/> + </xsd:restriction> + </xsd:simpleType> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/mce/mc.xsd b/.claude/skills/xlsx/scripts/office/schemas/mce/mc.xsd new file mode 100644 index 0000000..ef72545 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/mce/mc.xsd @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + attributeFormDefault="unqualified" elementFormDefault="qualified" + targetNamespace="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <!-- + This XSD is a modified version of the one found at: + https://github.com/plutext/docx4j/blob/master/xsd/mce/markup-compatibility-2006-MINIMAL.xsd + + This XSD has 2 objectives: + + 1. round tripping @mc:Ignorable + + <w:document + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" + mc:Ignorable="w14 w15 wp14"> + + 2. enabling AlternateContent to be manipulated in certain elements + (in the unusual case where the content model is xsd:any, it doesn't have to be explicitly added) + + See further ECMA-376, 4th Edition, Office Open XML File Formats + Part 3 : Markup Compatibility and Extensibility + --> + + <!-- Objective 1 --> + <xsd:attribute name="Ignorable" type="xsd:string" /> + + <!-- Objective 2 --> + <xsd:attribute name="MustUnderstand" type="xsd:string" /> + <xsd:attribute name="ProcessContent" type="xsd:string" /> + +<!-- An AlternateContent element shall contain one or more Choice child elements, optionally followed by a +Fallback child element. If present, there shall be only one Fallback element, and it shall follow all Choice +elements. --> + <xsd:element name="AlternateContent"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="Choice" minOccurs="0" maxOccurs="unbounded"> + <xsd:complexType> + <xsd:sequence> + <xsd:any minOccurs="0" maxOccurs="unbounded" + processContents="strict"> + </xsd:any> + </xsd:sequence> + <xsd:attribute name="Requires" type="xsd:string" use="required" /> + <xsd:attribute ref="mc:Ignorable" use="optional" /> + <xsd:attribute ref="mc:MustUnderstand" use="optional" /> + <xsd:attribute ref="mc:ProcessContent" use="optional" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="Fallback" minOccurs="0" maxOccurs="1"> + <xsd:complexType> + <xsd:sequence> + <xsd:any minOccurs="0" maxOccurs="unbounded" + processContents="strict"> + </xsd:any> + </xsd:sequence> + <xsd:attribute ref="mc:Ignorable" use="optional" /> + <xsd:attribute ref="mc:MustUnderstand" use="optional" /> + <xsd:attribute ref="mc:ProcessContent" use="optional" /> + </xsd:complexType> + </xsd:element> + </xsd:sequence> + <!-- AlternateContent elements might include the attributes Ignorable, + MustUnderstand and ProcessContent described in this Part of ECMA-376. These + attributes’ qualified names shall be prefixed when associated with an AlternateContent + element. --> + <xsd:attribute ref="mc:Ignorable" use="optional" /> + <xsd:attribute ref="mc:MustUnderstand" use="optional" /> + <xsd:attribute ref="mc:ProcessContent" use="optional" /> + </xsd:complexType> + </xsd:element> +</xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd b/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd new file mode 100644 index 0000000..f65f777 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd @@ -0,0 +1,560 @@ + <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:w12="http://schemas.openxmlformats.org/wordprocessingml/2006/main" elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns="http://schemas.microsoft.com/office/word/2010/wordml" targetNamespace="http://schemas.microsoft.com/office/word/2010/wordml"> + <!-- <xsd:import id="rel" namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships" schemaLocation="orel.xsd"/> --> + <xsd:import id="w" namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main" schemaLocation="../ISO-IEC29500-4_2016/wml.xsd"/> + <!-- <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main" schemaLocation="oartbasetypes.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main" schemaLocation="oartsplineproperties.xsd"/> --> + <xsd:complexType name="CT_LongHexNumber"> + <xsd:attribute name="val" type="w:ST_LongHexNumber" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_OnOff"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="true"/> + <xsd:enumeration value="false"/> + <xsd:enumeration value="0"/> + <xsd:enumeration value="1"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_OnOff"> + <xsd:attribute name="val" type="ST_OnOff"/> + </xsd:complexType> + <xsd:element name="docId" type="CT_LongHexNumber"/> + <xsd:element name="conflictMode" type="CT_OnOff"/> + <xsd:attributeGroup name="AG_Parids"> + <xsd:attribute name="paraId" type="w:ST_LongHexNumber"/> + <xsd:attribute name="textId" type="w:ST_LongHexNumber"/> + </xsd:attributeGroup> + <xsd:attribute name="anchorId" type="w:ST_LongHexNumber"/> + <xsd:attribute name="noSpellErr" type="ST_OnOff"/> + <xsd:element name="customXmlConflictInsRangeStart" type="w:CT_TrackChange"/> + <xsd:element name="customXmlConflictInsRangeEnd" type="w:CT_Markup"/> + <xsd:element name="customXmlConflictDelRangeStart" type="w:CT_TrackChange"/> + <xsd:element name="customXmlConflictDelRangeEnd" type="w:CT_Markup"/> + <xsd:group name="EG_RunLevelConflicts"> + <xsd:sequence> + <xsd:element name="conflictIns" type="w:CT_RunTrackChange" minOccurs="0"/> + <xsd:element name="conflictDel" type="w:CT_RunTrackChange" minOccurs="0"/> + </xsd:sequence> + </xsd:group> + <xsd:group name="EG_Conflicts"> + <xsd:choice> + <xsd:element name="conflictIns" type="w:CT_TrackChange" minOccurs="0"/> + <xsd:element name="conflictDel" type="w:CT_TrackChange" minOccurs="0"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_Percentage"> + <xsd:attribute name="val" type="a:ST_Percentage" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_PositiveFixedPercentage"> + <xsd:attribute name="val" type="a:ST_PositiveFixedPercentage" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_PositivePercentage"> + <xsd:attribute name="val" type="a:ST_PositivePercentage" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_SchemeColorVal"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="bg1"/> + <xsd:enumeration value="tx1"/> + <xsd:enumeration value="bg2"/> + <xsd:enumeration value="tx2"/> + <xsd:enumeration value="accent1"/> + <xsd:enumeration value="accent2"/> + <xsd:enumeration value="accent3"/> + <xsd:enumeration value="accent4"/> + <xsd:enumeration value="accent5"/> + <xsd:enumeration value="accent6"/> + <xsd:enumeration value="hlink"/> + <xsd:enumeration value="folHlink"/> + <xsd:enumeration value="dk1"/> + <xsd:enumeration value="lt1"/> + <xsd:enumeration value="dk2"/> + <xsd:enumeration value="lt2"/> + <xsd:enumeration value="phClr"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_RectAlignment"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="tl"/> + <xsd:enumeration value="t"/> + <xsd:enumeration value="tr"/> + <xsd:enumeration value="l"/> + <xsd:enumeration value="ctr"/> + <xsd:enumeration value="r"/> + <xsd:enumeration value="bl"/> + <xsd:enumeration value="b"/> + <xsd:enumeration value="br"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PathShadeType"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="shape"/> + <xsd:enumeration value="circle"/> + <xsd:enumeration value="rect"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_LineCap"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="rnd"/> + <xsd:enumeration value="sq"/> + <xsd:enumeration value="flat"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PresetLineDashVal"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="solid"/> + <xsd:enumeration value="dot"/> + <xsd:enumeration value="sysDot"/> + <xsd:enumeration value="dash"/> + <xsd:enumeration value="sysDash"/> + <xsd:enumeration value="lgDash"/> + <xsd:enumeration value="dashDot"/> + <xsd:enumeration value="sysDashDot"/> + <xsd:enumeration value="lgDashDot"/> + <xsd:enumeration value="lgDashDotDot"/> + <xsd:enumeration value="sysDashDotDot"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_PenAlignment"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="ctr"/> + <xsd:enumeration value="in"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_CompoundLine"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="sng"/> + <xsd:enumeration value="dbl"/> + <xsd:enumeration value="thickThin"/> + <xsd:enumeration value="thinThick"/> + <xsd:enumeration value="tri"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_RelativeRect"> + <xsd:attribute name="l" use="optional" type="a:ST_Percentage"/> + <xsd:attribute name="t" use="optional" type="a:ST_Percentage"/> + <xsd:attribute name="r" use="optional" type="a:ST_Percentage"/> + <xsd:attribute name="b" use="optional" type="a:ST_Percentage"/> + </xsd:complexType> + <xsd:group name="EG_ColorTransform"> + <xsd:choice> + <xsd:element name="tint" type="CT_PositiveFixedPercentage"/> + <xsd:element name="shade" type="CT_PositiveFixedPercentage"/> + <xsd:element name="alpha" type="CT_PositiveFixedPercentage"/> + <xsd:element name="hueMod" type="CT_PositivePercentage"/> + <xsd:element name="sat" type="CT_Percentage"/> + <xsd:element name="satOff" type="CT_Percentage"/> + <xsd:element name="satMod" type="CT_Percentage"/> + <xsd:element name="lum" type="CT_Percentage"/> + <xsd:element name="lumOff" type="CT_Percentage"/> + <xsd:element name="lumMod" type="CT_Percentage"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_SRgbColor"> + <xsd:sequence> + <xsd:group ref="EG_ColorTransform" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="val" type="s:ST_HexColorRGB" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_SchemeColor"> + <xsd:sequence> + <xsd:group ref="EG_ColorTransform" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="val" type="ST_SchemeColorVal" use="required"/> + </xsd:complexType> + <xsd:group name="EG_ColorChoice"> + <xsd:choice> + <xsd:element name="srgbClr" type="CT_SRgbColor"/> + <xsd:element name="schemeClr" type="CT_SchemeColor"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_Color"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GradientStop"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice"/> + </xsd:sequence> + <xsd:attribute name="pos" type="a:ST_PositiveFixedPercentage" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_GradientStopList"> + <xsd:sequence> + <xsd:element name="gs" type="CT_GradientStop" minOccurs="2" maxOccurs="10"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_LinearShadeProperties"> + <xsd:attribute name="ang" type="a:ST_PositiveFixedAngle" use="optional"/> + <xsd:attribute name="scaled" type="ST_OnOff" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_PathShadeProperties"> + <xsd:sequence> + <xsd:element name="fillToRect" type="CT_RelativeRect" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="path" type="ST_PathShadeType" use="optional"/> + </xsd:complexType> + <xsd:group name="EG_ShadeProperties"> + <xsd:choice> + <xsd:element name="lin" type="CT_LinearShadeProperties"/> + <xsd:element name="path" type="CT_PathShadeProperties"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_SolidColorFillProperties"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_GradientFillProperties"> + <xsd:sequence> + <xsd:element name="gsLst" type="CT_GradientStopList" minOccurs="0"/> + <xsd:group ref="EG_ShadeProperties" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_FillProperties"> + <xsd:choice> + <xsd:element name="noFill" type="w:CT_Empty"/> + <xsd:element name="solidFill" type="CT_SolidColorFillProperties"/> + <xsd:element name="gradFill" type="CT_GradientFillProperties"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_PresetLineDashProperties"> + <xsd:attribute name="val" type="ST_PresetLineDashVal" use="optional"/> + </xsd:complexType> + <xsd:group name="EG_LineDashProperties"> + <xsd:choice> + <xsd:element name="prstDash" type="CT_PresetLineDashProperties"/> + </xsd:choice> + </xsd:group> + <xsd:complexType name="CT_LineJoinMiterProperties"> + <xsd:attribute name="lim" type="a:ST_PositivePercentage" use="optional"/> + </xsd:complexType> + <xsd:group name="EG_LineJoinProperties"> + <xsd:choice> + <xsd:element name="round" type="w:CT_Empty"/> + <xsd:element name="bevel" type="w:CT_Empty"/> + <xsd:element name="miter" type="CT_LineJoinMiterProperties"/> + </xsd:choice> + </xsd:group> + <xsd:simpleType name="ST_PresetCameraType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="legacyObliqueTopLeft"/> + <xsd:enumeration value="legacyObliqueTop"/> + <xsd:enumeration value="legacyObliqueTopRight"/> + <xsd:enumeration value="legacyObliqueLeft"/> + <xsd:enumeration value="legacyObliqueFront"/> + <xsd:enumeration value="legacyObliqueRight"/> + <xsd:enumeration value="legacyObliqueBottomLeft"/> + <xsd:enumeration value="legacyObliqueBottom"/> + <xsd:enumeration value="legacyObliqueBottomRight"/> + <xsd:enumeration value="legacyPerspectiveTopLeft"/> + <xsd:enumeration value="legacyPerspectiveTop"/> + <xsd:enumeration value="legacyPerspectiveTopRight"/> + <xsd:enumeration value="legacyPerspectiveLeft"/> + <xsd:enumeration value="legacyPerspectiveFront"/> + <xsd:enumeration value="legacyPerspectiveRight"/> + <xsd:enumeration value="legacyPerspectiveBottomLeft"/> + <xsd:enumeration value="legacyPerspectiveBottom"/> + <xsd:enumeration value="legacyPerspectiveBottomRight"/> + <xsd:enumeration value="orthographicFront"/> + <xsd:enumeration value="isometricTopUp"/> + <xsd:enumeration value="isometricTopDown"/> + <xsd:enumeration value="isometricBottomUp"/> + <xsd:enumeration value="isometricBottomDown"/> + <xsd:enumeration value="isometricLeftUp"/> + <xsd:enumeration value="isometricLeftDown"/> + <xsd:enumeration value="isometricRightUp"/> + <xsd:enumeration value="isometricRightDown"/> + <xsd:enumeration value="isometricOffAxis1Left"/> + <xsd:enumeration value="isometricOffAxis1Right"/> + <xsd:enumeration value="isometricOffAxis1Top"/> + <xsd:enumeration value="isometricOffAxis2Left"/> + <xsd:enumeration value="isometricOffAxis2Right"/> + <xsd:enumeration value="isometricOffAxis2Top"/> + <xsd:enumeration value="isometricOffAxis3Left"/> + <xsd:enumeration value="isometricOffAxis3Right"/> + <xsd:enumeration value="isometricOffAxis3Bottom"/> + <xsd:enumeration value="isometricOffAxis4Left"/> + <xsd:enumeration value="isometricOffAxis4Right"/> + <xsd:enumeration value="isometricOffAxis4Bottom"/> + <xsd:enumeration value="obliqueTopLeft"/> + <xsd:enumeration value="obliqueTop"/> + <xsd:enumeration value="obliqueTopRight"/> + <xsd:enumeration value="obliqueLeft"/> + <xsd:enumeration value="obliqueRight"/> + <xsd:enumeration value="obliqueBottomLeft"/> + <xsd:enumeration value="obliqueBottom"/> + <xsd:enumeration value="obliqueBottomRight"/> + <xsd:enumeration value="perspectiveFront"/> + <xsd:enumeration value="perspectiveLeft"/> + <xsd:enumeration value="perspectiveRight"/> + <xsd:enumeration value="perspectiveAbove"/> + <xsd:enumeration value="perspectiveBelow"/> + <xsd:enumeration value="perspectiveAboveLeftFacing"/> + <xsd:enumeration value="perspectiveAboveRightFacing"/> + <xsd:enumeration value="perspectiveContrastingLeftFacing"/> + <xsd:enumeration value="perspectiveContrastingRightFacing"/> + <xsd:enumeration value="perspectiveHeroicLeftFacing"/> + <xsd:enumeration value="perspectiveHeroicRightFacing"/> + <xsd:enumeration value="perspectiveHeroicExtremeLeftFacing"/> + <xsd:enumeration value="perspectiveHeroicExtremeRightFacing"/> + <xsd:enumeration value="perspectiveRelaxed"/> + <xsd:enumeration value="perspectiveRelaxedModerately"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Camera"> + <xsd:attribute name="prst" use="required" type="ST_PresetCameraType"/> + </xsd:complexType> + <xsd:complexType name="CT_SphereCoords"> + <xsd:attribute name="lat" type="a:ST_PositiveFixedAngle" use="required"/> + <xsd:attribute name="lon" type="a:ST_PositiveFixedAngle" use="required"/> + <xsd:attribute name="rev" type="a:ST_PositiveFixedAngle" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_LightRigType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="legacyFlat1"/> + <xsd:enumeration value="legacyFlat2"/> + <xsd:enumeration value="legacyFlat3"/> + <xsd:enumeration value="legacyFlat4"/> + <xsd:enumeration value="legacyNormal1"/> + <xsd:enumeration value="legacyNormal2"/> + <xsd:enumeration value="legacyNormal3"/> + <xsd:enumeration value="legacyNormal4"/> + <xsd:enumeration value="legacyHarsh1"/> + <xsd:enumeration value="legacyHarsh2"/> + <xsd:enumeration value="legacyHarsh3"/> + <xsd:enumeration value="legacyHarsh4"/> + <xsd:enumeration value="threePt"/> + <xsd:enumeration value="balanced"/> + <xsd:enumeration value="soft"/> + <xsd:enumeration value="harsh"/> + <xsd:enumeration value="flood"/> + <xsd:enumeration value="contrasting"/> + <xsd:enumeration value="morning"/> + <xsd:enumeration value="sunrise"/> + <xsd:enumeration value="sunset"/> + <xsd:enumeration value="chilly"/> + <xsd:enumeration value="freezing"/> + <xsd:enumeration value="flat"/> + <xsd:enumeration value="twoPt"/> + <xsd:enumeration value="glow"/> + <xsd:enumeration value="brightRoom"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="ST_LightRigDirection"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="tl"/> + <xsd:enumeration value="t"/> + <xsd:enumeration value="tr"/> + <xsd:enumeration value="l"/> + <xsd:enumeration value="r"/> + <xsd:enumeration value="bl"/> + <xsd:enumeration value="b"/> + <xsd:enumeration value="br"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_LightRig"> + <xsd:sequence> + <xsd:element name="rot" type="CT_SphereCoords" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="rig" type="ST_LightRigType" use="required"/> + <xsd:attribute name="dir" type="ST_LightRigDirection" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_BevelPresetType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="relaxedInset"/> + <xsd:enumeration value="circle"/> + <xsd:enumeration value="slope"/> + <xsd:enumeration value="cross"/> + <xsd:enumeration value="angle"/> + <xsd:enumeration value="softRound"/> + <xsd:enumeration value="convex"/> + <xsd:enumeration value="coolSlant"/> + <xsd:enumeration value="divot"/> + <xsd:enumeration value="riblet"/> + <xsd:enumeration value="hardEdge"/> + <xsd:enumeration value="artDeco"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Bevel"> + <xsd:attribute name="w" type="a:ST_PositiveCoordinate" use="optional"/> + <xsd:attribute name="h" type="a:ST_PositiveCoordinate" use="optional"/> + <xsd:attribute name="prst" type="ST_BevelPresetType" use="optional"/> + </xsd:complexType> + <xsd:simpleType name="ST_PresetMaterialType"> + <xsd:restriction base="xsd:token"> + <xsd:enumeration value="legacyMatte"/> + <xsd:enumeration value="legacyPlastic"/> + <xsd:enumeration value="legacyMetal"/> + <xsd:enumeration value="legacyWireframe"/> + <xsd:enumeration value="matte"/> + <xsd:enumeration value="plastic"/> + <xsd:enumeration value="metal"/> + <xsd:enumeration value="warmMatte"/> + <xsd:enumeration value="translucentPowder"/> + <xsd:enumeration value="powder"/> + <xsd:enumeration value="dkEdge"/> + <xsd:enumeration value="softEdge"/> + <xsd:enumeration value="clear"/> + <xsd:enumeration value="flat"/> + <xsd:enumeration value="softmetal"/> + <xsd:enumeration value="none"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Glow"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice"/> + </xsd:sequence> + <xsd:attribute name="rad" use="optional" type="a:ST_PositiveCoordinate"/> + </xsd:complexType> + <xsd:complexType name="CT_Shadow"> + <xsd:sequence> + <xsd:group ref="EG_ColorChoice"/> + </xsd:sequence> + <xsd:attribute name="blurRad" use="optional" type="a:ST_PositiveCoordinate"/> + <xsd:attribute name="dist" use="optional" type="a:ST_PositiveCoordinate"/> + <xsd:attribute name="dir" use="optional" type="a:ST_PositiveFixedAngle"/> + <xsd:attribute name="sx" use="optional" type="a:ST_Percentage"/> + <xsd:attribute name="sy" use="optional" type="a:ST_Percentage"/> + <xsd:attribute name="kx" use="optional" type="a:ST_FixedAngle"/> + <xsd:attribute name="ky" use="optional" type="a:ST_FixedAngle"/> + <xsd:attribute name="algn" use="optional" type="ST_RectAlignment"/> + </xsd:complexType> + <xsd:complexType name="CT_Reflection"> + <xsd:attribute name="blurRad" use="optional" type="a:ST_PositiveCoordinate"/> + <xsd:attribute name="stA" use="optional" type="a:ST_PositiveFixedPercentage"/> + <xsd:attribute name="stPos" use="optional" type="a:ST_PositiveFixedPercentage"/> + <xsd:attribute name="endA" use="optional" type="a:ST_PositiveFixedPercentage"/> + <xsd:attribute name="endPos" use="optional" type="a:ST_PositiveFixedPercentage"/> + <xsd:attribute name="dist" use="optional" type="a:ST_PositiveCoordinate"/> + <xsd:attribute name="dir" use="optional" type="a:ST_PositiveFixedAngle"/> + <xsd:attribute name="fadeDir" use="optional" type="a:ST_PositiveFixedAngle"/> + <xsd:attribute name="sx" use="optional" type="a:ST_Percentage"/> + <xsd:attribute name="sy" use="optional" type="a:ST_Percentage"/> + <xsd:attribute name="kx" use="optional" type="a:ST_FixedAngle"/> + <xsd:attribute name="ky" use="optional" type="a:ST_FixedAngle"/> + <xsd:attribute name="algn" use="optional" type="ST_RectAlignment"/> + </xsd:complexType> + <xsd:complexType name="CT_FillTextEffect"> + <xsd:sequence> + <xsd:group ref="EG_FillProperties" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_TextOutlineEffect"> + <xsd:sequence> + <xsd:group ref="EG_FillProperties" minOccurs="0"/> + <xsd:group ref="EG_LineDashProperties" minOccurs="0"/> + <xsd:group ref="EG_LineJoinProperties" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="w" use="optional" type="a:ST_LineWidth"/> + <xsd:attribute name="cap" use="optional" type="ST_LineCap"/> + <xsd:attribute name="cmpd" use="optional" type="ST_CompoundLine"/> + <xsd:attribute name="algn" use="optional" type="ST_PenAlignment"/> + </xsd:complexType> + <xsd:complexType name="CT_Scene3D"> + <xsd:sequence> + <xsd:element name="camera" type="CT_Camera"/> + <xsd:element name="lightRig" type="CT_LightRig"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_Props3D"> + <xsd:sequence> + <xsd:element name="bevelT" type="CT_Bevel" minOccurs="0"/> + <xsd:element name="bevelB" type="CT_Bevel" minOccurs="0"/> + <xsd:element name="extrusionClr" type="CT_Color" minOccurs="0"/> + <xsd:element name="contourClr" type="CT_Color" minOccurs="0"/> + </xsd:sequence> + <xsd:attribute name="extrusionH" type="a:ST_PositiveCoordinate" use="optional"/> + <xsd:attribute name="contourW" type="a:ST_PositiveCoordinate" use="optional"/> + <xsd:attribute name="prstMaterial" type="ST_PresetMaterialType" use="optional"/> + </xsd:complexType> + <xsd:group name="EG_RPrTextEffects"> + <xsd:sequence> + <xsd:element name="glow" minOccurs="0" type="CT_Glow"/> + <xsd:element name="shadow" minOccurs="0" type="CT_Shadow"/> + <xsd:element name="reflection" minOccurs="0" type="CT_Reflection"/> + <xsd:element name="textOutline" minOccurs="0" type="CT_TextOutlineEffect"/> + <xsd:element name="textFill" minOccurs="0" type="CT_FillTextEffect"/> + <xsd:element name="scene3d" minOccurs="0" type="CT_Scene3D"/> + <xsd:element name="props3d" minOccurs="0" type="CT_Props3D"/> + </xsd:sequence> + </xsd:group> + <xsd:simpleType name="ST_Ligatures"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="none"/> + <xsd:enumeration value="standard"/> + <xsd:enumeration value="contextual"/> + <xsd:enumeration value="historical"/> + <xsd:enumeration value="discretional"/> + <xsd:enumeration value="standardContextual"/> + <xsd:enumeration value="standardHistorical"/> + <xsd:enumeration value="contextualHistorical"/> + <xsd:enumeration value="standardDiscretional"/> + <xsd:enumeration value="contextualDiscretional"/> + <xsd:enumeration value="historicalDiscretional"/> + <xsd:enumeration value="standardContextualHistorical"/> + <xsd:enumeration value="standardContextualDiscretional"/> + <xsd:enumeration value="standardHistoricalDiscretional"/> + <xsd:enumeration value="contextualHistoricalDiscretional"/> + <xsd:enumeration value="all"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Ligatures"> + <xsd:attribute name="val" type="ST_Ligatures" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_NumForm"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="default"/> + <xsd:enumeration value="lining"/> + <xsd:enumeration value="oldStyle"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_NumForm"> + <xsd:attribute name="val" type="ST_NumForm" use="required"/> + </xsd:complexType> + <xsd:simpleType name="ST_NumSpacing"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="default"/> + <xsd:enumeration value="proportional"/> + <xsd:enumeration value="tabular"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_NumSpacing"> + <xsd:attribute name="val" type="ST_NumSpacing" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_StyleSet"> + <xsd:attribute name="id" type="s:ST_UnsignedDecimalNumber" use="required"/> + <xsd:attribute name="val" type="ST_OnOff" use="optional"/> + </xsd:complexType> + <xsd:complexType name="CT_StylisticSets"> + <xsd:sequence minOccurs="0"> + <xsd:element name="styleSet" minOccurs="0" maxOccurs="unbounded" type="CT_StyleSet"/> + </xsd:sequence> + </xsd:complexType> + <xsd:group name="EG_RPrOpenType"> + <xsd:sequence> + <xsd:element name="ligatures" minOccurs="0" type="CT_Ligatures"/> + <xsd:element name="numForm" minOccurs="0" type="CT_NumForm"/> + <xsd:element name="numSpacing" minOccurs="0" type="CT_NumSpacing"/> + <xsd:element name="stylisticSets" minOccurs="0" type="CT_StylisticSets"/> + <xsd:element name="cntxtAlts" minOccurs="0" type="CT_OnOff"/> + </xsd:sequence> + </xsd:group> + <xsd:element name="discardImageEditingData" type="CT_OnOff"/> + <xsd:element name="defaultImageDpi" type="CT_DefaultImageDpi"/> + <xsd:complexType name="CT_DefaultImageDpi"> + <xsd:attribute name="val" type="w:ST_DecimalNumber" use="required"/> + </xsd:complexType> + <xsd:element name="entityPicker" type="w:CT_Empty"/> + <xsd:complexType name="CT_SdtCheckboxSymbol"> + <xsd:attribute name="font" type="s:ST_String"/> + <xsd:attribute name="val" type="w:ST_ShortHexNumber"/> + </xsd:complexType> + <xsd:complexType name="CT_SdtCheckbox"> + <xsd:sequence> + <xsd:element name="checked" type="CT_OnOff" minOccurs="0"/> + <xsd:element name="checkedState" type="CT_SdtCheckboxSymbol" minOccurs="0"/> + <xsd:element name="uncheckedState" type="CT_SdtCheckboxSymbol" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="checkbox" type="CT_SdtCheckbox"/> + </xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd b/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd new file mode 100644 index 0000000..6b00755 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd @@ -0,0 +1,67 @@ + <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:w12="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all" xmlns="http://schemas.microsoft.com/office/word/2012/wordml" targetNamespace="http://schemas.microsoft.com/office/word/2012/wordml"> + <xsd:import id="w12" namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main" schemaLocation="../ISO-IEC29500-4_2016/wml.xsd"/> + <xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" schemaLocation="../ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd"/> + <xsd:element name="color" type="w12:CT_Color"/> + <xsd:simpleType name="ST_SdtAppearance"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="boundingBox"/> + <xsd:enumeration value="tags"/> + <xsd:enumeration value="hidden"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:element name="dataBinding" type="w12:CT_DataBinding"/> + <xsd:complexType name="CT_SdtAppearance"> + <xsd:attribute name="val" type="ST_SdtAppearance"/> + </xsd:complexType> + <xsd:element name="appearance" type="CT_SdtAppearance"/> + <xsd:complexType name="CT_CommentsEx"> + <xsd:sequence> + <xsd:element name="commentEx" type="CT_CommentEx" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_CommentEx"> + <xsd:attribute name="paraId" type="w12:ST_LongHexNumber" use="required"/> + <xsd:attribute name="paraIdParent" type="w12:ST_LongHexNumber" use="optional"/> + <xsd:attribute name="done" type="s:ST_OnOff" use="optional"/> + </xsd:complexType> + <xsd:element name="commentsEx" type="CT_CommentsEx"/> + <xsd:complexType name="CT_People"> + <xsd:sequence> + <xsd:element name="person" type="CT_Person" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_PresenceInfo"> + <xsd:attribute name="providerId" type="xsd:string" use="required"/> + <xsd:attribute name="userId" type="xsd:string" use="required"/> + </xsd:complexType> + <xsd:complexType name="CT_Person"> + <xsd:sequence> + <xsd:element name="presenceInfo" type="CT_PresenceInfo" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="author" type="s:ST_String" use="required"/> + </xsd:complexType> + <xsd:element name="people" type="CT_People"/> + <xsd:complexType name="CT_SdtRepeatedSection"> + <xsd:sequence> + <xsd:element name="sectionTitle" type="w12:CT_String" minOccurs="0"/> + <xsd:element name="doNotAllowInsertDeleteSection" type="w12:CT_OnOff" minOccurs="0"/> + </xsd:sequence> + </xsd:complexType> + <xsd:simpleType name="ST_Guid"> + <xsd:restriction base="xsd:token"> + <xsd:pattern value="\{[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\}"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:complexType name="CT_Guid"> + <xsd:attribute name="val" type="ST_Guid"/> + </xsd:complexType> + <xsd:element name="repeatingSection" type="CT_SdtRepeatedSection"/> + <xsd:element name="repeatingSectionItem" type="w12:CT_Empty"/> + <xsd:element name="chartTrackingRefBased" type="w12:CT_OnOff"/> + <xsd:element name="collapsed" type="w12:CT_OnOff"/> + <xsd:element name="docId" type="CT_Guid"/> + <xsd:element name="footnoteColumns" type="w12:CT_DecimalNumber"/> + <xsd:element name="webExtensionLinked" type="w12:CT_OnOff"/> + <xsd:element name="webExtensionCreated" type="w12:CT_OnOff"/> + <xsd:attribute name="restartNumberingAfterBreak" type="s:ST_OnOff"/> + </xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd b/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd new file mode 100644 index 0000000..f321d33 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd @@ -0,0 +1,14 @@ + <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:w12="http://schemas.openxmlformats.org/wordprocessingml/2006/main" elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all" xmlns="http://schemas.microsoft.com/office/word/2018/wordml" targetNamespace="http://schemas.microsoft.com/office/word/2018/wordml"> + <xsd:import id="w12" namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main" schemaLocation="../ISO-IEC29500-4_2016/wml.xsd"/> + <xsd:complexType name="CT_Extension"> + <xsd:sequence> + <xsd:any processContents="lax"/> + </xsd:sequence> + <xsd:attribute name="uri" type="xsd:token"/> + </xsd:complexType> + <xsd:complexType name="CT_ExtensionList"> + <xsd:sequence> + <xsd:element name="ext" type="CT_Extension" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + </xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd b/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd new file mode 100644 index 0000000..364c6a9 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd @@ -0,0 +1,20 @@ + <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml" elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all" xmlns="http://schemas.microsoft.com/office/word/2018/wordml/cex" targetNamespace="http://schemas.microsoft.com/office/word/2018/wordml/cex"> + <xsd:import id="w16" namespace="http://schemas.microsoft.com/office/word/2018/wordml" schemaLocation="wml-2018.xsd"/> + <xsd:import id="w" namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main" schemaLocation="../ISO-IEC29500-4_2016/wml.xsd"/> + <xsd:import id="s" namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" schemaLocation="../ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd"/> + <xsd:complexType name="CT_CommentsExtensible"> + <xsd:sequence> + <xsd:element name="commentExtensible" type="CT_CommentExtensible" minOccurs="0" maxOccurs="unbounded"/> + <xsd:element name="extLst" type="w16:CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_CommentExtensible"> + <xsd:sequence> + <xsd:element name="extLst" type="w16:CT_ExtensionList" minOccurs="0" maxOccurs="1"/> + </xsd:sequence> + <xsd:attribute name="durableId" type="w:ST_LongHexNumber" use="required"/> + <xsd:attribute name="dateUtc" type="w:ST_DateTime" use="optional"/> + <xsd:attribute name="intelligentPlaceholder" type="s:ST_OnOff" use="optional"/> + </xsd:complexType> + <xsd:element name="commentsExtensible" type="CT_CommentsExtensible"/> + </xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd b/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd new file mode 100644 index 0000000..fed9d15 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd @@ -0,0 +1,13 @@ + <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:w12="http://schemas.openxmlformats.org/wordprocessingml/2006/main" elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all" xmlns="http://schemas.microsoft.com/office/word/2016/wordml/cid" targetNamespace="http://schemas.microsoft.com/office/word/2016/wordml/cid"> + <xsd:import id="w12" namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main" schemaLocation="../ISO-IEC29500-4_2016/wml.xsd"/> + <xsd:complexType name="CT_CommentsIds"> + <xsd:sequence> + <xsd:element name="commentId" type="CT_CommentId" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="CT_CommentId"> + <xsd:attribute name="paraId" type="w12:ST_LongHexNumber" use="required"/> + <xsd:attribute name="durableId" type="w12:ST_LongHexNumber" use="required"/> + </xsd:complexType> + <xsd:element name="commentsIds" type="CT_CommentsIds"/> + </xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd b/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd new file mode 100644 index 0000000..680cf15 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd @@ -0,0 +1,4 @@ + <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:w12="http://schemas.openxmlformats.org/wordprocessingml/2006/main" elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all" xmlns="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash" targetNamespace="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash"> + <xsd:import id="w12" namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main" schemaLocation="../ISO-IEC29500-4_2016/wml.xsd"/> + <xsd:attribute name="storeItemChecksum" type="w12:ST_String"/> + </xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd b/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd new file mode 100644 index 0000000..89ada90 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd @@ -0,0 +1,8 @@ + <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:w12="http://schemas.openxmlformats.org/wordprocessingml/2006/main" elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all" xmlns="http://schemas.microsoft.com/office/word/2015/wordml/symex" targetNamespace="http://schemas.microsoft.com/office/word/2015/wordml/symex"> + <xsd:import id="w12" namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main" schemaLocation="../ISO-IEC29500-4_2016/wml.xsd"/> + <xsd:complexType name="CT_SymEx"> + <xsd:attribute name="font" type="w12:ST_String"/> + <xsd:attribute name="char" type="w12:ST_LongHexNumber"/> + </xsd:complexType> + <xsd:element name="symEx" type="CT_SymEx"/> + </xsd:schema> diff --git a/.claude/skills/xlsx/scripts/office/soffice.py b/.claude/skills/xlsx/scripts/office/soffice.py new file mode 100644 index 0000000..c7f7e32 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/soffice.py @@ -0,0 +1,183 @@ +""" +Helper for running LibreOffice (soffice) in environments where AF_UNIX +sockets may be blocked (e.g., sandboxed VMs). Detects the restriction +at runtime and applies an LD_PRELOAD shim if needed. + +Usage: + from office.soffice import run_soffice, get_soffice_env + + # Option 1 – run soffice directly + result = run_soffice(["--headless", "--convert-to", "pdf", "input.docx"]) + + # Option 2 – get env dict for your own subprocess calls + env = get_soffice_env() + subprocess.run(["soffice", ...], env=env) +""" + +import os +import socket +import subprocess +import tempfile +from pathlib import Path + + +def get_soffice_env() -> dict: + env = os.environ.copy() + env["SAL_USE_VCLPLUGIN"] = "svp" + + if _needs_shim(): + shim = _ensure_shim() + env["LD_PRELOAD"] = str(shim) + + return env + + +def run_soffice(args: list[str], **kwargs) -> subprocess.CompletedProcess: + env = get_soffice_env() + return subprocess.run(["soffice"] + args, env=env, **kwargs) + + + +_SHIM_SO = Path(tempfile.gettempdir()) / "lo_socket_shim.so" + + +def _needs_shim() -> bool: + try: + s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + s.close() + return False + except OSError: + return True + + +def _ensure_shim() -> Path: + if _SHIM_SO.exists(): + return _SHIM_SO + + src = Path(tempfile.gettempdir()) / "lo_socket_shim.c" + src.write_text(_SHIM_SOURCE) + subprocess.run( + ["gcc", "-shared", "-fPIC", "-o", str(_SHIM_SO), str(src), "-ldl"], + check=True, + capture_output=True, + ) + src.unlink() + return _SHIM_SO + + + +_SHIM_SOURCE = r""" +#define _GNU_SOURCE +#include <dlfcn.h> +#include <errno.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/socket.h> +#include <unistd.h> + +static int (*real_socket)(int, int, int); +static int (*real_socketpair)(int, int, int, int[2]); +static int (*real_listen)(int, int); +static int (*real_accept)(int, struct sockaddr *, socklen_t *); +static int (*real_close)(int); +static int (*real_read)(int, void *, size_t); + +/* Per-FD bookkeeping (FDs >= 1024 are passed through unshimmed). */ +static int is_shimmed[1024]; +static int peer_of[1024]; +static int wake_r[1024]; /* accept() blocks reading this */ +static int wake_w[1024]; /* close() writes to this */ +static int listener_fd = -1; /* FD that received listen() */ + +__attribute__((constructor)) +static void init(void) { + real_socket = dlsym(RTLD_NEXT, "socket"); + real_socketpair = dlsym(RTLD_NEXT, "socketpair"); + real_listen = dlsym(RTLD_NEXT, "listen"); + real_accept = dlsym(RTLD_NEXT, "accept"); + real_close = dlsym(RTLD_NEXT, "close"); + real_read = dlsym(RTLD_NEXT, "read"); + for (int i = 0; i < 1024; i++) { + peer_of[i] = -1; + wake_r[i] = -1; + wake_w[i] = -1; + } +} + +/* ---- socket ---------------------------------------------------------- */ +int socket(int domain, int type, int protocol) { + if (domain == AF_UNIX) { + int fd = real_socket(domain, type, protocol); + if (fd >= 0) return fd; + /* socket(AF_UNIX) blocked – fall back to socketpair(). */ + int sv[2]; + if (real_socketpair(domain, type, protocol, sv) == 0) { + if (sv[0] >= 0 && sv[0] < 1024) { + is_shimmed[sv[0]] = 1; + peer_of[sv[0]] = sv[1]; + int wp[2]; + if (pipe(wp) == 0) { + wake_r[sv[0]] = wp[0]; + wake_w[sv[0]] = wp[1]; + } + } + return sv[0]; + } + errno = EPERM; + return -1; + } + return real_socket(domain, type, protocol); +} + +/* ---- listen ---------------------------------------------------------- */ +int listen(int sockfd, int backlog) { + if (sockfd >= 0 && sockfd < 1024 && is_shimmed[sockfd]) { + listener_fd = sockfd; + return 0; + } + return real_listen(sockfd, backlog); +} + +/* ---- accept ---------------------------------------------------------- */ +int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) { + if (sockfd >= 0 && sockfd < 1024 && is_shimmed[sockfd]) { + /* Block until close() writes to the wake pipe. */ + if (wake_r[sockfd] >= 0) { + char buf; + real_read(wake_r[sockfd], &buf, 1); + } + errno = ECONNABORTED; + return -1; + } + return real_accept(sockfd, addr, addrlen); +} + +/* ---- close ----------------------------------------------------------- */ +int close(int fd) { + if (fd >= 0 && fd < 1024 && is_shimmed[fd]) { + int was_listener = (fd == listener_fd); + is_shimmed[fd] = 0; + + if (wake_w[fd] >= 0) { /* unblock accept() */ + char c = 0; + write(wake_w[fd], &c, 1); + real_close(wake_w[fd]); + wake_w[fd] = -1; + } + if (wake_r[fd] >= 0) { real_close(wake_r[fd]); wake_r[fd] = -1; } + if (peer_of[fd] >= 0) { real_close(peer_of[fd]); peer_of[fd] = -1; } + + if (was_listener) + _exit(0); /* conversion done – exit */ + } + return real_close(fd); +} +""" + + + +if __name__ == "__main__": + import sys + result = run_soffice(sys.argv[1:]) + sys.exit(result.returncode) diff --git a/.claude/skills/xlsx/scripts/office/unpack.py b/.claude/skills/xlsx/scripts/office/unpack.py new file mode 100644 index 0000000..0015253 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/unpack.py @@ -0,0 +1,132 @@ +"""Unpack Office files (DOCX, PPTX, XLSX) for editing. + +Extracts the ZIP archive, pretty-prints XML files, and optionally: +- Merges adjacent runs with identical formatting (DOCX only) +- Simplifies adjacent tracked changes from same author (DOCX only) + +Usage: + python unpack.py <office_file> <output_dir> [options] + +Examples: + python unpack.py document.docx unpacked/ + python unpack.py presentation.pptx unpacked/ + python unpack.py document.docx unpacked/ --merge-runs false +""" + +import argparse +import sys +import zipfile +from pathlib import Path + +import defusedxml.minidom + +from helpers.merge_runs import merge_runs as do_merge_runs +from helpers.simplify_redlines import simplify_redlines as do_simplify_redlines + +SMART_QUOTE_REPLACEMENTS = { + "\u201c": "“", + "\u201d": "”", + "\u2018": "‘", + "\u2019": "’", +} + + +def unpack( + input_file: str, + output_directory: str, + merge_runs: bool = True, + simplify_redlines: bool = True, +) -> tuple[None, str]: + input_path = Path(input_file) + output_path = Path(output_directory) + suffix = input_path.suffix.lower() + + if not input_path.exists(): + return None, f"Error: {input_file} does not exist" + + if suffix not in {".docx", ".pptx", ".xlsx"}: + return None, f"Error: {input_file} must be a .docx, .pptx, or .xlsx file" + + try: + output_path.mkdir(parents=True, exist_ok=True) + + with zipfile.ZipFile(input_path, "r") as zf: + zf.extractall(output_path) + + xml_files = list(output_path.rglob("*.xml")) + list(output_path.rglob("*.rels")) + for xml_file in xml_files: + _pretty_print_xml(xml_file) + + message = f"Unpacked {input_file} ({len(xml_files)} XML files)" + + if suffix == ".docx": + if simplify_redlines: + simplify_count, _ = do_simplify_redlines(str(output_path)) + message += f", simplified {simplify_count} tracked changes" + + if merge_runs: + merge_count, _ = do_merge_runs(str(output_path)) + message += f", merged {merge_count} runs" + + for xml_file in xml_files: + _escape_smart_quotes(xml_file) + + return None, message + + except zipfile.BadZipFile: + return None, f"Error: {input_file} is not a valid Office file" + except Exception as e: + return None, f"Error unpacking: {e}" + + +def _pretty_print_xml(xml_file: Path) -> None: + try: + content = xml_file.read_text(encoding="utf-8") + dom = defusedxml.minidom.parseString(content) + xml_file.write_bytes(dom.toprettyxml(indent=" ", encoding="utf-8")) + except Exception: + pass + + +def _escape_smart_quotes(xml_file: Path) -> None: + try: + content = xml_file.read_text(encoding="utf-8") + for char, entity in SMART_QUOTE_REPLACEMENTS.items(): + content = content.replace(char, entity) + xml_file.write_text(content, encoding="utf-8") + except Exception: + pass + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Unpack an Office file (DOCX, PPTX, XLSX) for editing" + ) + parser.add_argument("input_file", help="Office file to unpack") + parser.add_argument("output_directory", help="Output directory") + parser.add_argument( + "--merge-runs", + type=lambda x: x.lower() == "true", + default=True, + metavar="true|false", + help="Merge adjacent runs with identical formatting (DOCX only, default: true)", + ) + parser.add_argument( + "--simplify-redlines", + type=lambda x: x.lower() == "true", + default=True, + metavar="true|false", + help="Merge adjacent tracked changes from same author (DOCX only, default: true)", + ) + args = parser.parse_args() + + _, message = unpack( + args.input_file, + args.output_directory, + merge_runs=args.merge_runs, + simplify_redlines=args.simplify_redlines, + ) + print(message) + + if "Error" in message: + sys.exit(1) diff --git a/.claude/skills/xlsx/scripts/office/validate.py b/.claude/skills/xlsx/scripts/office/validate.py new file mode 100644 index 0000000..03b01f6 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/validate.py @@ -0,0 +1,111 @@ +""" +Command line tool to validate Office document XML files against XSD schemas and tracked changes. + +Usage: + python validate.py <path> [--original <original_file>] [--auto-repair] [--author NAME] + +The first argument can be either: +- An unpacked directory containing the Office document XML files +- A packed Office file (.docx/.pptx/.xlsx) which will be unpacked to a temp directory + +Auto-repair fixes: +- paraId/durableId values that exceed OOXML limits +- Missing xml:space="preserve" on w:t elements with whitespace +""" + +import argparse +import sys +import tempfile +import zipfile +from pathlib import Path + +from validators import DOCXSchemaValidator, PPTXSchemaValidator, RedliningValidator + + +def main(): + parser = argparse.ArgumentParser(description="Validate Office document XML files") + parser.add_argument( + "path", + help="Path to unpacked directory or packed Office file (.docx/.pptx/.xlsx)", + ) + parser.add_argument( + "--original", + required=False, + default=None, + help="Path to original file (.docx/.pptx/.xlsx). If omitted, all XSD errors are reported and redlining validation is skipped.", + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + help="Enable verbose output", + ) + parser.add_argument( + "--auto-repair", + action="store_true", + help="Automatically repair common issues (hex IDs, whitespace preservation)", + ) + parser.add_argument( + "--author", + default="Claude", + help="Author name for redlining validation (default: Claude)", + ) + args = parser.parse_args() + + path = Path(args.path) + assert path.exists(), f"Error: {path} does not exist" + + original_file = None + if args.original: + original_file = Path(args.original) + assert original_file.is_file(), f"Error: {original_file} is not a file" + assert original_file.suffix.lower() in [".docx", ".pptx", ".xlsx"], ( + f"Error: {original_file} must be a .docx, .pptx, or .xlsx file" + ) + + file_extension = (original_file or path).suffix.lower() + assert file_extension in [".docx", ".pptx", ".xlsx"], ( + f"Error: Cannot determine file type from {path}. Use --original or provide a .docx/.pptx/.xlsx file." + ) + + if path.is_file() and path.suffix.lower() in [".docx", ".pptx", ".xlsx"]: + temp_dir = tempfile.mkdtemp() + with zipfile.ZipFile(path, "r") as zf: + zf.extractall(temp_dir) + unpacked_dir = Path(temp_dir) + else: + assert path.is_dir(), f"Error: {path} is not a directory or Office file" + unpacked_dir = path + + match file_extension: + case ".docx": + validators = [ + DOCXSchemaValidator(unpacked_dir, original_file, verbose=args.verbose), + ] + if original_file: + validators.append( + RedliningValidator(unpacked_dir, original_file, verbose=args.verbose, author=args.author) + ) + case ".pptx": + validators = [ + PPTXSchemaValidator(unpacked_dir, original_file, verbose=args.verbose), + ] + case _: + print(f"Error: Validation not supported for file type {file_extension}") + sys.exit(1) + + if args.auto_repair: + total_repairs = sum(v.repair() for v in validators) + if total_repairs: + print(f"Auto-repaired {total_repairs} issue(s)") + + success = all(v.validate() for v in validators) + + if success: + print("All validations PASSED!") + + sys.exit(0 if success else 1) + + +if __name__ == "__main__": + main() diff --git a/.claude/skills/xlsx/scripts/office/validators/__init__.py b/.claude/skills/xlsx/scripts/office/validators/__init__.py new file mode 100644 index 0000000..db092ec --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/validators/__init__.py @@ -0,0 +1,15 @@ +""" +Validation modules for Word document processing. +""" + +from .base import BaseSchemaValidator +from .docx import DOCXSchemaValidator +from .pptx import PPTXSchemaValidator +from .redlining import RedliningValidator + +__all__ = [ + "BaseSchemaValidator", + "DOCXSchemaValidator", + "PPTXSchemaValidator", + "RedliningValidator", +] diff --git a/.claude/skills/xlsx/scripts/office/validators/base.py b/.claude/skills/xlsx/scripts/office/validators/base.py new file mode 100644 index 0000000..db4a06a --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/validators/base.py @@ -0,0 +1,847 @@ +""" +Base validator with common validation logic for document files. +""" + +import re +from pathlib import Path + +import defusedxml.minidom +import lxml.etree + + +class BaseSchemaValidator: + + IGNORED_VALIDATION_ERRORS = [ + "hyphenationZone", + "purl.org/dc/terms", + ] + + UNIQUE_ID_REQUIREMENTS = { + "comment": ("id", "file"), + "commentrangestart": ("id", "file"), + "commentrangeend": ("id", "file"), + "bookmarkstart": ("id", "file"), + "bookmarkend": ("id", "file"), + "sldid": ("id", "file"), + "sldmasterid": ("id", "global"), + "sldlayoutid": ("id", "global"), + "cm": ("authorid", "file"), + "sheet": ("sheetid", "file"), + "definedname": ("id", "file"), + "cxnsp": ("id", "file"), + "sp": ("id", "file"), + "pic": ("id", "file"), + "grpsp": ("id", "file"), + } + + EXCLUDED_ID_CONTAINERS = { + "sectionlst", + } + + ELEMENT_RELATIONSHIP_TYPES = {} + + SCHEMA_MAPPINGS = { + "word": "ISO-IEC29500-4_2016/wml.xsd", + "ppt": "ISO-IEC29500-4_2016/pml.xsd", + "xl": "ISO-IEC29500-4_2016/sml.xsd", + "[Content_Types].xml": "ecma/fouth-edition/opc-contentTypes.xsd", + "app.xml": "ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd", + "core.xml": "ecma/fouth-edition/opc-coreProperties.xsd", + "custom.xml": "ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd", + ".rels": "ecma/fouth-edition/opc-relationships.xsd", + "people.xml": "microsoft/wml-2012.xsd", + "commentsIds.xml": "microsoft/wml-cid-2016.xsd", + "commentsExtensible.xml": "microsoft/wml-cex-2018.xsd", + "commentsExtended.xml": "microsoft/wml-2012.xsd", + "chart": "ISO-IEC29500-4_2016/dml-chart.xsd", + "theme": "ISO-IEC29500-4_2016/dml-main.xsd", + "drawing": "ISO-IEC29500-4_2016/dml-main.xsd", + } + + MC_NAMESPACE = "http://schemas.openxmlformats.org/markup-compatibility/2006" + XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace" + + PACKAGE_RELATIONSHIPS_NAMESPACE = ( + "http://schemas.openxmlformats.org/package/2006/relationships" + ) + OFFICE_RELATIONSHIPS_NAMESPACE = ( + "http://schemas.openxmlformats.org/officeDocument/2006/relationships" + ) + CONTENT_TYPES_NAMESPACE = ( + "http://schemas.openxmlformats.org/package/2006/content-types" + ) + + MAIN_CONTENT_FOLDERS = {"word", "ppt", "xl"} + + OOXML_NAMESPACES = { + "http://schemas.openxmlformats.org/officeDocument/2006/math", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships", + "http://schemas.openxmlformats.org/schemaLibrary/2006/main", + "http://schemas.openxmlformats.org/drawingml/2006/main", + "http://schemas.openxmlformats.org/drawingml/2006/chart", + "http://schemas.openxmlformats.org/drawingml/2006/chartDrawing", + "http://schemas.openxmlformats.org/drawingml/2006/diagram", + "http://schemas.openxmlformats.org/drawingml/2006/picture", + "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing", + "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing", + "http://schemas.openxmlformats.org/wordprocessingml/2006/main", + "http://schemas.openxmlformats.org/presentationml/2006/main", + "http://schemas.openxmlformats.org/spreadsheetml/2006/main", + "http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes", + "http://www.w3.org/XML/1998/namespace", + } + + def __init__(self, unpacked_dir, original_file=None, verbose=False): + self.unpacked_dir = Path(unpacked_dir).resolve() + self.original_file = Path(original_file) if original_file else None + self.verbose = verbose + + self.schemas_dir = Path(__file__).parent.parent / "schemas" + + patterns = ["*.xml", "*.rels"] + self.xml_files = [ + f for pattern in patterns for f in self.unpacked_dir.rglob(pattern) + ] + + if not self.xml_files: + print(f"Warning: No XML files found in {self.unpacked_dir}") + + def validate(self): + raise NotImplementedError("Subclasses must implement the validate method") + + def repair(self) -> int: + return self.repair_whitespace_preservation() + + def repair_whitespace_preservation(self) -> int: + repairs = 0 + + for xml_file in self.xml_files: + try: + content = xml_file.read_text(encoding="utf-8") + dom = defusedxml.minidom.parseString(content) + modified = False + + for elem in dom.getElementsByTagName("*"): + if elem.tagName.endswith(":t") and elem.firstChild: + text = elem.firstChild.nodeValue + if text and (text.startswith((' ', '\t')) or text.endswith((' ', '\t'))): + if elem.getAttribute("xml:space") != "preserve": + elem.setAttribute("xml:space", "preserve") + text_preview = repr(text[:30]) + "..." if len(text) > 30 else repr(text) + print(f" Repaired: {xml_file.name}: Added xml:space='preserve' to {elem.tagName}: {text_preview}") + repairs += 1 + modified = True + + if modified: + xml_file.write_bytes(dom.toxml(encoding="UTF-8")) + + except Exception: + pass + + return repairs + + def validate_xml(self): + errors = [] + + for xml_file in self.xml_files: + try: + lxml.etree.parse(str(xml_file)) + except lxml.etree.XMLSyntaxError as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {e.lineno}: {e.msg}" + ) + except Exception as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Unexpected error: {str(e)}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} XML violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All XML files are well-formed") + return True + + def validate_namespaces(self): + errors = [] + + for xml_file in self.xml_files: + try: + root = lxml.etree.parse(str(xml_file)).getroot() + declared = set(root.nsmap.keys()) - {None} + + for attr_val in [ + v for k, v in root.attrib.items() if k.endswith("Ignorable") + ]: + undeclared = set(attr_val.split()) - declared + errors.extend( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Namespace '{ns}' in Ignorable but not declared" + for ns in undeclared + ) + except lxml.etree.XMLSyntaxError: + continue + + if errors: + print(f"FAILED - {len(errors)} namespace issues:") + for error in errors: + print(error) + return False + if self.verbose: + print("PASSED - All namespace prefixes properly declared") + return True + + def validate_unique_ids(self): + errors = [] + global_ids = {} + + for xml_file in self.xml_files: + try: + root = lxml.etree.parse(str(xml_file)).getroot() + file_ids = {} + + mc_elements = root.xpath( + ".//mc:AlternateContent", namespaces={"mc": self.MC_NAMESPACE} + ) + for elem in mc_elements: + elem.getparent().remove(elem) + + for elem in root.iter(): + tag = ( + elem.tag.split("}")[-1].lower() + if "}" in elem.tag + else elem.tag.lower() + ) + + if tag in self.UNIQUE_ID_REQUIREMENTS: + in_excluded_container = any( + ancestor.tag.split("}")[-1].lower() in self.EXCLUDED_ID_CONTAINERS + for ancestor in elem.iterancestors() + ) + if in_excluded_container: + continue + + attr_name, scope = self.UNIQUE_ID_REQUIREMENTS[tag] + + id_value = None + for attr, value in elem.attrib.items(): + attr_local = ( + attr.split("}")[-1].lower() + if "}" in attr + else attr.lower() + ) + if attr_local == attr_name: + id_value = value + break + + if id_value is not None: + if scope == "global": + if id_value in global_ids: + prev_file, prev_line, prev_tag = global_ids[ + id_value + ] + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {elem.sourceline}: Global ID '{id_value}' in <{tag}> " + f"already used in {prev_file} at line {prev_line} in <{prev_tag}>" + ) + else: + global_ids[id_value] = ( + xml_file.relative_to(self.unpacked_dir), + elem.sourceline, + tag, + ) + elif scope == "file": + key = (tag, attr_name) + if key not in file_ids: + file_ids[key] = {} + + if id_value in file_ids[key]: + prev_line = file_ids[key][id_value] + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {elem.sourceline}: Duplicate {attr_name}='{id_value}' in <{tag}> " + f"(first occurrence at line {prev_line})" + ) + else: + file_ids[key][id_value] = elem.sourceline + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} ID uniqueness violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All required IDs are unique") + return True + + def validate_file_references(self): + errors = [] + + rels_files = list(self.unpacked_dir.rglob("*.rels")) + + if not rels_files: + if self.verbose: + print("PASSED - No .rels files found") + return True + + all_files = [] + for file_path in self.unpacked_dir.rglob("*"): + if ( + file_path.is_file() + and file_path.name != "[Content_Types].xml" + and not file_path.name.endswith(".rels") + ): + all_files.append(file_path.resolve()) + + all_referenced_files = set() + + if self.verbose: + print( + f"Found {len(rels_files)} .rels files and {len(all_files)} target files" + ) + + for rels_file in rels_files: + try: + rels_root = lxml.etree.parse(str(rels_file)).getroot() + + rels_dir = rels_file.parent + + referenced_files = set() + broken_refs = [] + + for rel in rels_root.findall( + ".//ns:Relationship", + namespaces={"ns": self.PACKAGE_RELATIONSHIPS_NAMESPACE}, + ): + target = rel.get("Target") + if target and not target.startswith( + ("http", "mailto:") + ): + if target.startswith("/"): + target_path = self.unpacked_dir / target.lstrip("/") + elif rels_file.name == ".rels": + target_path = self.unpacked_dir / target + else: + base_dir = rels_dir.parent + target_path = base_dir / target + + try: + target_path = target_path.resolve() + if target_path.exists() and target_path.is_file(): + referenced_files.add(target_path) + all_referenced_files.add(target_path) + else: + broken_refs.append((target, rel.sourceline)) + except (OSError, ValueError): + broken_refs.append((target, rel.sourceline)) + + if broken_refs: + rel_path = rels_file.relative_to(self.unpacked_dir) + for broken_ref, line_num in broken_refs: + errors.append( + f" {rel_path}: Line {line_num}: Broken reference to {broken_ref}" + ) + + except Exception as e: + rel_path = rels_file.relative_to(self.unpacked_dir) + errors.append(f" Error parsing {rel_path}: {e}") + + unreferenced_files = set(all_files) - all_referenced_files + + if unreferenced_files: + for unref_file in sorted(unreferenced_files): + unref_rel_path = unref_file.relative_to(self.unpacked_dir) + errors.append(f" Unreferenced file: {unref_rel_path}") + + if errors: + print(f"FAILED - Found {len(errors)} relationship validation errors:") + for error in errors: + print(error) + print( + "CRITICAL: These errors will cause the document to appear corrupt. " + + "Broken references MUST be fixed, " + + "and unreferenced files MUST be referenced or removed." + ) + return False + else: + if self.verbose: + print( + "PASSED - All references are valid and all files are properly referenced" + ) + return True + + def validate_all_relationship_ids(self): + import lxml.etree + + errors = [] + + for xml_file in self.xml_files: + if xml_file.suffix == ".rels": + continue + + rels_dir = xml_file.parent / "_rels" + rels_file = rels_dir / f"{xml_file.name}.rels" + + if not rels_file.exists(): + continue + + try: + rels_root = lxml.etree.parse(str(rels_file)).getroot() + rid_to_type = {} + + for rel in rels_root.findall( + f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship" + ): + rid = rel.get("Id") + rel_type = rel.get("Type", "") + if rid: + if rid in rid_to_type: + rels_rel_path = rels_file.relative_to(self.unpacked_dir) + errors.append( + f" {rels_rel_path}: Line {rel.sourceline}: " + f"Duplicate relationship ID '{rid}' (IDs must be unique)" + ) + type_name = ( + rel_type.split("/")[-1] if "/" in rel_type else rel_type + ) + rid_to_type[rid] = type_name + + xml_root = lxml.etree.parse(str(xml_file)).getroot() + + r_ns = self.OFFICE_RELATIONSHIPS_NAMESPACE + rid_attrs_to_check = ["id", "embed", "link"] + for elem in xml_root.iter(): + for attr_name in rid_attrs_to_check: + rid_attr = elem.get(f"{{{r_ns}}}{attr_name}") + if not rid_attr: + continue + xml_rel_path = xml_file.relative_to(self.unpacked_dir) + elem_name = ( + elem.tag.split("}")[-1] if "}" in elem.tag else elem.tag + ) + + if rid_attr not in rid_to_type: + errors.append( + f" {xml_rel_path}: Line {elem.sourceline}: " + f"<{elem_name}> r:{attr_name} references non-existent relationship '{rid_attr}' " + f"(valid IDs: {', '.join(sorted(rid_to_type.keys())[:5])}{'...' if len(rid_to_type) > 5 else ''})" + ) + elif attr_name == "id" and self.ELEMENT_RELATIONSHIP_TYPES: + expected_type = self._get_expected_relationship_type( + elem_name + ) + if expected_type: + actual_type = rid_to_type[rid_attr] + if expected_type not in actual_type.lower(): + errors.append( + f" {xml_rel_path}: Line {elem.sourceline}: " + f"<{elem_name}> references '{rid_attr}' which points to '{actual_type}' " + f"but should point to a '{expected_type}' relationship" + ) + + except Exception as e: + xml_rel_path = xml_file.relative_to(self.unpacked_dir) + errors.append(f" Error processing {xml_rel_path}: {e}") + + if errors: + print(f"FAILED - Found {len(errors)} relationship ID reference errors:") + for error in errors: + print(error) + print("\nThese ID mismatches will cause the document to appear corrupt!") + return False + else: + if self.verbose: + print("PASSED - All relationship ID references are valid") + return True + + def _get_expected_relationship_type(self, element_name): + elem_lower = element_name.lower() + + if elem_lower in self.ELEMENT_RELATIONSHIP_TYPES: + return self.ELEMENT_RELATIONSHIP_TYPES[elem_lower] + + if elem_lower.endswith("id") and len(elem_lower) > 2: + prefix = elem_lower[:-2] + if prefix.endswith("master"): + return prefix.lower() + elif prefix.endswith("layout"): + return prefix.lower() + else: + if prefix == "sld": + return "slide" + return prefix.lower() + + if elem_lower.endswith("reference") and len(elem_lower) > 9: + prefix = elem_lower[:-9] + return prefix.lower() + + return None + + def validate_content_types(self): + errors = [] + + content_types_file = self.unpacked_dir / "[Content_Types].xml" + if not content_types_file.exists(): + print("FAILED - [Content_Types].xml file not found") + return False + + try: + root = lxml.etree.parse(str(content_types_file)).getroot() + declared_parts = set() + declared_extensions = set() + + for override in root.findall( + f".//{{{self.CONTENT_TYPES_NAMESPACE}}}Override" + ): + part_name = override.get("PartName") + if part_name is not None: + declared_parts.add(part_name.lstrip("/")) + + for default in root.findall( + f".//{{{self.CONTENT_TYPES_NAMESPACE}}}Default" + ): + extension = default.get("Extension") + if extension is not None: + declared_extensions.add(extension.lower()) + + declarable_roots = { + "sld", + "sldLayout", + "sldMaster", + "presentation", + "document", + "workbook", + "worksheet", + "theme", + } + + media_extensions = { + "png": "image/png", + "jpg": "image/jpeg", + "jpeg": "image/jpeg", + "gif": "image/gif", + "bmp": "image/bmp", + "tiff": "image/tiff", + "wmf": "image/x-wmf", + "emf": "image/x-emf", + } + + all_files = list(self.unpacked_dir.rglob("*")) + all_files = [f for f in all_files if f.is_file()] + + for xml_file in self.xml_files: + path_str = str(xml_file.relative_to(self.unpacked_dir)).replace( + "\\", "/" + ) + + if any( + skip in path_str + for skip in [".rels", "[Content_Types]", "docProps/", "_rels/"] + ): + continue + + try: + root_tag = lxml.etree.parse(str(xml_file)).getroot().tag + root_name = root_tag.split("}")[-1] if "}" in root_tag else root_tag + + if root_name in declarable_roots and path_str not in declared_parts: + errors.append( + f" {path_str}: File with <{root_name}> root not declared in [Content_Types].xml" + ) + + except Exception: + continue + + for file_path in all_files: + if file_path.suffix.lower() in {".xml", ".rels"}: + continue + if file_path.name == "[Content_Types].xml": + continue + if "_rels" in file_path.parts or "docProps" in file_path.parts: + continue + + extension = file_path.suffix.lstrip(".").lower() + if extension and extension not in declared_extensions: + if extension in media_extensions: + relative_path = file_path.relative_to(self.unpacked_dir) + errors.append( + f' {relative_path}: File with extension \'{extension}\' not declared in [Content_Types].xml - should add: <Default Extension="{extension}" ContentType="{media_extensions[extension]}"/>' + ) + + except Exception as e: + errors.append(f" Error parsing [Content_Types].xml: {e}") + + if errors: + print(f"FAILED - Found {len(errors)} content type declaration errors:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print( + "PASSED - All content files are properly declared in [Content_Types].xml" + ) + return True + + def validate_file_against_xsd(self, xml_file, verbose=False): + xml_file = Path(xml_file).resolve() + unpacked_dir = self.unpacked_dir.resolve() + + is_valid, current_errors = self._validate_single_file_xsd( + xml_file, unpacked_dir + ) + + if is_valid is None: + return None, set() + elif is_valid: + return True, set() + + original_errors = self._get_original_file_errors(xml_file) + + assert current_errors is not None + new_errors = current_errors - original_errors + + new_errors = { + e for e in new_errors + if not any(pattern in e for pattern in self.IGNORED_VALIDATION_ERRORS) + } + + if new_errors: + if verbose: + relative_path = xml_file.relative_to(unpacked_dir) + print(f"FAILED - {relative_path}: {len(new_errors)} new error(s)") + for error in list(new_errors)[:3]: + truncated = error[:250] + "..." if len(error) > 250 else error + print(f" - {truncated}") + return False, new_errors + else: + if verbose: + print( + f"PASSED - No new errors (original had {len(current_errors)} errors)" + ) + return True, set() + + def validate_against_xsd(self): + new_errors = [] + original_error_count = 0 + valid_count = 0 + skipped_count = 0 + + for xml_file in self.xml_files: + relative_path = str(xml_file.relative_to(self.unpacked_dir)) + is_valid, new_file_errors = self.validate_file_against_xsd( + xml_file, verbose=False + ) + + if is_valid is None: + skipped_count += 1 + continue + elif is_valid and not new_file_errors: + valid_count += 1 + continue + elif is_valid: + original_error_count += 1 + valid_count += 1 + continue + + new_errors.append(f" {relative_path}: {len(new_file_errors)} new error(s)") + for error in list(new_file_errors)[:3]: + new_errors.append( + f" - {error[:250]}..." if len(error) > 250 else f" - {error}" + ) + + if self.verbose: + print(f"Validated {len(self.xml_files)} files:") + print(f" - Valid: {valid_count}") + print(f" - Skipped (no schema): {skipped_count}") + if original_error_count: + print(f" - With original errors (ignored): {original_error_count}") + print( + f" - With NEW errors: {len(new_errors) > 0 and len([e for e in new_errors if not e.startswith(' ')]) or 0}" + ) + + if new_errors: + print("\nFAILED - Found NEW validation errors:") + for error in new_errors: + print(error) + return False + else: + if self.verbose: + print("\nPASSED - No new XSD validation errors introduced") + return True + + def _get_schema_path(self, xml_file): + if xml_file.name in self.SCHEMA_MAPPINGS: + return self.schemas_dir / self.SCHEMA_MAPPINGS[xml_file.name] + + if xml_file.suffix == ".rels": + return self.schemas_dir / self.SCHEMA_MAPPINGS[".rels"] + + if "charts/" in str(xml_file) and xml_file.name.startswith("chart"): + return self.schemas_dir / self.SCHEMA_MAPPINGS["chart"] + + if "theme/" in str(xml_file) and xml_file.name.startswith("theme"): + return self.schemas_dir / self.SCHEMA_MAPPINGS["theme"] + + if xml_file.parent.name in self.MAIN_CONTENT_FOLDERS: + return self.schemas_dir / self.SCHEMA_MAPPINGS[xml_file.parent.name] + + return None + + def _clean_ignorable_namespaces(self, xml_doc): + xml_string = lxml.etree.tostring(xml_doc, encoding="unicode") + xml_copy = lxml.etree.fromstring(xml_string) + + for elem in xml_copy.iter(): + attrs_to_remove = [] + + for attr in elem.attrib: + if "{" in attr: + ns = attr.split("}")[0][1:] + if ns not in self.OOXML_NAMESPACES: + attrs_to_remove.append(attr) + + for attr in attrs_to_remove: + del elem.attrib[attr] + + self._remove_ignorable_elements(xml_copy) + + return lxml.etree.ElementTree(xml_copy) + + def _remove_ignorable_elements(self, root): + elements_to_remove = [] + + for elem in list(root): + if not hasattr(elem, "tag") or callable(elem.tag): + continue + + tag_str = str(elem.tag) + if tag_str.startswith("{"): + ns = tag_str.split("}")[0][1:] + if ns not in self.OOXML_NAMESPACES: + elements_to_remove.append(elem) + continue + + self._remove_ignorable_elements(elem) + + for elem in elements_to_remove: + root.remove(elem) + + def _preprocess_for_mc_ignorable(self, xml_doc): + root = xml_doc.getroot() + + if f"{{{self.MC_NAMESPACE}}}Ignorable" in root.attrib: + del root.attrib[f"{{{self.MC_NAMESPACE}}}Ignorable"] + + return xml_doc + + def _validate_single_file_xsd(self, xml_file, base_path): + schema_path = self._get_schema_path(xml_file) + if not schema_path: + return None, None + + try: + with open(schema_path, "rb") as xsd_file: + parser = lxml.etree.XMLParser() + xsd_doc = lxml.etree.parse( + xsd_file, parser=parser, base_url=str(schema_path) + ) + schema = lxml.etree.XMLSchema(xsd_doc) + + with open(xml_file, "r") as f: + xml_doc = lxml.etree.parse(f) + + xml_doc, _ = self._remove_template_tags_from_text_nodes(xml_doc) + xml_doc = self._preprocess_for_mc_ignorable(xml_doc) + + relative_path = xml_file.relative_to(base_path) + if ( + relative_path.parts + and relative_path.parts[0] in self.MAIN_CONTENT_FOLDERS + ): + xml_doc = self._clean_ignorable_namespaces(xml_doc) + + if schema.validate(xml_doc): + return True, set() + else: + errors = set() + for error in schema.error_log: + errors.add(error.message) + return False, errors + + except Exception as e: + return False, {str(e)} + + def _get_original_file_errors(self, xml_file): + if self.original_file is None: + return set() + + import tempfile + import zipfile + + xml_file = Path(xml_file).resolve() + unpacked_dir = self.unpacked_dir.resolve() + relative_path = xml_file.relative_to(unpacked_dir) + + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + with zipfile.ZipFile(self.original_file, "r") as zip_ref: + zip_ref.extractall(temp_path) + + original_xml_file = temp_path / relative_path + + if not original_xml_file.exists(): + return set() + + is_valid, errors = self._validate_single_file_xsd( + original_xml_file, temp_path + ) + return errors if errors else set() + + def _remove_template_tags_from_text_nodes(self, xml_doc): + warnings = [] + template_pattern = re.compile(r"\{\{[^}]*\}\}") + + xml_string = lxml.etree.tostring(xml_doc, encoding="unicode") + xml_copy = lxml.etree.fromstring(xml_string) + + def process_text_content(text, content_type): + if not text: + return text + matches = list(template_pattern.finditer(text)) + if matches: + for match in matches: + warnings.append( + f"Found template tag in {content_type}: {match.group()}" + ) + return template_pattern.sub("", text) + return text + + for elem in xml_copy.iter(): + if not hasattr(elem, "tag") or callable(elem.tag): + continue + tag_str = str(elem.tag) + if tag_str.endswith("}t") or tag_str == "t": + continue + + elem.text = process_text_content(elem.text, "text content") + elem.tail = process_text_content(elem.tail, "tail content") + + return lxml.etree.ElementTree(xml_copy), warnings + + +if __name__ == "__main__": + raise RuntimeError("This module should not be run directly.") diff --git a/.claude/skills/xlsx/scripts/office/validators/docx.py b/.claude/skills/xlsx/scripts/office/validators/docx.py new file mode 100644 index 0000000..fec405e --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/validators/docx.py @@ -0,0 +1,446 @@ +""" +Validator for Word document XML files against XSD schemas. +""" + +import random +import re +import tempfile +import zipfile + +import defusedxml.minidom +import lxml.etree + +from .base import BaseSchemaValidator + + +class DOCXSchemaValidator(BaseSchemaValidator): + + WORD_2006_NAMESPACE = "http://schemas.openxmlformats.org/wordprocessingml/2006/main" + W14_NAMESPACE = "http://schemas.microsoft.com/office/word/2010/wordml" + W16CID_NAMESPACE = "http://schemas.microsoft.com/office/word/2016/wordml/cid" + + ELEMENT_RELATIONSHIP_TYPES = {} + + def validate(self): + if not self.validate_xml(): + return False + + all_valid = True + if not self.validate_namespaces(): + all_valid = False + + if not self.validate_unique_ids(): + all_valid = False + + if not self.validate_file_references(): + all_valid = False + + if not self.validate_content_types(): + all_valid = False + + if not self.validate_against_xsd(): + all_valid = False + + if not self.validate_whitespace_preservation(): + all_valid = False + + if not self.validate_deletions(): + all_valid = False + + if not self.validate_insertions(): + all_valid = False + + if not self.validate_all_relationship_ids(): + all_valid = False + + if not self.validate_id_constraints(): + all_valid = False + + if not self.validate_comment_markers(): + all_valid = False + + self.compare_paragraph_counts() + + return all_valid + + def validate_whitespace_preservation(self): + errors = [] + + for xml_file in self.xml_files: + if xml_file.name != "document.xml": + continue + + try: + root = lxml.etree.parse(str(xml_file)).getroot() + + for elem in root.iter(f"{{{self.WORD_2006_NAMESPACE}}}t"): + if elem.text: + text = elem.text + if re.search(r"^[ \t\n\r]", text) or re.search( + r"[ \t\n\r]$", text + ): + xml_space_attr = f"{{{self.XML_NAMESPACE}}}space" + if ( + xml_space_attr not in elem.attrib + or elem.attrib[xml_space_attr] != "preserve" + ): + text_preview = ( + repr(text)[:50] + "..." + if len(repr(text)) > 50 + else repr(text) + ) + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {elem.sourceline}: w:t element with whitespace missing xml:space='preserve': {text_preview}" + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} whitespace preservation violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All whitespace is properly preserved") + return True + + def validate_deletions(self): + errors = [] + + for xml_file in self.xml_files: + if xml_file.name != "document.xml": + continue + + try: + root = lxml.etree.parse(str(xml_file)).getroot() + namespaces = {"w": self.WORD_2006_NAMESPACE} + + for t_elem in root.xpath(".//w:del//w:t", namespaces=namespaces): + if t_elem.text: + text_preview = ( + repr(t_elem.text)[:50] + "..." + if len(repr(t_elem.text)) > 50 + else repr(t_elem.text) + ) + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {t_elem.sourceline}: <w:t> found within <w:del>: {text_preview}" + ) + + for instr_elem in root.xpath( + ".//w:del//w:instrText", namespaces=namespaces + ): + text_preview = ( + repr(instr_elem.text or "")[:50] + "..." + if len(repr(instr_elem.text or "")) > 50 + else repr(instr_elem.text or "") + ) + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {instr_elem.sourceline}: <w:instrText> found within <w:del> (use <w:delInstrText>): {text_preview}" + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} deletion validation violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - No w:t elements found within w:del elements") + return True + + def count_paragraphs_in_unpacked(self): + count = 0 + + for xml_file in self.xml_files: + if xml_file.name != "document.xml": + continue + + try: + root = lxml.etree.parse(str(xml_file)).getroot() + paragraphs = root.findall(f".//{{{self.WORD_2006_NAMESPACE}}}p") + count = len(paragraphs) + except Exception as e: + print(f"Error counting paragraphs in unpacked document: {e}") + + return count + + def count_paragraphs_in_original(self): + original = self.original_file + if original is None: + return 0 + + count = 0 + + try: + with tempfile.TemporaryDirectory() as temp_dir: + with zipfile.ZipFile(original, "r") as zip_ref: + zip_ref.extractall(temp_dir) + + doc_xml_path = temp_dir + "/word/document.xml" + root = lxml.etree.parse(doc_xml_path).getroot() + + paragraphs = root.findall(f".//{{{self.WORD_2006_NAMESPACE}}}p") + count = len(paragraphs) + + except Exception as e: + print(f"Error counting paragraphs in original document: {e}") + + return count + + def validate_insertions(self): + errors = [] + + for xml_file in self.xml_files: + if xml_file.name != "document.xml": + continue + + try: + root = lxml.etree.parse(str(xml_file)).getroot() + namespaces = {"w": self.WORD_2006_NAMESPACE} + + invalid_elements = root.xpath( + ".//w:ins//w:delText[not(ancestor::w:del)]", namespaces=namespaces + ) + + for elem in invalid_elements: + text_preview = ( + repr(elem.text or "")[:50] + "..." + if len(repr(elem.text or "")) > 50 + else repr(elem.text or "") + ) + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {elem.sourceline}: <w:delText> within <w:ins>: {text_preview}" + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} insertion validation violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - No w:delText elements within w:ins elements") + return True + + def compare_paragraph_counts(self): + original_count = self.count_paragraphs_in_original() + new_count = self.count_paragraphs_in_unpacked() + + diff = new_count - original_count + diff_str = f"+{diff}" if diff > 0 else str(diff) + print(f"\nParagraphs: {original_count} → {new_count} ({diff_str})") + + def _parse_id_value(self, val: str, base: int = 16) -> int: + return int(val, base) + + def validate_id_constraints(self): + errors = [] + para_id_attr = f"{{{self.W14_NAMESPACE}}}paraId" + durable_id_attr = f"{{{self.W16CID_NAMESPACE}}}durableId" + + for xml_file in self.xml_files: + try: + for elem in lxml.etree.parse(str(xml_file)).iter(): + if val := elem.get(para_id_attr): + if self._parse_id_value(val, base=16) >= 0x80000000: + errors.append( + f" {xml_file.name}:{elem.sourceline}: paraId={val} >= 0x80000000" + ) + + if val := elem.get(durable_id_attr): + if xml_file.name == "numbering.xml": + try: + if self._parse_id_value(val, base=10) >= 0x7FFFFFFF: + errors.append( + f" {xml_file.name}:{elem.sourceline}: " + f"durableId={val} >= 0x7FFFFFFF" + ) + except ValueError: + errors.append( + f" {xml_file.name}:{elem.sourceline}: " + f"durableId={val} must be decimal in numbering.xml" + ) + else: + if self._parse_id_value(val, base=16) >= 0x7FFFFFFF: + errors.append( + f" {xml_file.name}:{elem.sourceline}: " + f"durableId={val} >= 0x7FFFFFFF" + ) + except Exception: + pass + + if errors: + print(f"FAILED - {len(errors)} ID constraint violations:") + for e in errors: + print(e) + elif self.verbose: + print("PASSED - All paraId/durableId values within constraints") + return not errors + + def validate_comment_markers(self): + errors = [] + + document_xml = None + comments_xml = None + for xml_file in self.xml_files: + if xml_file.name == "document.xml" and "word" in str(xml_file): + document_xml = xml_file + elif xml_file.name == "comments.xml": + comments_xml = xml_file + + if not document_xml: + if self.verbose: + print("PASSED - No document.xml found (skipping comment validation)") + return True + + try: + doc_root = lxml.etree.parse(str(document_xml)).getroot() + namespaces = {"w": self.WORD_2006_NAMESPACE} + + range_starts = { + elem.get(f"{{{self.WORD_2006_NAMESPACE}}}id") + for elem in doc_root.xpath( + ".//w:commentRangeStart", namespaces=namespaces + ) + } + range_ends = { + elem.get(f"{{{self.WORD_2006_NAMESPACE}}}id") + for elem in doc_root.xpath( + ".//w:commentRangeEnd", namespaces=namespaces + ) + } + references = { + elem.get(f"{{{self.WORD_2006_NAMESPACE}}}id") + for elem in doc_root.xpath( + ".//w:commentReference", namespaces=namespaces + ) + } + + orphaned_ends = range_ends - range_starts + for comment_id in sorted( + orphaned_ends, key=lambda x: int(x) if x and x.isdigit() else 0 + ): + errors.append( + f' document.xml: commentRangeEnd id="{comment_id}" has no matching commentRangeStart' + ) + + orphaned_starts = range_starts - range_ends + for comment_id in sorted( + orphaned_starts, key=lambda x: int(x) if x and x.isdigit() else 0 + ): + errors.append( + f' document.xml: commentRangeStart id="{comment_id}" has no matching commentRangeEnd' + ) + + comment_ids = set() + if comments_xml and comments_xml.exists(): + comments_root = lxml.etree.parse(str(comments_xml)).getroot() + comment_ids = { + elem.get(f"{{{self.WORD_2006_NAMESPACE}}}id") + for elem in comments_root.xpath( + ".//w:comment", namespaces=namespaces + ) + } + + marker_ids = range_starts | range_ends | references + invalid_refs = marker_ids - comment_ids + for comment_id in sorted( + invalid_refs, key=lambda x: int(x) if x and x.isdigit() else 0 + ): + if comment_id: + errors.append( + f' document.xml: marker id="{comment_id}" references non-existent comment' + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append(f" Error parsing XML: {e}") + + if errors: + print(f"FAILED - {len(errors)} comment marker violations:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All comment markers properly paired") + return True + + def repair(self) -> int: + repairs = super().repair() + repairs += self.repair_durableId() + return repairs + + def repair_durableId(self) -> int: + repairs = 0 + + for xml_file in self.xml_files: + try: + content = xml_file.read_text(encoding="utf-8") + dom = defusedxml.minidom.parseString(content) + modified = False + + for elem in dom.getElementsByTagName("*"): + if not elem.hasAttribute("w16cid:durableId"): + continue + + durable_id = elem.getAttribute("w16cid:durableId") + needs_repair = False + + if xml_file.name == "numbering.xml": + try: + needs_repair = ( + self._parse_id_value(durable_id, base=10) >= 0x7FFFFFFF + ) + except ValueError: + needs_repair = True + else: + try: + needs_repair = ( + self._parse_id_value(durable_id, base=16) >= 0x7FFFFFFF + ) + except ValueError: + needs_repair = True + + if needs_repair: + value = random.randint(1, 0x7FFFFFFE) + if xml_file.name == "numbering.xml": + new_id = str(value) + else: + new_id = f"{value:08X}" + + elem.setAttribute("w16cid:durableId", new_id) + print( + f" Repaired: {xml_file.name}: durableId {durable_id} → {new_id}" + ) + repairs += 1 + modified = True + + if modified: + xml_file.write_bytes(dom.toxml(encoding="UTF-8")) + + except Exception: + pass + + return repairs + + +if __name__ == "__main__": + raise RuntimeError("This module should not be run directly.") diff --git a/.claude/skills/xlsx/scripts/office/validators/pptx.py b/.claude/skills/xlsx/scripts/office/validators/pptx.py new file mode 100644 index 0000000..09842aa --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/validators/pptx.py @@ -0,0 +1,275 @@ +""" +Validator for PowerPoint presentation XML files against XSD schemas. +""" + +import re + +from .base import BaseSchemaValidator + + +class PPTXSchemaValidator(BaseSchemaValidator): + + PRESENTATIONML_NAMESPACE = ( + "http://schemas.openxmlformats.org/presentationml/2006/main" + ) + + ELEMENT_RELATIONSHIP_TYPES = { + "sldid": "slide", + "sldmasterid": "slidemaster", + "notesmasterid": "notesmaster", + "sldlayoutid": "slidelayout", + "themeid": "theme", + "tablestyleid": "tablestyles", + } + + def validate(self): + if not self.validate_xml(): + return False + + all_valid = True + if not self.validate_namespaces(): + all_valid = False + + if not self.validate_unique_ids(): + all_valid = False + + if not self.validate_uuid_ids(): + all_valid = False + + if not self.validate_file_references(): + all_valid = False + + if not self.validate_slide_layout_ids(): + all_valid = False + + if not self.validate_content_types(): + all_valid = False + + if not self.validate_against_xsd(): + all_valid = False + + if not self.validate_notes_slide_references(): + all_valid = False + + if not self.validate_all_relationship_ids(): + all_valid = False + + if not self.validate_no_duplicate_slide_layouts(): + all_valid = False + + return all_valid + + def validate_uuid_ids(self): + import lxml.etree + + errors = [] + uuid_pattern = re.compile( + r"^[\{\(]?[0-9A-Fa-f]{8}-?[0-9A-Fa-f]{4}-?[0-9A-Fa-f]{4}-?[0-9A-Fa-f]{4}-?[0-9A-Fa-f]{12}[\}\)]?$" + ) + + for xml_file in self.xml_files: + try: + root = lxml.etree.parse(str(xml_file)).getroot() + + for elem in root.iter(): + for attr, value in elem.attrib.items(): + attr_name = attr.split("}")[-1].lower() + if attr_name == "id" or attr_name.endswith("id"): + if self._looks_like_uuid(value): + if not uuid_pattern.match(value): + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: " + f"Line {elem.sourceline}: ID '{value}' appears to be a UUID but contains invalid hex characters" + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} UUID ID validation errors:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All UUID-like IDs contain valid hex values") + return True + + def _looks_like_uuid(self, value): + clean_value = value.strip("{}()").replace("-", "") + return len(clean_value) == 32 and all(c.isalnum() for c in clean_value) + + def validate_slide_layout_ids(self): + import lxml.etree + + errors = [] + + slide_masters = list(self.unpacked_dir.glob("ppt/slideMasters/*.xml")) + + if not slide_masters: + if self.verbose: + print("PASSED - No slide masters found") + return True + + for slide_master in slide_masters: + try: + root = lxml.etree.parse(str(slide_master)).getroot() + + rels_file = slide_master.parent / "_rels" / f"{slide_master.name}.rels" + + if not rels_file.exists(): + errors.append( + f" {slide_master.relative_to(self.unpacked_dir)}: " + f"Missing relationships file: {rels_file.relative_to(self.unpacked_dir)}" + ) + continue + + rels_root = lxml.etree.parse(str(rels_file)).getroot() + + valid_layout_rids = set() + for rel in rels_root.findall( + f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship" + ): + rel_type = rel.get("Type", "") + if "slideLayout" in rel_type: + valid_layout_rids.add(rel.get("Id")) + + for sld_layout_id in root.findall( + f".//{{{self.PRESENTATIONML_NAMESPACE}}}sldLayoutId" + ): + r_id = sld_layout_id.get( + f"{{{self.OFFICE_RELATIONSHIPS_NAMESPACE}}}id" + ) + layout_id = sld_layout_id.get("id") + + if r_id and r_id not in valid_layout_rids: + errors.append( + f" {slide_master.relative_to(self.unpacked_dir)}: " + f"Line {sld_layout_id.sourceline}: sldLayoutId with id='{layout_id}' " + f"references r:id='{r_id}' which is not found in slide layout relationships" + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {slide_master.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print(f"FAILED - Found {len(errors)} slide layout ID validation errors:") + for error in errors: + print(error) + print( + "Remove invalid references or add missing slide layouts to the relationships file." + ) + return False + else: + if self.verbose: + print("PASSED - All slide layout IDs reference valid slide layouts") + return True + + def validate_no_duplicate_slide_layouts(self): + import lxml.etree + + errors = [] + slide_rels_files = list(self.unpacked_dir.glob("ppt/slides/_rels/*.xml.rels")) + + for rels_file in slide_rels_files: + try: + root = lxml.etree.parse(str(rels_file)).getroot() + + layout_rels = [ + rel + for rel in root.findall( + f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship" + ) + if "slideLayout" in rel.get("Type", "") + ] + + if len(layout_rels) > 1: + errors.append( + f" {rels_file.relative_to(self.unpacked_dir)}: has {len(layout_rels)} slideLayout references" + ) + + except Exception as e: + errors.append( + f" {rels_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + if errors: + print("FAILED - Found slides with duplicate slideLayout references:") + for error in errors: + print(error) + return False + else: + if self.verbose: + print("PASSED - All slides have exactly one slideLayout reference") + return True + + def validate_notes_slide_references(self): + import lxml.etree + + errors = [] + notes_slide_references = {} + + slide_rels_files = list(self.unpacked_dir.glob("ppt/slides/_rels/*.xml.rels")) + + if not slide_rels_files: + if self.verbose: + print("PASSED - No slide relationship files found") + return True + + for rels_file in slide_rels_files: + try: + root = lxml.etree.parse(str(rels_file)).getroot() + + for rel in root.findall( + f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship" + ): + rel_type = rel.get("Type", "") + if "notesSlide" in rel_type: + target = rel.get("Target", "") + if target: + normalized_target = target.replace("../", "") + + slide_name = rels_file.stem.replace( + ".xml", "" + ) + + if normalized_target not in notes_slide_references: + notes_slide_references[normalized_target] = [] + notes_slide_references[normalized_target].append( + (slide_name, rels_file) + ) + + except (lxml.etree.XMLSyntaxError, Exception) as e: + errors.append( + f" {rels_file.relative_to(self.unpacked_dir)}: Error: {e}" + ) + + for target, references in notes_slide_references.items(): + if len(references) > 1: + slide_names = [ref[0] for ref in references] + errors.append( + f" Notes slide '{target}' is referenced by multiple slides: {', '.join(slide_names)}" + ) + for slide_name, rels_file in references: + errors.append(f" - {rels_file.relative_to(self.unpacked_dir)}") + + if errors: + print( + f"FAILED - Found {len([e for e in errors if not e.startswith(' ')])} notes slide reference validation errors:" + ) + for error in errors: + print(error) + print("Each slide may optionally have its own slide file.") + return False + else: + if self.verbose: + print("PASSED - All notes slide references are unique") + return True + + +if __name__ == "__main__": + raise RuntimeError("This module should not be run directly.") diff --git a/.claude/skills/xlsx/scripts/office/validators/redlining.py b/.claude/skills/xlsx/scripts/office/validators/redlining.py new file mode 100644 index 0000000..71c81b6 --- /dev/null +++ b/.claude/skills/xlsx/scripts/office/validators/redlining.py @@ -0,0 +1,247 @@ +""" +Validator for tracked changes in Word documents. +""" + +import subprocess +import tempfile +import zipfile +from pathlib import Path + + +class RedliningValidator: + + def __init__(self, unpacked_dir, original_docx, verbose=False, author="Claude"): + self.unpacked_dir = Path(unpacked_dir) + self.original_docx = Path(original_docx) + self.verbose = verbose + self.author = author + self.namespaces = { + "w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main" + } + + def repair(self) -> int: + return 0 + + def validate(self): + modified_file = self.unpacked_dir / "word" / "document.xml" + if not modified_file.exists(): + print(f"FAILED - Modified document.xml not found at {modified_file}") + return False + + try: + import xml.etree.ElementTree as ET + + tree = ET.parse(modified_file) + root = tree.getroot() + + del_elements = root.findall(".//w:del", self.namespaces) + ins_elements = root.findall(".//w:ins", self.namespaces) + + author_del_elements = [ + elem + for elem in del_elements + if elem.get(f"{{{self.namespaces['w']}}}author") == self.author + ] + author_ins_elements = [ + elem + for elem in ins_elements + if elem.get(f"{{{self.namespaces['w']}}}author") == self.author + ] + + if not author_del_elements and not author_ins_elements: + if self.verbose: + print(f"PASSED - No tracked changes by {self.author} found.") + return True + + except Exception: + pass + + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + try: + with zipfile.ZipFile(self.original_docx, "r") as zip_ref: + zip_ref.extractall(temp_path) + except Exception as e: + print(f"FAILED - Error unpacking original docx: {e}") + return False + + original_file = temp_path / "word" / "document.xml" + if not original_file.exists(): + print( + f"FAILED - Original document.xml not found in {self.original_docx}" + ) + return False + + try: + import xml.etree.ElementTree as ET + + modified_tree = ET.parse(modified_file) + modified_root = modified_tree.getroot() + original_tree = ET.parse(original_file) + original_root = original_tree.getroot() + except ET.ParseError as e: + print(f"FAILED - Error parsing XML files: {e}") + return False + + self._remove_author_tracked_changes(original_root) + self._remove_author_tracked_changes(modified_root) + + modified_text = self._extract_text_content(modified_root) + original_text = self._extract_text_content(original_root) + + if modified_text != original_text: + error_message = self._generate_detailed_diff( + original_text, modified_text + ) + print(error_message) + return False + + if self.verbose: + print(f"PASSED - All changes by {self.author} are properly tracked") + return True + + def _generate_detailed_diff(self, original_text, modified_text): + error_parts = [ + f"FAILED - Document text doesn't match after removing {self.author}'s tracked changes", + "", + "Likely causes:", + " 1. Modified text inside another author's <w:ins> or <w:del> tags", + " 2. Made edits without proper tracked changes", + " 3. Didn't nest <w:del> inside <w:ins> when deleting another's insertion", + "", + "For pre-redlined documents, use correct patterns:", + " - To reject another's INSERTION: Nest <w:del> inside their <w:ins>", + " - To restore another's DELETION: Add new <w:ins> AFTER their <w:del>", + "", + ] + + git_diff = self._get_git_word_diff(original_text, modified_text) + if git_diff: + error_parts.extend(["Differences:", "============", git_diff]) + else: + error_parts.append("Unable to generate word diff (git not available)") + + return "\n".join(error_parts) + + def _get_git_word_diff(self, original_text, modified_text): + try: + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + + original_file = temp_path / "original.txt" + modified_file = temp_path / "modified.txt" + + original_file.write_text(original_text, encoding="utf-8") + modified_file.write_text(modified_text, encoding="utf-8") + + result = subprocess.run( + [ + "git", + "diff", + "--word-diff=plain", + "--word-diff-regex=.", + "-U0", + "--no-index", + str(original_file), + str(modified_file), + ], + capture_output=True, + text=True, + ) + + if result.stdout.strip(): + lines = result.stdout.split("\n") + content_lines = [] + in_content = False + for line in lines: + if line.startswith("@@"): + in_content = True + continue + if in_content and line.strip(): + content_lines.append(line) + + if content_lines: + return "\n".join(content_lines) + + result = subprocess.run( + [ + "git", + "diff", + "--word-diff=plain", + "-U0", + "--no-index", + str(original_file), + str(modified_file), + ], + capture_output=True, + text=True, + ) + + if result.stdout.strip(): + lines = result.stdout.split("\n") + content_lines = [] + in_content = False + for line in lines: + if line.startswith("@@"): + in_content = True + continue + if in_content and line.strip(): + content_lines.append(line) + return "\n".join(content_lines) + + except (subprocess.CalledProcessError, FileNotFoundError, Exception): + pass + + return None + + def _remove_author_tracked_changes(self, root): + ins_tag = f"{{{self.namespaces['w']}}}ins" + del_tag = f"{{{self.namespaces['w']}}}del" + author_attr = f"{{{self.namespaces['w']}}}author" + + for parent in root.iter(): + to_remove = [] + for child in parent: + if child.tag == ins_tag and child.get(author_attr) == self.author: + to_remove.append(child) + for elem in to_remove: + parent.remove(elem) + + deltext_tag = f"{{{self.namespaces['w']}}}delText" + t_tag = f"{{{self.namespaces['w']}}}t" + + for parent in root.iter(): + to_process = [] + for child in parent: + if child.tag == del_tag and child.get(author_attr) == self.author: + to_process.append((child, list(parent).index(child))) + + for del_elem, del_index in reversed(to_process): + for elem in del_elem.iter(): + if elem.tag == deltext_tag: + elem.tag = t_tag + + for child in reversed(list(del_elem)): + parent.insert(del_index, child) + parent.remove(del_elem) + + def _extract_text_content(self, root): + p_tag = f"{{{self.namespaces['w']}}}p" + t_tag = f"{{{self.namespaces['w']}}}t" + + paragraphs = [] + for p_elem in root.findall(f".//{p_tag}"): + text_parts = [] + for t_elem in p_elem.findall(f".//{t_tag}"): + if t_elem.text: + text_parts.append(t_elem.text) + paragraph_text = "".join(text_parts) + if paragraph_text: + paragraphs.append(paragraph_text) + + return "\n".join(paragraphs) + + +if __name__ == "__main__": + raise RuntimeError("This module should not be run directly.") diff --git a/.claude/skills/xlsx/scripts/recalc.py b/.claude/skills/xlsx/scripts/recalc.py new file mode 100644 index 0000000..f472e9a --- /dev/null +++ b/.claude/skills/xlsx/scripts/recalc.py @@ -0,0 +1,184 @@ +""" +Excel Formula Recalculation Script +Recalculates all formulas in an Excel file using LibreOffice +""" + +import json +import os +import platform +import subprocess +import sys +from pathlib import Path + +from office.soffice import get_soffice_env + +from openpyxl import load_workbook + +MACRO_DIR_MACOS = "~/Library/Application Support/LibreOffice/4/user/basic/Standard" +MACRO_DIR_LINUX = "~/.config/libreoffice/4/user/basic/Standard" +MACRO_FILENAME = "Module1.xba" + +RECALCULATE_MACRO = """<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Module1" script:language="StarBasic"> + Sub RecalculateAndSave() + ThisComponent.calculateAll() + ThisComponent.store() + ThisComponent.close(True) + End Sub +</script:module>""" + + +def has_gtimeout(): + try: + subprocess.run( + ["gtimeout", "--version"], capture_output=True, timeout=1, check=False + ) + return True + except (FileNotFoundError, subprocess.TimeoutExpired): + return False + + +def setup_libreoffice_macro(): + macro_dir = os.path.expanduser( + MACRO_DIR_MACOS if platform.system() == "Darwin" else MACRO_DIR_LINUX + ) + macro_file = os.path.join(macro_dir, MACRO_FILENAME) + + if ( + os.path.exists(macro_file) + and "RecalculateAndSave" in Path(macro_file).read_text() + ): + return True + + if not os.path.exists(macro_dir): + subprocess.run( + ["soffice", "--headless", "--terminate_after_init"], + capture_output=True, + timeout=10, + env=get_soffice_env(), + ) + os.makedirs(macro_dir, exist_ok=True) + + try: + Path(macro_file).write_text(RECALCULATE_MACRO) + return True + except Exception: + return False + + +def recalc(filename, timeout=30): + if not Path(filename).exists(): + return {"error": f"File {filename} does not exist"} + + abs_path = str(Path(filename).absolute()) + + if not setup_libreoffice_macro(): + return {"error": "Failed to setup LibreOffice macro"} + + cmd = [ + "soffice", + "--headless", + "--norestore", + "vnd.sun.star.script:Standard.Module1.RecalculateAndSave?language=Basic&location=application", + abs_path, + ] + + if platform.system() == "Linux": + cmd = ["timeout", str(timeout)] + cmd + elif platform.system() == "Darwin" and has_gtimeout(): + cmd = ["gtimeout", str(timeout)] + cmd + + result = subprocess.run(cmd, capture_output=True, text=True, env=get_soffice_env()) + + if result.returncode != 0 and result.returncode != 124: + error_msg = result.stderr or "Unknown error during recalculation" + if "Module1" in error_msg or "RecalculateAndSave" not in error_msg: + return {"error": "LibreOffice macro not configured properly"} + return {"error": error_msg} + + try: + wb = load_workbook(filename, data_only=True) + + excel_errors = [ + "#VALUE!", + "#DIV/0!", + "#REF!", + "#NAME?", + "#NULL!", + "#NUM!", + "#N/A", + ] + error_details = {err: [] for err in excel_errors} + total_errors = 0 + + for sheet_name in wb.sheetnames: + ws = wb[sheet_name] + for row in ws.iter_rows(): + for cell in row: + if cell.value is not None and isinstance(cell.value, str): + for err in excel_errors: + if err in cell.value: + location = f"{sheet_name}!{cell.coordinate}" + error_details[err].append(location) + total_errors += 1 + break + + wb.close() + + result = { + "status": "success" if total_errors == 0 else "errors_found", + "total_errors": total_errors, + "error_summary": {}, + } + + for err_type, locations in error_details.items(): + if locations: + result["error_summary"][err_type] = { + "count": len(locations), + "locations": locations[:20], + } + + wb_formulas = load_workbook(filename, data_only=False) + formula_count = 0 + for sheet_name in wb_formulas.sheetnames: + ws = wb_formulas[sheet_name] + for row in ws.iter_rows(): + for cell in row: + if ( + cell.value + and isinstance(cell.value, str) + and cell.value.startswith("=") + ): + formula_count += 1 + wb_formulas.close() + + result["total_formulas"] = formula_count + + return result + + except Exception as e: + return {"error": str(e)} + + +def main(): + if len(sys.argv) < 2: + print("Usage: python recalc.py <excel_file> [timeout_seconds]") + print("\nRecalculates all formulas in an Excel file using LibreOffice") + print("\nReturns JSON with error details:") + print(" - status: 'success' or 'errors_found'") + print(" - total_errors: Total number of Excel errors found") + print(" - total_formulas: Number of formulas in the file") + print(" - error_summary: Breakdown by error type with locations") + print(" - #VALUE!, #DIV/0!, #REF!, #NAME?, #NULL!, #NUM!, #N/A") + sys.exit(1) + + filename = sys.argv[1] + timeout = int(sys.argv[2]) if len(sys.argv) > 2 else 30 + + result = recalc(filename, timeout) + print(json.dumps(result, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..104e807 --- /dev/null +++ b/.env.example @@ -0,0 +1,36 @@ +# QQ 机器人配置 +# 可从 https://bot.q.qq.com/open 获取 + +# 机器人 AppID(必填) +BOT_APPID=your_app_id_here + +# 机器人 AppSecret(必填) +BOT_SECRET=your_app_secret_here + +# 日志级别: DEBUG / INFO / WARNING / ERROR +LOG_LEVEL=INFO + +# 是否启用沙箱环境 +SANDBOX_MODE=False + +# ==================== AI 配置 ==================== + +# 主模型配置 +# 可选 provider: openai / anthropic / deepseek / qwen +AI_PROVIDER=openai +AI_MODEL=gpt-4 +AI_API_KEY=your_api_key_here +# 可选,自定义 API 地址 +AI_API_BASE=https://api.openai.com/v1 + +# 嵌入模型配置(用于长期记忆检索) +# 不配置时将回退为主模型的 embedding 能力(如果可用) +AI_EMBED_PROVIDER=openai +AI_EMBED_MODEL=text-embedding-3-small +AI_EMBED_API_KEY= +AI_EMBED_API_BASE= + +# 向量数据库配置 +# true: 使用 Chroma(推荐) +# false: 使用 JSON 存储 +AI_USE_VECTOR_DB=true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4b787c6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,50 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# 虚拟环境 +venv/ +env/ +ENV/ + +# 配置文件 +.env +config.yaml + +# 日志文件 +logs/ +*.log + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# 操作系统 +.DS_Store +Thumbs.db + +# 数据文件 +data/ +*.db +*.sqlite diff --git a/config/mcp.json b/config/mcp.json new file mode 100644 index 0000000..d13402b --- /dev/null +++ b/config/mcp.json @@ -0,0 +1,6 @@ +{ + "filesystem": { + "enabled": true, + "root_path": "data" + } +} diff --git a/config/models.json b/config/models.json new file mode 100644 index 0000000..f42c3bf --- /dev/null +++ b/config/models.json @@ -0,0 +1,41 @@ +{ + "active": "pro_moonshotai_kimi_k2_5", + "profiles": { + "default": { + "provider": "openai", + "model_name": "Pro/deepseek-ai/DeepSeek-V3.2", + "temperature": 0.7, + "max_tokens": 4096, + "top_p": 1.0, + "frequency_penalty": 0.0, + "presence_penalty": 0.0, + "timeout": 60, + "stream": false, + "api_base": "https://api.siliconflow.cn/v1" + }, + "qwen_qwen2_5_7b_instruct": { + "provider": "openai", + "model_name": "Qwen/Qwen2.5-7B-Instruct", + "temperature": 0.7, + "max_tokens": 4096, + "top_p": 1.0, + "frequency_penalty": 0.0, + "presence_penalty": 0.0, + "timeout": 60, + "stream": false, + "api_base": "https://api.siliconflow.cn/v1" + }, + "pro_moonshotai_kimi_k2_5": { + "provider": "openai", + "model_name": "Pro/moonshotai/Kimi-K2.5", + "temperature": 0.7, + "max_tokens": 4096, + "top_p": 1.0, + "frequency_penalty": 0.0, + "presence_penalty": 0.0, + "timeout": 60, + "stream": false, + "api_base": "https://api.siliconflow.cn/v1" + } + } +} \ No newline at end of file diff --git a/config/personalities.json b/config/personalities.json new file mode 100644 index 0000000..6ffcae8 --- /dev/null +++ b/config/personalities.json @@ -0,0 +1,38 @@ +{ + "default": { + "name": "小助手", + "description": "一个友好、专业的AI助手", + "traits": ["FRIENDLY", "PROFESSIONAL", "EMPATHETIC"], + "speaking_style": "温和、清晰、有条理,善于倾听和理解用户需求", + "example_responses": [ + "我明白你的意思了,让我来帮你解决这个问题。", + "这是个很好的问题!我来详细解释一下。", + "如果你还有其他疑问,随时告诉我哦~" + ], + "custom_instructions": "" + }, + "tech_expert": { + "name": "技术专家", + "description": "精通技术的专业顾问", + "traits": ["PROFESSIONAL", "ANALYTICAL", "DIRECT"], + "speaking_style": "专业、精确、逻辑清晰,注重技术细节", + "example_responses": [ + "从技术角度来看,这个问题的根本原因是...", + "建议采用以下方案:1. ... 2. ... 3. ...", + "这个实现需要注意以下几个关键点:" + ], + "custom_instructions": "" + }, + "creative": { + "name": "创意伙伴", + "description": "充满创意和想象力的伙伴", + "traits": ["CREATIVE", "HUMOROUS", "FRIENDLY"], + "speaking_style": "活泼、有趣、富有想象力,善于用比喻和故事", + "example_responses": [ + "哇!这让我想到一个很酷的点子...", + "如果我们换个角度思考,也许可以...", + "这就像是在拼图,让我们一起找到那块缺失的部分!" + ], + "custom_instructions": "" + } +} diff --git a/docs/AGENTS.md b/docs/AGENTS.md new file mode 100644 index 0000000..6bdfe78 --- /dev/null +++ b/docs/AGENTS.md @@ -0,0 +1,130 @@ +# AGENTS + +<skills_system priority="1"> + +## Available Skills + +<!-- SKILLS_TABLE_START --> +<usage> +When users ask you to perform tasks, check if any of the available skills below can help complete the task more effectively. Skills provide specialized capabilities and domain knowledge. + +How to use skills: +- Invoke: `npx openskills read <skill-name>` (run in your shell) + - For multiple: `npx openskills read skill-one,skill-two` +- The skill content will load with detailed instructions on how to complete the task +- Base directory provided in output for resolving bundled resources (references/, scripts/, assets/) + +Usage notes: +- Only use skills listed in <available_skills> below +- Do not invoke a skill that is already loaded in your context +- Each skill invocation is stateless +</usage> + +<available_skills> + +<skill> +<name>algorithmic-art</name> +<description>Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.</description> +<location>project</location> +</skill> + +<skill> +<name>brand-guidelines</name> +<description>Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.</description> +<location>project</location> +</skill> + +<skill> +<name>canvas-design</name> +<description>Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.</description> +<location>project</location> +</skill> + +<skill> +<name>doc-coauthoring</name> +<description>Guide users through a structured workflow for co-authoring documentation. Use when user wants to write documentation, proposals, technical specs, decision docs, or similar structured content. This workflow helps users efficiently transfer context, refine content through iteration, and verify the doc works for readers. Trigger when user mentions writing docs, creating proposals, drafting specs, or similar documentation tasks.</description> +<location>project</location> +</skill> + +<skill> +<name>docx</name> +<description>"Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when extracting or reorganizing content from .docx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation."</description> +<location>project</location> +</skill> + +<skill> +<name>frontend-design</name> +<description>Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML/CSS layouts, or when styling/beautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.</description> +<location>project</location> +</skill> + +<skill> +<name>internal-comms</name> +<description>A set of resources to help me write all kinds of internal communications, using the formats that my company likes to use. Claude should use this skill whenever asked to write some sort of internal communications (status reports, leadership updates, 3P updates, company newsletters, FAQs, incident reports, project updates, etc.).</description> +<location>project</location> +</skill> + +<skill> +<name>mcp-builder</name> +<description>Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).</description> +<location>project</location> +</skill> + +<skill> +<name>pdf</name> +<description>Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.</description> +<location>project</location> +</skill> + +<skill> +<name>pptx</name> +<description>"Use this skill any time a .pptx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates, layouts, speaker notes, or comments. Trigger whenever the user mentions \"deck,\" \"slides,\" \"presentation,\" or references a .pptx filename, regardless of what they plan to do with the content afterward. If a .pptx file needs to be opened, created, or touched, use this skill."</description> +<location>project</location> +</skill> + +<skill> +<name>skill-creator</name> +<description>Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, update or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.</description> +<location>project</location> +</skill> + +<skill> +<name>slack-gif-creator</name> +<description>Knowledge and utilities for creating animated GIFs optimized for Slack. Provides constraints, validation tools, and animation concepts. Use when users request animated GIFs for Slack like "make me a GIF of X doing Y for Slack."</description> +<location>project</location> +</skill> + +<skill> +<name>template</name> +<description>Replace with description of the skill and when Claude should use it.</description> +<location>project</location> +</skill> + +<skill> +<name>theme-factory</name> +<description>Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors/fonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.</description> +<location>project</location> +</skill> + +<skill> +<name>web-artifacts-builder</name> +<description>Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts.</description> +<location>project</location> +</skill> + +<skill> +<name>webapp-testing</name> +<description>Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.</description> +<location>project</location> +</skill> + +<skill> +<name>xlsx</name> +<description>"Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved."</description> +<location>project</location> +</skill> + +</available_skills> +<!-- SKILLS_TABLE_END --> + +</skills_system> diff --git a/docs/AI_IMPLEMENTATION.md b/docs/AI_IMPLEMENTATION.md new file mode 100644 index 0000000..ed23756 --- /dev/null +++ b/docs/AI_IMPLEMENTATION.md @@ -0,0 +1,235 @@ +# QQBot AI功能实现完成 ✅ + +## 已实现的功能 + +### 1. ✅ AI模型接入 +- **多模型支持**:OpenAI、Anthropic Claude、DeepSeek、Qwen +- **统一接口**:`AIClient` 提供统一的对话接口 +- **流式响应**:支持流式输出 +- **工具调用**:支持Function Calling + +**核心文件**: +- `src/ai/base.py` - 基础类和接口定义 +- `src/ai/models/openai_model.py` - OpenAI模型实现 +- `src/ai/models/anthropic_model.py` - Anthropic模型实现 +- `src/ai/client.py` - AI客户端统一接口 + +### 2. ✅ 人格系统 +- **预设人格**:默认助手、技术专家、创意伙伴 +- **自定义人格**:支持定义性格特质、说话风格、示例回复 +- **动态切换**:运行时切换人格 +- **持久化**:人格配置保存到JSON文件 + +**核心文件**: +- `src/ai/personality.py` - 人格系统实现 +- `config/personalities.json` - 人格配置文件 + +### 3. ✅ 记忆系统 +- **短期记忆**: + - 滑动窗口(默认20条) + - 自动过期(默认30分钟) + - 按用户隔离 + +- **长期记忆**: + - 重要性评估(基于长度、关键词、元数据) + - 持久化存储 + - 访问统计 + +- **RAG检索**: + - 向量嵌入 + - 余弦相似度搜索 + - 智能上下文组装 + +**核心文件**: +- `src/ai/memory.py` - 记忆系统实现 +- `data/ai/long_term_memory.json` - 长期记忆存储 + +### 4. ✅ 长任务处理 +- **任务分解**:将复杂任务分解为多个步骤 +- **进度跟踪**:实时进度回调 +- **状态管理**:支持暂停、恢复、取消 +- **持久化**:任务状态保存到JSON +- **动作注册**:灵活的动作处理器系统 + +**核心文件**: +- `src/ai/task_manager.py` - 长任务管理器 +- `data/ai/tasks.json` - 任务存储 + +### 5. ✅ Skills插件系统 +- **插件架构**:基于类的插件系统 +- **热加载**:运行时加载/卸载技能 +- **工具注册**:技能可注册多个工具 +- **元数据管理**:skill.json配置文件 +- **示例技能**:天气查询技能 + +**核心文件**: +- `src/ai/skills/base.py` - Skills基础框架 +- `skills/weather/` - 示例天气技能 + +### 6. ✅ MCP支持 +- **标准协议**:Model Context Protocol支持 +- **服务器架构**:可扩展的MCP服务器 +- **资源管理**:资源、工具、提示词注册 +- **文件系统服务器**:内置文件访问MCP服务器 + +**核心文件**: +- `src/ai/mcp/base.py` - MCP基础框架 +- `src/ai/mcp/servers/filesystem.py` - 文件系统MCP服务器 +- `config/mcp.json` - MCP配置 + +## 项目结构 + +``` +QQbot/ +├── src/ +│ ├── ai/ # AI模块 +│ │ ├── __init__.py +│ │ ├── base.py # 基础类定义 +│ │ ├── client.py # AI客户端 +│ │ ├── personality.py # 人格系统 +│ │ ├── memory.py # 记忆系统 +│ │ ├── task_manager.py # 长任务管理 +│ │ ├── models/ # 模型实现 +│ │ │ ├── openai_model.py +│ │ │ └── anthropic_model.py +│ │ ├── skills/ # Skills系统 +│ │ │ ├── base.py +│ │ │ └── __init__.py +│ │ └── mcp/ # MCP系统 +│ │ ├── base.py +│ │ ├── __init__.py +│ │ └── servers/ +│ │ └── filesystem.py +│ ├── handlers/ +│ │ └── message_handler_ai.py # AI集成的消息处理器 +│ └── ... +├── skills/ # 技能插件目录 +│ └── weather/ # 示例天气技能 +│ ├── skill.json +│ ├── main.py +│ └── README.md +├── config/ # 配置文件 +│ ├── personalities.json # 人格配置 +│ └── mcp.json # MCP配置 +├── data/ # 数据目录 +│ └── ai/ # AI数据 +│ ├── long_term_memory.json +│ └── tasks.json +├── examples/ # 示例代码 +│ └── ai_example.py +├── tests/ # 测试 +│ └── test_ai.py +├── requirements-ai.txt # AI依赖 +├── .env.ai.example # AI配置示例 +├── AI_QUICKSTART.md # 快速开始指南 +└── src/ai/README.md # 完整文档 +``` + +## 使用方法 + +### 1. 安装依赖 + +```bash +pip install -r requirements-ai.txt +``` + +### 2. 配置环境变量 + +复制 `.env.ai.example` 到 `.env` 并配置: + +```env +AI_PROVIDER=openai +AI_MODEL=gpt-4 +AI_API_KEY=your_api_key_here +AI_API_BASE=https://api.openai.com/v1 +``` + +### 3. 使用AI功能 + +```python +from pathlib import Path +from src.ai import AIClient +from src.ai.base import ModelConfig, ModelProvider + +# 创建配置 +config = ModelConfig( + provider=ModelProvider.OPENAI, + model_name="gpt-4", + api_key="your_key", + temperature=0.7 +) + +# 初始化客户端 +client = AIClient(config, data_dir=Path("data/ai")) + +# 对话 +response = await client.chat( + user_id="user123", + user_message="你好", + use_memory=True, + use_tools=True +) +``` + +### 4. 集成到QQ机器人 + +修改 `src/core/bot.py`,使用 `message_handler_ai.py`: + +```python +from src.handlers.message_handler_ai import MessageHandler +``` + +## 测试 + +运行测试脚本: + +```bash +python tests/test_ai.py +``` + +运行示例: + +```bash +python examples/ai_example.py +``` + +## 文档 + +- **快速开始**:`AI_QUICKSTART.md` +- **完整文档**:`src/ai/README.md` +- **示例代码**:`examples/ai_example.py` + +## 特性亮点 + +1. **模块化设计**:各功能模块独立,易于维护和扩展 +2. **异步支持**:全异步实现,性能优秀 +3. **类型提示**:完整的类型注解,IDE友好 +4. **错误处理**:完善的异常处理和日志记录 +5. **可扩展性**:Skills和MCP系统支持无限扩展 +6. **持久化**:记忆和任务自动保存 +7. **用户隔离**:多用户数据完全隔离 + +## 下一步 + +1. **接入真实API**:配置真实的API密钥 +2. **开发自定义技能**:根据需求开发专属技能 +3. **优化人格**:调整人格配置以适应场景 +4. **扩展MCP服务器**:开发更多MCP服务器 +5. **性能调优**:根据实际使用情况调整参数 + +## 技术栈 + +- **Python 3.8+** +- **OpenAI SDK** - OpenAI API客户端 +- **Anthropic SDK** - Claude API客户端 +- **NumPy** - 向量计算 +- **asyncio** - 异步编程 + +## 许可证 + +MIT License + +--- + +**实现完成时间**:2024-03-02 +**版本**:v1.0.0 diff --git a/docs/AI_INTEGRATION_COMPLETE.md b/docs/AI_INTEGRATION_COMPLETE.md new file mode 100644 index 0000000..7592976 --- /dev/null +++ b/docs/AI_INTEGRATION_COMPLETE.md @@ -0,0 +1,138 @@ +# AI接入完成 ✅ + +## 🎉 接入状态 + +AI功能已成功接入QQ机器人! + +### ✅ 已完成的功能 + +1. **AI对话系统** - 使用 SiliconFlow DeepSeek-V3.2 模型 +2. **记忆系统** - 短期记忆 + 长期记忆 + RAG检索(Chroma向量数据库) +3. **人格系统** - 支持多种人格切换 +4. **Skills插件** - 已加载天气查询技能 +5. **MCP系统** - 文件系统访问服务器 + +### 📊 初始化日志 + +``` +✅ 嵌入模型初始化: openai/BAAI/bge-large-zh-v1.5 +✅ Chroma向量数据库初始化: data\ai\chroma_db +✅ AI客户端初始化完成: openai/Pro/deepseek-ai/DeepSeek-V3.2 +✅ 加载了 1 个技能 +✅ MCP系统初始化完成 +✅ AI系统初始化完成 +``` + +## 🚀 使用方法 + +### 基础对话 + +在QQ中@机器人发送消息: + +``` +@机器人 你好 +@机器人 今天天气怎么样? +@机器人 帮我写一段Python代码 +``` + +### 可用命令 + +| 命令 | 说明 | +|------|------| +| `/help` | 显示帮助信息 | +| `/clear` | 清除对话记忆 | +| `/personality` | 查看当前人格 | +| `/personality <名称>` | 切换人格 | +| `/skills` | 查看已加载的技能 | +| `/task <任务ID>` | 查看任务状态 | + +### 人格列表 + +- **default** - 友好的助手 +- **tech_expert** - 技术专家 +- **creative** - 创意伙伴 + +## 🔧 配置说明 + +当前配置(`.env`): + +```env +# AI主模型配置 +AI_PROVIDER=siliconflow +AI_MODEL=Pro/deepseek-ai/DeepSeek-V3.2 +AI_API_KEY=sk-znjpzcbvadzoijtvplcdjhwyrpwtvolfbyvnshjulrqsmbju +AI_API_BASE=https://api.siliconflow.cn/v1 + +# AI嵌入模型配置(用于RAG) +AI_EMBED_PROVIDER=siliconflow +AI_EMBED_MODEL=BAAI/bge-large-zh-v1.5 +AI_EMBED_API_BASE=https://api.siliconflow.cn/v1 +``` + +## 🐛 已修复的问题 + +1. ✅ **事件循环问题** - 修改为延迟初始化,在第一次收到消息时才初始化AI +2. ✅ **用户ID获取** - 添加了兼容不同消息类型的用户ID获取方法 + +## 📝 核心代码修改 + +### 1. `src/core/bot.py` + +```python +# 修改前 +from src.handlers.message_handler import MessageHandler + +# 修改后 +from src.handlers.message_handler_ai import MessageHandler +``` + +### 2. `src/handlers/message_handler_ai.py` + +关键改进: + +- **延迟初始化**:在第一次收到消息时才初始化AI系统 +- **用户ID兼容**:支持多种消息类型的用户ID获取 +- **错误处理**:完善的异常捕获和日志记录 + +```python +@staticmethod +def _get_user_id(message: Message) -> str: + """获取用户ID(兼容不同消息类型)""" + author = getattr(message, 'author', None) + if not author: + return 'unknown' + + # 尝试不同的ID字段 + return ( + getattr(author, 'id', None) or + getattr(author, 'user_openid', None) or + getattr(author, 'member_openid', None) or + getattr(author, 'union_openid', None) or + 'unknown' + ) +``` + +## 🎯 下一步建议 + +1. **测试对话功能** - 在QQ中@机器人测试各种对话 +2. **添加更多Skills** - 在 `skills/` 目录下添加自定义技能 +3. **调整人格** - 在 `data/ai/personalities.json` 中自定义人格 +4. **监控日志** - 观察 AI 的响应质量和性能 + +## 📚 相关文档 + +- [配置指南](docs/CONFIG_GUIDE.md) +- [AI快速开始](docs/AI_QUICKSTART.md) +- [完整文档](src/ai/docs/README.md) + +## 💡 提示 + +- 机器人会记住对话历史(短期记忆30分钟) +- 重要对话会自动保存到长期记忆 +- 使用 `/clear` 可以清除记忆重新开始 +- RAG检索会自动从历史对话中查找相关信息 + +--- + +**状态**: ✅ AI接入完成,可以正常使用! +**时间**: 2026-03-02 22:19 diff --git a/docs/AI_QUICKSTART.md b/docs/AI_QUICKSTART.md new file mode 100644 index 0000000..e1f5017 --- /dev/null +++ b/docs/AI_QUICKSTART.md @@ -0,0 +1,262 @@ +# AI模型接入快速开始 + +## 🚀 快速开始 + +### 1. 安装依赖 + +```bash +pip install -r requirements-ai.txt +``` + +### 2. 配置环境变量 + +复制 `.env.ai.example` 到 `.env` 并填入你的配置: + +```bash +cp .env.ai.example .env +``` + +编辑 `.env` 文件: + +```env +# 机器人配置 +BOT_APPID=你的机器人APPID +BOT_SECRET=你的机器人SECRET + +# AI配置 +AI_PROVIDER=openai # 可选: openai, anthropic, deepseek, qwen +AI_MODEL=gpt-4 +AI_API_KEY=你的API密钥 +AI_API_BASE=https://api.openai.com/v1 # 可选 +``` + +### 3. 启动机器人 + +```bash +python main.py +``` + +或使用启动脚本: + +```bash +# Windows +start.bat + +# Linux/Mac +./start.sh +``` + +## 📚 功能说明 + +### ✅ 已实现功能 + +1. **多模型支持** + - OpenAI (GPT-4, GPT-3.5等) + - Anthropic Claude + - DeepSeek + - Qwen (通义千问) + +2. **人格系统** + - 预设3种人格:默认助手、技术专家、创意伙伴 + - 支持自定义人格 + - 可动态切换 + +3. **记忆系统** + - 短期记忆:最近20条对话,30分钟过期 + - 长期记忆:重要对话持久化存储 + - RAG检索:基于向量相似度的智能检索 + +4. **长任务处理** + - 多步骤任务分解 + - 进度跟踪 + - 任务暂停/恢复/取消 + +5. **Skills插件系统** + - 可扩展的技能插件 + - 示例:天气查询技能 + - 支持热加载/卸载 + +6. **MCP支持** + - Model Context Protocol标准 + - 文件系统访问服务器 + - 可自定义MCP服务器 + +## 🎮 使用命令 + +在QQ中@机器人使用以下命令: + +### 基础命令 + +- `/help` - 显示帮助信息 +- `/clear` - 清除对话记忆 +- `/personality` - 查看当前人格 +- `/personality list` - 查看全部人格 +- `/personality set <key>` - 切换人格 +- `/personality add <key> <json或管道格式>` - 新增人格(角色扮演) +- `/personality remove <key>` - 删除人格 + +### 技能命令 + +- `/skills` - 查看已加载的技能 +- `/skills install <source> [skill_name]` - 从本地/网络安装并加载技能 +- `/skills uninstall <skill_name>` - 卸载技能 +- `/skills reload <skill_name>` - 重载技能 +- `/task <任务ID>` - 查看任务状态 + +`source` 支持: +- 本地技能名,如 `weather` +- URL(zip 包) +- GitHub 简写,如 `owner/repo` 或 `owner/repo#branch` + +### 对话示例 + +``` +用户: @机器人 你好 +机器人: 你好!我是小助手,很高兴为你服务。有什么我可以帮助你的吗? + +用户: @机器人 我喜欢编程 +机器人: 太好了!编程是一项很有趣的技能。你主要使用什么编程语言呢? + +用户: @机器人 /personality set tech_expert +机器人: ✅ 已切换到人格: tech_expert + +用户: @机器人 如何优化Python性能? +机器人: 从技术角度来看,Python性能优化可以从以下几个方面入手: +1. 使用内置函数和标准库 +2. 避免全局变量 +3. 使用列表推导式 +... +``` + +## 🔧 高级配置 + +### 自定义人格 + +编辑 `config/personalities.json`: + +```json +{ + "my_personality": { + "name": "我的人格", + "description": "描述", + "traits": ["FRIENDLY", "CREATIVE"], + "speaking_style": "说话风格", + "example_responses": ["示例1", "示例2"], + "custom_instructions": "特殊指令" + } +} +``` + +### 创建自定义技能 + +```bash +# 使用Python创建技能模板 +python -c "from src.ai.skills.base import create_skill_template; from pathlib import Path; create_skill_template('my_skill', Path('skills'))" +``` + +然后编辑 `skills/my_skill/main.py` 实现你的技能。 + +### 配置MCP服务器 + +编辑 `config/mcp.json`: + +```json +{ + "filesystem": { + "enabled": true, + "root_path": "data" + } +} +``` + +## 📖 详细文档 + +查看完整文档:[src/ai/README.md](src/ai/README.md) + +## 🐛 故障排查 + +### 问题1: AI功能不可用 + +**解决方案:** +1. 检查 `.env` 文件中的 `AI_API_KEY` 是否正确 +2. 检查网络连接 +3. 查看日志文件 `botpy.log` + +### 问题2: 技能加载失败 + +**解决方案:** +1. 检查 `skills/技能名/skill.json` 格式是否正确 +2. 确保 `main.py` 中有继承自 `Skill` 的类 +3. 查看日志中的错误信息 + +### 问题3: 记忆系统不工作 + +**解决方案:** +1. 确保 `data/ai` 目录有写入权限 +2. 检查是否在对话时设置了 `use_memory=True` +3. 查看 `data/ai/long_term_memory.json` 是否正常 + +## 🎯 最佳实践 + +1. **合理使用记忆** + - 重要对话会自动保存到长期记忆 + - 定期使用 `/clear` 清理短期记忆 + - 为重要信息添加关键词(如"重要"、"记住") + +2. **人格切换** + - 根据场景选择合适的人格 + - 技术问题用 `tech_expert` + - 创意讨论用 `creative` + - 日常对话用 `default` + +3. **技能开发** + - 保持技能功能单一 + - 提供清晰的工具描述 + - 处理异常情况 + +## 📊 性能优化 + +### 记忆系统优化 + +```python +# 调整短期记忆大小 +client.memory.short_term.max_size = 30 # 默认20 + +# 调整重要性阈值 +client.memory.importance_threshold = 0.7 # 默认0.6 +``` + +### 模型参数调整 + +```python +config = ModelConfig( + provider=ModelProvider.OPENAI, + model_name="gpt-4", + temperature=0.7, # 创造性 0-2 + max_tokens=4096, # 最大输出长度 + top_p=1.0, # 采样参数 +) +``` + +## 🔄 更新日志 + +### v1.0.0 (2024-03-02) +- ✅ 初始版本 +- ✅ 支持多种AI模型 +- ✅ 人格系统 +- ✅ 记忆系统(短期+长期+RAG) +- ✅ 长任务处理 +- ✅ Skills插件系统 +- ✅ MCP支持 + +## 📝 示例代码 + +查看 `examples/ai_example.py` 获取完整示例。 + +## 🤝 贡献 + +欢迎提交Issue和Pull Request! + +## 📄 许可证 + +MIT License diff --git a/docs/AI_SUMMARY.md b/docs/AI_SUMMARY.md new file mode 100644 index 0000000..9d91a02 --- /dev/null +++ b/docs/AI_SUMMARY.md @@ -0,0 +1,495 @@ +# AI模型接入系统 - 完整实现总结 + +## 🎉 实现完成 + +已成功实现完整的AI模型接入系统,包含所有要求的功能: + +### ✅ 核心功能 + +1. **AI模型接入** - 支持多种主流AI模型 +2. **Skills系统** - 可扩展的技能插件 +3. **MCP支持** - Model Context Protocol标准 +4. **人格系统** - 可自定义AI性格 +5. **记忆系统** - 短期+长期+RAG检索 +6. **长任务能力** - 多步骤任务处理 + +--- + +## 📁 文件清单 + +### 核心模块 + +``` +src/ai/ +├── __init__.py # 模块导出 +├── base.py # 基础类和接口 (117行) +├── client.py # AI客户端统一接口 (241行) +├── personality.py # 人格系统 (177行) +├── memory.py # 记忆系统 (307行) +├── task_manager.py # 长任务管理 (328行) +├── models/ +│ ├── __init__.py +│ ├── openai_model.py # OpenAI模型 (95行) +│ └── anthropic_model.py # Anthropic模型 (121行) +├── skills/ +│ ├── __init__.py +│ └── base.py # Skills框架 (234行) +└── mcp/ + ├── __init__.py + ├── base.py # MCP框架 (220行) + └── servers/ + ├── __init__.py + └── filesystem.py # 文件系统服务器 (124行) +``` + +### 配置和示例 + +``` +config/ +├── personalities.json # 人格配置 +└── mcp.json # MCP配置 + +skills/ +└── weather/ # 示例技能 + ├── skill.json + ├── main.py + └── README.md + +examples/ +└── ai_example.py # 完整使用示例 + +tests/ +└── test_ai.py # 功能测试 + +src/handlers/ +└── message_handler_ai.py # QQ机器人集成 +``` + +### 文档 + +``` +AI_QUICKSTART.md # 快速开始指南 +AI_IMPLEMENTATION.md # 实现总结 +src/ai/README.md # 完整文档 (546行) +requirements-ai.txt # 依赖包 +.env.ai.example # 配置示例 +``` + +--- + +## 🚀 快速开始 + +### 1. 安装依赖 + +```bash +pip install -r requirements-ai.txt +``` + +### 2. 配置环境变量 + +```bash +# 复制配置示例 +cp .env.ai.example .env + +# 编辑 .env 文件,填入你的配置 +AI_PROVIDER=openai +AI_MODEL=gpt-4 +AI_API_KEY=your_api_key_here +``` + +### 3. 运行测试 + +```bash +# 测试AI功能(不需要API密钥的部分) +python tests/test_ai.py + +# 运行完整示例(需要API密钥) +python examples/ai_example.py +``` + +### 4. 集成到QQ机器人 + +修改 `src/core/bot.py`: + +```python +# 将这行 +from src.handlers.message_handler import MessageHandler + +# 改为 +from src.handlers.message_handler_ai import MessageHandler +``` + +然后启动机器人: + +```bash +python main.py +``` + +--- + +## 💡 核心特性详解 + +### 1. AI模型接入 + +**支持的模型**: +- OpenAI (GPT-4, GPT-3.5-turbo等) +- Anthropic Claude (Claude-3.5-Sonnet等) +- DeepSeek (deepseek-chat) +- Qwen (通义千问) + +**特性**: +- 统一接口,轻松切换模型 +- 支持流式响应 +- 支持Function Calling +- 自动错误处理和重试 + +**使用示例**: +```python +from src.ai import AIClient +from src.ai.base import ModelConfig, ModelProvider + +config = ModelConfig( + provider=ModelProvider.OPENAI, + model_name="gpt-4", + api_key="your_key" +) + +client = AIClient(config) +response = await client.chat( + user_id="user123", + user_message="你好" +) +``` + +### 2. 人格系统 + +**预设人格**: +- `default` - 友好的助手 +- `tech_expert` - 技术专家 +- `creative` - 创意伙伴 + +**自定义人格**: +```python +from src.ai.personality import PersonalityProfile, PersonalityTrait + +profile = PersonalityProfile( + name="游戏助手", + description="专业的游戏顾问", + traits=[PersonalityTrait.FRIENDLY, PersonalityTrait.HUMOROUS], + speaking_style="活泼、热情", + example_responses=["哇!这个操作太秀了!"] +) + +client.personality.add_personality('gamer', profile) +client.set_personality('gamer') +``` + +### 3. 记忆系统 + +**短期记忆**: +- 滑动窗口(默认20条) +- 自动过期(默认30分钟) +- 按用户隔离 + +**长期记忆**: +- 自动评估重要性 +- 持久化存储 +- 支持向量检索(RAG) + +**重要性评估规则**: +- 内容长度 >100字符:+0.1分 +- 包含关键词("重要"、"记住"等):+0.2分 +- 是问题:+0.1分 +- 包含代码:+0.15分 +- 阈值:≥0.6分保存到长期记忆 + +**使用示例**: +```python +# 自动记忆 +response = await client.chat( + user_id="user123", + user_message="我喜欢编程", + use_memory=True # 自动保存和检索记忆 +) + +# 手动查询记忆 +short_term, long_term = await client.memory.get_context( + user_id="user123", + query="我们之前讨论过什么?" +) +``` + +### 4. 长任务处理 + +**功能**: +- 任务分解为多个步骤 +- 实时进度跟踪 +- 支持暂停/恢复/取消 +- 持久化存储 + +**使用示例**: +```python +# 注册动作处理器 +async def load_data(file_path: str): + # 实现数据加载 + return {"rows": 1000} + +client.task_manager.register_action("load_data", load_data) + +# 创建任务 +task_id = await client.create_long_task( + user_id="user123", + title="数据分析", + description="分析用户数据", + steps=[ + { + "description": "加载数据", + "action": "load_data", + "params": {"file_path": "data.csv"} + }, + # 更多步骤... + ] +) + +# 启动任务 +async def on_progress(task_id, progress, message): + print(f"{progress*100:.0f}% - {message}") + +await client.start_task(task_id, progress_callback=on_progress) +``` + +### 5. Skills插件系统 + +**创建技能**: +```python +from src.ai.skills.base import Skill + +class MySkill(Skill): + async def initialize(self): + self.register_tool("my_tool", self.my_tool) + + async def my_tool(self, param: str) -> str: + return f"处理: {param}" +``` + +**加载技能**: +```python +from src.ai.skills import SkillsManager + +manager = SkillsManager(Path("skills")) +await manager.load_skill("weather") + +# 获取所有工具 +tools = manager.get_all_tools() +``` + +### 6. MCP支持 + +**内置服务器**: +- 文件系统访问服务器 + +**自定义服务器**: +```python +from src.ai.mcp.base import MCPServer + +class MyMCPServer(MCPServer): + def __init__(self): + super().__init__(name="my_server", version="1.0.0") + + async def initialize(self): + self.register_tool( + name="my_tool", + description="我的工具", + input_schema={...}, + handler=self.my_handler + ) +``` + +--- + +## 🎮 QQ机器人命令 + +在QQ中@机器人使用: + +### 基础命令 +- `/help` - 显示帮助 +- `/clear` - 清除记忆 +- `/personality` - 查看当前人格 +- `/personality <名称>` - 切换人格 + +### 技能命令 +- `/skills` - 查看已加载技能 +- `/task <ID>` - 查看任务状态 + +### 对话示例 +``` +用户: @机器人 你好 +机器人: 你好!我是小助手,很高兴为你服务。 + +用户: @机器人 我喜欢编程 +机器人: 太好了!编程是一项很有趣的技能... + +用户: @机器人 /personality tech_expert +机器人: ✅ 已切换到人格: tech_expert + +用户: @机器人 如何优化Python性能? +机器人: 从技术角度来看,Python性能优化可以从以下几个方面入手... +``` + +--- + +## 📊 代码统计 + +### 核心代码 +- **总行数**:约2,500行 +- **模块数**:15个 +- **类数**:30+个 +- **函数数**:100+个 + +### 文档 +- **文档行数**:约1,500行 +- **示例代码**:3个完整示例 +- **测试用例**:6个测试函数 + +--- + +## 🔧 技术架构 + +### 设计模式 +- **工厂模式**:模型创建 +- **策略模式**:不同AI提供商 +- **观察者模式**:任务进度回调 +- **插件模式**:Skills系统 +- **适配器模式**:MCP服务器 + +### 核心技术 +- **异步编程**:全异步实现 +- **类型提示**:完整类型注解 +- **依赖注入**:松耦合设计 +- **配置管理**:JSON配置文件 +- **持久化**:JSON文件存储 + +--- + +## 🎯 使用场景 + +### 1. 智能客服 +- 使用记忆系统记住用户信息 +- 使用人格系统提供友好服务 +- 使用Skills扩展业务功能 + +### 2. 技术助手 +- 切换到tech_expert人格 +- 使用长任务处理复杂问题 +- 使用MCP访问代码库 + +### 3. 创意伙伴 +- 切换到creative人格 +- 使用记忆系统保持创意连贯性 +- 使用Skills生成内容 + +--- + +## 📈 性能优化建议 + +### 1. 记忆系统 +```python +# 调整短期记忆大小 +client.memory.short_term.max_size = 30 + +# 调整重要性阈值 +client.memory.importance_threshold = 0.7 +``` + +### 2. 模型参数 +```python +config = ModelConfig( + temperature=0.7, # 创造性 + max_tokens=4096, # 输出长度 + top_p=1.0, # 采样 +) +``` + +### 3. 并发处理 +```python +# 并发执行多个任务 +tasks = [client.start_task(tid) for tid in task_ids] +await asyncio.gather(*tasks) +``` + +--- + +## 🐛 故障排查 + +### 常见问题 + +**1. API调用失败** +- 检查API密钥 +- 检查网络连接 +- 查看日志文件 + +**2. 记忆不工作** +- 确保 `use_memory=True` +- 检查数据目录权限 +- 查看 `data/ai/long_term_memory.json` + +**3. 技能加载失败** +- 检查 `skill.json` 格式 +- 确保有Skill子类 +- 查看错误日志 + +--- + +## 📚 学习资源 + +### 文档 +- `AI_QUICKSTART.md` - 快速开始 +- `src/ai/README.md` - 完整文档 +- `AI_IMPLEMENTATION.md` - 实现总结 + +### 示例 +- `examples/ai_example.py` - 完整示例 +- `tests/test_ai.py` - 测试用例 +- `skills/weather/` - 技能示例 + +--- + +## 🔄 后续扩展 + +### 建议功能 +1. **更多模型支持**:本地模型、其他云服务 +2. **高级记忆**:图数据库、向量数据库 +3. **多模态**:图像、语音支持 +4. **分布式**:多实例协作 +5. **监控面板**:Web管理界面 + +### 技能开发 +1. **搜索技能**:网络搜索、知识库搜索 +2. **工具技能**:计算器、翻译、代码执行 +3. **娱乐技能**:游戏、音乐、图片生成 +4. **业务技能**:订单查询、数据分析 + +--- + +## ✨ 总结 + +这是一个**生产级**的AI模型接入系统,具有: + +- ✅ **完整功能**:所有要求的功能都已实现 +- ✅ **模块化设计**:易于维护和扩展 +- ✅ **高性能**:全异步,支持并发 +- ✅ **易用性**:清晰的API,丰富的文档 +- ✅ **可扩展**:Skills和MCP支持无限扩展 +- ✅ **生产就绪**:完善的错误处理和日志 + +**立即开始使用**:查看 `AI_QUICKSTART.md` + +**深入学习**:阅读 `src/ai/README.md` + +**实践练习**:运行 `examples/ai_example.py` + +--- + +**实现时间**:2024-03-02 +**版本**:v1.0.0 +**许可证**:MIT License diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md new file mode 100644 index 0000000..c6f6385 --- /dev/null +++ b/docs/CHANGELOG.md @@ -0,0 +1,210 @@ +# 更新说明 - v1.0.1 + +## 🔄 本次更新内容 + +### 1. ✅ 统一配置管理 + +**问题**:之前AI配置分散在多个文件中 +**解决**:所有配置现在统一在 `.env` 文件中管理 + +**更新的文件**: +- `.env.example` - 添加了完整的AI配置项 +- `src/core/config.py` - 添加了AI嵌入模型配置 +- 删除了 `.env.ai.example`(已合并到 `.env.example`) + +### 2. ✅ 文档结构优化 + +**问题**:文档散落在项目根目录 +**解决**:所有文档移动到对应的 `docs` 目录 + +**新的文档结构**: +``` +docs/ +├── README.md # 文档索引(新增) +├── CONFIG_GUIDE.md # 配置指南(新增) +├── AI_QUICKSTART.md # 快速开始 +├── AI_IMPLEMENTATION.md # 实现总结 +└── AI_SUMMARY.md # 功能总结 + +src/ai/docs/ +└── README.md # 完整文档 + +skills/docs/ +└── (技能相关文档) +``` + +### 3. ✅ RAG嵌入模型配置 + +**问题**:RAG功能需要嵌入模型,但没有配置选项 +**解决**:添加了独立的嵌入模型配置 + +**新增配置项**: +```env +# AI嵌入模型配置(用于RAG记忆检索) +AI_EMBED_PROVIDER=openai +AI_EMBED_MODEL=text-embedding-3-small +AI_EMBED_API_KEY= # 留空则使用 AI_API_KEY +AI_EMBED_API_BASE= # 留空则使用 AI_API_BASE +``` + +**更新的文件**: +- `src/ai/client.py` - 支持独立的嵌入模型配置 +- `src/handlers/message_handler_ai.py` - 传递嵌入模型配置 + +**工作原理**: +1. 如果配置了嵌入模型,优先使用独立的嵌入模型 +2. 如果没有配置,尝试使用主模型的嵌入功能 +3. 如果主模型不支持(如Claude),RAG功能降级为基于重要性的检索 + +## 📝 配置示例 + +### 完整配置(推荐) + +```env +# QQ机器人配置 +BOT_APPID=你的机器人APPID +BOT_SECRET=你的机器人SECRET + +# AI主模型 +AI_PROVIDER=openai +AI_MODEL=gpt-4 +AI_API_KEY=sk-xxx + +# AI嵌入模型(用于RAG) +AI_EMBED_PROVIDER=openai +AI_EMBED_MODEL=text-embedding-3-small +AI_EMBED_API_KEY= # 留空使用主模型的key +``` + +### 使用Claude + OpenAI嵌入 + +```env +# 主模型(Claude) +AI_PROVIDER=anthropic +AI_MODEL=claude-3-5-sonnet-20241022 +AI_API_KEY=sk-ant-xxx + +# 嵌入模型(OpenAI) +AI_EMBED_PROVIDER=openai +AI_EMBED_MODEL=text-embedding-3-small +AI_EMBED_API_KEY=sk-xxx # 需要单独的OpenAI key +``` + +### 最简配置(不使用RAG) + +```env +# 只配置主模型 +AI_PROVIDER=openai +AI_MODEL=gpt-4 +AI_API_KEY=sk-xxx + +# 不配置嵌入模型,RAG功能会降级 +``` + +## 🚀 如何更新 + +### 1. 更新配置文件 + +```bash +# 备份现有配置 +cp .env .env.backup + +# 查看新的配置模板 +cat .env.example + +# 手动添加嵌入模型配置到 .env +``` + +在 `.env` 文件中添加: +```env +# AI嵌入模型配置(用于RAG记忆检索) +AI_EMBED_PROVIDER=openai +AI_EMBED_MODEL=text-embedding-3-small +AI_EMBED_API_KEY= +AI_EMBED_API_BASE= +``` + +### 2. 查看新文档 + +```bash +# 查看文档索引 +cat docs/README.md + +# 查看配置指南 +cat docs/CONFIG_GUIDE.md +``` + +### 3. 重启机器人 + +```bash +python main.py +``` + +查看日志确认配置成功: +``` +✅ AI配置: openai/gpt-4 +✅ 嵌入模型初始化: openai/text-embedding-3-small +✅ AI客户端初始化完成: openai/gpt-4 +``` + +## 📚 文档导航 + +- **配置说明**:`docs/CONFIG_GUIDE.md` ⭐ 重要! +- **快速开始**:`docs/AI_QUICKSTART.md` +- **完整文档**:`src/ai/docs/README.md` +- **文档索引**:`docs/README.md` + +## ⚠️ 注意事项 + +1. **嵌入模型是可选的** + - 如果不配置,系统会尝试使用主模型的嵌入功能 + - 如果主模型不支持,RAG功能会降级但不影响基本使用 + +2. **Claude用户需要额外配置** + - Claude不提供嵌入API + - 建议配置OpenAI的嵌入模型作为补充 + +3. **配置文件位置** + - 所有配置都在 `.env` 文件中 + - 不再需要 `.env.ai.example` + +## 🐛 问题排查 + +### 问题1: 找不到嵌入模型配置 + +**解决**:检查 `.env` 文件是否包含 `AI_EMBED_*` 配置项 + +### 问题2: RAG功能不工作 + +**解决**: +1. 检查是否配置了嵌入模型 +2. 查看日志是否有 "嵌入模型初始化" 的提示 +3. 如果没有配置,RAG会降级为基于重要性的检索 + +### 问题3: 文档找不到了 + +**解决**:文档已移动到 `docs/` 目录,查看 `docs/README.md` 获取索引 + +## 📊 版本对比 + +| 功能 | v1.0.0 | v1.0.1 | +|------|--------|--------| +| 配置文件 | 分散 | 统一在.env | +| 文档位置 | 根目录 | docs目录 | +| RAG嵌入模型 | 未配置 | 可配置 | +| 配置指南 | 无 | 新增 | + +## 🎉 总结 + +本次更新主要解决了三个问题: +1. ✅ 配置统一管理 +2. ✅ 文档结构优化 +3. ✅ RAG嵌入模型支持 + +所有功能保持向后兼容,现有配置无需修改即可继续使用! + +--- + +**更新时间**:2024-03-02 +**版本**:v1.0.1 +**上一版本**:v1.0.0 diff --git a/docs/CONFIG_GUIDE.md b/docs/CONFIG_GUIDE.md new file mode 100644 index 0000000..14e1877 --- /dev/null +++ b/docs/CONFIG_GUIDE.md @@ -0,0 +1,226 @@ +# AI模型接入系统 - 配置说明 + +## 📋 配置文件说明 + +所有配置都在 `.env` 文件中统一管理。 + +### 1. 基础配置 + +```env +# QQ机器人配置 +BOT_APPID=你的机器人APPID +BOT_SECRET=你的机器人SECRET + +# 日志配置 +LOG_LEVEL=INFO + +# 沙箱模式 +SANDBOX_MODE=False +``` + +### 2. AI主模型配置 + +```env +# AI主模型配置 +AI_PROVIDER=openai # 可选: openai, anthropic, deepseek, qwen +AI_MODEL=gpt-4 +AI_API_KEY=你的API密钥 +AI_API_BASE=https://api.openai.com/v1 # 可选 +``` + +**支持的模型提供商**: +- `openai` - OpenAI (GPT-4, GPT-3.5-turbo等) +- `anthropic` - Anthropic Claude +- `deepseek` - DeepSeek +- `qwen` - 通义千问 + +### 3. AI嵌入模型配置(用于RAG) + +```env +# AI嵌入模型配置(用于RAG记忆检索) +AI_EMBED_PROVIDER=openai # 可选: openai, deepseek, qwen +AI_EMBED_MODEL=text-embedding-3-small +AI_EMBED_API_KEY= # 留空则使用 AI_API_KEY +AI_EMBED_API_BASE= # 留空则使用 AI_API_BASE + +# 向量数据库配置 +AI_USE_VECTOR_DB=true # 是否使用Chroma向量数据库(推荐),false则使用JSON存储 +``` + +**为什么需要嵌入模型?** + +嵌入模型用于将文本转换为向量,实现RAG(检索增强生成)功能: +- 长期记忆的向量检索 +- 相似对话的智能查找 +- 上下文相关性匹配 + + +**向量数据库配置**: + +系统支持两种存储方式: +1. **Chroma向量数据库**(推荐):专业的向量存储,支持高效检索和持久化 +2. **JSON文件存储**:简单的文件存储,适合测试和小规模使用 + +```env +AI_USE_VECTOR_DB=true # 使用Chroma(推荐) +# AI_USE_VECTOR_DB=false # 使用JSON存储 +``` + +**数据迁移**: + +如果你之前使用JSON存储,现在想切换到Chroma,可以使用迁移工具: + +```bash +# 预览迁移(不实际执行) +python -m src.ai.migrate_data --dry-run + +# 执行迁移 +python -m src.ai.migrate_data +``` + +**嵌入模型配置说明**: + + +1. **使用OpenAI嵌入模型**(推荐): +```env +AI_EMBED_PROVIDER=openai +AI_EMBED_MODEL=text-embedding-3-small # 或 text-embedding-3-large +AI_EMBED_API_KEY= # 留空使用主模型的key +``` + +2. **使用DeepSeek嵌入模型**: +```env +AI_EMBED_PROVIDER=deepseek +AI_EMBED_MODEL=deepseek-chat # DeepSeek使用同一个模型 +AI_EMBED_API_KEY= # 留空使用主模型的key +``` + +3. **不配置嵌入模型**: +- 如果不配置,系统会尝试使用主模型的嵌入功能 +- 如果主模型不支持(如Claude),RAG功能将降级为基于重要性的检索 + +## 🔧 配置示例 + +### 示例1: 使用OpenAI(推荐) + +```env +# 主模型 +AI_PROVIDER=openai +AI_MODEL=gpt-4 +AI_API_KEY=sk-xxx + +# 嵌入模型(使用OpenAI的嵌入模型) +AI_EMBED_PROVIDER=openai +AI_EMBED_MODEL=text-embedding-3-small +AI_EMBED_API_KEY= # 留空,使用主模型的key +``` + +### 示例2: 使用Claude + OpenAI嵌入 + +```env +# 主模型(Claude) +AI_PROVIDER=anthropic +AI_MODEL=claude-3-5-sonnet-20241022 +AI_API_KEY=sk-ant-xxx + +# 嵌入模型(OpenAI,因为Claude不提供嵌入) +AI_EMBED_PROVIDER=openai +AI_EMBED_MODEL=text-embedding-3-small +AI_EMBED_API_KEY=sk-xxx # 需要单独的OpenAI key +``` + +### 示例3: 使用DeepSeek + +```env +# 主模型 +AI_PROVIDER=deepseek +AI_MODEL=deepseek-chat +AI_API_KEY=sk-xxx +AI_API_BASE=https://api.deepseek.com/v1 + +# 嵌入模型(使用同一个DeepSeek模型) +AI_EMBED_PROVIDER=deepseek +AI_EMBED_MODEL=deepseek-chat +AI_EMBED_API_KEY= # 留空,使用主模型的key +AI_EMBED_API_BASE= # 留空,使用主模型的base +``` + +### 示例4: 不使用RAG(最简配置) + +```env +# 只配置主模型,不配置嵌入模型 +AI_PROVIDER=openai +AI_MODEL=gpt-4 +AI_API_KEY=sk-xxx + +# 不配置嵌入模型 +# AI_EMBED_PROVIDER= +# AI_EMBED_MODEL= +``` + +这种情况下,记忆系统会降级为基于重要性的检索,不使用向量相似度。 + +## 📊 嵌入模型对比 + +| 模型 | 提供商 | 维度 | 性能 | 成本 | +|------|--------|------|------|------| +| text-embedding-3-small | OpenAI | 1536 | 快 | 低 | +| text-embedding-3-large | OpenAI | 3072 | 慢 | 高 | +| deepseek-chat | DeepSeek | - | 中 | 低 | + +**推荐**: +- 一般使用:`text-embedding-3-small` +- 高精度需求:`text-embedding-3-large` +- 成本敏感:使用主模型的嵌入功能或不使用RAG + +## ⚙️ 高级配置 + +### 自定义API地址 + +```env +# 使用代理或自建服务 +AI_API_BASE=https://your-proxy.com/v1 +AI_EMBED_API_BASE=https://your-proxy.com/v1 +``` + +### 使用不同的API密钥 + +```env +# 主模型使用一个key +AI_API_KEY=sk-main-xxx + +# 嵌入模型使用另一个key +AI_EMBED_API_KEY=sk-embed-xxx +``` + +## 🔍 验证配置 + +启动机器人后,查看日志: + +``` +✅ AI配置: openai/gpt-4 +✅ 嵌入模型初始化: openai/text-embedding-3-small +✅ AI客户端初始化完成: openai/gpt-4 +``` + +如果看到这些日志,说明配置成功! + +## ❓ 常见问题 + +**Q: 必须配置嵌入模型吗?** +A: 不是必须的。如果不配置,RAG功能会降级,但基本功能仍可用。 + +**Q: Claude不支持嵌入怎么办?** +A: 配置OpenAI的嵌入模型作为补充,或者不使用RAG功能。 + +**Q: 嵌入模型可以和主模型不同吗?** +A: 可以!推荐使用OpenAI的嵌入模型,即使主模型是其他提供商。 + +**Q: 如何降低成本?** +A: 使用 `text-embedding-3-small` 或不配置嵌入模型。 + +## 📚 相关文档 + +- [快速开始](AI_QUICKSTART.md) +- [完整文档](../src/ai/docs/README.md) +- [实现总结](AI_IMPLEMENTATION.md) diff --git a/docs/FIXES.md b/docs/FIXES.md new file mode 100644 index 0000000..d5f551b --- /dev/null +++ b/docs/FIXES.md @@ -0,0 +1,148 @@ +# 修复说明 + +## 已修复的问题 + +### 1. 日志文件位置问题 ✅ + +**问题**: `botpy.log` 文件保存在项目根目录,而不是 `logs/` 文件夹中 + +**解决方案**: +- 已删除根目录的 `botpy.log` 文件 +- 日志配置 (`src/utils/logger.py`) 已正确设置为保存到 `logs/` 文件夹 +- `.gitignore` 已包含 `logs/` 和 `*.log` 规则 + +**结果**: 所有日志文件现在都会保存在 `logs/` 文件夹中 + +--- + +### 2. Intent 配置错误 (错误码 4014) ✅ + +**问题**: +``` +[botpy] 关闭, 返回码: 4014, 返回信息: disallowed intents +``` + +**原因**: +- 使用了错误的 intents 初始化方式 +- 尝试启用了未授权的权限(如 `direct_message`, `public_messages`) + +**解决方案**: +修改 `src/core/bot.py` 中的 intents 配置: + +```python +# 旧代码(错误) +intents = botpy.Intents( + public_guild_messages=True, + direct_message=True, +) + +# 新代码(正确) +intents = botpy.Intents.none() +intents.public_guild_messages = True # 频道公域消息(@机器人) +``` + +**说明**: +- `Intents.none()` 创建一个空的 intents 对象 +- 只启用 `public_guild_messages`(频道公域消息),这是默认权限 +- 其他权限(如群聊、私聊)需要在 QQ 开放平台申请后才能启用 + +--- + +### 3. 导入错误修复 ✅ + +**问题**: +``` +ImportError: cannot import name 'setup_logger' from 'logger' +``` + +**原因**: +- `from logger import setup_logger` 导入了第三方包而不是本地模块 + +**解决方案**: +修改 `src/handlers/message_handler.py`: + +```python +# 旧代码 +from logger import setup_logger + +# 新代码 +from src.utils.logger import setup_logger +``` + +--- + +## 如何测试 + +1. 运行启动脚本: +```bash +start.bat +``` + +2. 检查日志: +```bash +# 查看日志文件夹 +dir logs + +# 查看最新日志 +type logs\bot.log +``` + +3. 预期输出: +``` +✅ 配置验证通过 +✅ Intents 配置完成 +🚀 正在启动机器人... +[botpy] 登录机器人账号中... +[botpy] 程序启动... +🤖 机器人已启动: [机器人名称] (ID: [机器人ID]) +``` + +--- + +## 注意事项 + +### 关于权限申请 + +如果需要支持以下功能,需要在 QQ 开放平台申请相应权限: + +1. **群聊@消息** - 需要申请 `GROUP_AND_C2C_EVENT` 权限 +2. **私聊消息** - 需要申请 `GROUP_AND_C2C_EVENT` 权限 +3. **频道私信** - 需要申请 `DIRECT_MESSAGE` 权限 + +申请地址: https://bot.q.qq.com/ + +### 当前支持的功能 + +使用默认权限(`public_guild_messages`),机器人可以: +- ✅ 接收频道中 @机器人 的消息 +- ✅ 在频道中回复消息 +- ✅ 响应基本命令(/help, /ping, /info) + +--- + +## 文件结构 + +``` +QQbot/ +├── logs/ # 日志文件夹(新) +│ └── bot.log # 应用日志 +├── src/ +│ ├── core/ +│ │ ├── bot.py # 已修复 intents 配置 +│ │ └── config.py +│ ├── handlers/ +│ │ └── message_handler.py # 已修复导入 +│ └── utils/ +│ └── logger.py # 日志配置 +├── .env # 配置文件 +├── .gitignore # 已包含 logs/ +└── start.bat # 启动脚本 +``` + +--- + +## 更新日志 + +- 2026-03-02: 修复 intents 配置错误(4014) +- 2026-03-02: 修复日志文件位置 +- 2026-03-02: 修复 logger 导入错误 diff --git a/docs/PROJECT_REFACTOR.md b/docs/PROJECT_REFACTOR.md new file mode 100644 index 0000000..0964e05 --- /dev/null +++ b/docs/PROJECT_REFACTOR.md @@ -0,0 +1,68 @@ +# 项目结构整理完成 + +## 整理内容 + +### ✅ 已完成的工作 + +1. **重构目录结构** + - 创建 `src/` 源代码目录 + - 按功能模块划分:`core/`、`handlers/`、`utils/` + - 预留 `ai/` 目录用于后续AI集成 + - 创建 `logs/` 和 `data/` 目录 + +2. **清理冗余文件** + - 删除 `start.sh`(Linux启动脚本,项目在Windows环境) + - 删除 `start_simple.bat`(简化版启动脚本) + - 移除 `colorlog` 依赖(未使用) + +3. **优化核心文件** + - 创建统一入口 `main.py` + - 更新 `start.bat` 启动脚本 + - 简化 `requirements.txt`(只保留必需依赖) + - 优化日志模块(日志文件统一存放到 `logs/` 目录) + +4. **完善项目文档** + - 更新 `README.md`(包含新的项目结构说明) + - 更新 `.gitignore`(添加日志和数据目录) + - 为 AI 模块创建规划文档 + +5. **模块化改造** + - 为所有模块添加 `__init__.py` + - 统一导入路径 + - 保持代码整洁和可维护性 + +## 新的项目结构 + +``` +QQbot/ +├── src/ # 源代码 +│ ├── core/ # 核心模块(bot、config) +│ ├── handlers/ # 消息处理器 +│ ├── utils/ # 工具模块(logger) +│ └── ai/ # AI模块(预留) +├── logs/ # 日志文件 +├── data/ # 数据文件 +├── main.py # 程序入口 +├── start.bat # 启动脚本 +└── requirements.txt # 依赖列表 +``` + +## 后续AI接入建议 + +在 `src/ai/` 目录下可以创建: +- `client.py` - AI客户端封装 +- `prompts.py` - 提示词管理 +- `context.py` - 对话上下文管理 +- `models/` - 不同AI模型的配置 + +## 启动方式 + +```bash +# Windows +start.bat + +# 或直接运行 +python main.py +``` + +项目现在更加整洁、模块化,便于后续扩展和维护! diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..aca6807 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,51 @@ +# AI模型接入系统 - 文档索引 + +## 📚 文档列表 + +### 快速开始 +- [配置指南](CONFIG_GUIDE.md) - **从这里开始!** 详细的配置说明 +- [快速开始](AI_QUICKSTART.md) - 5分钟快速上手 + +### 详细文档 +- [完整文档](../src/ai/docs/README.md) - 所有功能的详细说明 +- [实现总结](AI_IMPLEMENTATION.md) - 技术实现细节 +- [功能总结](AI_SUMMARY.md) - 功能概览 + +## 🎯 根据需求选择文档 + +### 我是新手,想快速开始 +1. 先看 [配置指南](CONFIG_GUIDE.md) 了解如何配置 +2. 再看 [快速开始](AI_QUICKSTART.md) 运行第一个示例 + +### 我想了解所有功能 +查看 [完整文档](../src/ai/docs/README.md) + +### 我想了解技术实现 +查看 [实现总结](AI_IMPLEMENTATION.md) + +### 我想快速了解有哪些功能 +查看 [功能总结](AI_SUMMARY.md) + +## 📁 目录结构 + +``` +docs/ +├── README.md # 本文件 - 文档索引 +├── CONFIG_GUIDE.md # 配置指南(重要!) +├── AI_QUICKSTART.md # 快速开始 +├── AI_IMPLEMENTATION.md # 实现总结 +└── AI_SUMMARY.md # 功能总结 + +src/ai/docs/ +└── README.md # 完整文档 + +skills/docs/ +└── (技能相关文档) +``` + +## 🔗 外部资源 + +- [OpenAI API文档](https://platform.openai.com/docs) +- [Anthropic API文档](https://docs.anthropic.com) +- [DeepSeek API文档](https://platform.deepseek.com/docs) +- [QQ机器人文档](https://bot.q.qq.com/wiki/) diff --git a/docs/README_INDEX.md b/docs/README_INDEX.md new file mode 100644 index 0000000..6d57643 --- /dev/null +++ b/docs/README_INDEX.md @@ -0,0 +1,21 @@ +# 文档目录 + +本目录包含项目的所有文档。 + +## 文档列表 + +- [README.md](./README.md) - 项目完整说明文档 +- [PROJECT_REFACTOR.md](./PROJECT_REFACTOR.md) - 项目结构整理记录 +- [AGENTS.md](./AGENTS.md) - AI技能配置说明 + +## 快速导航 + +### 新手入门 +1. 查看 [README.md](./README.md) 了解项目基本信息 +2. 按照文档配置环境和机器人 +3. 运行 `start.bat` 启动机器人 + +### 开发者 +- 项目结构说明:[PROJECT_REFACTOR.md](./PROJECT_REFACTOR.md) +- AI集成规划:查看 `src/ai/README.md` +- 技能配置:[AGENTS.md](./AGENTS.md) diff --git a/examples/ai_example.py b/examples/ai_example.py new file mode 100644 index 0000000..ab95a68 --- /dev/null +++ b/examples/ai_example.py @@ -0,0 +1,156 @@ +""" +AI配置示例 +""" +from pathlib import Path +from src.ai import AIClient +from src.ai.base import ModelConfig, ModelProvider +from src.ai.skills import SkillsManager +from src.ai.mcp import MCPManager +from src.ai.mcp.servers import FileSystemMCPServer + + +async def setup_ai_client(): + """设置AI客户端""" + + # 1. 创建模型配置 + config = ModelConfig( + provider=ModelProvider.OPENAI, + model_name="gpt-4", + api_key="your_api_key_here", + temperature=0.7, + max_tokens=4096 + ) + + # 2. 初始化AI客户端 + client = AIClient(config, data_dir=Path("data/ai")) + + # 3. 设置人格 + client.set_personality("default") + + # 4. 加载Skills + skills_manager = SkillsManager(Path("skills")) + await skills_manager.load_all_skills() + + # 将Skills的工具注册到AI客户端 + for tool_name, tool_func in skills_manager.get_all_tools().items(): + # 解析工具名称和描述 + parts = tool_name.split('.') + if len(parts) == 2: + skill_name, func_name = parts + client.register_tool( + name=tool_name, + description=f"{skill_name}技能的{func_name}工具", + parameters={ + "type": "object", + "properties": {}, + "required": [] + }, + function=tool_func + ) + + # 5. 设置MCP + mcp_manager = MCPManager(Path("config/mcp.json")) + + # 注册文件系统服务器 + fs_server = FileSystemMCPServer(root_path=Path("data")) + await mcp_manager.register_server(fs_server) + + # 获取MCP工具并注册到AI客户端 + mcp_tools = await mcp_manager.get_all_tools_for_ai() + for tool in mcp_tools: + func_info = tool['function'] + + # 创建工具执行函数 + async def execute_mcp_tool(**kwargs): + return await mcp_manager.execute_tool(func_info['name'], kwargs) + + client.register_tool( + name=func_info['name'], + description=func_info['description'], + parameters=func_info['parameters'], + function=execute_mcp_tool + ) + + return client + + +async def example_usage(): + """使用示例""" + + # 设置客户端 + client = await setup_ai_client() + + # 示例1: 基础对话 + print("=== 示例1: 基础对话 ===") + response = await client.chat( + user_id="user123", + user_message="你好,介绍一下你自己", + use_memory=True + ) + print(f"AI: {response}\n") + + # 示例2: 使用记忆 + print("=== 示例2: 使用记忆 ===") + await client.chat( + user_id="user123", + user_message="我喜欢编程,特别是Python", + use_memory=True + ) + + response = await client.chat( + user_id="user123", + user_message="我刚才说我喜欢什么?", + use_memory=True + ) + print(f"AI: {response}\n") + + # 示例3: 切换人格 + print("=== 示例3: 切换人格 ===") + client.set_personality("tech_expert") + response = await client.chat( + user_id="user123", + user_message="如何优化Python代码性能?", + use_memory=False + ) + print(f"AI (技术专家): {response}\n") + + # 示例4: 创建长任务 + print("=== 示例4: 创建长任务 ===") + + # 注册任务动作 + async def step1(): + print("执行步骤1...") + return "步骤1完成" + + async def step2(): + print("执行步骤2...") + return "步骤2完成" + + client.task_manager.register_action("step1", step1) + client.task_manager.register_action("step2", step2) + + # 创建任务 + task_id = await client.create_long_task( + user_id="user123", + title="测试任务", + description="测试长任务功能", + steps=[ + {"description": "第一步", "action": "step1", "params": {}}, + {"description": "第二步", "action": "step2", "params": {}} + ] + ) + + # 执行任务 + async def on_progress(tid, progress, message): + print(f"进度: {progress*100:.0f}% - {message}") + + await client.start_task(task_id, progress_callback=on_progress) + + # 查询状态 + status = client.get_task_status(task_id) + print(f"任务状态: {status}\n") + + +if __name__ == "__main__": + import asyncio + asyncio.run(example_usage()) diff --git a/main.py b/main.py new file mode 100644 index 0000000..70c6e94 --- /dev/null +++ b/main.py @@ -0,0 +1,42 @@ +""" +QQ机器人主入口 +""" +import sys +from pathlib import Path + +# 添加项目根目录到Python路径 +project_root = Path(__file__).parent +sys.path.insert(0, str(project_root)) + +from src.core.bot import MyClient, build_intents +from src.core.config import Config +from src.utils.logger import setup_logger + + +def main(): + """主函数""" + # 设置日志 + logger = setup_logger() + + try: + # 验证配置 + Config.validate() + logger.info("配置验证通过") + + # 创建并启动机器人(最小权限,避免 4014 disallowed intents) + logger.info("正在启动QQ机器人...") + intents = build_intents() + client = MyClient(intents=intents) + client.run(appid=Config.BOT_APPID, secret=Config.BOT_SECRET) + + except ValueError as e: + logger.error(f"配置错误: {e}") + logger.error("请检查 .env 文件配置") + sys.exit(1) + except Exception as e: + logger.error(f"启动失败: {e}", exc_info=True) + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..6a7141f --- /dev/null +++ b/pytest.ini @@ -0,0 +1,4 @@ +[pytest] +testpaths = tests +norecursedirs = pytest-cache-files-* +addopts = -p no:cacheprovider diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..8a01ddf --- /dev/null +++ b/requirements.txt @@ -0,0 +1,14 @@ +# ============================================ +# 核心依赖(必须安装) +# ============================================ +qq-botpy +python-dotenv>=1.0.0 + +# ============================================ +# AI 功能依赖(可选) +# 如果不需要 AI 对话功能,可以注释掉下面的依赖 +# ============================================ +openai>=1.0.0 +anthropic>=0.18.0 +numpy>=1.24.0 +chromadb>=0.4.0 # 向量数据库,用于记忆存储 diff --git a/scripts/migrate_to_vector_db.py b/scripts/migrate_to_vector_db.py new file mode 100644 index 0000000..a1b0c1c --- /dev/null +++ b/scripts/migrate_to_vector_db.py @@ -0,0 +1,206 @@ +""" +数据迁移工具 - 从JSON迁移到Chroma向量数据库 +""" +import asyncio +import json +from pathlib import Path +from datetime import datetime +from src.ai.vector_store import ChromaVectorStore, JSONVectorStore, VectorMemory +from src.utils.logger import setup_logger + +logger = setup_logger('DataMigration') + + +async def migrate_json_to_chroma( + json_path: Path, + chroma_path: Path, + dry_run: bool = False +): + """ + 从JSON迁移到Chroma + + Args: + json_path: JSON文件路径 + chroma_path: Chroma数据库路径 + dry_run: 是否只是预览,不实际迁移 + """ + logger.info("=" * 60) + logger.info("开始数据迁移:JSON -> Chroma") + logger.info("=" * 60) + + # 1. 加载JSON数据 + logger.info(f"📂 读取JSON文件: {json_path}") + + if not json_path.exists(): + logger.error(f"❌ JSON文件不存在: {json_path}") + return False + + json_store = JSONVectorStore(json_path) + + # 统计数据 + total_users = len(json_store.memories) + total_memories = sum(len(memories) for memories in json_store.memories.values()) + + logger.info(f"📊 找到 {total_users} 个用户,共 {total_memories} 条记忆") + + if total_memories == 0: + logger.info("✅ 没有数据需要迁移") + return True + + # 显示详细信息 + for user_id, memories in json_store.memories.items(): + logger.info(f" 用户 {user_id}: {len(memories)} 条记忆") + + if dry_run: + logger.info("🔍 预览模式,不执行实际迁移") + return True + + # 2. 初始化Chroma + logger.info(f"📂 初始化Chroma数据库: {chroma_path}") + + try: + chroma_store = ChromaVectorStore(chroma_path) + except Exception as e: + logger.error(f"❌ Chroma初始化失败: {e}") + return False + + # 3. 迁移数据 + logger.info("🚀 开始迁移数据...") + + success_count = 0 + fail_count = 0 + + for user_id, memories in json_store.memories.items(): + logger.info(f" 迁移用户 {user_id} 的数据...") + + for memory in memories: + try: + success = await chroma_store.add( + id=memory.id, + user_id=memory.user_id, + content=memory.content, + embedding=memory.embedding, + importance=memory.importance, + metadata=memory.metadata + ) + + if success: + success_count += 1 + else: + fail_count += 1 + logger.warning(f" ⚠️ 迁移失败: {memory.id}") + + except Exception as e: + fail_count += 1 + logger.error(f" ❌ 迁移出错: {memory.id} - {e}") + + # 4. 关闭连接 + await chroma_store.close() + + # 5. 显示结果 + logger.info("=" * 60) + logger.info("迁移完成!") + logger.info(f"✅ 成功: {success_count} 条") + if fail_count > 0: + logger.info(f"❌ 失败: {fail_count} 条") + logger.info("=" * 60) + + return fail_count == 0 + + +async def backup_json(json_path: Path): + """备份JSON文件""" + if not json_path.exists(): + logger.warning(f"⚠️ JSON文件不存在,无需备份: {json_path}") + return None + + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + backup_path = json_path.parent / f"{json_path.stem}_backup_{timestamp}.json" + + logger.info(f"💾 备份JSON文件: {backup_path}") + + try: + with open(json_path, 'r', encoding='utf-8') as f: + data = json.load(f) + + with open(backup_path, 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False, indent=2) + + logger.info(f"✅ 备份成功: {backup_path}") + return backup_path + + except Exception as e: + logger.error(f"❌ 备份失败: {e}") + return None + + +async def main(): + """主函数""" + import argparse + + parser = argparse.ArgumentParser(description='数据迁移工具:JSON -> Chroma') + parser.add_argument( + '--json-path', + type=str, + default='data/ai/long_term_memory.json', + help='JSON文件路径' + ) + parser.add_argument( + '--chroma-path', + type=str, + default='data/ai/chroma_db', + help='Chroma数据库路径' + ) + parser.add_argument( + '--dry-run', + action='store_true', + help='预览模式,不实际迁移' + ) + parser.add_argument( + '--no-backup', + action='store_true', + help='不备份原JSON文件' + ) + + args = parser.parse_args() + + json_path = Path(args.json_path) + chroma_path = Path(args.chroma_path) + + print("\n" + "=" * 60) + print("数据迁移工具 - JSON to Chroma") + print("=" * 60) + print(f"JSON路径: {json_path}") + print(f"Chroma路径: {chroma_path}") + print(f"预览模式: {'是' if args.dry_run else '否'}") + print(f"备份: {'否' if args.no_backup else '是'}") + print("=" * 60 + "\n") + + # 备份 + if not args.no_backup and not args.dry_run: + backup_path = await backup_json(json_path) + if backup_path: + print(f"\n✅ 已备份到: {backup_path}\n") + + # 迁移 + success = await migrate_json_to_chroma( + json_path=json_path, + chroma_path=chroma_path, + dry_run=args.dry_run + ) + + if success: + print("\n✅ 迁移成功!") + if not args.dry_run: + print(f"\n💡 提示:") + print(f"1. 请在 .env 中设置 AI_USE_VECTOR_DB=true") + print(f"2. 重启机器人即可使用Chroma向量数据库") + print(f"3. 原JSON文件已备份,可以安全删除") + else: + print("\n❌ 迁移失败,请查看日志") + + print() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/skills/cmd_zip_skill/README.md b/skills/cmd_zip_skill/README.md new file mode 100644 index 0000000..f196536 --- /dev/null +++ b/skills/cmd_zip_skill/README.md @@ -0,0 +1,7 @@ +# cmd_zip_skill + +## 描述 +zip skill + +## 工具 +- example_tool(text) diff --git a/skills/cmd_zip_skill/__init__.py b/skills/cmd_zip_skill/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/skills/cmd_zip_skill/main.py b/skills/cmd_zip_skill/main.py new file mode 100644 index 0000000..e673dff --- /dev/null +++ b/skills/cmd_zip_skill/main.py @@ -0,0 +1,13 @@ +"""cmd_zip_skill skill""" +from src.ai.skills.base import Skill + + +class CmdZipSkillSkill(Skill): + async def initialize(self): + self.register_tool("example_tool", self.example_tool) + + async def example_tool(self, text: str) -> str: + return f"cmd_zip_skill 收到: {text}" + + async def cleanup(self): + pass diff --git a/skills/cmd_zip_skill/skill.json b/skills/cmd_zip_skill/skill.json new file mode 100644 index 0000000..7acae47 --- /dev/null +++ b/skills/cmd_zip_skill/skill.json @@ -0,0 +1,8 @@ +{ + "name": "cmd_zip_skill", + "version": "1.0.0", + "description": "zip skill", + "author": "test", + "dependencies": [], + "enabled": false +} \ No newline at end of file diff --git a/skills/cmd_zip_skill_1772465404375/README.md b/skills/cmd_zip_skill_1772465404375/README.md new file mode 100644 index 0000000..7b863a6 --- /dev/null +++ b/skills/cmd_zip_skill_1772465404375/README.md @@ -0,0 +1,7 @@ +# cmd_zip_skill_1772465404375 + +## 描述 +zip skill + +## 工具 +- example_tool(text) diff --git a/skills/cmd_zip_skill_1772465404375/__init__.py b/skills/cmd_zip_skill_1772465404375/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/skills/cmd_zip_skill_1772465404375/main.py b/skills/cmd_zip_skill_1772465404375/main.py new file mode 100644 index 0000000..37808f8 --- /dev/null +++ b/skills/cmd_zip_skill_1772465404375/main.py @@ -0,0 +1,13 @@ +"""cmd_zip_skill_1772465404375 skill""" +from src.ai.skills.base import Skill + + +class CmdZipSkill1772465404375Skill(Skill): + async def initialize(self): + self.register_tool("example_tool", self.example_tool) + + async def example_tool(self, text: str) -> str: + return f"cmd_zip_skill_1772465404375 收到: {text}" + + async def cleanup(self): + pass diff --git a/skills/cmd_zip_skill_1772465404375/skill.json b/skills/cmd_zip_skill_1772465404375/skill.json new file mode 100644 index 0000000..c046c86 --- /dev/null +++ b/skills/cmd_zip_skill_1772465404375/skill.json @@ -0,0 +1,8 @@ +{ + "name": "cmd_zip_skill_1772465404375", + "version": "1.0.0", + "description": "zip skill", + "author": "test", + "dependencies": [], + "enabled": false +} \ No newline at end of file diff --git a/skills/cmd_zip_skill_1772465434774/README.md b/skills/cmd_zip_skill_1772465434774/README.md new file mode 100644 index 0000000..d0516de --- /dev/null +++ b/skills/cmd_zip_skill_1772465434774/README.md @@ -0,0 +1,7 @@ +# cmd_zip_skill_1772465434774 + +## 描述 +zip skill + +## 工具 +- example_tool(text) diff --git a/skills/cmd_zip_skill_1772465434774/__init__.py b/skills/cmd_zip_skill_1772465434774/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/skills/cmd_zip_skill_1772465434774/main.py b/skills/cmd_zip_skill_1772465434774/main.py new file mode 100644 index 0000000..2af7b12 --- /dev/null +++ b/skills/cmd_zip_skill_1772465434774/main.py @@ -0,0 +1,13 @@ +"""cmd_zip_skill_1772465434774 skill""" +from src.ai.skills.base import Skill + + +class CmdZipSkill1772465434774Skill(Skill): + async def initialize(self): + self.register_tool("example_tool", self.example_tool) + + async def example_tool(self, text: str) -> str: + return f"cmd_zip_skill_1772465434774 收到: {text}" + + async def cleanup(self): + pass diff --git a/skills/cmd_zip_skill_1772465434774/skill.json b/skills/cmd_zip_skill_1772465434774/skill.json new file mode 100644 index 0000000..60148e6 --- /dev/null +++ b/skills/cmd_zip_skill_1772465434774/skill.json @@ -0,0 +1,8 @@ +{ + "name": "cmd_zip_skill_1772465434774", + "version": "1.0.0", + "description": "zip skill", + "author": "test", + "dependencies": [], + "enabled": false +} \ No newline at end of file diff --git a/skills/cmd_zip_skill_1772465467809/README.md b/skills/cmd_zip_skill_1772465467809/README.md new file mode 100644 index 0000000..f42c1d7 --- /dev/null +++ b/skills/cmd_zip_skill_1772465467809/README.md @@ -0,0 +1,7 @@ +# cmd_zip_skill_1772465467809 + +## 描述 +zip skill + +## 工具 +- example_tool(text) diff --git a/skills/cmd_zip_skill_1772465467809/__init__.py b/skills/cmd_zip_skill_1772465467809/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/skills/cmd_zip_skill_1772465467809/main.py b/skills/cmd_zip_skill_1772465467809/main.py new file mode 100644 index 0000000..a61bd41 --- /dev/null +++ b/skills/cmd_zip_skill_1772465467809/main.py @@ -0,0 +1,13 @@ +"""cmd_zip_skill_1772465467809 skill""" +from src.ai.skills.base import Skill + + +class CmdZipSkill1772465467809Skill(Skill): + async def initialize(self): + self.register_tool("example_tool", self.example_tool) + + async def example_tool(self, text: str) -> str: + return f"cmd_zip_skill_1772465467809 收到: {text}" + + async def cleanup(self): + pass diff --git a/skills/cmd_zip_skill_1772465467809/skill.json b/skills/cmd_zip_skill_1772465467809/skill.json new file mode 100644 index 0000000..dc7fc87 --- /dev/null +++ b/skills/cmd_zip_skill_1772465467809/skill.json @@ -0,0 +1,8 @@ +{ + "name": "cmd_zip_skill_1772465467809", + "version": "1.0.0", + "description": "zip skill", + "author": "test", + "dependencies": [], + "enabled": false +} \ No newline at end of file diff --git a/skills/cmd_zip_skill_1772465652075/README.md b/skills/cmd_zip_skill_1772465652075/README.md new file mode 100644 index 0000000..39ed797 --- /dev/null +++ b/skills/cmd_zip_skill_1772465652075/README.md @@ -0,0 +1,7 @@ +# cmd_zip_skill_1772465652075 + +## 描述 +zip skill + +## 工具 +- example_tool(text) diff --git a/skills/cmd_zip_skill_1772465652075/__init__.py b/skills/cmd_zip_skill_1772465652075/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/skills/cmd_zip_skill_1772465652075/main.py b/skills/cmd_zip_skill_1772465652075/main.py new file mode 100644 index 0000000..c0dfa8e --- /dev/null +++ b/skills/cmd_zip_skill_1772465652075/main.py @@ -0,0 +1,13 @@ +"""cmd_zip_skill_1772465652075 skill""" +from src.ai.skills.base import Skill + + +class CmdZipSkill1772465652075Skill(Skill): + async def initialize(self): + self.register_tool("example_tool", self.example_tool) + + async def example_tool(self, text: str) -> str: + return f"cmd_zip_skill_1772465652075 收到: {text}" + + async def cleanup(self): + pass diff --git a/skills/cmd_zip_skill_1772465652075/skill.json b/skills/cmd_zip_skill_1772465652075/skill.json new file mode 100644 index 0000000..24e2772 --- /dev/null +++ b/skills/cmd_zip_skill_1772465652075/skill.json @@ -0,0 +1,8 @@ +{ + "name": "cmd_zip_skill_1772465652075", + "version": "1.0.0", + "description": "zip skill", + "author": "test", + "dependencies": [], + "enabled": false +} \ No newline at end of file diff --git a/skills/cmd_zip_skill_1772465685352/README.md b/skills/cmd_zip_skill_1772465685352/README.md new file mode 100644 index 0000000..42f156b --- /dev/null +++ b/skills/cmd_zip_skill_1772465685352/README.md @@ -0,0 +1,7 @@ +# cmd_zip_skill_1772465685352 + +## 描述 +zip skill + +## 工具 +- example_tool(text) diff --git a/skills/cmd_zip_skill_1772465685352/__init__.py b/skills/cmd_zip_skill_1772465685352/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/skills/cmd_zip_skill_1772465685352/main.py b/skills/cmd_zip_skill_1772465685352/main.py new file mode 100644 index 0000000..cff99cf --- /dev/null +++ b/skills/cmd_zip_skill_1772465685352/main.py @@ -0,0 +1,13 @@ +"""cmd_zip_skill_1772465685352 skill""" +from src.ai.skills.base import Skill + + +class CmdZipSkill1772465685352Skill(Skill): + async def initialize(self): + self.register_tool("example_tool", self.example_tool) + + async def example_tool(self, text: str) -> str: + return f"cmd_zip_skill_1772465685352 收到: {text}" + + async def cleanup(self): + pass diff --git a/skills/cmd_zip_skill_1772465685352/skill.json b/skills/cmd_zip_skill_1772465685352/skill.json new file mode 100644 index 0000000..23cbd37 --- /dev/null +++ b/skills/cmd_zip_skill_1772465685352/skill.json @@ -0,0 +1,8 @@ +{ + "name": "cmd_zip_skill_1772465685352", + "version": "1.0.0", + "description": "zip skill", + "author": "test", + "dependencies": [], + "enabled": false +} \ No newline at end of file diff --git a/skills/cmd_zip_skill_1772465936294/README.md b/skills/cmd_zip_skill_1772465936294/README.md new file mode 100644 index 0000000..43b734c --- /dev/null +++ b/skills/cmd_zip_skill_1772465936294/README.md @@ -0,0 +1,7 @@ +# cmd_zip_skill_1772465936294 + +## 描述 +zip skill + +## 工具 +- example_tool(text) diff --git a/skills/cmd_zip_skill_1772465936294/__init__.py b/skills/cmd_zip_skill_1772465936294/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/skills/cmd_zip_skill_1772465936294/main.py b/skills/cmd_zip_skill_1772465936294/main.py new file mode 100644 index 0000000..1c25f33 --- /dev/null +++ b/skills/cmd_zip_skill_1772465936294/main.py @@ -0,0 +1,13 @@ +"""cmd_zip_skill_1772465936294 skill""" +from src.ai.skills.base import Skill + + +class CmdZipSkill1772465936294Skill(Skill): + async def initialize(self): + self.register_tool("example_tool", self.example_tool) + + async def example_tool(self, text: str) -> str: + return f"cmd_zip_skill_1772465936294 收到: {text}" + + async def cleanup(self): + pass diff --git a/skills/cmd_zip_skill_1772465936294/skill.json b/skills/cmd_zip_skill_1772465936294/skill.json new file mode 100644 index 0000000..dcb35e7 --- /dev/null +++ b/skills/cmd_zip_skill_1772465936294/skill.json @@ -0,0 +1,8 @@ +{ + "name": "cmd_zip_skill_1772465936294", + "version": "1.0.0", + "description": "zip skill", + "author": "test", + "dependencies": [], + "enabled": false +} \ No newline at end of file diff --git a/skills/cmd_zip_skill_1772465966322/README.md b/skills/cmd_zip_skill_1772465966322/README.md new file mode 100644 index 0000000..d8449f7 --- /dev/null +++ b/skills/cmd_zip_skill_1772465966322/README.md @@ -0,0 +1,7 @@ +# cmd_zip_skill_1772465966322 + +## 描述 +zip skill + +## 工具 +- example_tool(text) diff --git a/skills/cmd_zip_skill_1772465966322/__init__.py b/skills/cmd_zip_skill_1772465966322/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/skills/cmd_zip_skill_1772465966322/main.py b/skills/cmd_zip_skill_1772465966322/main.py new file mode 100644 index 0000000..f0b63f6 --- /dev/null +++ b/skills/cmd_zip_skill_1772465966322/main.py @@ -0,0 +1,13 @@ +"""cmd_zip_skill_1772465966322 skill""" +from src.ai.skills.base import Skill + + +class CmdZipSkill1772465966322Skill(Skill): + async def initialize(self): + self.register_tool("example_tool", self.example_tool) + + async def example_tool(self, text: str) -> str: + return f"cmd_zip_skill_1772465966322 收到: {text}" + + async def cleanup(self): + pass diff --git a/skills/cmd_zip_skill_1772465966322/skill.json b/skills/cmd_zip_skill_1772465966322/skill.json new file mode 100644 index 0000000..6635930 --- /dev/null +++ b/skills/cmd_zip_skill_1772465966322/skill.json @@ -0,0 +1,8 @@ +{ + "name": "cmd_zip_skill_1772465966322", + "version": "1.0.0", + "description": "zip skill", + "author": "test", + "dependencies": [], + "enabled": false +} \ No newline at end of file diff --git a/skills/cmd_zip_skill_1772466071278/README.md b/skills/cmd_zip_skill_1772466071278/README.md new file mode 100644 index 0000000..a8b7ecf --- /dev/null +++ b/skills/cmd_zip_skill_1772466071278/README.md @@ -0,0 +1,7 @@ +# cmd_zip_skill_1772466071278 + +## 描述 +zip skill + +## 工具 +- example_tool(text) diff --git a/skills/cmd_zip_skill_1772466071278/__init__.py b/skills/cmd_zip_skill_1772466071278/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/skills/cmd_zip_skill_1772466071278/main.py b/skills/cmd_zip_skill_1772466071278/main.py new file mode 100644 index 0000000..e1180e3 --- /dev/null +++ b/skills/cmd_zip_skill_1772466071278/main.py @@ -0,0 +1,13 @@ +"""cmd_zip_skill_1772466071278 skill""" +from src.ai.skills.base import Skill + + +class CmdZipSkill1772466071278Skill(Skill): + async def initialize(self): + self.register_tool("example_tool", self.example_tool) + + async def example_tool(self, text: str) -> str: + return f"cmd_zip_skill_1772466071278 收到: {text}" + + async def cleanup(self): + pass diff --git a/skills/cmd_zip_skill_1772466071278/skill.json b/skills/cmd_zip_skill_1772466071278/skill.json new file mode 100644 index 0000000..e1fa141 --- /dev/null +++ b/skills/cmd_zip_skill_1772466071278/skill.json @@ -0,0 +1,8 @@ +{ + "name": "cmd_zip_skill_1772466071278", + "version": "1.0.0", + "description": "zip skill", + "author": "test", + "dependencies": [], + "enabled": false +} \ No newline at end of file diff --git a/skills/skills_creator/README.md b/skills/skills_creator/README.md new file mode 100644 index 0000000..5e9eb9d --- /dev/null +++ b/skills/skills_creator/README.md @@ -0,0 +1,12 @@ +# skills_creator + +Tools exposed to AI: +- create_skill +- write_skill_main +- update_skill_metadata +- delete_skill +- load_skill +- reload_skill +- list_skills + +This skill enables creating and managing other skills from chat-driven AI tool calls. \ No newline at end of file diff --git a/skills/skills_creator/__init__.py b/skills/skills_creator/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/skills/skills_creator/main.py b/skills/skills_creator/main.py new file mode 100644 index 0000000..a101f7f --- /dev/null +++ b/skills/skills_creator/main.py @@ -0,0 +1,147 @@ +"""skills_creator skill""" + +import json +from pathlib import Path +import shutil +from typing import Any, Dict + +from src.ai.skills.base import Skill, SkillsManager, create_skill_template + + +class SkillsCreatorSkill(Skill): + """Provide tools to create and manage local skills from chat.""" + + def __init__(self): + super().__init__() + self.skills_root = Path("skills") + self.protected_skills = {"skills_creator"} + + async def initialize(self): + self.register_tool("create_skill", self.create_skill) + self.register_tool("write_skill_main", self.write_skill_main) + self.register_tool("update_skill_metadata", self.update_skill_metadata) + self.register_tool("delete_skill", self.delete_skill) + self.register_tool("load_skill", self.load_skill) + self.register_tool("reload_skill", self.reload_skill) + self.register_tool("list_skills", self.list_skills) + + def _skill_key(self, skill_name: str) -> str: + return SkillsManager.normalize_skill_key(skill_name) + + def _skill_path(self, skill_name: str) -> Path: + return self.skills_root / self._skill_key(skill_name) + + async def create_skill( + self, + skill_name: str, + description: str = "custom skill", + author: str = "chat_user", + auto_load: bool = True, + overwrite: bool = False, + ) -> str: + skill_key = self._skill_key(skill_name) + skill_path = self._skill_path(skill_key) + + if skill_path.exists() and not overwrite: + return f"技能已存在: {skill_key}" + + if skill_path.exists() and overwrite: + shutil.rmtree(skill_path) + + create_skill_template(skill_key, self.skills_root, description=description, author=author) + + if auto_load and self.manager: + await self.manager.load_skill(skill_key) + + return f"已创建技能: {skill_key}" + + async def write_skill_main(self, skill_name: str, code: str, auto_reload: bool = True) -> str: + skill_key = self._skill_key(skill_name) + skill_path = self._skill_path(skill_key) + if not skill_path.exists(): + return f"技能不存在: {skill_key}" + + main_file = skill_path / "main.py" + main_file.write_text(code, encoding="utf-8") + + if auto_reload and self.manager: + await self.manager.reload_skill(skill_key) + + return f"已更新技能代码: {skill_key}/main.py" + + async def update_skill_metadata(self, skill_name: str, fields: Dict[str, Any]) -> str: + skill_key = self._skill_key(skill_name) + skill_path = self._skill_path(skill_key) + if not skill_path.exists(): + return f"技能不存在: {skill_key}" + + metadata_file = skill_path / "skill.json" + if metadata_file.exists(): + metadata = json.loads(metadata_file.read_text(encoding="utf-8")) + else: + metadata = { + "name": skill_key, + "version": "1.0.0", + "description": "", + "author": "chat_user", + "dependencies": [], + "enabled": True, + } + + for key, value in fields.items(): + metadata[key] = value + + metadata.setdefault("name", skill_key) + metadata.setdefault("version", "1.0.0") + metadata.setdefault("description", "") + metadata.setdefault("author", "chat_user") + metadata.setdefault("dependencies", []) + metadata.setdefault("enabled", True) + + metadata_file.write_text(json.dumps(metadata, ensure_ascii=False, indent=2), encoding="utf-8") + return f"已更新技能元数据: {skill_key}/skill.json" + + async def delete_skill(self, skill_name: str, delete_files: bool = True) -> str: + skill_key = self._skill_key(skill_name) + if skill_key in self.protected_skills: + return f"拒绝删除受保护技能: {skill_key}" + + if self.manager: + removed = await self.manager.uninstall_skill(skill_key, delete_files=delete_files) + return f"删除结果({skill_key}): {removed}" + + skill_path = self._skill_path(skill_key) + if delete_files and skill_path.exists(): + shutil.rmtree(skill_path) + return f"已删除技能目录: {skill_key}" + + return f"技能不存在或未删除: {skill_key}" + + async def load_skill(self, skill_name: str) -> str: + skill_key = self._skill_key(skill_name) + if not self.manager: + return "SkillsManager 不可用" + + success = await self.manager.load_skill(skill_key) + return f"加载技能 {skill_key}: {success}" + + async def reload_skill(self, skill_name: str) -> str: + skill_key = self._skill_key(skill_name) + if not self.manager: + return "SkillsManager 不可用" + + success = await self.manager.reload_skill(skill_key) + return f"重载技能 {skill_key}: {success}" + + async def list_skills(self) -> str: + if not self.manager: + return "SkillsManager 不可用" + + payload = { + "loaded": self.manager.list_skills(), + "available": self.manager.list_available_skills(), + } + return json.dumps(payload, ensure_ascii=False) + + async def cleanup(self): + pass \ No newline at end of file diff --git a/skills/skills_creator/skill.json b/skills/skills_creator/skill.json new file mode 100644 index 0000000..7875637 --- /dev/null +++ b/skills/skills_creator/skill.json @@ -0,0 +1,8 @@ +{ + "name": "skills_creator", + "version": "1.0.0", + "description": "Create, edit, load, and remove skills from chat", + "author": "QQBot", + "dependencies": [], + "enabled": true +} \ No newline at end of file diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..9086fe6 --- /dev/null +++ b/src/__init__.py @@ -0,0 +1,4 @@ +""" +QQ机器人主包 +""" +__version__ = "1.0.0" diff --git a/src/ai/__init__.py b/src/ai/__init__.py new file mode 100644 index 0000000..7650318 --- /dev/null +++ b/src/ai/__init__.py @@ -0,0 +1,14 @@ +""" +AI模块 - 提供AI模型接入、人格系统、记忆系统和长任务处理能力 +""" +from .client import AIClient +from .personality import PersonalitySystem +from .memory import MemorySystem +from .task_manager import LongTaskManager + +__all__ = [ + 'AIClient', + 'PersonalitySystem', + 'MemorySystem', + 'LongTaskManager' +] diff --git a/src/ai/base.py b/src/ai/base.py new file mode 100644 index 0000000..5533b34 --- /dev/null +++ b/src/ai/base.py @@ -0,0 +1,130 @@ +""" +AI模型基类和接口定义 +""" +from abc import ABC, abstractmethod +from typing import List, Dict, Any, Optional, AsyncIterator +from dataclasses import dataclass +from enum import Enum + + +class ModelProvider(Enum): + """AI模型提供商""" + OPENAI = "openai" + ANTHROPIC = "anthropic" + DEEPSEEK = "deepseek" + QWEN = "qwen" + LOCAL = "local" + + +@dataclass +class Message: + """消息对象""" + role: str # system, user, assistant, tool + content: str + name: Optional[str] = None + tool_calls: Optional[List[Dict]] = None + tool_call_id: Optional[str] = None + + +@dataclass +class ModelConfig: + """模型配置""" + provider: ModelProvider + model_name: str + api_key: Optional[str] = None + api_base: Optional[str] = None + temperature: float = 0.7 + max_tokens: int = 4096 + top_p: float = 1.0 + frequency_penalty: float = 0.0 + presence_penalty: float = 0.0 + timeout: int = 60 + stream: bool = False + + +class BaseAIModel(ABC): + """AI模型基类""" + + def __init__(self, config: ModelConfig): + self.config = config + + @abstractmethod + async def chat( + self, + messages: List[Message], + tools: Optional[List[Dict]] = None, + **kwargs + ) -> Message: + """同步对话""" + pass + + @abstractmethod + async def chat_stream( + self, + messages: List[Message], + tools: Optional[List[Dict]] = None, + **kwargs + ) -> AsyncIterator[str]: + """流式对话""" + pass + + @abstractmethod + async def embed(self, text: str) -> List[float]: + """文本嵌入""" + pass + + +@dataclass +class ToolDefinition: + """工具定义""" + name: str + description: str + parameters: Dict[str, Any] + function: callable + + +class ToolRegistry: + """工具注册表""" + + def __init__(self): + self._tools: Dict[str, ToolDefinition] = {} + + def register(self, tool: ToolDefinition): + """注册工具""" + self._tools[tool.name] = tool + + def unregister(self, name: str) -> bool: + """卸载工具""" + if name not in self._tools: + return False + del self._tools[name] + return True + + def unregister_by_prefix(self, prefix: str) -> int: + """按前缀卸载工具""" + to_remove = [name for name in self._tools.keys() if name.startswith(prefix)] + for name in to_remove: + del self._tools[name] + return len(to_remove) + + def get(self, name: str) -> Optional[ToolDefinition]: + """获取工具""" + return self._tools.get(name) + + def list(self) -> List[ToolDefinition]: + """列出所有工具""" + return list(self._tools.values()) + + def to_openai_format(self) -> List[Dict]: + """转换为OpenAI工具格式""" + return [ + { + "type": "function", + "function": { + "name": tool.name, + "description": tool.description, + "parameters": tool.parameters + } + } + for tool in self._tools.values() + ] diff --git a/src/ai/client.py b/src/ai/client.py new file mode 100644 index 0000000..cfbdc47 --- /dev/null +++ b/src/ai/client.py @@ -0,0 +1,475 @@ +""" +AI瀹㈡埛绔?- 鏁村悎鎵€鏈堿I鍔熻兘 +""" +import inspect +import json +import re +from typing import List, Optional, Dict, Any, AsyncIterator, Tuple +from pathlib import Path +from .base import ModelConfig, ModelProvider, Message, ToolRegistry +from .models import OpenAIModel, AnthropicModel +from .personality import PersonalitySystem +from .memory import MemorySystem +from .task_manager import LongTaskManager +from src.utils.logger import setup_logger + +logger = setup_logger('AIClient') + + +class AIClient: + """AI瀹㈡埛绔?- 缁熶竴鎺ュ彛""" + + def __init__( + self, + model_config: ModelConfig, + embed_config: Optional[ModelConfig] = None, + data_dir: Path = Path("data/ai"), + use_vector_db: bool = True + ): + self.config = model_config + self.data_dir = data_dir + self.data_dir.mkdir(parents=True, exist_ok=True) + + # 初始化主模型 + self.model = self._create_model(model_config) + + # 初始化嵌入模型(如果提供) + self.embed_model = None + if embed_config: + self.embed_model = self._create_model(embed_config) + logger.info( + f"嵌入模型初始化完成: {embed_config.provider.value}/{embed_config.model_name}" + ) + + # 初始化工具注册表 + self.tools = ToolRegistry() + + # 初始化人格系统 + self.personality = PersonalitySystem( + config_path=data_dir / "personalities.json" + ) + + # 初始化记忆系统 + self.memory = MemorySystem( + storage_path=data_dir / "long_term_memory.json", + embed_func=self._embed_wrapper, + importance_evaluator=self._evaluate_memory_importance, + use_vector_db=use_vector_db + ) + + # 初始化长任务管理器 + self.task_manager = LongTaskManager( + storage_path=data_dir / "tasks.json" + ) + + logger.info( + f"AI 客户端初始化完成: {model_config.provider.value}/{model_config.model_name}" + ) + + def _create_model(self, config: ModelConfig): + """创建模型实例。""" + if config.provider == ModelProvider.OPENAI: + return OpenAIModel(config) + elif config.provider == ModelProvider.ANTHROPIC: + return AnthropicModel(config) + elif config.provider in [ModelProvider.DEEPSEEK, ModelProvider.QWEN]: + # DeepSeek 和 Qwen 使用 OpenAI 兼容接口 + return OpenAIModel(config) + else: + raise ValueError(f"不支持的模型提供商: {config.provider}") + + async def _embed_wrapper(self, text: str) -> List[float]: + """嵌入向量包装器。""" + try: + # 如果有独立的嵌入模型,优先使用 + if self.embed_model: + return await self.embed_model.embed(text) + # 否则尝试使用主模型 + return await self.model.embed(text) + except NotImplementedError: + # 如果都不支持嵌入,返回 None(记忆系统会降级) + logger.warning("Current model does not support embeddings; vector retrieval disabled") + return None + except Exception as e: + logger.error(f"生成嵌入向量失败: {e}") + return None + + @staticmethod + def _parse_importance_score(raw: str) -> float: + text = (raw or "").strip() + if not text: + raise ValueError("empty importance response") + + try: + parsed = json.loads(text) + if isinstance(parsed, (int, float)): + return float(parsed) + if isinstance(parsed, dict): + for key in ["importance", "score", "value"]: + if key in parsed: + return float(parsed[key]) + except Exception: + pass + + match = re.search(r"-?\d+(?:\.\d+)?", text) + if not match: + raise ValueError(f"cannot parse importance score: {text}") + return float(match.group(0)) + + async def _evaluate_memory_importance( + self, content: str, metadata: Optional[Dict] = None + ) -> float: + """ + 调用主模型评估记忆重要性,返回 [0, 1] 分值。 + """ + system_prompt = ( + "你是记忆重要性评估器。请根据输入内容判断该信息是否值得长期记忆。" + "输出一个 0 到 1 的数字,数字越大表示越重要。" + "只输出数字,不要输出任何解释、单位或多余文本。" + ) + payload = json.dumps( + {"content": content, "metadata": metadata or {}}, + ensure_ascii=False, + ) + messages = [ + Message(role="system", content=system_prompt), + Message(role="user", content=payload), + ] + + try: + response = await self.model.chat( + messages=messages, + tools=None, + temperature=0.0, + max_tokens=16, + ) + score = self._parse_importance_score(response.content) + return max(0.0, min(1.0, score)) + except Exception as e: + logger.warning(f"memory importance evaluation failed, fallback to neutral score: {e}") + return 0.5 + + async def chat( + self, + user_id: str, + user_message: str, + system_prompt: Optional[str] = None, + use_memory: bool = True, + use_tools: bool = True, + stream: bool = False, + **kwargs + ) -> str: + """对话接口。""" + try: + # 构建消息列表 + messages = [] + + # 系统提示词 + if system_prompt is None: + system_prompt = self.personality.get_system_prompt() + + # 注入记忆上下文 + if use_memory: + short_term, long_term = await self.memory.get_context( + user_id=user_id, + query=user_message + ) + + if short_term or long_term: + memory_context = self.memory.format_context(short_term, long_term) + system_prompt += f"\n\n{memory_context}" + + messages.append(Message(role="system", content=system_prompt)) + + # 添加用户消息 + messages.append(Message(role="user", content=user_message)) + + # 准备工具 + tools = None + if use_tools and self.tools.list(): + tools = self.tools.to_openai_format() + + # 调用模型 + if stream: + return self._chat_stream(messages, tools, **kwargs) + else: + response = await self.model.chat(messages, tools, **kwargs) + + # 处理工具调用 + if response.tool_calls: + response = await self._handle_tool_calls( + messages, response, tools, **kwargs + ) + + # 写入记忆 + if use_memory: + stored_memory = await self.memory.add_qa_pair( + user_id=user_id, + question=user_message, + answer=response.content, + metadata={"source": "chat"}, + ) + if stored_memory: + logger.info( + "已写入长期记忆问答对:\n" + f"{stored_memory.content}\n" + f"memory_id={stored_memory.id}, " + f"importance={stored_memory.importance:.2f}" + ) + + return response.content + + except Exception as e: + logger.error(f"对话失败: {e}") + raise + + async def _chat_stream( + self, + messages: List[Message], + tools: Optional[List[Dict]], + **kwargs + ) -> AsyncIterator[str]: + """流式对话。""" + async for chunk in self.model.chat_stream(messages, tools, **kwargs): + yield chunk + + async def _handle_tool_calls( + self, + messages: List[Message], + response: Message, + tools: Optional[List[Dict]], + **kwargs + ) -> Message: + """处理工具调用。""" + messages.append(response) + + # 鎵ц宸ュ叿璋冪敤 + for tool_call in response.tool_calls or []: + try: + tool_name, tool_args, tool_call_id = self._parse_tool_call(tool_call) + except Exception as e: + logger.warning(f"解析工具调用失败: {e}") + fallback_id = tool_call.get('id') if isinstance(tool_call, dict) else getattr(tool_call, 'id', None) + if fallback_id: + messages.append(Message( + role="tool", + content=f"工具参数解析失败: {str(e)}", + tool_call_id=fallback_id + )) + continue + if not tool_name: + logger.warning(f"跳过无效工具调用: {tool_call}") + continue + + tool_def = self.tools.get(tool_name) + if not tool_def: + error_msg = f"未找到工具: {tool_name}" + logger.warning(error_msg) + if tool_call_id: + messages.append(Message( + role="tool", + content=error_msg, + tool_call_id=tool_call_id + )) + continue + + try: + result = tool_def.function(**tool_args) + if inspect.isawaitable(result): + result = await result + if tool_call_id: + messages.append(Message( + role="tool", + content=str(result), + tool_call_id=tool_call_id + )) + except Exception as e: + if tool_call_id: + messages.append(Message( + role="tool", + content=f"工具执行失败: {str(e)}", + tool_call_id=tool_call_id + )) + + # 再次调用模型获取最终响应 + return await self.model.chat(messages, tools, **kwargs) + + def _parse_tool_call(self, tool_call: Any) -> Tuple[Optional[str], Dict[str, Any], Optional[str]]: + """兼容不同 SDK 返回的工具调用结构。""" + if isinstance(tool_call, dict): + tool_call_id = tool_call.get('id') + function = tool_call.get('function') or {} + tool_name = function.get('name') + raw_args = function.get('arguments') + else: + tool_call_id = getattr(tool_call, 'id', None) + function = getattr(tool_call, 'function', None) + tool_name = getattr(function, 'name', None) if function else None + raw_args = getattr(function, 'arguments', None) if function else None + + tool_args = self._normalize_tool_args(raw_args) + return tool_name, tool_args, tool_call_id + + def _normalize_tool_args(self, raw_args: Any) -> Dict[str, Any]: + """将工具参数统一转换为字典。""" + if raw_args is None: + return {} + + if isinstance(raw_args, dict): + return raw_args + + if isinstance(raw_args, str): + raw_args = raw_args.strip() + if not raw_args: + return {} + parsed = json.loads(raw_args) + if not isinstance(parsed, dict): + raise ValueError(f"工具参数必须是 JSON 对象,实际类型: {type(parsed)}") + return parsed + + if hasattr(raw_args, 'model_dump'): + parsed = raw_args.model_dump() + if isinstance(parsed, dict): + return parsed + + raise ValueError(f"不支持的工具参数类型: {type(raw_args)}") + + def set_personality(self, personality_name: str) -> bool: + """设置人格。""" + return self.personality.set_personality(personality_name) + + def list_personalities(self) -> List[str]: + """列出所有人格。""" + return self.personality.list_personalities() + + def switch_model(self, model_config: ModelConfig) -> bool: + """Runtime switch for primary chat model.""" + new_model = self._create_model(model_config) + self.model = new_model + self.config = model_config + logger.info( + f"已切换主模型: {model_config.provider.value}/{model_config.model_name}" + ) + return True + + async def create_long_task( + self, + user_id: str, + title: str, + description: str, + steps: List[Dict], + metadata: Optional[Dict] = None + ) -> str: + """创建长任务。""" + return self.task_manager.create_task( + user_id=user_id, + title=title, + description=description, + steps=steps, + metadata=metadata + ) + + async def start_task( + self, + task_id: str, + progress_callback: Optional[callable] = None + ): + """启动任务。""" + await self.task_manager.start_task(task_id, progress_callback) + + def get_task_status(self, task_id: str) -> Optional[Dict]: + """获取任务状态。""" + return self.task_manager.get_task_status(task_id) + + def register_tool(self, name: str, description: str, parameters: Dict, function: callable): + """注册工具。""" + from .base import ToolDefinition + tool = ToolDefinition( + name=name, + description=description, + parameters=parameters, + function=function + ) + self.tools.register(tool) + logger.info(f"已注册工具: {name}") + + def unregister_tool(self, name: str) -> bool: + """卸载工具。""" + removed = self.tools.unregister(name) + if removed: + logger.info(f"已卸载工具: {name}") + return removed + + def unregister_tools_by_prefix(self, prefix: str) -> int: + """按前缀批量卸载工具。""" + removed_count = self.tools.unregister_by_prefix(prefix) + if removed_count: + logger.info(f"Unregistered tools by prefix {prefix}: {removed_count}") + return removed_count + + def clear_memory(self, user_id: str): + """清除用户短期记忆。""" + self.memory.clear_short_term(user_id) + logger.info(f"Cleared short-term memory for user {user_id}") + + async def clear_long_term_memory(self, user_id: str) -> bool: + try: + await self.memory.clear_long_term(user_id) + logger.info(f"Cleared long-term memory for user {user_id}") + return True + except Exception as e: + logger.warning(f"Failed to clear long-term memory for user {user_id}: {e}") + return False + + async def list_long_term_memories(self, user_id: str, limit: int = 20): + return await self.memory.list_long_term(user_id, limit=limit) + + async def get_long_term_memory(self, user_id: str, memory_id: str): + return await self.memory.get_long_term(user_id, memory_id) + + async def add_long_term_memory( + self, + user_id: str, + content: str, + importance: float = 0.8, + metadata: Optional[Dict] = None, + ): + return await self.memory.add_long_term( + user_id=user_id, + content=content, + importance=importance, + metadata=metadata, + ) + + async def search_long_term_memories( + self, user_id: str, query: str, limit: int = 10 + ): + return await self.memory.search_long_term(user_id, query=query, limit=limit) + + async def update_long_term_memory( + self, + user_id: str, + memory_id: str, + content: Optional[str] = None, + importance: Optional[float] = None, + metadata: Optional[Dict] = None, + ): + return await self.memory.update_long_term( + user_id=user_id, + memory_id=memory_id, + content=content, + importance=importance, + metadata=metadata, + ) + + async def delete_long_term_memory(self, user_id: str, memory_id: str) -> bool: + return await self.memory.delete_long_term(user_id, memory_id) + + async def clear_all_memory(self, user_id: str) -> bool: + """清除用户全部记忆(短期 + 长期)。""" + self.clear_memory(user_id) + try: + return await self.clear_long_term_memory(user_id) + except Exception: + return False + diff --git a/src/ai/docs/README.md b/src/ai/docs/README.md new file mode 100644 index 0000000..42c6731 --- /dev/null +++ b/src/ai/docs/README.md @@ -0,0 +1,545 @@ +# AI模型接入完整指南 + +## 概述 + +本系统提供了完整的AI模型接入能力,包括: + +- ✅ **多模型支持**:OpenAI、Anthropic Claude、DeepSeek、Qwen等 +- ✅ **人格系统**:可自定义AI性格特征和说话风格 +- ✅ **记忆系统**:短期记忆(滑动窗口)+ 长期记忆(RAG检索) +- ✅ **长任务处理**:支持多步骤复杂任务的执行和管理 +- ✅ **Skills插件**:可扩展的技能插件系统 +- ✅ **MCP支持**:Model Context Protocol标准支持 + +## 快速开始 + +### 1. 安装依赖 + +```bash +pip install openai anthropic numpy +``` + +### 2. 配置环境变量 + +在 `.env` 文件中添加: + +```env +# AI模型配置 +AI_PROVIDER=openai # openai, anthropic, deepseek, qwen +AI_MODEL=gpt-4 +AI_API_KEY=your_api_key_here +AI_API_BASE=https://api.openai.com/v1 # 可选,自定义API地址 +``` + +### 3. 基础使用 + +```python +from pathlib import Path +from src.ai import AIClient +from src.ai.base import ModelConfig, ModelProvider + +# 创建模型配置 +config = ModelConfig( + provider=ModelProvider.OPENAI, + model_name="gpt-4", + api_key="your_api_key", + temperature=0.7 +) + +# 初始化AI客户端 +client = AIClient(config, data_dir=Path("data/ai")) + +# 对话 +response = await client.chat( + user_id="user123", + user_message="你好,介绍一下你自己", + use_memory=True, + use_tools=True +) + +print(response) +``` + +## 核心功能详解 + +### 1. 人格系统 + +人格系统允许你为AI定义独特的性格特征和说话风格。 + +#### 使用预设人格 + +```python +# 列出所有人格 +personalities = client.list_personalities() +print(personalities) # ['default', 'tech_expert', 'creative'] + +# 切换人格 +client.set_personality('tech_expert') +``` + +#### 自定义人格 + +```python +from src.ai.personality import PersonalityProfile, PersonalityTrait + +# 创建自定义人格 +custom_personality = PersonalityProfile( + name="游戏助手", + description="专业的游戏顾问和陪玩伙伴", + traits=[ + PersonalityTrait.FRIENDLY, + PersonalityTrait.HUMOROUS, + PersonalityTrait.CREATIVE + ], + speaking_style="活泼、热情、善用游戏术语和梗", + example_responses=[ + "哇!这个操作太秀了!", + "让我们一起冲冲冲!", + "别慌,稳住我们能赢!" + ], + custom_instructions="始终保持积极乐观的态度,鼓励玩家" +) + +# 添加到系统 +client.personality.add_personality('gamer', custom_personality) +client.set_personality('gamer') +``` + +### 2. 记忆系统 + +记忆系统分为短期记忆和长期记忆两部分。 + +#### 短期记忆 + +- 自动保存最近的对话(默认20条) +- 使用滑动窗口,自动清理过期记忆(默认30分钟) +- 无需手动管理 + +#### 长期记忆 + +- 自动评估重要性,重要对话会被保存 +- 支持向量检索(RAG) +- 可手动查询历史记忆 + +```python +# 获取用户的记忆上下文 +short_term, long_term = await client.memory.get_context( + user_id="user123", + query="我们之前讨论过什么?", + max_short_term=10, + max_long_term=5 +) + +# 格式化为文本 +context = client.memory.format_context(short_term, long_term) +print(context) + +# 清除短期记忆 +client.clear_memory("user123") +``` + +#### 记忆重要性评估 + +系统会自动评估对话的重要性: + +- 内容长度(>100字符 +0.1分) +- 关键词("重要"、"记住"、"别忘了" +0.2分) +- 元数据(问题 +0.1分,代码 +0.15分) +- 阈值:≥0.6分会被保存到长期记忆 + +### 3. 长任务处理 + +支持将复杂任务分解为多个步骤执行。 + +```python +# 创建长任务 +task_id = await client.create_long_task( + user_id="user123", + title="数据分析任务", + description="分析用户行为数据并生成报告", + steps=[ + { + "description": "加载数据", + "action": "load_data", + "params": {"file_path": "data.csv"} + }, + { + "description": "数据清洗", + "action": "clean_data", + "params": {} + }, + { + "description": "统计分析", + "action": "analyze", + "params": {"metrics": ["avg", "max", "min"]} + }, + { + "description": "生成报告", + "action": "generate_report", + "params": {"format": "pdf"} + } + ] +) + +# 定义进度回调 +async def on_progress(task_id, progress, message): + print(f"任务 {task_id}: {progress*100:.1f}% - {message}") + +# 启动任务 +await client.start_task(task_id, progress_callback=on_progress) + +# 查询任务状态 +status = client.get_task_status(task_id) +print(status) +``` + +#### 注册任务动作处理器 + +```python +# 注册动作处理器 +async def load_data_handler(file_path: str): + # 实现数据加载逻辑 + return {"rows": 1000, "columns": 10} + +client.task_manager.register_action("load_data", load_data_handler) +``` + +### 4. Skills插件系统 + +Skills系统允许你扩展AI的能力。 + +#### 加载技能 + +```python +from pathlib import Path +from src.ai.skills import SkillsManager + +# 创建技能管理器 +skills_manager = SkillsManager(skills_dir=Path("skills")) + +# 加载单个技能 +await skills_manager.load_skill("weather") + +# 加载所有技能 +await skills_manager.load_all_skills() + +# 获取所有工具 +tools = skills_manager.get_all_tools() +``` + +#### 创建自定义技能 + +```python +from src.ai.skills import create_skill_template + +# 创建技能模板 +create_skill_template("my_skill", Path("skills")) +``` + +技能目录结构: + +``` +skills/ +└── my_skill/ + ├── skill.json # 元数据 + ├── main.py # 主要实现 + ├── __init__.py + └── README.md +``` + +`main.py` 示例: + +```python +from src.ai.skills.base import Skill + +class MySkill(Skill): + async def initialize(self): + # 注册工具 + self.register_tool("my_tool", self.my_tool) + + async def my_tool(self, param: str) -> str: + return f"处理: {param}" + + async def cleanup(self): + pass +``` + +### 5. MCP支持 + +MCP (Model Context Protocol) 提供标准化的上下文访问接口。 + +#### 使用内置MCP服务器 + +```python +from pathlib import Path +from src.ai.mcp import MCPManager +from src.ai.mcp.servers import FileSystemMCPServer + +# 创建MCP管理器 +mcp_manager = MCPManager(config_path=Path("config/mcp.json")) + +# 注册文件系统服务器 +fs_server = FileSystemMCPServer(root_path=Path("data")) +await mcp_manager.register_server(fs_server) + +# 获取所有工具 +tools = await mcp_manager.get_all_tools_for_ai() + +# 执行工具 +result = await mcp_manager.execute_tool( + "filesystem.read_file", + {"path": "test.txt"} +) +``` + +#### 创建自定义MCP服务器 + +```python +from src.ai.mcp.base import MCPServer + +class MyMCPServer(MCPServer): + def __init__(self): + super().__init__(name="my_server", version="1.0.0") + + async def initialize(self): + self.register_tool( + name="my_tool", + description="我的工具", + input_schema={ + "type": "object", + "properties": { + "param": {"type": "string"} + }, + "required": ["param"] + }, + handler=self.my_tool_handler + ) + + async def my_tool_handler(self, param: str): + return f"处理: {param}" +``` + +## 集成到QQ机器人 + +### 修改消息处理器 + +```python +# src/handlers/message_handler.py +from src.ai import AIClient +from src.ai.base import ModelConfig, ModelProvider +from pathlib import Path + +class MessageHandler: + def __init__(self, bot): + self.bot = bot + + # 初始化AI客户端 + config = ModelConfig( + provider=ModelProvider.OPENAI, + model_name="gpt-4", + api_key=Config.AI_API_KEY, + api_base=Config.AI_API_BASE + ) + self.ai_client = AIClient(config, data_dir=Path("data/ai")) + + # 加载技能 + from src.ai.skills import SkillsManager + self.skills = SkillsManager(Path("skills")) + asyncio.create_task(self.skills.load_all_skills()) + + async def handle_at_message(self, message: Message): + try: + # 提取用户消息 + user_message = message.content.strip() + user_id = message.author.id + + # 调用AI + response = await self.ai_client.chat( + user_id=user_id, + user_message=user_message, + use_memory=True, + use_tools=True + ) + + # 发送回复 + await message.reply(content=response) + + except Exception as e: + logger.error(f"处理消息失败: {e}") + await message.reply(content="抱歉,处理消息时出错了") +``` + +## 配置文件 + +### config/personalities.json + +```json +{ + "default": { + "name": "小助手", + "description": "友好的AI助手", + "traits": ["FRIENDLY", "PROFESSIONAL", "EMPATHETIC"], + "speaking_style": "温和、清晰、有条理", + "example_responses": [ + "我明白你的意思了,让我来帮你解决这个问题。", + "这是个很好的问题!我来详细解释一下。" + ], + "custom_instructions": "" + } +} +``` + +### config/mcp.json + +```json +{ + "filesystem": { + "enabled": true, + "root_path": "data" + } +} +``` + +## 高级用法 + +### 1. 流式响应 + +```python +async for chunk in client.chat( + user_id="user123", + user_message="讲个故事", + stream=True +): + print(chunk, end='', flush=True) +``` + +### 2. 自定义工具 + +```python +# 定义工具函数 +async def search_web(query: str) -> str: + # 实现搜索逻辑 + return f"搜索结果: {query}" + +# 注册工具 +client.register_tool( + name="search_web", + description="搜索网络信息", + parameters={ + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "搜索关键词" + } + }, + "required": ["query"] + }, + function=search_web +) +``` + +### 3. 多模型切换 + +```python +# 切换到Claude +claude_config = ModelConfig( + provider=ModelProvider.ANTHROPIC, + model_name="claude-3-5-sonnet-20241022", + api_key="your_anthropic_key" +) +client.model = client._create_model(claude_config) + +# 切换到DeepSeek +deepseek_config = ModelConfig( + provider=ModelProvider.DEEPSEEK, + model_name="deepseek-chat", + api_key="your_deepseek_key", + api_base="https://api.deepseek.com/v1" +) +client.model = client._create_model(deepseek_config) +``` + +## 性能优化 + +### 1. 记忆系统优化 + +```python +# 调整短期记忆大小 +client.memory.short_term.max_size = 30 # 默认20 + +# 调整记忆过期时间 +from datetime import timedelta +client.memory.short_term.max_age = timedelta(hours=1) # 默认30分钟 + +# 调整重要性阈值 +client.memory.importance_threshold = 0.7 # 默认0.6 +``` + +### 2. 并发任务处理 + +```python +# 同时启动多个任务 +tasks = [] +for i in range(5): + task_id = await client.create_long_task(...) + tasks.append(client.start_task(task_id)) + +# 等待所有任务完成 +await asyncio.gather(*tasks) +``` + +## 故障排查 + +### 常见问题 + +1. **API调用失败** + - 检查API密钥是否正确 + - 检查网络连接 + - 检查API地址是否正确 + +2. **记忆系统不工作** + - 确保 `use_memory=True` + - 检查数据目录权限 + - 查看日志文件 + +3. **技能加载失败** + - 检查 `skill.json` 格式 + - 确保 `main.py` 中有Skill子类 + - 查看错误日志 + +## 最佳实践 + +1. **合理使用记忆系统** + - 不要在每次对话都查询长期记忆 + - 定期清理不重要的记忆 + - 为重要对话添加元数据标记 + +2. **技能开发** + - 保持技能功能单一 + - 提供清晰的工具描述 + - 处理异常情况 + +3. **长任务设计** + - 将任务分解为合理的步骤 + - 提供进度反馈 + - 支持任务暂停和恢复 + +## 更新日志 + +### v1.0.0 (2024-03-02) +- ✅ 初始版本发布 +- ✅ 支持OpenAI、Anthropic、DeepSeek、Qwen +- ✅ 人格系统 +- ✅ 记忆系统(短期+长期+RAG) +- ✅ 长任务处理 +- ✅ Skills插件系统 +- ✅ MCP支持 + +## 贡献 + +欢迎提交Issue和Pull Request! + +## 许可证 + +MIT License diff --git a/src/ai/mcp/__init__.py b/src/ai/mcp/__init__.py new file mode 100644 index 0000000..4bf4500 --- /dev/null +++ b/src/ai/mcp/__init__.py @@ -0,0 +1,13 @@ +""" +MCP模块 +""" +from .base import MCPServer, MCPClient, MCPManager, MCPResource, MCPTool, MCPPrompt + +__all__ = [ + 'MCPServer', + 'MCPClient', + 'MCPManager', + 'MCPResource', + 'MCPTool', + 'MCPPrompt' +] diff --git a/src/ai/mcp/base.py b/src/ai/mcp/base.py new file mode 100644 index 0000000..4f0b4be --- /dev/null +++ b/src/ai/mcp/base.py @@ -0,0 +1,219 @@ +""" +MCP (Model Context Protocol) 支持 +""" +import asyncio +import json +from typing import Dict, List, Optional, Any, Callable +from dataclasses import dataclass, asdict +from pathlib import Path +from src.utils.logger import setup_logger + +logger = setup_logger('MCPSystem') + + +@dataclass +class MCPResource: + """MCP资源""" + uri: str + name: str + description: str + mime_type: str + + +@dataclass +class MCPTool: + """MCP工具""" + name: str + description: str + input_schema: Dict[str, Any] + + +@dataclass +class MCPPrompt: + """MCP提示词""" + name: str + description: str + arguments: List[Dict[str, Any]] + + +class MCPServer: + """MCP服务器基类""" + + def __init__(self, name: str, version: str): + self.name = name + self.version = version + self.resources: Dict[str, MCPResource] = {} + self.tools: Dict[str, Callable] = {} + self.prompts: Dict[str, MCPPrompt] = {} + + async def initialize(self): + """初始化服务器""" + pass + + async def shutdown(self): + """关闭服务器""" + pass + + def register_resource(self, resource: MCPResource): + """注册资源""" + self.resources[resource.uri] = resource + + def register_tool(self, name: str, description: str, input_schema: Dict, handler: Callable): + """注册工具""" + tool = MCPTool(name=name, description=description, input_schema=input_schema) + self.tools[name] = handler + logger.info(f"✅ MCP工具注册: {self.name}.{name}") + + def register_prompt(self, prompt: MCPPrompt): + """注册提示词""" + self.prompts[prompt.name] = prompt + + async def list_resources(self) -> List[MCPResource]: + """列出资源""" + return list(self.resources.values()) + + async def read_resource(self, uri: str) -> Optional[str]: + """读取资源""" + raise NotImplementedError + + async def list_tools(self) -> List[MCPTool]: + """列出工具""" + return [ + MCPTool(name=name, description="", input_schema={}) + for name in self.tools.keys() + ] + + async def call_tool(self, name: str, arguments: Dict[str, Any]) -> Any: + """调用工具""" + if name not in self.tools: + raise ValueError(f"工具不存在: {name}") + + handler = self.tools[name] + return await handler(**arguments) + + async def list_prompts(self) -> List[MCPPrompt]: + """列出提示词""" + return list(self.prompts.values()) + + async def get_prompt(self, name: str, arguments: Dict[str, Any]) -> Optional[str]: + """获取提示词""" + raise NotImplementedError + + +class MCPClient: + """MCP客户端""" + + def __init__(self): + self.servers: Dict[str, MCPServer] = {} + + async def connect_server(self, server: MCPServer): + """连接服务器""" + await server.initialize() + self.servers[server.name] = server + logger.info(f"✅ 连接MCP服务器: {server.name} v{server.version}") + + async def disconnect_server(self, server_name: str): + """断开服务器""" + if server_name in self.servers: + await self.servers[server_name].shutdown() + del self.servers[server_name] + logger.info(f"✅ 断开MCP服务器: {server_name}") + + def get_server(self, name: str) -> Optional[MCPServer]: + """获取服务器""" + return self.servers.get(name) + + def list_servers(self) -> List[str]: + """列出所有服务器""" + return list(self.servers.keys()) + + async def list_all_resources(self) -> Dict[str, List[MCPResource]]: + """列出所有资源""" + result = {} + for name, server in self.servers.items(): + result[name] = await server.list_resources() + return result + + async def list_all_tools(self) -> Dict[str, List[MCPTool]]: + """列出所有工具""" + result = {} + for name, server in self.servers.items(): + result[name] = await server.list_tools() + return result + + async def call_tool(self, server_name: str, tool_name: str, arguments: Dict[str, Any]) -> Any: + """调用工具""" + server = self.get_server(server_name) + if not server: + raise ValueError(f"服务器不存在: {server_name}") + + return await server.call_tool(tool_name, arguments) + + +class MCPManager: + """MCP管理器""" + + def __init__(self, config_path: Path): + self.config_path = config_path + self.client = MCPClient() + self.server_configs: Dict[str, Dict] = {} + self._load_config() + + def _load_config(self): + """加载配置""" + if self.config_path.exists(): + with open(self.config_path, 'r', encoding='utf-8') as f: + self.server_configs = json.load(f) + + def _save_config(self): + """保存配置""" + self.config_path.parent.mkdir(parents=True, exist_ok=True) + with open(self.config_path, 'w', encoding='utf-8') as f: + json.dump(self.server_configs, f, ensure_ascii=False, indent=2) + + async def register_server(self, server: MCPServer, config: Optional[Dict] = None): + """注册服务器""" + await self.client.connect_server(server) + + if config: + self.server_configs[server.name] = config + self._save_config() + + async def unregister_server(self, server_name: str): + """注销服务器""" + await self.client.disconnect_server(server_name) + + if server_name in self.server_configs: + del self.server_configs[server_name] + self._save_config() + + def get_client(self) -> MCPClient: + """获取客户端""" + return self.client + + async def get_all_tools_for_ai(self) -> List[Dict]: + """获取所有工具(AI格式)""" + all_tools = [] + tools_by_server = await self.client.list_all_tools() + + for server_name, tools in tools_by_server.items(): + for tool in tools: + all_tools.append({ + "type": "function", + "function": { + "name": f"{server_name}.{tool.name}", + "description": tool.description, + "parameters": tool.input_schema + } + }) + + return all_tools + + async def execute_tool(self, full_tool_name: str, arguments: Dict) -> Any: + """执行工具""" + parts = full_tool_name.split('.', 1) + if len(parts) != 2: + raise ValueError(f"工具名格式错误: {full_tool_name}") + + server_name, tool_name = parts + return await self.client.call_tool(server_name, tool_name, arguments) diff --git a/src/ai/mcp/servers/__init__.py b/src/ai/mcp/servers/__init__.py new file mode 100644 index 0000000..2b5a18c --- /dev/null +++ b/src/ai/mcp/servers/__init__.py @@ -0,0 +1,6 @@ +""" +MCP服务器实现 +""" +from .filesystem import FileSystemMCPServer + +__all__ = ['FileSystemMCPServer'] diff --git a/src/ai/mcp/servers/filesystem.py b/src/ai/mcp/servers/filesystem.py new file mode 100644 index 0000000..8f793da --- /dev/null +++ b/src/ai/mcp/servers/filesystem.py @@ -0,0 +1,123 @@ +""" +MCP示例服务器 - 文件系统访问 +""" +from pathlib import Path +from typing import Optional +from ..base import MCPServer, MCPResource + + +class FileSystemMCPServer(MCPServer): + """文件系统MCP服务器""" + + def __init__(self, root_path: Path): + super().__init__(name="filesystem", version="1.0.0") + self.root_path = root_path + + async def initialize(self): + """初始化""" + # 注册工具 + self.register_tool( + name="read_file", + description="读取文件内容", + input_schema={ + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "文件路径" + } + }, + "required": ["path"] + }, + handler=self.read_file + ) + + self.register_tool( + name="write_file", + description="写入文件内容", + input_schema={ + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "文件路径" + }, + "content": { + "type": "string", + "description": "文件内容" + } + }, + "required": ["path", "content"] + }, + handler=self.write_file + ) + + self.register_tool( + name="list_directory", + description="列出目录内容", + input_schema={ + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "目录路径" + } + }, + "required": ["path"] + }, + handler=self.list_directory + ) + + def _resolve_path(self, path: str) -> Path: + """解析路径""" + full_path = (self.root_path / path).resolve() + + # 安全检查:确保路径在root_path内 + if not str(full_path).startswith(str(self.root_path)): + raise ValueError("路径超出允许范围") + + return full_path + + async def read_file(self, path: str) -> str: + """读取文件""" + file_path = self._resolve_path(path) + + if not file_path.exists(): + raise FileNotFoundError(f"文件不存在: {path}") + + if not file_path.is_file(): + raise ValueError(f"不是文件: {path}") + + with open(file_path, 'r', encoding='utf-8') as f: + return f.read() + + async def write_file(self, path: str, content: str) -> str: + """写入文件""" + file_path = self._resolve_path(path) + + file_path.parent.mkdir(parents=True, exist_ok=True) + + with open(file_path, 'w', encoding='utf-8') as f: + f.write(content) + + return f"文件已写入: {path}" + + async def list_directory(self, path: str) -> list: + """列出目录""" + dir_path = self._resolve_path(path) + + if not dir_path.exists(): + raise FileNotFoundError(f"目录不存在: {path}") + + if not dir_path.is_dir(): + raise ValueError(f"不是目录: {path}") + + items = [] + for item in dir_path.iterdir(): + items.append({ + "name": item.name, + "type": "directory" if item.is_dir() else "file", + "size": item.stat().st_size if item.is_file() else None + }) + + return items diff --git a/src/ai/memory.py b/src/ai/memory.py new file mode 100644 index 0000000..8ea4751 --- /dev/null +++ b/src/ai/memory.py @@ -0,0 +1,466 @@ +""" +记忆系统:短期记忆、长期记忆与 RAG 检索(向量数据库)。 +""" +import asyncio +import hashlib +import uuid +from typing import List, Dict, Optional, Tuple, Callable, Awaitable +from dataclasses import dataclass, field +from datetime import datetime, timedelta +from pathlib import Path +from collections import deque +from .vector_store import VectorStore, VectorMemory, ChromaVectorStore, JSONVectorStore +from src.utils.logger import setup_logger + +logger = setup_logger('MemorySystem') + + +@dataclass +class MemoryItem: + """记忆项(用于短期记忆)。""" + content: str + timestamp: datetime + user_id: str + importance: float = 0.5 + metadata: Dict = field(default_factory=dict) + + def to_dict(self) -> Dict: + """转换为字典。""" + return { + 'content': self.content, + 'timestamp': self.timestamp.isoformat(), + 'user_id': self.user_id, + 'importance': self.importance, + 'metadata': self.metadata + } + + +class ShortTermMemory: + """短期记忆(滑动窗口)。""" + + def __init__(self, max_size: int = 20, max_age_minutes: int = 30): + self.max_size = max_size + self.max_age = timedelta(minutes=max_age_minutes) + self.memories: Dict[str, deque] = {} # user_id -> deque of MemoryItem + + def add(self, user_id: str, content: str, metadata: Optional[Dict] = None): + """添加短期记忆。""" + if user_id not in self.memories: + self.memories[user_id] = deque(maxlen=self.max_size) + + memory = MemoryItem( + content=content, + timestamp=datetime.now(), + user_id=user_id, + metadata=metadata or {} + ) + + self.memories[user_id].append(memory) + + def get(self, user_id: str, limit: Optional[int] = None) -> List[MemoryItem]: + """获取短期记忆。""" + if user_id not in self.memories: + return [] + + # 过滤过期记忆 + now = datetime.now() + valid_memories = [ + m for m in self.memories[user_id] + if now - m.timestamp <= self.max_age + ] + + if limit: + valid_memories = valid_memories[-limit:] + + return valid_memories + + def clear(self, user_id: str): + """清除用户短期记忆。""" + if user_id in self.memories: + self.memories.pop(user_id, None) + + +class MemorySystem: + """记忆系统:整合短期记忆与长期记忆。""" + + def __init__( + self, + storage_path: Path, + embed_func: Optional[callable] = None, + importance_evaluator: Optional[Callable[[str, Optional[Dict]], Awaitable[float]]] = None, + importance_threshold: float = 0.6, + use_vector_db: bool = True + ): + self.short_term = ShortTermMemory() + self.embed_func = embed_func + self.importance_evaluator = importance_evaluator + self.importance_threshold = importance_threshold + + # 初始化向量存储 + if use_vector_db: + try: + # 使用 Chroma 向量数据库 + chroma_path = storage_path.parent / "chroma_db" + self.vector_store: VectorStore = ChromaVectorStore(chroma_path) + logger.info("Using Chroma vector store") + except Exception as e: + logger.warning(f"Chroma 初始化失败,降级为 JSON 存储: {e}") + self.vector_store = JSONVectorStore(storage_path) + else: + # 使用 JSON 存储(向后兼容) + self.vector_store = JSONVectorStore(storage_path) + logger.info("使用 JSON 存储") + + @staticmethod + def _normalize_embedding(values: List[float], dim: int = 1024) -> List[float]: + if not values: + return [0.0] * dim + + normalized = [float(v) for v in values[:dim]] + if len(normalized) < dim: + normalized.extend([0.0] * (dim - len(normalized))) + return normalized + + @staticmethod + def _local_embedding(text: str, dim: int = 1024) -> List[float]: + if not text: + return [0.0] * dim + + vec = [0.0] * dim + encoded = text.encode("utf-8", errors="ignore") + if not encoded: + return vec + + for idx, byte in enumerate(encoded): + bucket = idx % dim + vec[bucket] += (byte / 255.0) + + digest = hashlib.sha256(encoded).digest() + for idx, byte in enumerate(digest): + bucket = idx % dim + vec[bucket] += ((byte / 255.0) - 0.5) * 0.1 + + return vec + + async def _build_embedding(self, text: str) -> List[float]: + if self.embed_func: + try: + embedding = await self.embed_func(text) + if embedding: + return [float(v) for v in list(embedding)] + except Exception as e: + logger.warning(f"embedding generation failed: {e}") + + return self._local_embedding(text) + + async def _add_vector_memory( + self, + memory_id: str, + user_id: str, + content: str, + embedding: List[float], + importance: float, + metadata: Optional[Dict] = None, + ) -> bool: + if await self.vector_store.add( + id=memory_id, + user_id=user_id, + content=content, + embedding=embedding, + importance=importance, + metadata=metadata, + ): + return True + + # Chroma collection may have a fixed historical embedding dimension. + candidate_dims = [] + base_len = len(embedding or []) + for dim in [base_len, 1024, 1536, 768, 384, 3072]: + if dim and dim > 0 and dim not in candidate_dims: + candidate_dims.append(dim) + + for dim in candidate_dims: + retry_embedding = self._normalize_embedding(list(embedding or []), dim=dim) + ok = await self.vector_store.add( + id=memory_id, + user_id=user_id, + content=content, + embedding=retry_embedding, + importance=importance, + metadata=metadata, + ) + if ok: + return True + + return False + + @staticmethod + def _normalize_importance(importance: float) -> float: + try: + value = float(importance) + except (TypeError, ValueError): + value = 0.5 + return max(0.0, min(1.0, value)) + + async def add_message( + self, + user_id: str, + role: str, + content: str, + metadata: Optional[Dict] = None + ): + """向短期记忆添加单条消息(不做长期记忆评分)。""" + self.short_term.add(user_id, content, metadata) + + async def add_qa_pair( + self, + user_id: str, + question: str, + answer: str, + metadata: Optional[Dict] = None, + ) -> Optional[VectorMemory]: + """ + 添加最新问答对,并仅对该问答对做模型重要性评估。 + """ + user_meta = {"role": "user"} + assistant_meta = {"role": "assistant"} + if isinstance(metadata, dict): + user_meta.update(metadata) + assistant_meta.update(metadata) + + self.short_term.add(user_id, question, user_meta) + self.short_term.add(user_id, answer, assistant_meta) + + qa_content = f"用户: {question}\n助手: {answer}" + qa_metadata = dict(metadata or {}) + qa_metadata.update({"type": "qa_pair", "question": question, "answer": answer}) + + importance = await self._evaluate_importance(qa_content, qa_metadata) + if importance < self.importance_threshold: + return None + + embedding = await self._build_embedding(qa_content) + memory_id = str(uuid.uuid4()) + ok = await self._add_vector_memory( + memory_id=memory_id, + user_id=user_id, + content=qa_content, + embedding=embedding, + importance=importance, + metadata=qa_metadata, + ) + if not ok: + return None + + return await self.get_long_term(user_id, memory_id) + + async def _evaluate_importance(self, content: str, metadata: Optional[Dict]) -> float: + """评估记忆重要性。""" + if not content or not content.strip(): + return 0.0 + + if self.importance_evaluator: + try: + score = await self.importance_evaluator(content, metadata) + return self._normalize_importance(score) + except Exception as e: + logger.warning(f"importance evaluation failed, fallback to neutral score: {e}") + + # 当模型评估不可用时,使用中性分数作为兜底。 + return 0.5 + + async def get_context( + self, + user_id: str, + query: Optional[str] = None, + max_short_term: int = 10, + max_long_term: int = 5 + ) -> Tuple[List[MemoryItem], List[VectorMemory]]: + """获取上下文(短期 + 长期记忆)。""" + # 获取短期记忆 + short_term_memories = self.short_term.get(user_id, limit=max_short_term) + + # 获取相关长期记忆 + long_term_memories = [] + + if query: + try: + # 使用向量检索 + query_embedding = await self._build_embedding(query) + if query_embedding: + long_term_memories = await self.vector_store.search( + user_id=user_id, + query_embedding=query_embedding, + limit=max_long_term + ) + except Exception as e: + logger.warning(f"向量检索失败,改用重要性检索: {e}") + + if query and not long_term_memories: + query_lower = query.lower() + try: + candidates = await self.vector_store.get_all(user_id) + matches = [m for m in candidates if query_lower in m.content.lower()] + matches.sort(key=lambda m: (m.importance, m.timestamp), reverse=True) + long_term_memories = matches[:max_long_term] + except Exception: + pass + + # 濡傛灉鍚戦噺妫€绱㈠け璐ユ垨娌℃湁缁撴灉锛屼娇鐢ㄩ噸瑕佹€ф绱? + if not long_term_memories: + long_term_memories = await self.vector_store.get_by_importance( + user_id=user_id, + limit=max_long_term + ) + + # 更新长期记忆访问记录 + for memory in long_term_memories: + await self.vector_store.update_access(memory.id) + + return short_term_memories, long_term_memories + + def format_context( + self, + short_term: List[MemoryItem], + long_term: List[VectorMemory] + ) -> str: + """格式化上下文为文本。""" + context = "" + + if long_term: + context += "## 相关历史记忆\n" + for i, memory in enumerate(long_term, 1): + context += f"{i}. {memory.content}\n" + context += "\n" + + if short_term: + context += "## 最近对话\n" + for memory in short_term: + context += f"- {memory.content}\n" + + return context + + async def list_long_term( + self, user_id: str, limit: int = 20 + ) -> List[VectorMemory]: + memories = await self.vector_store.get_all(user_id) + memories.sort(key=lambda m: m.timestamp, reverse=True) + if limit > 0: + return memories[:limit] + return memories + + async def get_long_term(self, user_id: str, memory_id: str) -> Optional[VectorMemory]: + memories = await self.vector_store.get_all(user_id) + for memory in memories: + if memory.id == memory_id: + return memory + return None + + async def add_long_term( + self, + user_id: str, + content: str, + importance: float = 0.8, + metadata: Optional[Dict] = None, + ) -> Optional[VectorMemory]: + memory_id = str(uuid.uuid4()) + importance = self._normalize_importance(importance) + embedding = await self._build_embedding(content) + + ok = await self._add_vector_memory( + memory_id=memory_id, + user_id=user_id, + content=content, + embedding=embedding, + importance=importance, + metadata=metadata or {}, + ) + if not ok: + return None + + return await self.get_long_term(user_id, memory_id) + + async def search_long_term( + self, user_id: str, query: str, limit: int = 10 + ) -> List[VectorMemory]: + if not query: + return [] + + query_embedding = await self._build_embedding(query) + results = await self.vector_store.search( + user_id=user_id, + query_embedding=query_embedding, + limit=limit, + min_importance=0.0, + ) + if results: + return results + + all_memories = await self.vector_store.get_all(user_id) + query_lower = query.lower() + matched = [m for m in all_memories if query_lower in m.content.lower()] + matched.sort(key=lambda m: (m.importance, m.timestamp), reverse=True) + return matched[:limit] + + async def update_long_term( + self, + user_id: str, + memory_id: str, + content: Optional[str] = None, + importance: Optional[float] = None, + metadata: Optional[Dict] = None, + ) -> Optional[VectorMemory]: + original = await self.get_long_term(user_id, memory_id) + if not original: + return None + + new_content = content if content is not None else original.content + new_importance = ( + self._normalize_importance(importance) + if importance is not None + else original.importance + ) + new_metadata = dict(original.metadata or {}) + if metadata is not None: + new_metadata = metadata + + if content is not None: + new_embedding = await self._build_embedding(new_content) + else: + new_embedding = self._normalize_embedding(list(original.embedding or [])) + + deleted = await self.vector_store.delete(memory_id) + if not deleted: + return None + + added = await self._add_vector_memory( + memory_id=memory_id, + user_id=user_id, + content=new_content, + embedding=new_embedding, + importance=new_importance, + metadata=new_metadata, + ) + if not added: + return None + + return await self.get_long_term(user_id, memory_id) + + async def delete_long_term(self, user_id: str, memory_id: str) -> bool: + memory = await self.get_long_term(user_id, memory_id) + if not memory: + return False + return await self.vector_store.delete(memory_id) + + def clear_short_term(self, user_id: str): + """清除短期记忆。""" + self.short_term.clear(user_id) + + async def clear_long_term(self, user_id: str): + """清除长期记忆。""" + await self.vector_store.clear_user(user_id) + + async def close(self): + """关闭记忆系统。""" + await self.vector_store.close() + diff --git a/src/ai/models/__init__.py b/src/ai/models/__init__.py new file mode 100644 index 0000000..361a275 --- /dev/null +++ b/src/ai/models/__init__.py @@ -0,0 +1,7 @@ +""" +AI模型实现 +""" +from .openai_model import OpenAIModel +from .anthropic_model import AnthropicModel + +__all__ = ['OpenAIModel', 'AnthropicModel'] diff --git a/src/ai/models/anthropic_model.py b/src/ai/models/anthropic_model.py new file mode 100644 index 0000000..3854b0e --- /dev/null +++ b/src/ai/models/anthropic_model.py @@ -0,0 +1,120 @@ +""" +Anthropic Claude模型实现 +""" +from typing import List, Optional, AsyncIterator +from anthropic import AsyncAnthropic +from ..base import BaseAIModel, Message, ModelConfig + + +class AnthropicModel(BaseAIModel): + """Anthropic Claude模型实现""" + + def __init__(self, config: ModelConfig): + super().__init__(config) + self.client = AsyncAnthropic( + api_key=config.api_key, + base_url=config.api_base, + timeout=config.timeout + ) + + async def chat( + self, + messages: List[Message], + tools: Optional[List[dict]] = None, + **kwargs + ) -> Message: + """同步对话""" + # 分离system消息 + system_message = None + formatted_messages = [] + + for msg in messages: + if msg.role == "system": + system_message = msg.content + else: + formatted_messages.append({ + "role": msg.role, + "content": msg.content + }) + + params = { + "model": self.config.model_name, + "messages": formatted_messages, + "max_tokens": self.config.max_tokens, + "temperature": self.config.temperature, + } + + if system_message: + params["system"] = system_message + + if tools: + params["tools"] = tools + + params.update(kwargs) + + response = await self.client.messages.create(**params) + + content = "" + tool_calls = [] + + for block in response.content: + if block.type == "text": + content += block.text + elif block.type == "tool_use": + tool_calls.append({ + "id": block.id, + "type": "function", + "function": { + "name": block.name, + "arguments": block.input + } + }) + + return Message( + role="assistant", + content=content, + tool_calls=tool_calls if tool_calls else None + ) + + async def chat_stream( + self, + messages: List[Message], + tools: Optional[List[dict]] = None, + **kwargs + ) -> AsyncIterator[str]: + """流式对话""" + system_message = None + formatted_messages = [] + + for msg in messages: + if msg.role == "system": + system_message = msg.content + else: + formatted_messages.append({ + "role": msg.role, + "content": msg.content + }) + + params = { + "model": self.config.model_name, + "messages": formatted_messages, + "max_tokens": self.config.max_tokens, + "temperature": self.config.temperature, + "stream": True, + } + + if system_message: + params["system"] = system_message + + if tools: + params["tools"] = tools + + params.update(kwargs) + + async with self.client.messages.stream(**params) as stream: + async for text in stream.text_stream: + yield text + + async def embed(self, text: str) -> List[float]: + """文本嵌入(Anthropic不直接提供,需要使用其他服务)""" + raise NotImplementedError("Anthropic不提供嵌入API,请使用OpenAI或其他服务") diff --git a/src/ai/models/openai_model.py b/src/ai/models/openai_model.py new file mode 100644 index 0000000..fe1e855 --- /dev/null +++ b/src/ai/models/openai_model.py @@ -0,0 +1,235 @@ +""" +OpenAI模型实现(兼容OpenAI API的模型) +""" +import json +import httpx +from typing import List, Optional, AsyncIterator, Dict, Any +from openai import AsyncOpenAI +from ..base import BaseAIModel, Message, ModelConfig +from src.utils.logger import setup_logger + +logger = setup_logger('OpenAIModel') + + +class OpenAIModel(BaseAIModel): + """OpenAI模型实现""" + + def __init__(self, config: ModelConfig): + super().__init__(config) + self.logger = logger + + # 创建支持UTF-8的httpx客户端 + http_client = httpx.AsyncClient( + timeout=config.timeout, + limits=httpx.Limits(max_keepalive_connections=5, max_connections=10) + ) + + self.client = AsyncOpenAI( + api_key=config.api_key, + base_url=config.api_base, + timeout=config.timeout, + http_client=http_client + ) + + async def chat( + self, + messages: List[Message], + tools: Optional[List[dict]] = None, + **kwargs + ) -> Message: + """同步对话""" + formatted_messages = [self._format_message(msg) for msg in messages] + + params = { + "model": self.config.model_name, + "messages": formatted_messages, + "temperature": self.config.temperature, + "max_tokens": self.config.max_tokens, + "top_p": self.config.top_p, + "frequency_penalty": self.config.frequency_penalty, + "presence_penalty": self.config.presence_penalty, + } + + if tools: + params["tools"] = tools + + params.update(kwargs) + + response = await self.client.chat.completions.create(**params) + + choice = response.choices[0] + raw_tool_calls = ( + choice.message.tool_calls + if hasattr(choice.message, 'tool_calls') and choice.message.tool_calls + else None + ) + tool_calls = ( + [self._normalize_tool_call(tool_call) for tool_call in raw_tool_calls] + if raw_tool_calls else None + ) + return Message( + role="assistant", + content=choice.message.content or "", + tool_calls=tool_calls + ) + + async def chat_stream( + self, + messages: List[Message], + tools: Optional[List[dict]] = None, + **kwargs + ) -> AsyncIterator[str]: + """流式对话""" + formatted_messages = [self._format_message(msg) for msg in messages] + + params = { + "model": self.config.model_name, + "messages": formatted_messages, + "temperature": self.config.temperature, + "max_tokens": self.config.max_tokens, + "stream": True, + } + + if tools: + params["tools"] = tools + + params.update(kwargs) + + stream = await self.client.chat.completions.create(**params) + + async for chunk in stream: + if chunk.choices[0].delta.content: + yield chunk.choices[0].delta.content + + def _format_message(self, msg: Message) -> Dict[str, Any]: + """将内部消息结构转换为OpenAI消息格式""" + formatted: Dict[str, Any] = {"role": msg.role} + + if msg.role == "assistant": + formatted["content"] = msg.content if msg.content else None + if msg.tool_calls: + formatted["tool_calls"] = [ + self._normalize_tool_call(tool_call) + for tool_call in msg.tool_calls + ] + elif msg.role == "tool": + formatted["content"] = msg.content + if msg.tool_call_id: + formatted["tool_call_id"] = msg.tool_call_id + else: + formatted["content"] = msg.content + if msg.name: + formatted["name"] = msg.name + + return formatted + + def _normalize_tool_call(self, tool_call: Any) -> Dict[str, Any]: + """将工具调用对象统一转换为字典""" + if isinstance(tool_call, dict): + normalized = dict(tool_call) + elif hasattr(tool_call, "model_dump"): + normalized = tool_call.model_dump() + else: + function = getattr(tool_call, "function", None) + if isinstance(function, dict): + function_name = function.get("name") + raw_arguments = function.get("arguments") + else: + function_name = getattr(function, "name", None) + raw_arguments = getattr(function, "arguments", None) + + normalized = { + "id": getattr(tool_call, "id", None), + "type": getattr(tool_call, "type", "function"), + "function": { + "name": function_name, + "arguments": raw_arguments + } + } + + function_data = normalized.get("function") or {} + if not isinstance(function_data, dict): + function_data = { + "name": getattr(function_data, "name", None), + "arguments": getattr(function_data, "arguments", None) + } + raw_arguments = function_data.get("arguments") + + if isinstance(raw_arguments, dict): + arguments = json.dumps(raw_arguments, ensure_ascii=False) + elif raw_arguments is None: + arguments = "{}" + else: + arguments = str(raw_arguments) + + function_data["arguments"] = arguments + normalized["function"] = function_data + normalized["type"] = normalized.get("type") or "function" + + return normalized + + @staticmethod + def _is_embedding_too_long_error(error: Exception) -> bool: + status_code = getattr(error, "status_code", None) + if status_code == 413: + return True + + message = str(error).lower() + return ( + "less than 512 tokens" in message + or "input too long" in message + or "maximum context length" in message + ) + + @staticmethod + def _shrink_text_for_embedding(text: str) -> str: + compact = " ".join((text or "").split()) + if len(compact) <= 64: + return compact + + target = max(64, int(len(compact) * 0.6)) + if target >= len(compact): + target = max(64, len(compact) // 2) + + head = target // 2 + tail = target - head + return f"{compact[:head]} {compact[-tail:]}" + + async def embed(self, text: str) -> List[float]: + """?????""" + if isinstance(text, bytes): + text = text.decode("utf-8", errors="ignore") + + raw_text = str(text or "") + candidate_text = raw_text.strip() or raw_text or " " + retry_count = 0 + + while True: + try: + response = await self.client.embeddings.create( + model=self.config.model_name, + input=candidate_text, + encoding_format="float" + ) + return response.data[0].embedding + except Exception as e: + if self._is_embedding_too_long_error(e): + next_text = self._shrink_text_for_embedding(candidate_text) + if next_text and len(next_text) < len(candidate_text) and retry_count < 5: + retry_count += 1 + self.logger.warning( + "embedding input too long, retry with truncated text: " + f"{len(candidate_text)} -> {len(next_text)}" + ) + candidate_text = next_text + continue + + import traceback + + self.logger.error(f"embedding generation failed: {e}") + self.logger.error(f"model: {self.config.model_name}") + self.logger.error(f"text length: {len(candidate_text)}") + self.logger.error(f"text preview: {repr(candidate_text[:100])}") + self.logger.error(f"full traceback:\n{traceback.format_exc()}") + raise + diff --git a/src/ai/personality.py b/src/ai/personality.py new file mode 100644 index 0000000..0f1d458 --- /dev/null +++ b/src/ai/personality.py @@ -0,0 +1,232 @@ +"""Personality system for role-play profiles.""" + +from dataclasses import dataclass, field +from enum import Enum +import json +from pathlib import Path +from typing import Dict, List, Optional + + +class PersonalityTrait(Enum): + """Personality traits.""" + + FRIENDLY = "Friendly" + PROFESSIONAL = "Professional" + HUMOROUS = "Humorous" + SERIOUS = "Serious" + CREATIVE = "Creative" + ANALYTICAL = "Analytical" + EMPATHETIC = "Empathetic" + DIRECT = "Direct" + + +@dataclass +class PersonalityProfile: + """Single personality profile.""" + + name: str + description: str + traits: List[PersonalityTrait] + speaking_style: str + example_responses: List[str] = field(default_factory=list) + custom_instructions: str = "" + + def to_system_prompt(self) -> str: + """Build plain-text system prompt.""" + + traits_text = ", ".join([t.value for t in self.traits]) if self.traits else "Friendly" + lines = [ + "Role Setting", + f"You are {self.name}. {self.description}", + f"Traits: {traits_text}", + f"Speaking style: {self.speaking_style}", + "Output rule: plain text only. Do not use Markdown syntax.", + ] + + if self.example_responses: + lines.append("Reference responses:") + for idx, example in enumerate(self.example_responses, 1): + lines.append(f"{idx}. {example}") + + if self.custom_instructions: + lines.append(f"Additional instructions: {self.custom_instructions}") + + return "\n".join(lines) + + +class PersonalitySystem: + """Personality management and persistence.""" + + def __init__(self, config_path: Optional[Path] = None): + self.config_path = config_path or Path("config/personalities.json") + self.personalities: Dict[str, PersonalityProfile] = {} + self.current_personality: Optional[PersonalityProfile] = None + self._load_personalities() + + def _dict_to_profile(self, config: Dict) -> PersonalityProfile: + trait_names = config.get("traits", []) + traits: List[PersonalityTrait] = [] + + for trait_name in trait_names: + if trait_name in PersonalityTrait.__members__: + traits.append(PersonalityTrait[trait_name]) + + if not traits: + traits = [PersonalityTrait.FRIENDLY] + + return PersonalityProfile( + name=str(config.get("name", "Assistant")), + description=str(config.get("description", "")), + traits=traits, + speaking_style=str(config.get("speaking_style", "Natural and concise")), + example_responses=list(config.get("example_responses", [])), + custom_instructions=str(config.get("custom_instructions", "")), + ) + + def _load_personalities(self): + """Load personality config from disk or create defaults.""" + + if self.config_path.exists(): + with open(self.config_path, "r", encoding="utf-8") as f: + data = json.load(f) + for key, config in data.items(): + self.personalities[key] = self._dict_to_profile(config) + + if "default" in self.personalities: + self.current_personality = self.personalities["default"] + elif self.personalities: + first_key = next(iter(self.personalities.keys())) + self.current_personality = self.personalities[first_key] + return + + self._create_default_personalities() + + def _create_default_personalities(self): + """Create and persist built-in default profiles.""" + + default = PersonalityProfile( + name="Assistant", + description="A friendly and practical AI assistant.", + traits=[ + PersonalityTrait.FRIENDLY, + PersonalityTrait.PROFESSIONAL, + PersonalityTrait.EMPATHETIC, + ], + speaking_style="Warm, clear, and actionable.", + example_responses=[ + "I understand. Let's solve this step by step.", + "Here is the result first, then the key details.", + ], + ) + + tech_expert = PersonalityProfile( + name="Tech Expert", + description="A senior engineer focused on correctness and maintainability.", + traits=[ + PersonalityTrait.PROFESSIONAL, + PersonalityTrait.ANALYTICAL, + PersonalityTrait.DIRECT, + ], + speaking_style="Direct, structured, and implementation-oriented.", + ) + + creative = PersonalityProfile( + name="Creative Partner", + description="A collaborative creative role-play partner.", + traits=[ + PersonalityTrait.CREATIVE, + PersonalityTrait.HUMOROUS, + PersonalityTrait.FRIENDLY, + ], + speaking_style="Lively, imaginative, and expressive.", + ) + + self.personalities = { + "default": default, + "tech_expert": tech_expert, + "creative": creative, + } + self.current_personality = default + self._save_personalities() + + def _save_personalities(self): + """Persist personalities to disk.""" + + self.config_path.parent.mkdir(parents=True, exist_ok=True) + data = {} + + for key, profile in self.personalities.items(): + data[key] = { + "name": profile.name, + "description": profile.description, + "traits": [trait.name for trait in profile.traits], + "speaking_style": profile.speaking_style, + "example_responses": profile.example_responses, + "custom_instructions": profile.custom_instructions, + } + + with open(self.config_path, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=2) + + def set_personality(self, key: str) -> bool: + """Switch active personality by key.""" + + if key not in self.personalities: + return False + + self.current_personality = self.personalities[key] + return True + + def get_system_prompt(self) -> str: + """Get current personality prompt.""" + + if self.current_personality: + return self.current_personality.to_system_prompt() + return "" + + def add_personality(self, key: str, profile: PersonalityProfile) -> bool: + """Add a new personality profile.""" + + key = key.strip() + if not key: + return False + + self.personalities[key] = profile + if not self.current_personality: + self.current_personality = profile + self._save_personalities() + return True + + def remove_personality(self, key: str) -> bool: + """Remove a personality profile.""" + + if key == "default": + return False + + if key not in self.personalities: + return False + + removed_profile = self.personalities[key] + del self.personalities[key] + + if self.current_personality == removed_profile: + if "default" in self.personalities: + self.current_personality = self.personalities["default"] + elif self.personalities: + first_key = next(iter(self.personalities.keys())) + self.current_personality = self.personalities[first_key] + else: + self.current_personality = None + + self._save_personalities() + return True + + def list_personalities(self) -> List[str]: + """List all personality keys.""" + + return sorted(self.personalities.keys()) + + def get_personality(self, key: str) -> Optional[PersonalityProfile]: + """Get personality by key.""" + + return self.personalities.get(key) diff --git a/src/ai/skills/__init__.py b/src/ai/skills/__init__.py new file mode 100644 index 0000000..40ee6ef --- /dev/null +++ b/src/ai/skills/__init__.py @@ -0,0 +1,6 @@ +""" +Skills系统初始化 +""" +from .base import Skill, SkillsManager, SkillMetadata, create_skill_template + +__all__ = ['Skill', 'SkillsManager', 'SkillMetadata', 'create_skill_template'] diff --git a/src/ai/skills/base.py b/src/ai/skills/base.py new file mode 100644 index 0000000..6a85f54 --- /dev/null +++ b/src/ai/skills/base.py @@ -0,0 +1,552 @@ +""" +Skills 系统 - 可扩展技能插件框架。 +""" + +from dataclasses import dataclass +import importlib +import inspect +import json +from pathlib import Path +import re +import shutil +import sys +import tempfile +import time +from typing import Any, Callable, Dict, List, Optional, Tuple +import urllib.request +import zipfile +import os +import stat + +from src.utils.logger import setup_logger + +logger = setup_logger("SkillsSystem") + + +@dataclass +class SkillMetadata: + """技能元数据。""" + + name: str + version: str + description: str + author: str + dependencies: List[str] + enabled: bool = True + + +class Skill: + """技能基类。""" + + def __init__(self): + self.metadata: Optional[SkillMetadata] = None + self.tools: Dict[str, Callable] = {} + self.manager = None + + async def initialize(self): + """初始化技能。""" + + async def cleanup(self): + """清理技能。""" + + def get_tools(self) -> Dict[str, Callable]: + """获取技能提供的工具。""" + + return self.tools + + def register_tool(self, name: str, func: Callable): + """注册工具。""" + + self.tools[name] = func + + +class SkillsManager: + """技能管理器。""" + + _SKILL_KEY_PATTERN = re.compile(r"[^a-zA-Z0-9_]") + _GITHUB_SHORTCUT_PATTERN = re.compile( + r"^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+(?:#[A-Za-z0-9_.-]+)?$" + ) + + def __init__(self, skills_dir: Path): + self.skills_dir = skills_dir + self.skills: Dict[str, Skill] = {} + self.skills_dir.mkdir(parents=True, exist_ok=True) + logger.info(f"✅ Skills 目录: {skills_dir}") + + @classmethod + def normalize_skill_key(cls, raw_name: str) -> str: + """将任意输入规范化为可导入的 Python 包名。""" + + key = raw_name.strip().lower().replace("-", "_").replace(" ", "_") + key = cls._SKILL_KEY_PATTERN.sub("_", key) + key = re.sub(r"_+", "_", key).strip("_") + + if not key: + raise ValueError("技能名不能为空") + + if key[0].isdigit(): + key = f"skill_{key}" + + return key + + def _get_skill_path(self, skill_name: str) -> Path: + return self.skills_dir / self.normalize_skill_key(skill_name) + + @staticmethod + def _on_rmtree_error(func, path, exc_info): + """Handle Windows readonly/locked file deletion errors.""" + try: + os.chmod(path, stat.S_IWRITE) + func(path) + except Exception: + # Keep original failure path for upper retry logic. + pass + + def _read_metadata(self, skill_path: Path, fallback_name: str) -> Dict[str, Any]: + metadata_file = skill_path / "skill.json" + if metadata_file.exists(): + with open(metadata_file, "r", encoding="utf-8") as f: + metadata = json.load(f) + else: + metadata = {} + + metadata.setdefault("name", fallback_name) + metadata.setdefault("version", "1.0.0") + metadata.setdefault("description", f"{fallback_name} skill") + metadata.setdefault("author", "unknown") + metadata.setdefault("dependencies", []) + metadata.setdefault("enabled", True) + + with open(metadata_file, "w", encoding="utf-8") as f: + json.dump(metadata, f, ensure_ascii=False, indent=2) + + return metadata + + def _ensure_skill_package_layout(self, skill_path: Path, skill_key: str): + """确保技能目录满足运行最小结构。""" + + skill_path.mkdir(parents=True, exist_ok=True) + + init_file = skill_path / "__init__.py" + if not init_file.exists(): + init_file.write_text("", encoding="utf-8") + + main_file = skill_path / "main.py" + if not main_file.exists(): + template = f'''"""{skill_key} skill""" +from src.ai.skills.base import Skill + + +class {"".join(p.capitalize() for p in skill_key.split("_"))}Skill(Skill): + async def initialize(self): + self.register_tool("ping", self.ping) + + async def ping(self, text: str = "ok") -> str: + return text + + async def cleanup(self): + pass +''' + main_file.write_text(template, encoding="utf-8") + + self._read_metadata(skill_path, skill_key) + + async def load_skill(self, skill_name: str) -> bool: + """加载技能。""" + + try: + skill_name = self.normalize_skill_key(skill_name) + + if skill_name in self.skills: + logger.info(f"✅ 技能已加载: {skill_name}") + return True + + skill_path = self._get_skill_path(skill_name) + if not skill_path.exists(): + logger.error(f"❌ 技能不存在: {skill_name}") + return False + + metadata_file = skill_path / "skill.json" + if not metadata_file.exists(): + logger.error(f"❌ 技能元数据不存在: {skill_name}") + return False + + with open(metadata_file, "r", encoding="utf-8") as f: + metadata_dict = json.load(f) + + metadata = SkillMetadata(**metadata_dict) + + if not metadata.enabled: + logger.info(f"⏸️ 技能已禁用: {skill_name}") + return False + + module_path = f"skills.{skill_name}.main" + importlib.invalidate_caches() + + try: + old_dont_write = sys.dont_write_bytecode + sys.dont_write_bytecode = True + try: + if module_path in sys.modules: + module = importlib.reload(sys.modules[module_path]) + else: + module = importlib.import_module(module_path) + finally: + sys.dont_write_bytecode = old_dont_write + except Exception as exc: + logger.error(f"❌ 无法导入技能模块 {module_path}: {exc}") + return False + + skill_class = None + for _, obj in inspect.getmembers(module): + if inspect.isclass(obj) and issubclass(obj, Skill) and obj != Skill: + skill_class = obj + break + + if not skill_class: + logger.error(f"❌ 技能中未找到 Skill 子类: {skill_name}") + return False + + skill = skill_class() + skill.metadata = metadata + skill.manager = self + + await skill.initialize() + self.skills[skill_name] = skill + + logger.info(f"✅ 加载技能: {skill_name} v{metadata.version}") + return True + + except Exception as exc: + logger.error(f"❌ 加载技能失败 {skill_name}: {exc}") + return False + + async def load_all_skills(self): + """加载所有可用技能。""" + + for skill_name in self.list_available_skills(): + await self.load_skill(skill_name) + + async def unload_skill(self, skill_name: str) -> bool: + """仅卸载内存中的技能。""" + + skill_name = self.normalize_skill_key(skill_name) + if skill_name not in self.skills: + return False + + skill = self.skills[skill_name] + await skill.cleanup() + del self.skills[skill_name] + + sys.modules.pop(f"skills.{skill_name}.main", None) + sys.modules.pop(f"skills.{skill_name}", None) + importlib.invalidate_caches() + + logger.info(f"✅ 卸载技能: {skill_name}") + return True + + async def uninstall_skill(self, skill_name: str, delete_files: bool = True) -> bool: + """卸载技能并可选删除文件。""" + + skill_name = self.normalize_skill_key(skill_name) + + if skill_name in self.skills: + await self.unload_skill(skill_name) + + if not delete_files: + return True + + skill_path = self._get_skill_path(skill_name) + if not skill_path.exists(): + return False + + removed = False + for _ in range(3): + try: + shutil.rmtree(skill_path, ignore_errors=False, onerror=self._on_rmtree_error) + except PermissionError: + pass + + if not skill_path.exists(): + removed = True + break + + time.sleep(0.2) + + if not removed: + try: + metadata_file = skill_path / "skill.json" + metadata = {} + if metadata_file.exists(): + with open(metadata_file, "r", encoding="utf-8") as f: + metadata = json.load(f) + metadata["enabled"] = False + with open(metadata_file, "w", encoding="utf-8") as f: + json.dump(metadata, f, ensure_ascii=False, indent=2) + logger.warning(f"⚠️ 删除目录失败,已软卸载技能: {skill_name}") + return True + except Exception: + return False + + importlib.invalidate_caches() + logger.info(f"✅ 删除技能目录: {skill_name}") + return True + + def get_skill(self, skill_name: str) -> Optional[Skill]: + """获取已加载技能实例。""" + + skill_name = self.normalize_skill_key(skill_name) + return self.skills.get(skill_name) + + def list_skills(self) -> List[str]: + """列出已加载技能。""" + + return sorted(self.skills.keys()) + + def list_available_skills(self) -> List[str]: + """列出可加载技能目录。""" + + if not self.skills_dir.exists(): + return [] + + available: List[str] = [] + for skill_dir in self.skills_dir.iterdir(): + if not skill_dir.is_dir() or skill_dir.name.startswith("_"): + continue + + if (skill_dir / "skill.json").exists() and (skill_dir / "main.py").exists(): + try: + with open(skill_dir / "skill.json", "r", encoding="utf-8") as f: + metadata = json.load(f) + if not metadata.get("enabled", True): + continue + available.append(self.normalize_skill_key(skill_dir.name)) + except ValueError: + continue + except Exception: + continue + + return sorted(set(available)) + + def get_all_tools(self) -> Dict[str, Callable]: + """获取全部技能工具。""" + + all_tools: Dict[str, Callable] = {} + for skill_name, skill in self.skills.items(): + for tool_name, tool_func in skill.get_tools().items(): + all_tools[f"{skill_name}.{tool_name}"] = tool_func + return all_tools + + async def reload_skill(self, skill_name: str) -> bool: + """重载技能。""" + + skill_name = self.normalize_skill_key(skill_name) + if skill_name in self.skills: + await self.unload_skill(skill_name) + return await self.load_skill(skill_name) + + def _resolve_network_url(self, source: str) -> str: + """支持 URL 与 GitHub 简写。""" + + source = source.strip() + if source.startswith(("http://", "https://")): + return source + + if self._GITHUB_SHORTCUT_PATTERN.match(source): + repo, _, branch = source.partition("#") + branch = branch or "main" + return f"https://codeload.github.com/{repo}/zip/refs/heads/{branch}" + + raise ValueError("source 必须是 URL 或 owner/repo[#branch]") + + def _download_zip(self, url: str, output_zip: Path): + """下载 zip 包到本地。""" + + req = urllib.request.Request(url, headers={"User-Agent": "QQBot-Skills/1.0"}) + with urllib.request.urlopen(req, timeout=30) as resp: + data = resp.read() + output_zip.write_bytes(data) + + def _find_skill_candidates(self, root_dir: Path) -> List[Tuple[str, Path]]: + """在目录中扫描技能候选项。""" + + candidates: List[Tuple[str, Path]] = [] + for metadata_file in root_dir.rglob("skill.json"): + candidate_dir = metadata_file.parent + if not (candidate_dir / "main.py").exists(): + continue + + try: + with open(metadata_file, "r", encoding="utf-8") as f: + metadata = json.load(f) + raw_name = str(metadata.get("name") or candidate_dir.name) + except Exception: + raw_name = candidate_dir.name + + try: + skill_key = self.normalize_skill_key(raw_name) + except ValueError: + continue + + candidates.append((skill_key, candidate_dir)) + + uniq: Dict[str, Path] = {} + for key, path in candidates: + uniq[key] = path + + return sorted(uniq.items(), key=lambda x: x[0]) + + def install_skill_from_source( + self, + source: str, + skill_name: Optional[str] = None, + overwrite: bool = False, + ) -> Tuple[bool, str]: + """从网络或本地源安装技能目录(仅落盘,不自动加载)。""" + + desired_key = self.normalize_skill_key(skill_name) if skill_name else None + + with tempfile.TemporaryDirectory(prefix="qqbot_skill_") as tmp: + tmp_dir = Path(tmp) + extract_root: Optional[Path] = None + + source_path = Path(source) + if source_path.exists(): + if source_path.is_dir(): + extract_root = source_path + elif source_path.is_file() and source_path.suffix.lower() == ".zip": + with zipfile.ZipFile(source_path, "r") as zf: + zf.extractall(tmp_dir / "extract") + extract_root = tmp_dir / "extract" + else: + return False, "本地 source 仅支持目录或 zip 文件" + else: + try: + url = self._resolve_network_url(source) + except ValueError as exc: + return False, str(exc) + + download_zip = tmp_dir / "download.zip" + try: + self._download_zip(url, download_zip) + except Exception as exc: + # GitHub 简写默认 main 失败时尝试 master + if "codeload.github.com" in url and url.endswith("/main"): + fallback = url[:-4] + "master" + try: + self._download_zip(fallback, download_zip) + except Exception: + return False, f"下载技能失败: {exc}" + else: + return False, f"下载技能失败: {exc}" + + try: + with zipfile.ZipFile(download_zip, "r") as zf: + zf.extractall(tmp_dir / "extract") + except Exception as exc: + return False, f"解压技能失败: {exc}" + + extract_root = tmp_dir / "extract" + + candidates = self._find_skill_candidates(extract_root) + if not candidates: + return False, "未找到可安装技能(需包含 skill.json 与 main.py)" + + selected_key: Optional[str] = None + selected_path: Optional[Path] = None + + if desired_key: + for key, path in candidates: + if key == desired_key: + selected_key, selected_path = key, path + break + + if not selected_path: + names = ", ".join([k for k, _ in candidates]) + return False, f"源中未找到技能 {desired_key},可选: {names}" + else: + if len(candidates) > 1: + names = ", ".join([k for k, _ in candidates]) + return False, f"检测到多个技能,请指定 skill_name。可选: {names}" + selected_key, selected_path = candidates[0] + + assert selected_key is not None and selected_path is not None + target_path = self._get_skill_path(selected_key) + + if target_path.exists(): + if not overwrite: + return False, f"技能已存在: {selected_key}" + shutil.rmtree(target_path) + + shutil.copytree( + selected_path, + target_path, + ignore=shutil.ignore_patterns("__pycache__", "*.pyc", ".git", ".github"), + ) + self._ensure_skill_package_layout(target_path, selected_key) + importlib.invalidate_caches() + + logger.info(f"✅ 安装技能成功: {selected_key} <- {source}") + return True, selected_key + + +def create_skill_template( + skill_name: str, + output_dir: Path, + description: str = "技能描述", + author: str = "QQBot", +): + """创建技能模板。""" + + skill_key = SkillsManager.normalize_skill_key(skill_name) + skill_dir = output_dir / skill_key + skill_dir.mkdir(parents=True, exist_ok=True) + + metadata = { + "name": skill_key, + "version": "1.0.0", + "description": description, + "author": author, + "dependencies": [], + "enabled": True, + } + + with open(skill_dir / "skill.json", "w", encoding="utf-8") as f: + json.dump(metadata, f, ensure_ascii=False, indent=2) + + class_name = "".join(word.capitalize() for word in skill_key.split("_")) + "Skill" + main_code = f'''"""{skill_key} skill""" +from src.ai.skills.base import Skill + + +class {class_name}(Skill): + async def initialize(self): + self.register_tool("example_tool", self.example_tool) + + async def example_tool(self, text: str) -> str: + return f"{skill_key} 收到: {{text}}" + + async def cleanup(self): + pass +''' + + with open(skill_dir / "main.py", "w", encoding="utf-8") as f: + f.write(main_code) + + with open(skill_dir / "__init__.py", "w", encoding="utf-8") as f: + f.write("") + + readme = f"""# {skill_key} + +## 描述 +{description} + +## 工具 +- example_tool(text) +""" + + with open(skill_dir / "README.md", "w", encoding="utf-8") as f: + f.write(readme) + + logger.info(f"✅ 创建技能模板: {skill_dir}") diff --git a/src/ai/task_manager.py b/src/ai/task_manager.py new file mode 100644 index 0000000..2a0d45e --- /dev/null +++ b/src/ai/task_manager.py @@ -0,0 +1,327 @@ +""" +长任务管理器 - 处理需要多步骤的复杂任务 +""" +import asyncio +from typing import List, Dict, Optional, Callable, Any +from dataclasses import dataclass, field +from datetime import datetime +from enum import Enum +import json +from pathlib import Path +import uuid + + +class TaskStatus(Enum): + """任务状态""" + PENDING = "pending" + RUNNING = "running" + PAUSED = "paused" + COMPLETED = "completed" + FAILED = "failed" + CANCELLED = "cancelled" + + +@dataclass +class TaskStep: + """任务步骤""" + step_id: str + description: str + action: str + params: Dict[str, Any] + status: TaskStatus = TaskStatus.PENDING + result: Optional[Any] = None + error: Optional[str] = None + started_at: Optional[datetime] = None + completed_at: Optional[datetime] = None + + def to_dict(self) -> Dict: + return { + 'step_id': self.step_id, + 'description': self.description, + 'action': self.action, + 'params': self.params, + 'status': self.status.value, + 'result': self.result, + 'error': self.error, + 'started_at': self.started_at.isoformat() if self.started_at else None, + 'completed_at': self.completed_at.isoformat() if self.completed_at else None + } + + +@dataclass +class LongTask: + """长任务""" + task_id: str + user_id: str + title: str + description: str + steps: List[TaskStep] = field(default_factory=list) + status: TaskStatus = TaskStatus.PENDING + created_at: datetime = field(default_factory=datetime.now) + started_at: Optional[datetime] = None + completed_at: Optional[datetime] = None + progress: float = 0.0 + metadata: Dict = field(default_factory=dict) + + def to_dict(self) -> Dict: + return { + 'task_id': self.task_id, + 'user_id': self.user_id, + 'title': self.title, + 'description': self.description, + 'steps': [step.to_dict() for step in self.steps], + 'status': self.status.value, + 'created_at': self.created_at.isoformat(), + 'started_at': self.started_at.isoformat() if self.started_at else None, + 'completed_at': self.completed_at.isoformat() if self.completed_at else None, + 'progress': self.progress, + 'metadata': self.metadata + } + + @classmethod + def from_dict(cls, data: Dict) -> 'LongTask': + steps = [ + TaskStep( + step_id=s['step_id'], + description=s['description'], + action=s['action'], + params=s['params'], + status=TaskStatus(s['status']), + result=s.get('result'), + error=s.get('error'), + started_at=datetime.fromisoformat(s['started_at']) if s.get('started_at') else None, + completed_at=datetime.fromisoformat(s['completed_at']) if s.get('completed_at') else None + ) + for s in data['steps'] + ] + + return cls( + task_id=data['task_id'], + user_id=data['user_id'], + title=data['title'], + description=data['description'], + steps=steps, + status=TaskStatus(data['status']), + created_at=datetime.fromisoformat(data['created_at']), + started_at=datetime.fromisoformat(data['started_at']) if data.get('started_at') else None, + completed_at=datetime.fromisoformat(data['completed_at']) if data.get('completed_at') else None, + progress=data.get('progress', 0.0), + metadata=data.get('metadata', {}) + ) + + +class LongTaskManager: + """长任务管理器""" + + def __init__(self, storage_path: Path): + self.storage_path = storage_path + self.tasks: Dict[str, LongTask] = {} + self.action_handlers: Dict[str, Callable] = {} + self.running_tasks: Dict[str, asyncio.Task] = {} + self._load() + + def _load(self): + """加载任务""" + if self.storage_path.exists(): + with open(self.storage_path, 'r', encoding='utf-8') as f: + data = json.load(f) + for task_data in data: + task = LongTask.from_dict(task_data) + self.tasks[task.task_id] = task + + def _save(self): + """保存任务""" + self.storage_path.parent.mkdir(parents=True, exist_ok=True) + data = [task.to_dict() for task in self.tasks.values()] + with open(self.storage_path, 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False, indent=2) + + def register_action(self, action_name: str, handler: Callable): + """注册动作处理器""" + self.action_handlers[action_name] = handler + + def create_task( + self, + user_id: str, + title: str, + description: str, + steps: List[Dict], + metadata: Optional[Dict] = None + ) -> str: + """创建任务""" + task_id = str(uuid.uuid4()) + + task_steps = [ + TaskStep( + step_id=str(uuid.uuid4()), + description=step['description'], + action=step['action'], + params=step.get('params', {}) + ) + for step in steps + ] + + task = LongTask( + task_id=task_id, + user_id=user_id, + title=title, + description=description, + steps=task_steps, + metadata=metadata or {} + ) + + self.tasks[task_id] = task + self._save() + + return task_id + + async def execute_task( + self, + task_id: str, + progress_callback: Optional[Callable[[str, float, str], None]] = None + ) -> bool: + """执行任务""" + if task_id not in self.tasks: + return False + + task = self.tasks[task_id] + + if task.status == TaskStatus.RUNNING: + return False + + task.status = TaskStatus.RUNNING + task.started_at = datetime.now() + self._save() + + try: + total_steps = len(task.steps) + + for i, step in enumerate(task.steps): + # 检查是否被取消 + if task.status == TaskStatus.CANCELLED: + break + + step.status = TaskStatus.RUNNING + step.started_at = datetime.now() + + # 执行步骤 + try: + handler = self.action_handlers.get(step.action) + if not handler: + raise ValueError(f"未找到动作处理器: {step.action}") + + result = await handler(**step.params) + step.result = result + step.status = TaskStatus.COMPLETED + + except Exception as e: + step.error = str(e) + step.status = TaskStatus.FAILED + task.status = TaskStatus.FAILED + self._save() + return False + + finally: + step.completed_at = datetime.now() + + # 更新进度 + task.progress = (i + 1) / total_steps + self._save() + + if progress_callback: + await progress_callback( + task_id, + task.progress, + f"完成步骤 {i+1}/{total_steps}: {step.description}" + ) + + task.status = TaskStatus.COMPLETED + task.completed_at = datetime.now() + task.progress = 1.0 + self._save() + + return True + + except Exception as e: + task.status = TaskStatus.FAILED + self._save() + raise e + + async def start_task( + self, + task_id: str, + progress_callback: Optional[Callable[[str, float, str], None]] = None + ): + """启动任务(异步)""" + if task_id in self.running_tasks: + return + + async def run(): + try: + await self.execute_task(task_id, progress_callback) + finally: + if task_id in self.running_tasks: + del self.running_tasks[task_id] + + self.running_tasks[task_id] = asyncio.create_task(run()) + + def pause_task(self, task_id: str) -> bool: + """暂停任务""" + if task_id not in self.tasks: + return False + + task = self.tasks[task_id] + if task.status == TaskStatus.RUNNING: + task.status = TaskStatus.PAUSED + self._save() + return True + + return False + + def cancel_task(self, task_id: str) -> bool: + """取消任务""" + if task_id not in self.tasks: + return False + + task = self.tasks[task_id] + task.status = TaskStatus.CANCELLED + self._save() + + # 取消正在运行的任务 + if task_id in self.running_tasks: + self.running_tasks[task_id].cancel() + + return True + + def get_task(self, task_id: str) -> Optional[LongTask]: + """获取任务""" + return self.tasks.get(task_id) + + def get_user_tasks(self, user_id: str) -> List[LongTask]: + """获取用户的所有任务""" + return [ + task for task in self.tasks.values() + if task.user_id == user_id + ] + + def get_task_status(self, task_id: str) -> Optional[Dict]: + """获取任务状态""" + task = self.get_task(task_id) + if not task: + return None + + completed_steps = sum(1 for step in task.steps if step.status == TaskStatus.COMPLETED) + total_steps = len(task.steps) + + return { + 'task_id': task.task_id, + 'title': task.title, + 'status': task.status.value, + 'progress': task.progress, + 'completed_steps': completed_steps, + 'total_steps': total_steps, + 'current_step': next( + (step.description for step in task.steps if step.status == TaskStatus.RUNNING), + None + ) + } diff --git a/src/ai/vector_store/__init__.py b/src/ai/vector_store/__init__.py new file mode 100644 index 0000000..b01b013 --- /dev/null +++ b/src/ai/vector_store/__init__.py @@ -0,0 +1,13 @@ +""" +向量存储模块 +""" +from .base import VectorStore, VectorMemory +from .chroma_store import ChromaVectorStore +from .json_store import JSONVectorStore + +__all__ = [ + 'VectorStore', + 'VectorMemory', + 'ChromaVectorStore', + 'JSONVectorStore' +] diff --git a/src/ai/vector_store/base.py b/src/ai/vector_store/base.py new file mode 100644 index 0000000..b030344 --- /dev/null +++ b/src/ai/vector_store/base.py @@ -0,0 +1,113 @@ +""" +向量数据库抽象层 +""" +from abc import ABC, abstractmethod +from typing import List, Dict, Optional, Tuple +from dataclasses import dataclass +from datetime import datetime + + +@dataclass +class VectorMemory: + """向量记忆项""" + id: str + user_id: str + content: str + embedding: List[float] + importance: float + timestamp: datetime + metadata: Dict + access_count: int = 0 + last_access: Optional[datetime] = None + + def to_dict(self) -> Dict: + """转换为字典""" + return { + 'id': self.id, + 'user_id': self.user_id, + 'content': self.content, + 'embedding': self.embedding, + 'importance': self.importance, + 'timestamp': self.timestamp.isoformat(), + 'metadata': self.metadata, + 'access_count': self.access_count, + 'last_access': self.last_access.isoformat() if self.last_access else None + } + + @classmethod + def from_dict(cls, data: Dict) -> 'VectorMemory': + """从字典创建""" + return cls( + id=data['id'], + user_id=data['user_id'], + content=data['content'], + embedding=data['embedding'], + importance=data['importance'], + timestamp=datetime.fromisoformat(data['timestamp']), + metadata=data.get('metadata', {}), + access_count=data.get('access_count', 0), + last_access=datetime.fromisoformat(data['last_access']) if data.get('last_access') else None + ) + + +class VectorStore(ABC): + """向量存储抽象基类""" + + @abstractmethod + async def add( + self, + id: str, + user_id: str, + content: str, + embedding: List[float], + importance: float, + metadata: Optional[Dict] = None + ) -> bool: + """添加记忆""" + pass + + @abstractmethod + async def search( + self, + user_id: str, + query_embedding: List[float], + limit: int = 5, + min_importance: float = 0.3 + ) -> List[VectorMemory]: + """搜索相似记忆""" + pass + + @abstractmethod + async def get_by_importance( + self, + user_id: str, + limit: int = 5, + min_importance: float = 0.3 + ) -> List[VectorMemory]: + """按重要性获取记忆""" + pass + + @abstractmethod + async def update_access(self, memory_id: str) -> bool: + """更新访问记录""" + pass + + @abstractmethod + async def delete(self, memory_id: str) -> bool: + """删除记忆""" + pass + + @abstractmethod + async def get_all(self, user_id: str) -> List[VectorMemory]: + """获取用户所有记忆""" + pass + + @abstractmethod + async def clear_user(self, user_id: str) -> bool: + """清除用户所有记忆""" + pass + + @abstractmethod + async def close(self): + """关闭连接""" + pass diff --git a/src/ai/vector_store/chroma_store.py b/src/ai/vector_store/chroma_store.py new file mode 100644 index 0000000..43be6a1 --- /dev/null +++ b/src/ai/vector_store/chroma_store.py @@ -0,0 +1,336 @@ +""" +Chroma向量数据库实现 +""" +import uuid +from typing import List, Dict, Optional +from pathlib import Path +from datetime import datetime +import chromadb +from chromadb.config import Settings +from .base import VectorStore, VectorMemory +from src.utils.logger import setup_logger + +logger = setup_logger('ChromaStore') + + +class ChromaVectorStore(VectorStore): + """Chroma向量数据库实现""" + + def __init__(self, persist_directory: Path): + """初始化Chroma客户端""" + self.persist_directory = persist_directory + self.persist_directory.mkdir(parents=True, exist_ok=True) + + # 创建Chroma客户端 + self.client = chromadb.PersistentClient( + path=str(persist_directory), + settings=Settings( + anonymized_telemetry=False, + allow_reset=True + ) + ) + + # 获取或创建集合 + self.collection = self.client.get_or_create_collection( + name="long_term_memory", + metadata={"description": "Long-term memory storage"} + ) + + logger.info(f"✅ Chroma向量数据库初始化: {persist_directory}") + + @staticmethod + def _to_list(value): + """将可能的 numpy 数组等序列转为 Python list。""" + if value is None: + return [] + if hasattr(value, "tolist"): + return value.tolist() + if isinstance(value, list): + return value + return list(value) + + async def add( + self, + id: str, + user_id: str, + content: str, + embedding: List[float], + importance: float, + metadata: Optional[Dict] = None + ) -> bool: + """添加记忆""" + try: + if not embedding: + logger.warning(f"跳过写入长期记忆(embedding为空): {id}") + return False + + now = datetime.now() + + # 准备元数据 + meta = { + 'user_id': user_id, + 'importance': importance, + 'timestamp': now.isoformat(), + 'access_count': 0, + 'last_access': '', + } + + if metadata: + # 只保存可序列化的元数据 + for key, value in metadata.items(): + if isinstance(value, (str, int, float, bool)): + meta[f'meta_{key}'] = value + + # 添加到Chroma + self.collection.add( + ids=[id], + embeddings=[embedding], + documents=[content], + metadatas=[meta] + ) + + logger.debug(f"添加记忆: {id} (用户: {user_id})") + return True + + except Exception as e: + logger.error(f"添加记忆失败: {e}") + return False + + async def search( + self, + user_id: str, + query_embedding: List[float], + limit: int = 5, + min_importance: float = 0.3 + ) -> List[VectorMemory]: + """搜索相似记忆""" + try: + # 查询Chroma + results = self.collection.query( + query_embeddings=[query_embedding], + n_results=limit * 2, # 多查询一些,用于过滤 + where={"user_id": user_id} + ) + + ids = self._to_list(results.get('ids')) + if len(ids) == 0: + return [] + first_row_ids = self._to_list(ids[0]) + if len(first_row_ids) == 0: + return [] + + metadatas = self._to_list(results.get('metadatas')) + documents = self._to_list(results.get('documents')) + embeddings = self._to_list(results.get('embeddings')) + first_row_metas = self._to_list(metadatas[0]) if len(metadatas) > 0 else [] + first_row_docs = self._to_list(documents[0]) if len(documents) > 0 else [] + first_row_embeddings = self._to_list(embeddings[0]) if len(embeddings) > 0 else [] + + # 转换结果 + memories = [] + for i in range(len(first_row_ids)): + if i >= len(first_row_metas) or i >= len(first_row_docs): + continue + + meta = first_row_metas[i] + + # 过滤重要性 + if meta['importance'] < min_importance: + continue + + # 提取自定义元数据 + custom_meta = {} + for key, value in meta.items(): + if key.startswith('meta_'): + custom_meta[key[5:]] = value + + memory = VectorMemory( + id=first_row_ids[i], + user_id=meta['user_id'], + content=first_row_docs[i], + embedding=self._to_list(first_row_embeddings[i]) if i < len(first_row_embeddings) else [], + importance=meta['importance'], + timestamp=datetime.fromisoformat(meta['timestamp']), + metadata=custom_meta, + access_count=meta.get('access_count', 0), + last_access=datetime.fromisoformat(meta['last_access']) if meta.get('last_access') else None + ) + memories.append(memory) + + if len(memories) >= limit: + break + + return memories + + except Exception as e: + logger.error(f"搜索记忆失败: {e}") + return [] + + async def get_by_importance( + self, + user_id: str, + limit: int = 5, + min_importance: float = 0.3 + ) -> List[VectorMemory]: + """按重要性获取记忆""" + try: + # 获取所有用户记忆 + results = self.collection.get( + where={"user_id": user_id}, + include=['embeddings', 'documents', 'metadatas'] + ) + + ids = self._to_list(results.get('ids')) + if len(ids) == 0: + return [] + + metadatas = self._to_list(results.get('metadatas')) + documents = self._to_list(results.get('documents')) + embeddings = self._to_list(results.get('embeddings')) + + # 转换并排序 + memories = [] + for i in range(len(ids)): + if i >= len(metadatas) or i >= len(documents): + continue + meta = metadatas[i] + + if meta['importance'] < min_importance: + continue + + custom_meta = {} + for key, value in meta.items(): + if key.startswith('meta_'): + custom_meta[key[5:]] = value + + memory = VectorMemory( + id=ids[i], + user_id=meta['user_id'], + content=documents[i], + embedding=self._to_list(embeddings[i]) if i < len(embeddings) else [], + importance=meta['importance'], + timestamp=datetime.fromisoformat(meta['timestamp']), + metadata=custom_meta, + access_count=meta.get('access_count', 0), + last_access=datetime.fromisoformat(meta['last_access']) if meta.get('last_access') else None + ) + memories.append(memory) + + # 按重要性和时间排序 + memories.sort(key=lambda m: (m.importance, m.timestamp), reverse=True) + return memories[:limit] + + except Exception as e: + logger.error(f"获取记忆失败: {e}") + return [] + + async def update_access(self, memory_id: str) -> bool: + """更新访问记录""" + try: + # 获取当前记忆 + result = self.collection.get( + ids=[memory_id], + include=['metadatas'] + ) + + ids = self._to_list(result.get('ids')) + if len(ids) == 0: + return False + + metadatas = self._to_list(result.get('metadatas')) + if len(metadatas) == 0: + return False + meta = metadatas[0] + meta['access_count'] = meta.get('access_count', 0) + 1 + meta['last_access'] = datetime.now().isoformat() + + # 更新元数据 + self.collection.update( + ids=[memory_id], + metadatas=[meta] + ) + + return True + + except Exception as e: + logger.error(f"更新访问记录失败: {e}") + return False + + async def delete(self, memory_id: str) -> bool: + """删除记忆""" + try: + self.collection.delete(ids=[memory_id]) + return True + except Exception as e: + logger.error(f"删除记忆失败: {e}") + return False + + async def get_all(self, user_id: str) -> List[VectorMemory]: + """获取用户所有记忆""" + try: + results = self.collection.get( + where={"user_id": user_id}, + include=['embeddings', 'documents', 'metadatas'] + ) + + ids = self._to_list(results.get('ids')) + if len(ids) == 0: + return [] + + metadatas = self._to_list(results.get('metadatas')) + documents = self._to_list(results.get('documents')) + embeddings = self._to_list(results.get('embeddings')) + + memories = [] + for i in range(len(ids)): + if i >= len(metadatas) or i >= len(documents): + continue + meta = metadatas[i] + + custom_meta = {} + for key, value in meta.items(): + if key.startswith('meta_'): + custom_meta[key[5:]] = value + + memory = VectorMemory( + id=ids[i], + user_id=meta['user_id'], + content=documents[i], + embedding=self._to_list(embeddings[i]) if i < len(embeddings) else [], + importance=meta['importance'], + timestamp=datetime.fromisoformat(meta['timestamp']), + metadata=custom_meta, + access_count=meta.get('access_count', 0), + last_access=datetime.fromisoformat(meta['last_access']) if meta.get('last_access') else None + ) + memories.append(memory) + + return memories + + except Exception as e: + logger.error(f"获取所有记忆失败: {e}") + return [] + + async def clear_user(self, user_id: str) -> bool: + """清除用户所有记忆""" + try: + # 获取用户所有记忆ID + results = self.collection.get( + where={"user_id": user_id} + ) + + ids = self._to_list(results.get('ids')) + if len(ids) > 0: + self.collection.delete(ids=ids) + + logger.info(f"清除用户记忆: {user_id}") + return True + + except Exception as e: + logger.error(f"清除用户记忆失败: {e}") + return False + + async def close(self): + """关闭连接""" + # Chroma会自动持久化,无需特殊关闭操作 + logger.info("Chroma向量数据库已关闭") diff --git a/src/ai/vector_store/json_store.py b/src/ai/vector_store/json_store.py new file mode 100644 index 0000000..87fea5b --- /dev/null +++ b/src/ai/vector_store/json_store.py @@ -0,0 +1,198 @@ +""" +JSON文件存储实现(向后兼容) +""" +import json +import uuid +from typing import List, Dict, Optional +from pathlib import Path +from datetime import datetime +import numpy as np +from .base import VectorStore, VectorMemory +from src.utils.logger import setup_logger + +logger = setup_logger('JSONStore') + + +class JSONVectorStore(VectorStore): + """JSON文件存储实现(向后兼容旧版本)""" + + def __init__(self, storage_path: Path): + """初始化JSON存储""" + self.storage_path = storage_path + self.memories: Dict[str, List[VectorMemory]] = {} # user_id -> List[VectorMemory] + self._load() + logger.info(f"✅ JSON存储初始化: {storage_path}") + + def _load(self): + """加载记忆""" + if self.storage_path.exists(): + try: + with open(self.storage_path, 'r', encoding='utf-8') as f: + data = json.load(f) + + for user_id, items in data.items(): + self.memories[user_id] = [] + for item in items: + # 兼容旧格式 + if 'id' not in item: + item['id'] = str(uuid.uuid4()) + + memory = VectorMemory.from_dict(item) + self.memories[user_id].append(memory) + + logger.info(f"加载了 {sum(len(v) for v in self.memories.values())} 条记忆") + except Exception as e: + logger.error(f"加载记忆失败: {e}") + self.memories = {} + + def _save(self): + """保存记忆""" + try: + self.storage_path.parent.mkdir(parents=True, exist_ok=True) + data = { + user_id: [memory.to_dict() for memory in memories] + for user_id, memories in self.memories.items() + } + + with open(self.storage_path, 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False, indent=2) + except Exception as e: + logger.error(f"保存记忆失败: {e}") + + async def add( + self, + id: str, + user_id: str, + content: str, + embedding: List[float], + importance: float, + metadata: Optional[Dict] = None + ) -> bool: + """添加记忆""" + try: + memory = VectorMemory( + id=id, + user_id=user_id, + content=content, + embedding=embedding, + importance=importance, + timestamp=datetime.now(), + metadata=metadata or {}, + access_count=0, + last_access=None + ) + + if user_id not in self.memories: + self.memories[user_id] = [] + + self.memories[user_id].append(memory) + self._save() + + logger.debug(f"添加记忆: {id} (用户: {user_id})") + return True + except Exception as e: + logger.error(f"添加记忆失败: {e}") + return False + + async def search( + self, + user_id: str, + query_embedding: List[float], + limit: int = 5, + min_importance: float = 0.3 + ) -> List[VectorMemory]: + """搜索相似记忆""" + if user_id not in self.memories: + return [] + + memories = self.memories[user_id] + + # 过滤重要性 + memories = [m for m in memories if m.importance >= min_importance] + + if not memories: + return [] + + # 使用向量相似度排序 + scored_memories = [] + for memory in memories: + if memory.embedding: + similarity = self._cosine_similarity(query_embedding, memory.embedding) + scored_memories.append((similarity, memory)) + + if not scored_memories: + # 如果没有嵌入向量,按重要性排序 + return await self.get_by_importance(user_id, limit, min_importance) + + scored_memories.sort(reverse=True, key=lambda x: x[0]) + return [m for _, m in scored_memories[:limit]] + + async def get_by_importance( + self, + user_id: str, + limit: int = 5, + min_importance: float = 0.3 + ) -> List[VectorMemory]: + """按重要性获取记忆""" + if user_id not in self.memories: + return [] + + memories = [m for m in self.memories[user_id] if m.importance >= min_importance] + memories.sort(key=lambda m: (m.importance, m.timestamp), reverse=True) + return memories[:limit] + + def _cosine_similarity(self, vec1: List[float], vec2: List[float]) -> float: + """计算余弦相似度""" + vec1 = np.array(vec1) + vec2 = np.array(vec2) + return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2)) + + async def update_access(self, memory_id: str) -> bool: + """更新访问记录""" + try: + for memories in self.memories.values(): + for memory in memories: + if memory.id == memory_id: + memory.access_count += 1 + memory.last_access = datetime.now() + self._save() + return True + return False + except Exception as e: + logger.error(f"更新访问记录失败: {e}") + return False + + async def delete(self, memory_id: str) -> bool: + """删除记忆""" + try: + for user_id, memories in self.memories.items(): + for i, memory in enumerate(memories): + if memory.id == memory_id: + del self.memories[user_id][i] + self._save() + return True + return False + except Exception as e: + logger.error(f"删除记忆失败: {e}") + return False + + async def get_all(self, user_id: str) -> List[VectorMemory]: + """获取用户所有记忆""" + return self.memories.get(user_id, []) + + async def clear_user(self, user_id: str) -> bool: + """清除用户所有记忆""" + try: + if user_id in self.memories: + del self.memories[user_id] + self._save() + logger.info(f"清除用户记忆: {user_id}") + return True + except Exception as e: + logger.error(f"清除用户记忆失败: {e}") + return False + + async def close(self): + """关闭连接""" + self._save() + logger.info("JSON存储已关闭") diff --git a/src/core/__init__.py b/src/core/__init__.py new file mode 100644 index 0000000..a0ad96a --- /dev/null +++ b/src/core/__init__.py @@ -0,0 +1,17 @@ +""" +核心模块导出。 + +避免在包导入阶段触发 `bot -> handler -> core` 循环依赖。 +""" + +__all__ = ["MyClient", "Config"] + + +def __getattr__(name): + if name == "MyClient": + from .bot import MyClient + return MyClient + if name == "Config": + from .config import Config + return Config + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") \ No newline at end of file diff --git a/src/core/bot.py b/src/core/bot.py new file mode 100644 index 0000000..f05f9e2 --- /dev/null +++ b/src/core/bot.py @@ -0,0 +1,105 @@ +""" +QQ机器人主程序 +基于官方SDK: https://github.com/tencent-connect/botpy +官方文档: https://bot.q.qq.com/wiki/develop/api-v2/ +""" +import botpy +from botpy.message import Message +from src.core.config import Config +from src.utils.logger import setup_logger +from src.handlers.message_handler_ai import MessageHandler + +logger = setup_logger('QQBot') + + +def build_intents() -> botpy.Intents: + """ + 构建最小可用的 intents。 + + - public_guild_messages: 频道公域 @机器人 消息 + - public_messages: 群聊@ + C2C 私聊(好友单聊)消息 + """ + intents = botpy.Intents.none() + intents.public_guild_messages = True + + # 新版 botpy 中,QQ 群聊@ / C2C 私聊依赖 public_messages(GROUP_AND_C2C_EVENT)。 + if hasattr(intents, "public_messages"): + intents.public_messages = True + logger.info("✅ 已启用 public_messages(支持群聊@与 C2C 私聊)") + else: + logger.warning("⚠️ 当前 botpy 不支持 public_messages,可能无法接收 C2C 私聊事件") + + return intents + + +class MyClient(botpy.Client): + """QQ机器人客户端""" + + def __init__(self, intents: botpy.Intents): + super().__init__(intents=intents) + self.message_handler = MessageHandler(self) + + async def on_ready(self): + """机器人启动完成事件""" + logger.info(f"🤖 机器人已启动: {self.robot.name} (ID: {self.robot.id})") + + async def on_at_message_create(self, message: Message): + """处理@机器人的消息(频道公域消息)""" + await self.message_handler.handle_at_message(message) + + async def on_message_create(self, message: Message): + """处理普通消息(需要私域权限)""" + await self.message_handler.handle_at_message(message) + + async def on_direct_message_create(self, message: Message): + """处理私信消息""" + await self.message_handler.handle_at_message(message) + + async def on_group_at_message_create(self, message: Message): + """处理群聊@消息""" + await self.message_handler.handle_at_message(message) + + async def on_c2c_message_create(self, message: Message): + """处理C2C消息(单聊)""" + await self.message_handler.handle_at_message(message) + + async def on_guild_create(self, guild): + """机器人加入频道事件""" + logger.info(f"➕ 加入频道: {guild.name} (ID: {guild.id})") + + async def on_guild_delete(self, guild): + """机器人离开频道事件""" + logger.info(f"➖ 离开频道: {guild.name} (ID: {guild.id})") + + async def on_error(self, error): + """错误处理""" + logger.error(f"❌ 发生错误: {error}") + + +def main(): + """主函数""" + try: + # 验证配置 + Config.validate() + logger.info("✅ 配置验证通过") + + # 创建机器人实例 - 使用最小可用 intents,避免 disallowed intents(4014) + intents = build_intents() + logger.info("✅ Intents 配置完成(最小权限模式)") + + client = MyClient(intents=intents) + + # 启动机器人 + logger.info("🚀 正在启动机器人...") + client.run(appid=Config.BOT_APPID, secret=Config.BOT_SECRET) + + except ValueError as e: + logger.error(f"❌ 配置错误: {e}") + logger.error("请检查 .env 文件配置") + except Exception as e: + logger.error(f"❌ 启动失败: {e}") + raise + + +if __name__ == "__main__": + main() diff --git a/src/core/config.py b/src/core/config.py new file mode 100644 index 0000000..b4a6591 --- /dev/null +++ b/src/core/config.py @@ -0,0 +1,72 @@ +""" +QQ机器人配置管理模块 +""" +import os +from typing import Optional +from dotenv import load_dotenv + +# 加载环境变量 +load_dotenv() + + +def _read_env(name: str, default: Optional[str] = None) -> Optional[str]: + """ + 读取并清洗环境变量。 + - 去除首尾空白 + - 空字符串视为未设置 + - 以 # 开头的值视为注释占位,视为未设置 + """ + value = os.getenv(name) + if value is None: + return default + + value = value.strip() + if not value or value.startswith('#'): + return default + + return value + + +class Config: + """机器人配置类""" + + # 机器人基本信息 + BOT_APPID = _read_env('BOT_APPID', '') or '' + BOT_SECRET = _read_env('BOT_SECRET', '') or '' + + # 日志配置 + LOG_LEVEL = _read_env('LOG_LEVEL', 'INFO') or 'INFO' + + # 沙箱模式 + SANDBOX_MODE = os.getenv('SANDBOX_MODE', 'False').lower() == 'true' + + # AI配置 + AI_PROVIDER = _read_env('AI_PROVIDER', 'openai') or 'openai' + AI_MODEL = _read_env('AI_MODEL', 'gpt-4') or 'gpt-4' + AI_API_KEY = _read_env('AI_API_KEY', '') or '' + AI_API_BASE = _read_env('AI_API_BASE', None) + + # AI嵌入模型配置(用于RAG) + AI_EMBED_PROVIDER = _read_env('AI_EMBED_PROVIDER', 'openai') or 'openai' + AI_EMBED_MODEL = _read_env('AI_EMBED_MODEL', 'text-embedding-3-small') or 'text-embedding-3-small' + AI_EMBED_API_KEY = _read_env('AI_EMBED_API_KEY', None) # 留空则使用 AI_API_KEY + AI_EMBED_API_BASE = _read_env('AI_EMBED_API_BASE', None) # 留空则使用 AI_API_BASE + + # 向量数据库配置 + AI_USE_VECTOR_DB = os.getenv('AI_USE_VECTOR_DB', 'true').lower() == 'true' + + @classmethod + def validate(cls): + """验证配置是否完整""" + if not cls.BOT_APPID: + raise ValueError("BOT_APPID 未配置") + if not cls.BOT_SECRET: + raise ValueError("BOT_SECRET 未配置") + + # AI配置验证(可选) + if cls.AI_API_KEY: + print(f"✅ AI配置: {cls.AI_PROVIDER}/{cls.AI_MODEL}") + else: + print("⚠️ AI_API_KEY 未设置,AI功能将不可用") + + return True diff --git a/src/handlers/__init__.py b/src/handlers/__init__.py new file mode 100644 index 0000000..0e5c565 --- /dev/null +++ b/src/handlers/__init__.py @@ -0,0 +1,6 @@ +""" +消息处理模块 +""" +from .message_handler import MessageHandler + +__all__ = ['MessageHandler'] diff --git a/src/handlers/message_handler.py b/src/handlers/message_handler.py new file mode 100644 index 0000000..c215726 --- /dev/null +++ b/src/handlers/message_handler.py @@ -0,0 +1,147 @@ +""" +基础消息处理器(不含 AI 能力)。 +""" + +import botpy +from botpy.message import Message + +from src.utils.logger import setup_logger + +logger = setup_logger("MessageHandler") + + +class MessageHandler: + """消息处理器。""" + + def __init__(self, client): + self.client = client + + async def handle_at_message(self, message: Message): + """ + 处理 @机器人的消息。 + + Args: + message: 消息对象 + """ + author_name = self._get_author_name(message) + msg_type = type(message).__name__.replace("Message", "") + logger.info( + f"[{msg_type}] {author_name}: {message.content[:30]}{'...' if len(message.content) > 30 else ''}" + ) + + content = message.content.strip() + + if self.client.robot.name: + content = content.replace(f"@{self.client.robot.name}", "").strip() + + if content.startswith("/"): + await self._handle_command(message, content) + else: + await self._handle_chat(message, content) + + @staticmethod + def _get_author_name(message: Message) -> str: + """兼容频道消息、群消息、C2C 私聊消息的作者字段。""" + author = getattr(message, "author", None) + if not author: + return "Unknown" + + return ( + getattr(author, "username", None) + or getattr(author, "nick", None) + or getattr(author, "member_openid", None) + or getattr(author, "user_openid", None) + or "Unknown" + ) + + async def _handle_command(self, message: Message, content: str): + """ + 处理命令消息。 + + Args: + message: 消息对象 + content: 消息内容 + """ + command = content.split()[0].lower() + + if command == "/help" or command == "/帮助": + await self._send_help(message) + elif command == "/ping": + await self._send_ping(message) + elif command == "/info" or command == "/信息": + await self._send_info(message) + else: + await self._send_reply(message, f"未知命令: {command}\n发送 /help 查看可用命令") + + async def _handle_chat(self, message: Message, content: str): + """ + 处理普通聊天消息。 + + Args: + message: 消息对象 + content: 消息内容 + """ + if "你好" in content or "hello" in content.lower(): + reply = "你好!我是 QQ 机器人,很高兴为你服务。" + elif "天气" in content: + reply = "天气查询功能还在开发中。" + elif "时间" in content: + from datetime import datetime + + now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + reply = f"当前时间: {now}" + else: + reply = f"收到你的消息: {content}\n发送 /help 查看我能做什么" + + await self._send_reply(message, reply) + + async def _send_help(self, message: Message): + """发送帮助信息。""" + help_text = """ +QQ 机器人帮助 + +可用命令: +/help 或 /帮助 - 显示帮助信息 +/ping - 测试机器人连通性 +/info 或 /信息 - 显示机器人信息 + +其他功能: +- @我并发送消息,我会回复你 +- 输入“你好”可打招呼 +- 输入“时间”可查看当前时间 + """.strip() + await self._send_reply(message, help_text) + + async def _send_ping(self, message: Message): + """发送 Ping 响应。""" + await self._send_reply(message, "Pong,机器人运行正常。") + + async def _send_info(self, message: Message): + """发送机器人信息。""" + info_text = f""" +机器人信息 + +名称: {self.client.robot.name} +ID: {self.client.robot.id} +状态: 运行中 + +基于 QQ 官方 SDK (botpy) + """.strip() + await self._send_reply(message, info_text) + + async def _send_reply(self, message: Message, content: str): + """ + 发送回复消息。 + + Args: + message: 原始消息对象 + content: 回复内容 + """ + try: + await message.reply(content=content) + logger.info(f"回复: {content[:30]}{'...' if len(content) > 30 else ''}") + except Exception as e: + logger.error(f"发送失败: {e}") + import traceback + + logger.debug(f"详细错误:\n{traceback.format_exc()}") diff --git a/src/handlers/message_handler_ai.py b/src/handlers/message_handler_ai.py new file mode 100644 index 0000000..86c3efd --- /dev/null +++ b/src/handlers/message_handler_ai.py @@ -0,0 +1,1197 @@ +""" +集成 AI 能力的 QQ 消息处理器。 +""" + +import asyncio +import json +from pathlib import Path +import re +from typing import Any, Dict + +from botpy.message import Message + +from src.ai import AIClient +from src.ai.base import ModelConfig, ModelProvider +from src.ai.mcp import MCPManager +from src.ai.mcp.servers import FileSystemMCPServer +from src.ai.personality import PersonalityProfile, PersonalityTrait +from src.ai.skills import SkillsManager +from src.core.config import Config +from src.utils.logger import setup_logger + +logger = setup_logger("MessageHandler") + + +class MessageHandler: + """消息处理器(集成 AI 功能)。""" + + MODEL_KEY_PATTERN = re.compile(r"[^a-zA-Z0-9_]") + + MARKDOWN_PATTERNS = [ + (re.compile(r"```[\s\S]*?```"), lambda m: m.group(0).replace("```", "")), + (re.compile(r"`([^`]+)`"), r"\1"), + (re.compile(r"\*\*([^*]+)\*\*"), r"\1"), + (re.compile(r"\*([^*]+)\*"), r"\1"), + (re.compile(r"__([^_]+)__"), r"\1"), + (re.compile(r"_([^_]+)_"), r"\1"), + (re.compile(r"^#{1,6}\s*", re.MULTILINE), ""), + (re.compile(r"^>\s?", re.MULTILINE), ""), + (re.compile(r"\[([^\]]+)\]\(([^)]+)\)"), r"\1: \2"), + (re.compile(r"^[-*]\s+", re.MULTILINE), "- "), + (re.compile(r"^\d+\.\s+", re.MULTILINE), "- "), + (re.compile(r"\n{3,}"), "\n\n"), + ] + + def __init__(self, bot): + self.bot = bot + self.ai_client = None + self.skills_manager = None + self.mcp_manager = None + self.model_profiles_path = Path("config/models.json") + self.model_profiles: Dict[str, Dict[str, Any]] = {} + self.active_model_key = "default" + self._ai_initialized = False + self._init_lock = asyncio.Lock() + + @staticmethod + def _get_user_id(message: Message) -> str: + author = getattr(message, "author", None) + if not author: + return "unknown" + + return ( + getattr(author, "id", None) + or getattr(author, "user_openid", None) + or getattr(author, "member_openid", None) + or getattr(author, "union_openid", None) + or "unknown" + ) + + @staticmethod + def _build_skills_usage(command_name: str = "/skills") -> str: + return ( + "技能命令:\n" + f"{command_name} 或 {command_name} list\n" + f"{command_name} install <source> [skill_name]\n" + f" source 支持:本地技能名、URL、owner/repo、owner/repo#branch\n" + f"{command_name} uninstall <skill_name>\n" + f"{command_name} reload <skill_name>" + ) + + @staticmethod + def _build_personality_usage() -> str: + return ( + "人设命令:\n" + "/personality\n" + "/personality list\n" + "/personality set <key>\n" + "/personality add <name> <Introduction>\n" + " 兼容旧格式: <json> 或 管道 name|description|speaking_style|TRAIT1,TRAIT2|custom_instructions\n" + "/personality remove <key>" + ) + + @staticmethod + def _build_models_usage(command_name: str = "/models") -> str: + return ( + "模型命令:\n" + f"{command_name} 或 {command_name} list\n" + f"{command_name} current\n" + f"{command_name} add <model_name> (保持 provider/api_base/api_key 不变)\n" + f"{command_name} add <key> <provider> <model_name> [api_base]\n" + f"{command_name} add <key> <json>\n" + " json 字段:provider, model_name, api_base, api_key, temperature, max_tokens, top_p\n" + f"{command_name} switch <key>\n" + f"{command_name} remove <key>" + ) + + @staticmethod + def _build_memory_usage(command_name: str = "/memory") -> str: + return ( + "记忆命令:\n" + f"{command_name} 或 {command_name} list [limit]\n" + f"{command_name} get <id>\n" + f"{command_name} add <content>\n" + f"{command_name} add <json>\n" + f"{command_name} update <id> <content or json>\n" + f"{command_name} delete <id>\n" + f"{command_name} search <query> [limit]\n" + "/clear (默认等价 /clear short)\n" + "/clear short\n" + "/clear long\n" + "/clear all" + ) + + @staticmethod + def _provider_map() -> Dict[str, ModelProvider]: + return { + "openai": ModelProvider.OPENAI, + "anthropic": ModelProvider.ANTHROPIC, + "deepseek": ModelProvider.DEEPSEEK, + "qwen": ModelProvider.QWEN, + "siliconflow": ModelProvider.OPENAI, + } + + @classmethod + def _normalize_model_key(cls, raw_key: str) -> str: + key = raw_key.strip().lower().replace("-", "_").replace(" ", "_") + key = cls.MODEL_KEY_PATTERN.sub("_", key) + key = re.sub(r"_+", "_", key).strip("_") + if not key: + raise ValueError("模型 key 不能为空") + if key[0].isdigit(): + key = f"model_{key}" + return key + + @classmethod + def _parse_provider(cls, raw_provider: str) -> ModelProvider: + provider = cls._provider_map().get(raw_provider.strip().lower()) + if not provider: + raise ValueError(f"不支持的 provider: {raw_provider}") + return provider + + @staticmethod + def _coerce_float(value: Any, default: float) -> float: + try: + return float(value) + except (TypeError, ValueError): + return default + + @staticmethod + def _coerce_int(value: Any, default: int) -> int: + try: + return int(value) + except (TypeError, ValueError): + return default + + @staticmethod + def _coerce_bool(value: Any, default: bool) -> bool: + if isinstance(value, bool): + return value + if isinstance(value, str): + lowered = value.strip().lower() + if lowered in {"1", "true", "yes", "on"}: + return True + if lowered in {"0", "false", "no", "off"}: + return False + return default + if value is None: + return default + return bool(value) + + @staticmethod + def _model_config_to_dict( + config: ModelConfig, include_api_key: bool = True + ) -> Dict[str, Any]: + data: Dict[str, Any] = { + "provider": config.provider.value, + "model_name": config.model_name, + "temperature": config.temperature, + "max_tokens": config.max_tokens, + "top_p": config.top_p, + "frequency_penalty": config.frequency_penalty, + "presence_penalty": config.presence_penalty, + "timeout": config.timeout, + "stream": config.stream, + } + if config.api_base: + data["api_base"] = config.api_base + if include_api_key and config.api_key: + data["api_key"] = config.api_key + return data + + def _model_config_from_dict( + self, raw: Dict[str, Any], fallback: ModelConfig + ) -> ModelConfig: + provider = self._parse_provider(str(raw.get("provider") or fallback.provider.value)) + model_name = str(raw.get("model_name") or fallback.model_name).strip() + if not model_name: + raise ValueError("model_name 不能为空") + + api_key = raw.get("api_key") + if api_key is None: + api_key = fallback.api_key or Config.AI_API_KEY + api_key = str(api_key) if api_key else "" + + api_base = raw.get("api_base", fallback.api_base) + api_base = str(api_base) if api_base else None + + return ModelConfig( + provider=provider, + model_name=model_name, + api_key=api_key, + api_base=api_base, + temperature=self._coerce_float(raw.get("temperature"), fallback.temperature), + max_tokens=self._coerce_int(raw.get("max_tokens"), fallback.max_tokens), + top_p=self._coerce_float(raw.get("top_p"), fallback.top_p), + frequency_penalty=self._coerce_float( + raw.get("frequency_penalty"), fallback.frequency_penalty + ), + presence_penalty=self._coerce_float( + raw.get("presence_penalty"), fallback.presence_penalty + ), + timeout=self._coerce_int(raw.get("timeout"), fallback.timeout), + stream=self._coerce_bool(raw.get("stream"), fallback.stream), + ) + + def _save_model_profiles(self): + payload = {"active": self.active_model_key, "profiles": self.model_profiles} + self.model_profiles_path.parent.mkdir(parents=True, exist_ok=True) + with open(self.model_profiles_path, "w", encoding="utf-8") as f: + json.dump(payload, f, ensure_ascii=False, indent=2) + + def _load_model_profiles(self, default_config: ModelConfig) -> ModelConfig: + payload: Dict[str, Any] = {} + if self.model_profiles_path.exists(): + try: + with open(self.model_profiles_path, "r", encoding="utf-8") as f: + payload = json.load(f) + except Exception as exc: + logger.warning(f"load model profiles failed, reset to defaults: {exc}") + payload = {} + + profiles = payload.get("profiles") + if not isinstance(profiles, dict): + profiles = {} + + if not profiles: + profiles = { + "default": self._model_config_to_dict( + default_config, include_api_key=False + ) + } + + active = str(payload.get("active") or "") + if active not in profiles: + active = "default" if "default" in profiles else sorted(profiles.keys())[0] + + self.model_profiles = profiles + self.active_model_key = active + + try: + active_config = self._model_config_from_dict( + self.model_profiles[self.active_model_key], default_config + ) + except Exception as exc: + logger.warning(f"active model profile invalid, fallback to default: {exc}") + self.model_profiles = { + "default": self._model_config_to_dict( + default_config, include_api_key=False + ) + } + self.active_model_key = "default" + active_config = default_config + + self._save_model_profiles() + return active_config + + def _ensure_model_profiles_ready(self): + if not self.ai_client: + return + + if self.model_profiles and self.active_model_key in self.model_profiles: + return + + active_config = self._load_model_profiles(self.ai_client.config) + if active_config != self.ai_client.config: + self.ai_client.switch_model(active_config) + + def _plain_text(self, text: str) -> str: + if not text: + return "" + + result = text + for pattern, replacement in self.MARKDOWN_PATTERNS: + result = pattern.sub(replacement, result) + + return result.strip() + + async def _reply_plain(self, message: Message, text: str): + await message.reply(content=self._plain_text(text)) + + def _register_skill_tools(self, skill_name: str) -> int: + if not self.skills_manager or not self.ai_client: + return 0 + + skill = self.skills_manager.get_skill(skill_name) + if not skill: + return 0 + + count = 0 + for tool_name, tool_func in skill.get_tools().items(): + full_tool_name = f"{skill_name}.{tool_name}" + self.ai_client.register_tool( + name=full_tool_name, + description=f"技能工具: {full_tool_name}", + parameters={"type": "object", "properties": {}}, + function=tool_func, + ) + count += 1 + + return count + + def _parse_traits(self, traits_raw) -> list[PersonalityTrait]: + traits = [] + + if isinstance(traits_raw, str): + trait_names = [name.strip().upper() for name in traits_raw.split(",") if name.strip()] + elif isinstance(traits_raw, list): + trait_names = [str(name).strip().upper() for name in traits_raw if str(name).strip()] + else: + trait_names = [] + + for name in trait_names: + if name in PersonalityTrait.__members__: + traits.append(PersonalityTrait[name]) + + if not traits: + traits = [PersonalityTrait.FRIENDLY] + + return traits + + def _parse_personality_payload(self, key: str, payload: str) -> PersonalityProfile: + payload = payload.strip() + + if payload.startswith("{"): + data = json.loads(payload) + return PersonalityProfile( + name=str(data.get("name") or key), + description=str(data.get("description") or "自定义人设"), + traits=self._parse_traits(data.get("traits", [])), + speaking_style=str(data.get("speaking_style") or "自然口语"), + example_responses=list(data.get("example_responses", [])), + custom_instructions=str(data.get("custom_instructions") or ""), + ) + + if "|" not in payload: + introduction = payload + return PersonalityProfile( + name=key, + description=introduction, + traits=[PersonalityTrait.FRIENDLY], + speaking_style="自然口语", + custom_instructions=introduction, + ) + + parts = [part.strip() for part in payload.split("|")] + name = parts[0] if len(parts) >= 1 and parts[0] else key + description = parts[1] if len(parts) >= 2 and parts[1] else "自定义人设" + speaking_style = parts[2] if len(parts) >= 3 and parts[2] else "自然口语" + traits = self._parse_traits(parts[3] if len(parts) >= 4 else "") + custom_instructions = parts[4] if len(parts) >= 5 else "" + + return PersonalityProfile( + name=name, + description=description, + traits=traits, + speaking_style=speaking_style, + custom_instructions=custom_instructions, + ) + + async def _init_ai(self): + if self._ai_initialized: + return + + try: + provider = self._provider_map().get( + Config.AI_PROVIDER.lower(), ModelProvider.OPENAI + ) + + config = ModelConfig( + provider=provider, + model_name=Config.AI_MODEL, + api_key=Config.AI_API_KEY, + api_base=Config.AI_API_BASE, + temperature=0.7, + ) + config = self._load_model_profiles(config) + + embed_config = None + if Config.AI_EMBED_PROVIDER and Config.AI_EMBED_MODEL: + embed_provider = self._provider_map().get( + Config.AI_EMBED_PROVIDER.lower(), ModelProvider.OPENAI + ) + + embed_config = ModelConfig( + provider=embed_provider, + model_name=Config.AI_EMBED_MODEL, + api_key=Config.AI_EMBED_API_KEY or Config.AI_API_KEY, + api_base=Config.AI_EMBED_API_BASE or Config.AI_API_BASE, + ) + + self.ai_client = AIClient( + model_config=config, + embed_config=embed_config, + data_dir=Path("data/ai"), + use_vector_db=Config.AI_USE_VECTOR_DB, + ) + + self.skills_manager = SkillsManager(Path("skills")) + await self.skills_manager.load_all_skills() + + total_tools = 0 + for skill_name in self.skills_manager.list_skills(): + total_tools += self._register_skill_tools(skill_name) + logger.info( + f"技能系统初始化完成: {len(self.skills_manager.list_skills())} skills, {total_tools} tools" + ) + + try: + self.mcp_manager = MCPManager(Path("config/mcp.json")) + fs_server = FileSystemMCPServer(root_path=Path("data")) + await self.mcp_manager.register_server(fs_server) + except Exception as exc: + logger.warning(f"MCP 初始化失败: {exc}") + + self._ai_initialized = True + logger.info("AI 系统初始化完成") + + except Exception as exc: + logger.error(f"AI 初始化失败: {exc}") + import traceback + + logger.error(traceback.format_exc()) + + async def handle_at_message(self, message: Message): + try: + if not self._ai_initialized: + async with self._init_lock: + if not self._ai_initialized: + await self._init_ai() + + if not self.ai_client: + await self._reply_plain(message, "AI 初始化失败,请检查配置") + return + + content = (message.content or "").strip() + user_id = self._get_user_id(message) + + if content.startswith(f"<@!{self.bot.robot.id}>"): + content = content.replace(f"<@!{self.bot.robot.id}>", "").strip() + + if not content: + return + + if content.startswith("/"): + await self._handle_command(message, content) + return + + response = await self.ai_client.chat( + user_id=user_id, + user_message=content, + use_memory=True, + use_tools=True, + ) + await self._reply_plain(message, response) + + except Exception as exc: + logger.error(f"处理消息失败: {exc}") + import traceback + + logger.error(traceback.format_exc()) + await self._reply_plain(message, "消息处理失败,请稍后重试") + + async def _handle_skills_command(self, message: Message, command: str): + if not self.skills_manager or not self.ai_client: + await self._reply_plain(message, "技能系统未初始化") + return + + parts = command.split() + command_name = parts[0].lower() + action = parts[1].lower() if len(parts) > 1 else "list" + + if action in {"list", "ls"} and len(parts) <= 2: + loaded = self.skills_manager.list_skills() + available = self.skills_manager.list_available_skills() + unloaded = [name for name in available if name not in loaded] + + lines = ["技能状态:"] + lines.append("已加载: " + (", ".join(loaded) if loaded else "无")) + lines.append("可安装: " + (", ".join(unloaded) if unloaded else "无")) + lines.append(self._build_skills_usage(command_name)) + await self._reply_plain(message, "\n".join(lines)) + return + + if action not in {"install", "uninstall", "remove", "reload"}: + await self._reply_plain(message, self._build_skills_usage(command_name)) + return + + if len(parts) < 3: + await self._reply_plain(message, self._build_skills_usage(command_name)) + return + + if action == "install": + source = parts[2] + desired_name = parts[3] if len(parts) > 3 else None + + try: + source_key = self.skills_manager.normalize_skill_key(source) + except Exception: + source_key = None + + if source_key and source_key in self.skills_manager.list_available_skills(): + success = await self.skills_manager.load_skill(source_key) + if not success: + await self._reply_plain(message, f"加载技能失败: {source_key}") + return + + tool_count = self._register_skill_tools(source_key) + await self._reply_plain( + message, + f"已加载本地技能: {source_key}\n注册工具: {tool_count}", + ) + return + + ok, result = self.skills_manager.install_skill_from_source( + source=source, + skill_name=desired_name, + overwrite=False, + ) + if not ok: + await self._reply_plain(message, f"安装失败: {result}") + return + + installed_key = result + success = await self.skills_manager.load_skill(installed_key) + if not success: + await self._reply_plain(message, f"安装成功但加载失败: {installed_key}") + return + + tool_count = self._register_skill_tools(installed_key) + await self._reply_plain( + message, + f"已从来源安装并加载技能: {installed_key}\n注册工具: {tool_count}", + ) + return + + skill_name = parts[2] + try: + skill_key = self.skills_manager.normalize_skill_key(skill_name) + except Exception: + await self._reply_plain(message, f"非法技能名: {skill_name}") + return + + if action in {"uninstall", "remove"}: + removed_tools = self.ai_client.unregister_tools_by_prefix(f"{skill_key}.") + removed = await self.skills_manager.uninstall_skill(skill_key, delete_files=True) + if not removed: + await self._reply_plain(message, f"卸载失败或技能不存在: {skill_key}") + return + + await self._reply_plain( + message, + f"已卸载技能: {skill_key}\n注销工具: {removed_tools}", + ) + return + + self.ai_client.unregister_tools_by_prefix(f"{skill_key}.") + success = await self.skills_manager.reload_skill(skill_key) + if not success: + await self._reply_plain(message, f"重载失败: {skill_key}") + return + + tool_count = self._register_skill_tools(skill_key) + await self._reply_plain(message, f"已重载技能: {skill_key}\n注册工具: {tool_count}") + + async def _handle_personality_command(self, message: Message, command: str): + parts = command.split(maxsplit=3) + + if len(parts) == 1: + current = self.ai_client.personality.current_personality + names = self.ai_client.list_personalities() + if current: + await self._reply_plain( + message, + f"当前人设: {current.name}\n简介: {current.description}\n可用: {', '.join(names)}", + ) + else: + await self._reply_plain(message, "当前没有激活的人设") + return + + action = parts[1].lower() + + if action == "list": + names = self.ai_client.list_personalities() + await self._reply_plain(message, "可用人设: " + ", ".join(names)) + return + + if action in {"set", "use"}: + if len(parts) < 3: + await self._reply_plain(message, self._build_personality_usage()) + return + + key = parts[2] + if self.ai_client.set_personality(key): + await self._reply_plain(message, f"已切换人设: {key}") + else: + await self._reply_plain(message, f"人设不存在: {key}") + return + + if action in {"add", "create"}: + if len(parts) < 4: + await self._reply_plain(message, self._build_personality_usage()) + return + + key = parts[2] + payload = parts[3] + + try: + profile = self._parse_personality_payload(key, payload) + ok = self.ai_client.personality.add_personality(key, profile) + if not ok: + await self._reply_plain(message, f"新增人设失败: {key}") + return + + self.ai_client.set_personality(key) + await self._reply_plain(message, f"已新增并切换人设: {key}") + except Exception as exc: + await self._reply_plain(message, f"新增人设失败: {exc}") + return + + if action in {"remove", "delete"}: + if len(parts) < 3: + await self._reply_plain(message, self._build_personality_usage()) + return + + key = parts[2] + removed = self.ai_client.personality.remove_personality(key) + if removed: + await self._reply_plain(message, f"已删除人设: {key}") + else: + await self._reply_plain(message, f"删除失败(可能是默认人设或不存在): {key}") + return + + # 兼容旧命令: /personality <name> + if self.ai_client.set_personality(parts[1]): + await self._reply_plain(message, f"已切换人设: {parts[1]}") + return + + await self._reply_plain(message, self._build_personality_usage()) + + async def _handle_memory_command(self, message: Message, command: str): + if not self.ai_client: + await self._reply_plain(message, "AI 客户端未初始化") + return + + user_id = self._get_user_id(message) + parts = command.split(maxsplit=3) + action = parts[1].lower() if len(parts) > 1 else "list" + + if action in {"list", "ls"}: + limit = 10 + if len(parts) >= 3: + try: + limit = max(1, min(100, int(parts[2]))) + except ValueError: + await self._reply_plain(message, self._build_memory_usage()) + return + + memories = await self.ai_client.list_long_term_memories(user_id, limit=limit) + if not memories: + await self._reply_plain(message, "暂无长期记忆") + return + + lines = ["长期记忆列表:"] + for memory in memories: + content = self._plain_text(memory.content).replace("\n", " ").strip() + if len(content) > 60: + content = content[:57] + "..." + lines.append( + f"- {memory.id} | 重要性={memory.importance:.2f} | {memory.timestamp.isoformat()} | {content}" + ) + await self._reply_plain(message, "\n".join(lines)) + return + + if action == "get": + if len(parts) < 3: + await self._reply_plain(message, self._build_memory_usage()) + return + + memory_id = parts[2].strip() + memory = await self.ai_client.get_long_term_memory(user_id, memory_id) + if not memory: + await self._reply_plain(message, f"记忆不存在: {memory_id}") + return + + meta_text = json.dumps(memory.metadata or {}, ensure_ascii=False) + await self._reply_plain( + message, + "记忆详情:\n" + f"id: {memory.id}\n" + f"重要性: {memory.importance:.2f}\n" + f"时间: {memory.timestamp.isoformat()}\n" + f"访问次数: {memory.access_count}\n" + f"内容: {memory.content}\n" + f"元数据: {meta_text}", + ) + return + + if action == "add": + if len(parts) < 3: + await self._reply_plain(message, self._build_memory_usage()) + return + + payload = " ".join(parts[2:]).strip() + content = payload + importance = 0.8 + metadata = None + + if payload.startswith("{"): + try: + data = json.loads(payload) + if not isinstance(data, dict): + raise ValueError("payload 必须是对象") + content = str(data.get("content") or "").strip() + importance = float(data.get("importance", 0.8)) + raw_meta = data.get("metadata") + metadata = raw_meta if isinstance(raw_meta, dict) else None + except Exception as exc: + await self._reply_plain(message, f"JSON 解析失败: {exc}") + return + + if not content: + await self._reply_plain(message, "内容不能为空") + return + + memory = await self.ai_client.add_long_term_memory( + user_id=user_id, + content=content, + importance=importance, + metadata=metadata, + ) + if not memory: + await self._reply_plain(message, "新增长期记忆失败") + return + + await self._reply_plain( + message, f"已新增长期记忆: {memory.id} (重要性={memory.importance:.2f})" + ) + return + + if action in {"update", "set"}: + if len(parts) < 4: + await self._reply_plain(message, self._build_memory_usage()) + return + + memory_id = parts[2].strip() + payload = parts[3].strip() + content = payload + importance = None + metadata = None + + if payload.startswith("{"): + try: + data = json.loads(payload) + if not isinstance(data, dict): + raise ValueError("payload 必须是对象") + if "content" in data: + content = str(data.get("content") or "") + else: + content = None + if "importance" in data: + importance = float(data.get("importance")) + raw_meta = data.get("metadata") + if raw_meta is not None: + if not isinstance(raw_meta, dict): + raise ValueError("metadata 必须是对象") + metadata = raw_meta + except Exception as exc: + await self._reply_plain(message, f"JSON 解析失败: {exc}") + return + + updated = await self.ai_client.update_long_term_memory( + user_id=user_id, + memory_id=memory_id, + content=content, + importance=importance, + metadata=metadata, + ) + if not updated: + await self._reply_plain(message, f"更新失败或记忆不存在: {memory_id}") + return + + await self._reply_plain( + message, + f"已更新长期记忆: {memory_id} (重要性={updated.importance:.2f})", + ) + return + + if action in {"delete", "remove", "rm"}: + if len(parts) < 3: + await self._reply_plain(message, self._build_memory_usage()) + return + + memory_id = parts[2].strip() + deleted = await self.ai_client.delete_long_term_memory(user_id, memory_id) + if not deleted: + await self._reply_plain(message, f"删除失败或记忆不存在: {memory_id}") + return + + await self._reply_plain(message, f"已删除长期记忆: {memory_id}") + return + + if action in {"search", "find"}: + if len(parts) < 3: + await self._reply_plain(message, self._build_memory_usage()) + return + + query_payload = " ".join(parts[2:]).strip() + limit = 10 + query = query_payload + if " " in query_payload: + possible_query, possible_limit = query_payload.rsplit(" ", 1) + if possible_limit.isdigit(): + query = possible_query + limit = max(1, min(100, int(possible_limit))) + + if not query: + await self._reply_plain(message, "搜索词不能为空") + return + + memories = await self.ai_client.search_long_term_memories( + user_id=user_id, + query=query, + limit=limit, + ) + if not memories: + await self._reply_plain(message, f"没有匹配到相关记忆: {query}") + return + + lines = [f"搜索结果({len(memories)} 条):"] + for memory in memories: + content = self._plain_text(memory.content).replace("\n", " ").strip() + if len(content) > 60: + content = content[:57] + "..." + lines.append(f"- {memory.id} | 重要性={memory.importance:.2f} | {content}") + await self._reply_plain(message, "\n".join(lines)) + return + + await self._reply_plain(message, self._build_memory_usage()) + + async def _handle_models_command(self, message: Message, command: str): + if not self.ai_client: + await self._reply_plain(message, "AI 客户端未初始化") + return + + self._ensure_model_profiles_ready() + + parts = command.split(maxsplit=3) + action = parts[1].lower() if len(parts) > 1 else "list" + + if action in {"list", "ls"} and len(parts) <= 2: + lines = [f"当前模型配置: {self.active_model_key}"] + for key in sorted(self.model_profiles.keys()): + profile = self.model_profiles.get(key, {}) + marker = "*" if key == self.active_model_key else "-" + provider = str(profile.get("provider") or "?") + model_name = str(profile.get("model_name") or "?") + lines.append(f"{marker} {key}: {provider}/{model_name}") + + lines.append(self._build_models_usage("/models")) + await self._reply_plain(message, "\n".join(lines)) + return + + if action in {"current", "show"}: + config = self.ai_client.config + await self._reply_plain( + message, + "当前模型:\n" + f"配置名: {self.active_model_key}\n" + f"供应商: {config.provider.value}\n" + f"模型: {config.model_name}\n" + f"API 地址: {config.api_base or '-'}", + ) + return + + if action in {"switch", "set", "use"}: + if len(parts) < 3: + await self._reply_plain(message, self._build_models_usage()) + return + + try: + key = self._normalize_model_key(parts[2]) + except ValueError as exc: + await self._reply_plain(message, str(exc)) + return + + if key not in self.model_profiles: + await self._reply_plain(message, f"模型配置不存在: {key}") + return + + try: + config = self._model_config_from_dict( + self.model_profiles[key], self.ai_client.config + ) + self.ai_client.switch_model(config) + except Exception as exc: + await self._reply_plain(message, f"切换模型失败: {exc}") + return + + self.active_model_key = key + self._save_model_profiles() + await self._reply_plain( + message, f"已切换模型: {key} ({config.provider.value}/{config.model_name})" + ) + return + + if action in {"add", "create"}: + # 快捷方式: /models add <model_name> + # 仅替换 model_name,保留 provider/api_base/api_key。 + if len(parts) == 3: + model_name = parts[2].strip() + if not model_name: + await self._reply_plain(message, self._build_models_usage()) + return + + key = self._normalize_model_key(model_name) + config = ModelConfig( + provider=self.ai_client.config.provider, + model_name=model_name, + api_key=self.ai_client.config.api_key, + api_base=self.ai_client.config.api_base, + temperature=self.ai_client.config.temperature, + max_tokens=self.ai_client.config.max_tokens, + top_p=self.ai_client.config.top_p, + frequency_penalty=self.ai_client.config.frequency_penalty, + presence_penalty=self.ai_client.config.presence_penalty, + timeout=self.ai_client.config.timeout, + stream=self.ai_client.config.stream, + ) + + self.model_profiles[key] = self._model_config_to_dict( + config, include_api_key=False + ) + self.active_model_key = key + self._save_model_profiles() + self.ai_client.switch_model(config) + + await self._reply_plain( + message, + f"已保存并切换模型: {key} ({config.provider.value}/{config.model_name})", + ) + return + + if len(parts) < 4: + await self._reply_plain(message, self._build_models_usage()) + return + + try: + key = self._normalize_model_key(parts[2]) + except ValueError as exc: + await self._reply_plain(message, str(exc)) + return + + payload = parts[3].strip() + include_api_key = False + + try: + if payload.startswith("{"): + raw_profile = json.loads(payload) + if not isinstance(raw_profile, dict): + raise ValueError("模型参数必须是 JSON 对象") + else: + payload_parts = payload.split() + if len(payload_parts) < 2: + raise ValueError( + "用法: /models add <key> <provider> <model_name> [api_base]" + ) + raw_profile = { + "provider": payload_parts[0], + "model_name": payload_parts[1], + } + if len(payload_parts) >= 3: + raw_profile["api_base"] = payload_parts[2] + + include_api_key = bool(raw_profile.get("api_key")) + config = self._model_config_from_dict(raw_profile, self.ai_client.config) + except Exception as exc: + await self._reply_plain(message, f"新增模型失败: {exc}") + return + + self.model_profiles[key] = self._model_config_to_dict( + config, include_api_key=include_api_key + ) + self.active_model_key = key + self._save_model_profiles() + self.ai_client.switch_model(config) + + await self._reply_plain( + message, + f"已保存并切换模型: {key} ({config.provider.value}/{config.model_name})", + ) + return + + if action in {"remove", "delete", "rm"}: + if len(parts) < 3: + await self._reply_plain(message, self._build_models_usage()) + return + + try: + key = self._normalize_model_key(parts[2]) + except ValueError as exc: + await self._reply_plain(message, str(exc)) + return + + if key == "default": + await self._reply_plain(message, "默认模型配置不能删除") + return + + if key not in self.model_profiles: + await self._reply_plain(message, f"模型配置不存在: {key}") + return + + del self.model_profiles[key] + switched_to = None + + if self.active_model_key == key: + fallback_key = ( + "default" + if "default" in self.model_profiles + else (sorted(self.model_profiles.keys())[0] if self.model_profiles else None) + ) + + if not fallback_key: + self.model_profiles["default"] = self._model_config_to_dict( + self.ai_client.config, include_api_key=False + ) + fallback_key = "default" + + fallback_config = self._model_config_from_dict( + self.model_profiles[fallback_key], self.ai_client.config + ) + self.ai_client.switch_model(fallback_config) + self.active_model_key = fallback_key + switched_to = fallback_key + + self._save_model_profiles() + + if switched_to: + await self._reply_plain( + message, f"已删除模型: {key},已切换到: {switched_to}" + ) + else: + await self._reply_plain(message, f"已删除模型: {key}") + return + + await self._reply_plain(message, self._build_models_usage()) + + async def _handle_command(self, message: Message, command: str): + user_id = self._get_user_id(message) + + if command == "/help": + await self._reply_plain( + message, + "命令帮助\n" + "====================\n" + "基础命令\n" + "/help\n" + "/clear (默认等价 /clear short)\n" + "/clear short\n" + "/clear long\n" + "/clear all\n" + "\n" + "人设命令\n" + "/personality\n" + "/personality list\n" + "/personality set <key>\n" + "/personality add <name> <Introduction>\n" + "/personality remove <key>\n" + "\n" + "技能命令\n" + "/skills\n" + "/skills install <source> [skill_name]\n" + "/skills uninstall <skill_name>\n" + "/skills reload <skill_name>\n" + "\n" + "模型命令\n" + "/models\n" + "/models current\n" + "/models add <model_name>\n" + "/models add <key> <provider> <model_name> [api_base]\n" + "/models switch <key>\n" + "/models remove <key>\n" + "\n" + "记忆命令\n" + "/memory\n" + "/memory get <id>\n" + "/memory add <content|json>\n" + "/memory update <id> <content|json>\n" + "/memory delete <id>\n" + "/memory search <query> [limit]\n" + "\n" + "任务命令\n" + "/task <task_id>", + ) + return + + if command.startswith("/clear"): + clear_parts = command.split(maxsplit=1) + clear_scope = clear_parts[1].strip().lower() if len(clear_parts) > 1 else "short" + + if clear_scope in {"all", ""}: + cleared_all = await self.ai_client.clear_all_memory(user_id) + if cleared_all: + await self._reply_plain(message, "已清除短期记忆和长期记忆") + else: + await self._reply_plain( + message, + "短期记忆已清除,但长期记忆清除失败", + ) + return + + if clear_scope in {"short", "short_term"}: + self.ai_client.clear_memory(user_id) + await self._reply_plain(message, "已清除短期记忆") + return + + if clear_scope in {"long", "long_term"}: + cleared_long = await self.ai_client.clear_long_term_memory(user_id) + if cleared_long: + await self._reply_plain(message, "已清除长期记忆") + else: + await self._reply_plain(message, "清除长期记忆失败") + return + + await self._reply_plain( + message, + "用法:\n/clear\n/clear short\n/clear long\n/clear all", + ) + return + + if command.startswith("/personality"): + await self._handle_personality_command(message, command) + return + + if command.startswith("/skills") or command.startswith("/skill"): + await self._handle_skills_command(message, command) + return + + if command.startswith("/models") or command.startswith("/model"): + await self._handle_models_command(message, command) + return + + if command.startswith("/memory") or command.startswith("/mem"): + await self._handle_memory_command(message, command) + return + + if command.startswith("/task"): + parts = command.split(maxsplit=1) + if len(parts) == 2: + task_id = parts[1] + status = self.ai_client.get_task_status(task_id) + if status: + await self._reply_plain( + message, + "任务状态:\n" + f"标题: {status['title']}\n" + f"状态: {status['status']}\n" + f"进度: {status['progress'] * 100:.1f}%\n" + f"步骤: {status['completed_steps']}/{status['total_steps']}", + ) + else: + await self._reply_plain(message, "任务不存在") + else: + await self._reply_plain(message, "用法: /task <task_id>") + return + + await self._reply_plain(message, "未知命令,请输入 /help 查看帮助") + diff --git a/src/utils/__init__.py b/src/utils/__init__.py new file mode 100644 index 0000000..0b33750 --- /dev/null +++ b/src/utils/__init__.py @@ -0,0 +1,6 @@ +""" +工具模块 +""" +from .logger import setup_logger + +__all__ = ['setup_logger'] diff --git a/src/utils/logger.py b/src/utils/logger.py new file mode 100644 index 0000000..feef2b0 --- /dev/null +++ b/src/utils/logger.py @@ -0,0 +1,63 @@ +""" +日志配置模块 +""" +import logging +import os +from pathlib import Path + + +def setup_logger(name='QQBot', level=None): + """ + 设置日志记录器 + + Args: + name: 日志记录器名称 + level: 日志级别,默认从环境变量读取 + + Returns: + logging.Logger: 配置好的日志记录器 + """ + # 创建logs目录 + log_dir = Path(__file__).parent.parent.parent / 'logs' + log_dir.mkdir(exist_ok=True) + + # 设置日志级别 + if level is None: + level = os.getenv('LOG_LEVEL', 'INFO') + + # 创建日志记录器 + logger = logging.getLogger(name) + logger.setLevel(getattr(logging, level.upper())) + # 避免向 root logger 传播导致重复输出 + logger.propagate = False + + # 避免重复添加处理器 + if logger.handlers: + return logger + + # 控制台处理器 + console_handler = logging.StreamHandler() + console_handler.setLevel(logging.INFO) + console_format = logging.Formatter( + '%(asctime)s - %(name)s - %(levelname)s - %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' + ) + console_handler.setFormatter(console_format) + + # 文件处理器 + file_handler = logging.FileHandler( + log_dir / 'bot.log', + encoding='utf-8' + ) + file_handler.setLevel(logging.DEBUG) + file_format = logging.Formatter( + '%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' + ) + file_handler.setFormatter(file_format) + + # 添加处理器 + logger.addHandler(console_handler) + logger.addHandler(file_handler) + + return logger diff --git a/start.bat b/start.bat new file mode 100644 index 0000000..509d4e3 --- /dev/null +++ b/start.bat @@ -0,0 +1,69 @@ +@echo off +chcp 65001 >nul +title QQ机器人启动器 + +echo ======================================== +echo QQ机器人启动脚本 +echo ======================================== +echo. + +echo [1/4] 激活conda环境... +call conda activate qqbot +if errorlevel 1 ( + echo [错误] 无法激活conda环境 qqbot + echo 请确保已创建该环境: conda create -n qqbot python=3.9 + pause + exit /b 1 +) +echo [成功] conda环境已激活 +echo. + +echo [2/4] 检查Python环境... +python --version >nul 2>&1 +if errorlevel 1 ( + echo [错误] 未找到Python + pause + exit /b 1 +) +echo [成功] Python环境正常 +echo. + +echo [3/4] 检查并安装依赖... +pip show qq-botpy >nul 2>&1 +if errorlevel 1 ( + echo [提示] 正在安装依赖包... + pip install -r requirements.txt + if errorlevel 1 ( + echo [错误] 依赖安装失败 + echo 请手动执行: conda activate qqbot 然后 pip install -r requirements.txt + pause + exit /b 1 + ) + echo [成功] 依赖安装完成 +) else ( + echo [成功] 依赖已安装 +) +echo. + +echo [4/4] 检查配置文件... +if not exist .env ( + echo [错误] 配置文件 .env 不存在 + echo 请复制 .env.example 为 .env 并填写配置 + pause + exit /b 1 +) +echo [成功] 配置文件存在 +echo. + +echo ======================================== +echo 启动机器人... +echo ======================================== +echo. + +python main.py + +if errorlevel 1 ( + echo. + echo [错误] 机器人异常退出 + pause +) diff --git a/tests/test_ai.py b/tests/test_ai.py new file mode 100644 index 0000000..0638f2c --- /dev/null +++ b/tests/test_ai.py @@ -0,0 +1,628 @@ +"""AI integration tests.""" + +import asyncio +import json +import os +from pathlib import Path +import shutil +import stat +import sys +import tempfile +import time +import zipfile + +from dotenv import load_dotenv + +project_root = Path(__file__).parent.parent +sys.path.insert(0, str(project_root)) + +from src.ai import AIClient +from src.ai.base import ModelConfig, ModelProvider +from src.ai.memory import MemorySystem +from src.ai.skills import SkillsManager, create_skill_template +from src.handlers.message_handler_ai import MessageHandler + +load_dotenv(project_root / ".env") + + +TEST_DATA_DIR = Path("data/ai_test") + + +def _safe_rmtree(path: Path): + if not path.exists(): + return + + def _onerror(func, target, exc_info): + try: + os.chmod(target, stat.S_IWRITE) + func(target) + except Exception: + pass + + for _ in range(3): + try: + shutil.rmtree(path, onerror=_onerror) + return + except PermissionError: + time.sleep(0.2) + + +def _safe_unlink(path: Path): + if not path.exists(): + return + + for _ in range(3): + try: + path.unlink() + return + except PermissionError: + time.sleep(0.2) + + +def _read_env(name: str, default=None): + value = os.getenv(name) + if value is None: + return default + + value = value.strip() + if not value or value.startswith("#"): + return default + + return value + + +def get_ai_config() -> ModelConfig: + provider_map = { + "openai": ModelProvider.OPENAI, + "anthropic": ModelProvider.ANTHROPIC, + "deepseek": ModelProvider.DEEPSEEK, + "qwen": ModelProvider.QWEN, + "siliconflow": ModelProvider.OPENAI, + } + + provider_str = (_read_env("AI_PROVIDER", "openai") or "openai").lower() + provider = provider_map.get(provider_str, ModelProvider.OPENAI) + + return ModelConfig( + provider=provider, + model_name=_read_env("AI_MODEL", "gpt-3.5-turbo") or "gpt-3.5-turbo", + api_key=_read_env("AI_API_KEY", "") or "", + api_base=_read_env("AI_API_BASE"), + temperature=0.7, + ) + + +def get_embed_config() -> ModelConfig: + provider_map = { + "openai": ModelProvider.OPENAI, + "anthropic": ModelProvider.ANTHROPIC, + "deepseek": ModelProvider.DEEPSEEK, + "qwen": ModelProvider.QWEN, + "siliconflow": ModelProvider.OPENAI, + } + + provider_str = (_read_env("AI_EMBED_PROVIDER", "openai") or "openai").lower() + provider = provider_map.get(provider_str, ModelProvider.OPENAI) + + api_key = _read_env("AI_EMBED_API_KEY") or _read_env("AI_API_KEY", "") or "" + api_base = _read_env("AI_EMBED_API_BASE") or _read_env("AI_API_BASE") + + return ModelConfig( + provider=provider, + model_name=_read_env("AI_EMBED_MODEL", "text-embedding-3-small") + or "text-embedding-3-small", + api_key=api_key, + api_base=api_base, + temperature=0.0, + ) + + +class FakeMessage: + def __init__(self, content: str): + from types import SimpleNamespace + + self.content = content + self.author = SimpleNamespace(id="test_user") + self.replies = [] + + async def reply(self, content: str): + self.replies.append(content) + + +def make_handler() -> MessageHandler: + from types import SimpleNamespace + + fake_bot = SimpleNamespace(robot=SimpleNamespace(id="test_bot")) + handler = MessageHandler(fake_bot) + handler.ai_client = AIClient(get_ai_config(), data_dir=TEST_DATA_DIR) + handler.skills_manager = SkillsManager(Path("skills")) + handler.model_profiles_path = TEST_DATA_DIR / "models_test.json" + TEST_DATA_DIR.mkdir(parents=True, exist_ok=True) + _safe_unlink(handler.model_profiles_path) + handler._ai_initialized = True + return handler + + +async def _test_basic_chat(): + print("=== test_basic_chat ===") + + config = get_ai_config() + if not config.api_key: + print("skip: AI_API_KEY not configured") + return + + embed_config = get_embed_config() + client = AIClient(config, embed_config=embed_config, data_dir=TEST_DATA_DIR) + response = await client.chat( + user_id="test_user", + user_message="你好,请介绍一下你自己", + use_memory=False, + use_tools=False, + ) + assert response + print("ok: chat response length", len(response)) + + +async def _test_memory(): + print("=== test_memory ===") + + config = get_ai_config() + if not config.api_key: + print("skip: AI_API_KEY not configured") + return + + client = AIClient(config, embed_config=get_embed_config(), data_dir=TEST_DATA_DIR) + await client.chat(user_id="test_user", user_message="鎴戝彨寮犱笁", use_memory=True) + await client.chat(user_id="test_user", user_message="what is my name", use_memory=True) + + short_term, long_term = await client.memory.get_context("test_user") + assert len(short_term) >= 2 + # 重要性改为模型评估后,是否入长期记忆取决于模型打分,不再固定断言数量。 + assert isinstance(long_term, list) + print("ok: memory short/long", len(short_term), len(long_term)) + + +async def _test_personality(): + print("=== test_personality ===") + + client = AIClient(get_ai_config(), data_dir=TEST_DATA_DIR) + names = client.list_personalities() + assert names + assert client.set_personality(names[0]) + + key = "roleplay_test" + added = client.personality.add_personality( + key, + client.personality.get_personality("default"), + ) + assert added + assert key in client.list_personalities() + assert client.personality.remove_personality(key) + assert key not in client.list_personalities() + + print("ok: personality add/remove") + + +async def _test_skills(): + print("=== test_skills ===") + + manager = SkillsManager(Path("skills")) + assert await manager.load_skill("weather") + + tools = manager.get_all_tools() + assert "weather.get_weather" in tools + weather = await tools["weather.get_weather"](city="鍖椾含") + assert weather + + assert await manager.load_skill("skills_creator") + tools = manager.get_all_tools() + assert "skills_creator.create_skill" in tools + + await manager.unload_skill("weather") + await manager.unload_skill("skills_creator") + print("ok: skills load/unload") + + +async def _test_skill_commands(): + print("=== test_skill_commands ===") + + handler = make_handler() + skill_key = f"cmd_zip_skill_{int(time.time() * 1000)}" + + # Prepare a zip package source for install testing + tmp_root = TEST_DATA_DIR / "tmp_skill_pkg" + if tmp_root.exists(): + _safe_rmtree(tmp_root) + tmp_root.mkdir(parents=True, exist_ok=True) + + create_skill_template(skill_key, tmp_root, description="zip skill", author="test") + + zip_path = TEST_DATA_DIR / f"{skill_key}.zip" + + with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf: + for file in (tmp_root / skill_key).rglob("*"): + if file.is_file(): + zf.write(file, file.relative_to(tmp_root)) + + install_msg = FakeMessage(f"/skills install {zip_path}") + await handler._handle_command(install_msg, install_msg.content) + assert install_msg.replies, "install command no reply" + + list_msg = FakeMessage("/skills") + await handler._handle_command(list_msg, list_msg.content) + assert list_msg.replies, "list command no reply" + + reload_msg = FakeMessage(f"/skills reload {skill_key}") + await handler._handle_command(reload_msg, reload_msg.content) + assert reload_msg.replies, "reload command no reply" + + uninstall_msg = FakeMessage(f"/skills uninstall {skill_key}") + await handler._handle_command(uninstall_msg, uninstall_msg.content) + assert uninstall_msg.replies, "uninstall command no reply" + + if tmp_root.exists(): + _safe_rmtree(tmp_root) + _safe_unlink(zip_path) + + print("ok: skills install/reload/uninstall command") + + +async def _test_personality_commands(): + print("=== test_personality_commands ===") + + handler = make_handler() + intro = "You are a hot-blooded anime hero. Speak directly and stay in-character." + + add_cmd = ( + "/personality add roleplay_hero " + f"{intro}" + ) + add_msg = FakeMessage(add_cmd) + await handler._handle_command(add_msg, add_msg.content) + assert add_msg.replies + + set_msg = FakeMessage("/personality set roleplay_hero") + await handler._handle_command(set_msg, set_msg.content) + assert set_msg.replies + assert intro in handler.ai_client.personality.get_system_prompt() + + remove_msg = FakeMessage("/personality remove roleplay_hero") + await handler._handle_command(remove_msg, remove_msg.content) + assert remove_msg.replies + + assert "roleplay_hero" not in handler.ai_client.list_personalities() + print("ok: personality add/set/remove command") + + +async def _test_model_commands(): + print("=== test_model_commands ===") + + handler = make_handler() + + list_msg = FakeMessage("/models") + await handler._handle_command(list_msg, list_msg.content) + assert list_msg.replies + assert "default" in list_msg.replies[-1].lower() + + add_msg = FakeMessage("/models add roleplay_llm openai gpt-4o-mini") + await handler._handle_command(add_msg, add_msg.content) + assert add_msg.replies + assert handler.active_model_key == "roleplay_llm" + assert "roleplay_llm" in handler.model_profiles + + switch_msg = FakeMessage("/models switch default") + await handler._handle_command(switch_msg, switch_msg.content) + assert switch_msg.replies + assert handler.active_model_key == "default" + + current_msg = FakeMessage("/models current") + await handler._handle_command(current_msg, current_msg.content) + assert current_msg.replies + + old_config = handler.ai_client.config + shortcut_model = "Qwen/Qwen2.5-7B-Instruct" + shortcut_key = handler._normalize_model_key(shortcut_model) + shortcut_add_msg = FakeMessage(f"/models add {shortcut_model}") + await handler._handle_command(shortcut_add_msg, shortcut_add_msg.content) + assert shortcut_add_msg.replies + assert handler.active_model_key == shortcut_key + assert handler.ai_client.config.model_name == shortcut_model + assert handler.ai_client.config.provider == old_config.provider + assert handler.ai_client.config.api_base == old_config.api_base + assert handler.ai_client.config.api_key == old_config.api_key + + shortcut_remove_msg = FakeMessage(f"/models remove {shortcut_key}") + await handler._handle_command(shortcut_remove_msg, shortcut_remove_msg.content) + assert shortcut_remove_msg.replies + assert shortcut_key not in handler.model_profiles + + remove_msg = FakeMessage("/models remove roleplay_llm") + await handler._handle_command(remove_msg, remove_msg.content) + assert remove_msg.replies + assert "roleplay_llm" not in handler.model_profiles + + _safe_unlink(handler.model_profiles_path) + print("ok: model add/switch/remove command") + + +async def _test_memory_commands(): + print("=== test_memory_commands ===") + + handler = make_handler() + user_id = "test_user" + + await handler.ai_client.clear_all_memory(user_id) + + add_msg = FakeMessage("/memory add this is a long-term memory test") + await handler._handle_command(add_msg, add_msg.content) + assert add_msg.replies + assert "已新增长期记忆" in add_msg.replies[-1] + + memory_id = add_msg.replies[-1].split(": ", 1)[1].split(" ", 1)[0] + assert memory_id + + list_msg = FakeMessage("/memory list 5") + await handler._handle_command(list_msg, list_msg.content) + assert list_msg.replies + assert memory_id in list_msg.replies[-1] + + get_msg = FakeMessage(f"/memory get {memory_id}") + await handler._handle_command(get_msg, get_msg.content) + assert get_msg.replies + assert memory_id in get_msg.replies[-1] + + search_msg = FakeMessage("/memory search 长期记忆") + await handler._handle_command(search_msg, search_msg.content) + assert search_msg.replies + assert memory_id in search_msg.replies[-1] + + update_msg = FakeMessage(f"/memory update {memory_id} 这是更新后的长期记忆") + await handler._handle_command(update_msg, update_msg.content) + assert update_msg.replies + assert "已更新长期记忆" in update_msg.replies[-1] + + # Build short-term memory then clear only short-term. + await handler.ai_client.memory.add_message( + user_id=user_id, + role="user", + content="short memory for clear short test", + ) + assert handler.ai_client.memory.short_term.get(user_id) + + clear_short_msg = FakeMessage("/clear short") + await handler._handle_command(clear_short_msg, clear_short_msg.content) + assert clear_short_msg.replies + assert not handler.ai_client.memory.short_term.get(user_id) + + # Long-term memory should still exist after clearing short-term only. + still_exists = await handler.ai_client.get_long_term_memory(user_id, memory_id) + assert still_exists is not None + + delete_msg = FakeMessage(f"/memory delete {memory_id}") + await handler._handle_command(delete_msg, delete_msg.content) + assert delete_msg.replies + assert "已删除长期记忆" in delete_msg.replies[-1] + + removed = await handler.ai_client.get_long_term_memory(user_id, memory_id) + assert removed is None + + print("ok: memory command CRUD + clear short") + + +async def _test_plain_text_output(): + print("=== test_plain_text_output ===") + + handler = make_handler() + md_text = "# 标题\n**加粗** 和 `代码`\n- 列表\n[链接](https://example.com)" + plain = handler._plain_text(md_text) + + assert "#" not in plain + assert "**" not in plain + assert "`" not in plain + assert "[" not in plain + assert "](" not in plain + print("ok: markdown stripped") + + +async def _test_skills_creator_autoload(): + print("=== test_skills_creator_autoload ===") + + from types import SimpleNamespace + + fake_bot = SimpleNamespace(robot=SimpleNamespace(id="test_bot")) + handler = MessageHandler(fake_bot) + handler.model_profiles_path = TEST_DATA_DIR / "models_autoload_test.json" + _safe_unlink(handler.model_profiles_path) + await handler._init_ai() + + assert handler.skills_manager is not None + assert "skills_creator" in handler.skills_manager.list_skills() + + tool_names = [tool.name for tool in handler.ai_client.tools.list()] + assert "skills_creator.create_skill" in tool_names + print("ok: skills_creator autoloaded") + + +async def _test_mcp(): + print("=== test_mcp ===") + + from src.ai.mcp import MCPManager + from src.ai.mcp.servers import FileSystemMCPServer + + manager = MCPManager(Path("config/mcp.json")) + fs_server = FileSystemMCPServer(root_path=Path("data")) + await manager.register_server(fs_server) + + tools = await manager.get_all_tools_for_ai() + assert len(tools) >= 1 + print("ok: mcp tools", len(tools)) + + +async def _test_long_task(): + print("=== test_long_task ===") + + client = AIClient(get_ai_config(), data_dir=TEST_DATA_DIR) + + async def step1(): + await asyncio.sleep(0.1) + return "step1" + + async def step2(): + await asyncio.sleep(0.1) + return "step2" + + client.task_manager.register_action("step1", step1) + client.task_manager.register_action("step2", step2) + + task_id = await client.create_long_task( + user_id="test_user", + title="test", + description="test task", + steps=[ + {"description": "s1", "action": "step1", "params": {}}, + {"description": "s2", "action": "step2", "params": {}}, + ], + ) + + await client.start_task(task_id) + await asyncio.sleep(0.5) + + status = client.get_task_status(task_id) + assert status is not None + assert status["status"] in {"completed", "running"} + print("ok: long task", status["status"]) + + +async def _test_memory_importance_evaluator(): + print("=== test_memory_importance_evaluator ===") + + called = {"value": False} + + async def fake_importance_eval(content, metadata): + called["value"] = True + assert "用户:" in content + assert "助手:" in content + return 0.91 + + store_path = TEST_DATA_DIR / "importance_test.json" + _safe_unlink(store_path) + + memory = MemorySystem( + storage_path=store_path, + importance_evaluator=fake_importance_eval, + use_vector_db=False, + ) + + stored = await memory.add_qa_pair( + user_id="u1", + question="请记住我的昵称是小明", + answer="好的,我记住了你的昵称是小明", + metadata={"source": "test"}, + ) + assert called["value"] + assert stored is not None + assert "用户:" in stored.content + assert "助手:" in stored.content + assert "小明" in stored.content + + long_term = await memory.list_long_term("u1") + assert len(long_term) == 1 + + # add_message 仅写入短期记忆,不触发长期记忆评分写入。 + await memory.add_message(user_id="u1", role="user", content="单条短期消息") + long_term_after_single = await memory.list_long_term("u1") + assert len(long_term_after_single) == 1 + + memory_without_eval = MemorySystem( + storage_path=TEST_DATA_DIR / "importance_fallback_test.json", + use_vector_db=False, + ) + fallback_score = await memory_without_eval._evaluate_importance("任意内容", None) + assert fallback_score == 0.5 + + await memory.close() + await memory_without_eval.close() + _safe_unlink(store_path) + _safe_unlink(TEST_DATA_DIR / "importance_fallback_test.json") + print("ok: memory importance evaluator") + + +def test_basic_chat(): + asyncio.run(_test_basic_chat()) + + +def test_memory(): + asyncio.run(_test_memory()) + + +def test_personality(): + asyncio.run(_test_personality()) + + +def test_skills(): + asyncio.run(_test_skills()) + + +def test_skill_commands(): + asyncio.run(_test_skill_commands()) + + +def test_personality_commands(): + asyncio.run(_test_personality_commands()) + + +def test_model_commands(): + asyncio.run(_test_model_commands()) + + +def test_memory_commands(): + asyncio.run(_test_memory_commands()) + + +def test_plain_text_output(): + asyncio.run(_test_plain_text_output()) + + +def test_skills_creator_autoload(): + asyncio.run(_test_skills_creator_autoload()) + + +def test_mcp(): + asyncio.run(_test_mcp()) + + +def test_long_task(): + asyncio.run(_test_long_task()) + + +def test_memory_importance_evaluator(): + asyncio.run(_test_memory_importance_evaluator()) + + +async def main(): + print("寮€濮?AI 鍔熻兘娴嬭瘯") + + await _test_personality() + await _test_skills() + await _test_skill_commands() + await _test_personality_commands() + await _test_model_commands() + await _test_memory_commands() + await _test_plain_text_output() + await _test_skills_creator_autoload() + await _test_mcp() + await _test_long_task() + await _test_memory_importance_evaluator() + + config = get_ai_config() + if config.api_key: + await _test_basic_chat() + await _test_memory() + else: + print("跳过需要 API Key 的对话/记忆测试") + + print("娴嬭瘯瀹屾垚") + + +if __name__ == "__main__": + asyncio.run(main())
    Lc}N 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 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf b/.claude/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..54418b8a6303d1b0cd6b6a206ca3014eba71bc3a GIT binary patch literal 175772 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

    Efa-}U=N0#E8wbvn*2 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

    Ho~`viMi{Qq6C8+OMYaKG9A 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%0A%=G!=gy#QXDT9?uha5>Msndv1y;_*lp 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 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt new file mode 100644 index 0000000..070f341 --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2019 The Work Sans Project Authors (https://github.com/weiweihuanghuang/Work-Sans) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d24586cc0336949d49a1c2bf3fb3b306c47b431e GIT binary patch literal 188916 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�x=?-oWMUIpXra(>*J~* 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

  • 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 Lt>?oSNbY|C4IDPj literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf b/.claude/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..12dea8c6f5f3af6c7e066b9c6ae5c8b33741e45e GIT binary patch literal 140332 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 SxwPE_zLV_>ke7{+I{yQdd{GDh literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/Lora-Italic.ttf b/.claude/skills/canvas-design/canvas-fonts/Lora-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e24b69b26b0e14a48fdbb65fd29db51ce1e95aad GIT binary patch literal 139328 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 Lyf1(o@qhmZ4%HFJ literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/Lora-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/Lora-OFL.txt new file mode 100644 index 0000000..4cf1b95 --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/Lora-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2011 The Lora Project Authors (https://github.com/cyrealtype/Lora-Cyrillic), with Reserved Font Name "Lora". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/Lora-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/Lora-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..dc751db00dc171fc19737d9da800d7a583bb2c6d GIT binary patch literal 133888 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 z�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ľpt2M58|nXQTYm`nHi4>=zyDnA3i4oQZvu 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 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf b/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a4d859a77f0e52e36bf699cf55469c31a4664c18 GIT binary patch literal 170004 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 TRjnW7*6tb_-nlkM?aKcEp-#ZB literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35f454ceac6b101ea3f9bed9f57a68a61519b401 GIT binary patch literal 160380 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%0A)KiD@urZp*RQFf}?HexfUW-qpkq{U<; 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 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf b/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..122b27305b6de88f6946bb171c055bd428124fc3 GIT binary patch literal 70004 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Ξ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 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf b/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4b98fb8dd753453f6e355a6dd1d4f483961c4017 GIT binary patch literal 69900 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 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt new file mode 100644 index 0000000..4bb9914 --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2022 The Instrument Sans Project Authors (https://github.com/Instrument/instrument-sans) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..14c6113cdd3abcfa360f8d27bb42034aa91accc0 GIT binary patch literal 68028 zcmbq+2S6Oh_4mvk+`-YiK!|q0(GTu`14KK@(c$O_BqRg~kSG$M>LR(zC5}tt*p_?m zb{xkowv*V2;~FcnY!zEBvX$ZX*x?lI07 z3&hETv6`xCYwlwiVT?&VjPaftTTA<|($Ys6yJ9nAGmSOvofUzjVLpsS?Ptt4s-@jv z9PnJR3wgf+mUZnNmX5W4m4&#!68HUs69b$7c42lVW14GFLGsAJ4Dhf(JP*ayYh--q z2LAMATE_BGe(jFY;eny#?xA<^d>x+Wj{@Lxo91-f7vny0bYgZ#M%C~H!=dO$_YVENR$v$RCaTagzfR!*AceB8@ShKOlep=Bb(4*RLAOV=Vb2 zkm0>~dU*4w`l54?-xv8ckMj9*9`N`HZW*7SX92h}{vX!KG^~cH>CWw+2jxPoFU+ga zl>GVM+8e#17UiMRR0>Dhey`cJ0mc7eD%IZ!%iG#-&@RT_S)KSY${zNLQXR#unn?u3 zKf>Ky+3#3fLa^L+)lrmT z>~ea}?b3c+;^ey79;E#N%>aGgsCS61W*yARidinpz#nJcJfE9+0Wai5d?hdD-TWp% z!CQW(ay6k#3^?a7GtPyq z1m`mJDrb$Lh_f!X9_Jx8it|Qx0nQh(pW=KOy8-8$*&R6F#U8@>VfJU7_p^gIzs}yo z`7Qi$_8$8X=a1QcasHakg9f64qkYBTdN=RJ`6jeZ;`j3V06)NAXDWV}pHO(kSOU1^ z3%XU}8N;);m?uBZ-v^Wf`Zj+Dxk(<3td!LYnkU&Vb}p#A4%8jsKD?CI^De%gPx7Dh zXZS1p5dTtANdeMwNiUhCGO0o8mbOTDOOHs;NUuo$Q2D4LR63PGwNh21YFDjQZBlJh zU8Z_K^@Qrrs-vpEsy_D!_Q>|A^XT*#@R;z}>2bTq8ykDtm+uu9NJK5XlUFu!$ z-Q~UBd(wNC_qpDed0*#!m-oZoPkX=T{i!xuo1)FtmTT8)uhQPC{iXIv?J=K7pCq3g zpAw%sp9_3`?sJ3B-98Wd{NCp!pF=+H`F!H@U*Gk2VgOY->gH{GvgIa@D z2VEX?T`&*M4IT-;I{5M6KL+m)ej_A2Bt9e~#2iu?a$d;YA&-PS6Y@dG7oj}VH#8zN zAv80zAhas9C3Jo08KFN3y(;w9&|ilBCG>;P|AetHpRn*SLs(H*by#cI>afwUnXuhq z7l!>J?541L!yXNLG3-d#`(dAjeI2d|4-Q`uo*JGPULM{U-W@&|{`2q~!|w@yB>d^{ zm%|T-zZd>#_}3BY2t!0sM0JEMqAy}+#5oa{MC^;WJ>r99x@E1)W|ut^85~(3c~RuA zB2PrlN2NxMN9~PzD$2e*V)@49_bopb9T1%z-5Y&v^kdPVt}v{qU9oS)TQPp(FD1ql zQy0@2GZ3>S=Iod&W1f%sI@TjLFxD8`5xYKiD)!Xa^JA}xy+8JyxZt?hxRkikxc<0} zaogg~jk`JS_i^9E7sOlQyW`izZ;Rg@e_{MD;%|<>C;qYcXX9Uu|2RRDP?2z2!o>+U zBs`gLRJTmmr5n-h)SaRGiS8=ht-2?42Xt@gzDo2;j7ZcaS`zCMyAuZ!rxGto{AJ?H zNfk*~COw=Sk-Rnes9vo%>dW-I^}k6`rBtWvNx38C{ZvD0MQTgxNb2ROx1~Oo`f}=* zY2ImrX-CsON&7lIB)u%XEqyqBXZnGRvW(u0Z5fwl+?(-S#)(XxxgxVXbA9G)=AO)- zWL}+lZ{}l}FJ>Og{3NX| z4Hp@HX1K<1i{T!_Lk7~>G#fbP0GdfcnTJO(u0yOGx;qg%t&p7#{d6n4n>_&i^eFoc z*YFU&oa?xrr*jjuYbmegO}vi}@L_&B|1)%fS^AT7Oy!~SQu(TaRVgv SBiuei{- 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 literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf b/.claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8fa958d9baf94bdf86c45d5340dc2ba171e2eb2c GIT binary patch literal 70868 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 EZwtSNl>h($ literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..976303184a522174d92bc8d1a82d7960850a94b0 GIT binary patch literal 69312 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 kD*L1+3?-O7{Y^Nh`|X17zihwCtH}t5 z-6!j>T*k<&(kFQ4Lvu{_R``+a-&g;R&GPYL%vsijU2P%$gg7t9r8PD*6K4srpH+o< zel6e$1v~-cr+p}awscTKt^2U1J?O?AS(x^)Jd27|TgNJF3Wr8yglxW}ens{DG>QZU zLY{!Uq+*B%H7#u7YD#E~NqLT~V34YrXK?=++?wc##ul4?C;83(oAiEIaBeAB!}Td5EQ}jV+q3kIL5R>n zF}`}zVF4%<_6044yCjDwB3r9`We_>89=F3?>+Y`M1-C5kmuDBI0%ljC&}9au7PvhiS6I+N z=)CA1cs=f9FV$UmBsxA_o|-C`Cnw8oU0rPeOUae#p6==C?w;w^-nMLSZ?>%$GoO%; zq9*ZIfj74OF1OXMb$c8X0Pc8GzmjivQ@^ITL#}h)q4tB(IsdNx;xrQB( zkA~tQQmy@ijbHdvJ`;1BYvl z!FjTkQP+vF4#6BrO37S%(WS;YlMW-=$DLwOH(c`aHR6Dd;o;8!^-$~>$rt)e6sA&v zQ;#HCb>=mP6}2x}=xUE*YqkWlu}BgJ{KG`g8%60G@SR4aZvI4BO_litVcTJRUXK)E z5sIJERuRbHp<$rfz@YVjqw-v$oE^y--Q5v?EP(Chwld#p??_DaTSk0$J{b#R&zU|y zBDi(EgBoBw_K){m6DSNNg!tz|iYurEM(^vA7*$vJ`?@?;*jfI*E~`*$%ziJVjKbj1 x!r#~Bg2K-8_Y?MxRoDglz1TepyT^Vn_*P*T#d~|@a4)?5UeFD77O+Ip{{-W$>9+s? literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/Italiana-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/Italiana-OFL.txt new file mode 100644 index 0000000..ba8af21 --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/Italiana-OFL.txt @@ -0,0 +1,93 @@ +Copyright (c) 2011, Santiago Orozco (hi@typemade.mx), with Reserved Font Name "Italiana". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a9b828c0f308eaf07a172cbf2aae823e0f762210 GIT binary patch literal 27184 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

    SlQ$b{H)Bp*kRd)gNrgr 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 AY5)KL literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt new file mode 100644 index 0000000..1890cb1 --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2024 The Boldonse Project Authors (https://github.com/googlefonts/boldonse) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..43fa30affce39b3649e6e94122fbe17cc5536dd2 GIT binary patch literal 77168 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 iFKDSl-VauD$&a5X#!m+TJ}F<>AVFkpJG0YVE2 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 F{{hdq%)S5s literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt b/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt new file mode 100644 index 0000000..fc2b216 --- /dev/null +++ b/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2022 The Bricolage Grotesque Project Authors (https://github.com/ateliertriay/bricolage) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf b/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0674ae3e4fc8c3f7baa53dbb582dd420ea73f224 GIT binary patch literal 90920 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 W*o4c2eAo@-xFeTi)L#c>r~W^H!)*Kj literal 0 HcmV?d00001 diff --git a/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf b/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..58730fb4c7b999b46537d613ab629b8e465251ad GIT binary patch literal 107352 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