{
  "openapi": "3.1.1",
  "info": {
    "title": "Threadsmith Sequence Optimizer API",
    "version": "1.0.0",
    "summary": "Reorder the stitch segments of a DST, PES, JEF or EXP file for fewer trims, jumps and colour stops.",
    "description": "Every endpoint performs the same calculation as the human page and returns inputs, result, units, assumptions, sources, warnings and computedAt. MCP endpoint: /mcp."
  },
  "servers": [
    {
      "url": "https://threadsmithsequenceoptimizer.usefulweb.app"
    }
  ],
  "paths": {
    "/api/v1/calculate": {
      "post": {
        "operationId": "calculate",
        "summary": "Reorder the stitch segments of a DST, PES, JEF or EXP file for fewer trims, jumps and colour stops.",
        "description": "Reads an embroidery machine file (or a stitch list), splits it into the segments that are sewn without a jump or trim, and finds a sewing order with fewer trims, jumps and colour changes: segments may be sewn backwards, colour blocks with the same thread are merged, and segments whose stitches overlap keep their original order so the layering does not change. Every stitch is kept. You get the before/after counts, the sewing time saved and the optimised file in the same or another format, decoded again to prove that every penetration is still there.\n\nMethodology:\n- The file is decoded (DST balanced ternary, EXP bytes, PES via its PEC block, JEF) into stitches, jumps, trims and colour changes; a segment is a run of stitches between two jumps, trims or colour changes.\n- Layering: segments whose stitches touch a common 1 mm cell keep their original order. All other segments may move, and within a thread they may be sewn backwards (jump to the last stitch, sew the same penetrations in reverse).\n- Order: stay in the current thread while a segment of it is free, otherwise switch to a thread that can be finished completely (or has most free segments); the next segment is the cheapest connection — jump for gaps under the trim distance, trim + jump otherwise. A relocate pass moves single segments inside a thread run when that is cheaper.\n- The file is rebuilt with one jump per gap (the writer splits long moves into format-legal records), trim + colour change between threads and END. The new order is only used when colour changes, trims and jumps are all no higher than in the input and at least one is lower.\n- Jumps are counted as moves: several jump records that a format needs for one long move count once. Sewing time = stitches ÷ speed + 4 s per trim + 20 s per colour change + 0.15 s per jump.\n\nMoving segments changes where the machine trims and ties off; check the new order in a viewer and test-stitch before production. Tie-in/tie-off stitches inside the file are kept as they are.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "threadsmith_sequence_optimizer",
        "x-owner-app": "threadsmith",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ThreadsmithSequenceOptimizerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Monogram badge DST: fewer trims, same stitches",
                  "value": {
                    "file": {
                      "filename": "badge.dst",
                      "contentBase64": "TEE6QkFER0UgICAgICAgICAgIA1TVDogICA1MDA4DUNPOiAgMg0rWDogIDQyMA0tWDogIDQxOQ0rWTogIDQyMA0tWTogIDQxOQ1BWDorICAxOTQNQVk6LSAgMTczDU1YOisgICAgMA1NWTorICAgIDANUEQ6KioqKioqDRogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkEpclEpckEpcAAANmQgOZgQNYJAOaJAOZJgNapgMapgOUoQOVoANFYAMFYgMFYgOBYQMAYQOCYQOAYAMBYgOAYgMCYgMKYQMKYQNKYANKYAMYogOaogNUqQOWKQMVKANWKAOUaANUagNUagMmigOmCgOhCQOgSQOgSQOAiQMCiQNCiQMCCQOASQMCSQNASQNQiQNQiQNRCQNWCgMWSgNUSgMkmgNmmAOkGAMlGANmGQMlWQMlWQNoUgNqUAOKkAMKkQMKkQMCkgNAkgNBkgNAkAMCkQNAkQMBkQMFkgMGkAOEkAOFkAMkUQMqVgMqVgNpFgMqFAOoFANplAMolQNYRQMZRQNZBQNSBgNQhgNQhgNBRgMARgOBRgMBBgNAhgMBhgOAhgOgRgNgBgMiBgOiBgMphQNYZQNaZQOZZAMaZANZZgMmgAOKpAMIpAMKpAOIpAOlggOqFiNoUgMEWAMFWANEWAMFWAMEWANFWAMEWANqUgOJGgMmgAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMlggNioANEmQNFWAMEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANFWANEmQNSSgOVYANVIAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpANUIAOVYAMIoQOZAQMFWAMEWANFWAMEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWAOZAQNQiAOkAgMKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMmAgOJYAMYAQNFWAMEWAMFWANEWAMFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANFWAMYAQMASQOhQQOKpAMIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAOhQQMZogNqkAOoEANEWAMFWAMEWANFWAMEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWANEWANqkAOoEAMBCQOJJgOIpAMKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAOKJAOaIgNoUgMEWANFWAMEWAMFWANEWAMFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANFWAMEWANqUgNEigMWYAMKpAOIpAMKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAMWYAOaYgMpEgMqEAMEWANFWAMEWAMFWANEWAMFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMqEAMpEgOFigMIJgMIpAOKpAMIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAMJJgNUaQNokAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANokAMmSAMVIANVIAMKpAOIpAMKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpANVIAMVIAMmiQNqUgMFWAMEWANFWAMEWAMFWANEWAMFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWANqUgNkCAMmAgMKpAMIpAOKpAMIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAMIpAMhAQNmiQNEmQMFWAMEWANFWAMEWAMFWANEWAMFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWANFmQOkCAOkAgMKpAMIpAOKpAMIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAMIpAOmAgMlCAMFmQMEWAMFWANEWAMFWAMEWANFWAMEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWAMKkgMliAMWIQOWIQMKpAOIpAMKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOVIAMWIQNmCAOpUgMFWAMEWANFWAMEWAMFWANEWAMFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWAOpUgNWaQMUYAOUYAMIpAOKpAMIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOUYAMUYAMlSgMYQQMEWAMFWANEWAMFWAMEWANFWAMEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWAMaQQOVaQMUoQMIpAOKpAMIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAMVoQOEigMEWAMFWANEWAMFWAMEWANFWAMEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMFWAMaIgOhQQMKpAOIpAMKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOhQQOBCQNaQQMEWANFWAMEWAMFWANEWAMFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANFWAMEWANaQQNYogMWIQOKpAMIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMVIANACQNoUgNEWAMFWAMEWANFWAMEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWANEWANqUgNKYAOIZgMKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKZgORiANEmQMFWAMEWANFWAMEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWANFmQMJIANFYQMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpANKZgNRCgMpEgMFWANEWAMFWAMEWAMFWANEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMpEgMiYgOkAgMIpAOKpAMIpAMKpAOIpAMKpAMIpAOKpAMIpAMKpAOIpAMKpAOkAgMoGQNGGQMEWAMFWAMEWANFWAMEWAMFWANEWAMFWAMEWANGGQORESOVIAMWIQMIpAOKpAMIpAMKpAOIpAMKpAOWIQMWIQOmJhtGGQNEWAMFWAMEWANGGQOGUANGEAOGUAOEUANGEAOGUANGEAOGUANGEAOGUANEEAOGUANGEAOGUANGEAMilAOmVAOmVAMilAMWRQOkCANmiANaqQNZqANZqANaqQNlCQOVqgNilAOmVAOmVAOlVgOmVAOmVAOZRAOZRAMARgNZqANaqQNZqANZqANaqQNZqANZqANaqQNYIgMaRQOZRAOmVAOlVgOmVAOmVAOlVgOmVAOmVANglANJBANmiANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqAOKgQMYYAOUgAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOUgAOJBgMZKQNaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQMoQAOqgQOUgAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOZRANKhgMligNkigNaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqAMkigMligOpgQOZRAMaRQOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAMglANEgQOoQgNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANkiAOlCANiggMmFgOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgMmFgMEgQMmCQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqAOQaANgggNSRgOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAMFgANkiANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqAOlCAOhAgNUgQOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVANYBANaBAMFgANkiANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqAMligMkigOiAANaBAOYRAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVANaBANYBAOEgAOlCANZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANRKgMgAAMYRQOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOkVgOEgAMkCQNZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQMkCQMgAAOVggOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOhFQOGgAOoQgNaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqAOlCAOkCAMgAANglAOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAMglAOFggNqQQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNmiANgAAMWgQOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVANZRQOFggNkiANmiANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANmiANkiANgAAOiFQOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVANaBANlQgMZKQNaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqAMligNhAANWgQOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAMWgQNkQgMSaQNaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqAOkCANmiAOiQQMglAOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgMaRQOZRANkQgNkiANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqAOkCANiAQMUgAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAMmFgNmQgMqQANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQOiQQOglgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOglgMmQgOmCANkiANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANlCQOiQQOaRQOZRAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgMZBgNmQgNRKgNaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqAORagOgQQOYRAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgMYRQOYRQNhQQNmiANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNpQAMiQQMmFgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVANmFgMhQQNqQANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqAOkigMgQQMVgAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgNZRQMhQQOaKQNZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqAMgQQNSRgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVANWgQMhQQOgiQNaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqAOoQgMgQQNYBANYBAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOYRANYBAMgQQOqQgNaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANQaQMgQQOVAQOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOhlgMgQQOkCANkiANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqAOkCANkiANgQQOhlgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOaBgMgQQNSaQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNqAgNgQQNYBANYBAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOYRANYBANgQQNqAgNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNSaQNhQQNUgQOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOglgMgQQOlCAOkCANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQOkCAOkCANhQQNSRgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgNUgQMiQQOmigNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQMpQgNhQQNkFgOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgNlFgMiQQNoQANZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqAMkigNhQQOUgAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAMaRQMiQQMQKgNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqAMSKgOBgQNYBAOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAMYRQMaRQMiQQOlCANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNkigMligOBgQNhlAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAMglANiQQNmiANmiANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqAMlCQOBgQNYBAOYRAOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOaBgMhQANQaQNaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQOgiQNhQQNWgQOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVANlFgMhQANoQANZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqAOZKQOBgQOZRAOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOZRANhQANRKgNaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqAMligMligOBgQNhlAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOZRAMZRAMhQANlCQNaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANlCQOBgQNYBANYBAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOilgMhQAOYKQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqAOmigOGggOWgAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOWgAMhQAOkCANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANRKgOGggMYBgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVANglAMhQAOmCANkiANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqAOkCANkiAMGggNZRQOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAMWgQMgQAMligNaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANpQAMGggOiFQOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOgFQMgQANmiANligNaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqAMkCQMGggNYBAOYRAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVANVgQMgQAMmigNaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqAOmigMEggNFQgOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgMhFQMiQANmiAMligNaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQOSaANEggNVgQOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOVAQMgQAOmigNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqAOYKQMEggOYRAOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAMgFQOiQANmiANmiANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNmiANligMEggOglgOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgNVgQMiQAMkigNaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNoQANEggNhlAOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOiFQOiQAOkCANmiANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANqAgNEggNkFgOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAMVgAMhQgOlCANZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQNkiANEggOYRAOZRAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgMilAOiQAOaKQNaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqAOmigNEggMYRQMaRQOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAMYRQMaRQOhQgNqAgNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANSaQNEggMVgAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgMYRQOhQgOSaANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQNZqANZqAOSaANFggNUgQOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOYRANaBAOhQgOJgANaqQNZqANZqANaqQNZqANZqANaqQNZqANaqQNZqANZqANaqQMSKgOFAgOaBgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOmVAOlVgOmVAOYBgMgQgOkigNZqANZqANaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQOYKQOFAgNZBgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgNhlAOgQgNaqQNaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQNZqAMGAANaBAOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVAOaRQMaRQOgQgOoQgNaqQNZqANZqANaqQNZqANZqANaqQNZqANZqANaqQOkCAOlCAMGAANaBAOmVAOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOmVANaBAOgQgNQaQNaqQNZqANaqQNZqANZqANaqQNZqANZqANaqQOkCAOlCAMGAANaBAOmVAOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVANilQOpQQNYqQNZqANZqANaqQNZqANZqANaqQNZqANaqQOaKQMEAAMYBgOmVAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOaRQOZRANpAQOJgANZqANZqANaqQNZqANZqANaqQNZqANZqAMSKgMFAANUgQOmVAOlVgOmVAOmVAOlVgOmVAOlVgOmVAOVAQMoAQMmCQNZqANZqANaqQNZqANZqANaqQNZqAOQaANFAAOWgAOlVgOmVAOmVAOlVgOmVAOmVAOlVgOZRAMqAQOkigNZqANZqANaqQNZqANaqQNZqAMmigOEQQNYBANaBAOmVAOlVgOmVAOmVAOlVgOglgOoAANQaQNZqANZqANaqQNZqANaqQOqQgMKRgOglgOlVgOmVAOmVAOlVgNQRgNoggMkigNZqANZqANaqQOYKQMahQOZRAOZRAOmVAOlVgMZBgMQKQOkCANkiAOkCANkiANEQgOIgQNCgYNCQoNCgYMAAMNAAIMAAAMEQgMIgQNZBQNZRQNYRQMqlQNplAOoFAMqFANoFgMoVgMlUQNkUQNmUQOEkAMFkgMEkgNGkgMAkQNCkQNAkANBkgMAkgNCkgMIkQMJkAOIkANqUANoUgMlWQMlWQNmGQMlGAOkGANmmAMlmgOlmgMWSgOWSgMRCQOQCQNQiQOQiQNCSQNCCQNCCQOCCQMAiQOCiQMgSQOgSQMhCQOhCQNmigOkigNUagOWaAOWaAMVKAOVKANUqQNVqQOYogOZogNKYANIYAMKYQMJYQOCYgOBYgOCYAMBYAOCYQOBYQMGYgMFYgNGYANFYANGYQMVoQMapgNYpgMZJgMYJANYJAMaZQNaZQOohQMphQOiBgMiBgOgRgMgRgOBhgMAhgOBBgMBBgOBRgNBRgOQhgMQhgOQBgNSBgMYQQOQZQMWkgMhhQMRkAMmBgMSkAMkRgMYkQMFhgOYkANFBgNIUgNFRgMEWQNUhgOEWANWBgMEGgNRRQMBmQOiFQNiWQNhFAOiWAMiVAOgGgMClgOgmgOKFQOZSQNIFANYiQNIVgMISQOUkQMKCQMUkAMKiQMUkgMoSQMSkQMoCQMSkAMiigMZkQORagMZkAMSKANIUgMRqAMFWQNAaQNFGANEKgMFGgOGKANBmQMEqQOCmQOKogNgGANoYAOhGgMqYQOgmgMgYgOZSQOhYAOYCQOhYQOYiQMlYgNKCQNmYQNKiQOKpgMoSQNJpgMpCQMJJAMiigNJJQMQagNAZgMSKAMQpAMQqANSJQMAaQNQZQNGKgMmhgMGKAMmBgNGqQMkRgOKogOFBgMqYAOERgMqYQOVhgOiYgMUBgOgYAORRQMhYQOglQMlYgMiFQNkYAOgVAOFoQOBlgMJpgNJlQOJJANKFQNJJQOKVANAZgMFUQMQpAOWkQMRJAMBUAORggOpZANYEgMqZQNaEgMoZQMUGQNpZQMUGQNpZQMUGQNiZgOVGAOApgOVGAOApgOUGAMBpgOUGAMBpgNWmANCpAMVmgOCJAMVmgOAJAMUmgOBJAMWmgOBJAMWmgMBJAORmQNAJQNAWQNAJQNCWQOBZQNCWQOBZQMBWAMBZQMBWANGZgNAGAOWpgNAGAMUpgMCGAMUpgMBGgNVpgOBGgOVJgNAmgOWJAOAGgOVJgNAmgMWJAMCmgOWZAOCmgOUZAOJmQOUZANoWQMVZANoWQNVZAMqWQOlhAOoWQOlhAOqWQMlhANqGQNlhAMqGQNlhAMpGAOmBQOpGAMmBQNomANkBQMqmAOkRQMomAOmRQOomAMmRQNaSAOEhQMaSAOEhQOaSAMEhQOZSgMEhQNZCgOEBQMZCgOEBQOZCgMEBQOZCgNEBQNZigNEBQMYigOERQMYigMERQNJSgNERQNISgOWhQMISgOUhQOISgMUhQOISgNWhQMICgOUBQMKCgOUBQMKCgMUBQNKigNWBQNIigNWBQMIigMVRAOIigMWRQNoSgNVRAMoSgOllAMoSgOklAOpSgMklANpCgNklANoCgNklAMpCgOmFAOpCgMmFANpigNmFAMpigNlFgMqiAOlVgOqiAOkVgOoiAMkVgMaaANkVgMaaAOGlgOZaAOBlQNZKAMBlQNZKAMAlQMaKQNAlQOZKAOAFQOaKQOCFQNaqQMCFQMYqQMBFAMYqQNAFANJaQOAVANJaQOCVANCagOCVAMCagMBVgMCagMBVgOAagNAVgNAKgOQlgMBKgOZlQMCKAMZlQOCKAMYlQOAKAMYlQOAKAMalQNBqANZlAMCqQOYFAMCqQOYFAOAqQOaFAOBqQOZFgOBqQMZFgMhaQNYFgMkagMaFgMkagNaFgMkagNVEQOlagNUEQOmaAOUUQNmKAOWUQNkKAOVUAMlKAOUUANmKQOWUAMmKQMWUAOkKQMVUgOlKQMUUgOlKQMUUgOqIgMWUgOoIgMQUQNpogMQUQNqoANSUQNqoAMSUQNooAMQUAMpoANQUAMpoAMSUANooQMRUgMooQMRUgMpoQMSUgMiogMSUgMiogMSUgMgogMYUQMhogOYUQMioAMZUAMgoAOZUAMgoAOZUAMhoAOaUAMioQOaUAOgoQOZUgMgoQNZEgMhoQOaUgMkogNVGQMkogNVGQMlogMUGQNmoAMWGQMmoAMWGQNkoAOVGANloAOUGAOmIQNUmAOmIQNWmAOkIQNVmgOlIQMVmgOlIQMUmgMqJgMUmgOqJgMWmgMpJgNBWQNpJgNBWQNqJANAWQNqJAMAWQOoZAOCWQOpZAMBWAOqZQOAWAOoZQNCGAMpZQNCGANpZQMBGgNiZgOBGgOCpgOBGgNgZgOAGgOApgNAmgMBpgMCmgMBpgMCmgNCpAOCmgNCpANpWQOAJANpWQOBJAMoWQMBJAMqWQMCJQOqWQNAJQNqGQOAZQMpGAOAZQMpGAMBZQOpGAMBZQOpGANGZgMomAOWpgMomAOWpgOomANUpgNaSANVpgMaSAOVJgMZSgOWJAOZSgMWJANZCgNWJAMZCgNWJAMZCgOUZAOZCgMUZANYigNVZAMYigNVZAMYigOlhAOYigOlhAOYigMmhQMISgOlBAOISgOmBQOISgMmBQNICgMmBQMICgNmBQMICgOkRQNKigMkRQNIigNkRQMIigNkRQOIigOEhQOIigMEhQNoSgMEhQMoSgOEBQOpSgOEBQNpCgMEBQNoCgNFBQMoCgNFBQOpCgMERQNpigMERQNqiANERQMpigNERQMqiAOUhQNaaANUhQMYaANWhQMYaAOWBQOYaAMUBQNYKANWBQMZKANWBQNZKANWBQMZKAOWRQOZKAMWRQNaqQOllAMYqQOklAOYqQMllAOYqQMklAOZqQNklAMCagOmFAMCagMmFAOCagMmFAOAagNlFgNBKgOlVgMBKgMkVgMCKAMkVgOCKANkVgOCKANkVgNAqAOGlgNAqAOGlgNBqAMBlQMCqQNAlQOAqQNAlQOAqQOCFQNhaQMCFQNhaQMCFQMmagNBFAMmagNBFAMkagOAVAOlagOCVAOlagMCVANmKAMBVgOkaAMBVgNkKANAVgNmKQNCVgNmKQOZlQMkKQOZlQMlKQMYlQOlKQMYlQOqIgNalQOqIgNalQOoIgNZlANpogOYFANqoAMaFANooAOZFgNpoAMYFgMqoQNaFgMooQNaFgMooQNVEQMpoQNVEQMpoQNUEQMiogOWUQMgogOWUQOhogOUUAMioAOUUAMioAMUUAOgoAMVUgMhoAOVUgMhoAMUUgMgoQMWUgOgoQMWUgMhoQNQUQMmogMQUQMmogMSUQMlogNRUAMlogMRUANmoAMSUANkoAMSUANkoAMRUgNloAMRUgOmIQMSUgNkoQMSUgOkIQMZUQOlIQMYUQOqJgMYUQMqJgOaUQMpJgOYUANpJgOZUAMpJgOYUANqJAOaUANoJAOZUgOpZANYEgNqJAMQggMgQQNCgYNCQoNCgYOkCZskCZukCZsAAANQgAOgQAOiUQOgUAOgUAOgUAOgUAOgUAOgUAOgUAOgUAOgUAOgUAOgUAOgUAOhkAOYZgOAYAMAYAMAYAOAYAMAYAMAYAOAYAMAYAMAYAOAhAMCBQOBBAMUYQOUaQMACQMACQMACQMACQMACQMACQMACQMACQMlmAOqFAMABAMCBANCRANAkANAkAOAEANAkAOAEANAkAOAEANAkANAkQOWggOEQAOGQQMCiAOGhAMKigOJigcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAuIiAcEhAtFiAdFiAeICAMFAAuFAAuICAOKAQdIgQeKAQeJCgMBAQuBAQuJCgOAAgdAggeCAgeICgMAAQuCAQuICgOBAgdAggeBAgeICgMCAQuCAQuICgOAAgdAggeAAgeICgMGAguBAQuICgOIAQdIgQeIAQeICAMEAAuEAAuICAMFAgMKAQNCgYNCQoNCgYMmEIdlEocmEIcAAAMQggMgQQMpUgOhUQMqFANpmQcmFANpmQcoFAOmUgMpUgOQCQMQCQMQCQOgUQMhiANhiANhiAOUKAOWggNpQQNCgYNCQoNCgYOkhaMkhaMAAAOiQANRgANQogMRRgORRgORRgNpFgMRQAOBAQOlAAMhQAMaogMWaANmigMgSQMACQMCSQNRiQNUSgMlGANqUAMAkAOFkAOqFANZRQOSBgOARgMBRgMShgOolQMmUQNqUAOlmgNQiQNCCQMCiQMhCQOWaAMlCgNaAAMQgAMlUQMqlQNSBgMRhgOBRgMChgOiRgOoBQMYZAMVoQNBYQNKYQNVqQNVagMhCQNgSQNAiQOAiQOmCgOVKANBYAMaJAOpBQOAhgOARgOQBgMplAOplANIQAMhRgOKCQMkRQMFBAuqSAcBBQupSQdCBgtgCAeIRgsmCAeFRQtKCgNERYsAAAMVAguACQcYBQuACgeRBAuICQeUBgsICAdWhAsJCAdUhAsKCQdUhAuJCQeVBguACAdQhQuECgeRBgtIggcaBAtJiAdJiAeGSgMUhQuESgMFigcFigcBSgMQhgtBSgOEiQeEiQdASgMZhAtASgOKggeKggdCSgMZhAtCSgOFiQeKggdASgMYhQtASgOFiAcFiAcCSQOUhgsCSQNCiAcBigcWAQtJgQeZBQtEiAeSBQuCCQeUBguCCgdWhAsICQdVhAsICAdUhAsICAdVhgsKCQeSBQuCCgeZBQuACQdUAAsKggdBQgMJSQNZhAsYhAsCSgOFigeFigcEigcBSgMShgsShguBSgMBiAcCiQeBiAdISgMRAQtISgNpQAeJgAdISQNYhgsISQMGigcGigcCSQMWhgsCSQMIgQdWKgMWKgNBCQOFRgtACQNkCQeFQAtgCQdJBAugSgcBBAupSAcEBAulRQMKCAMhRQNKAQOFAgNCgYNCQoNCgYMKQqMKQqMAAAOFAgNKAQMAhQMmSAclSgcAhQMJRQtIRQtJRQsBhAMgSQcgSQcBhAMARAtCRAsARAuEhQNpAQeGhQNEQAtGQAsEhgOlSQeEhgMIRQsIRQsChAMgSgcBhgOERQuFRQtiCgdKAQOFAgNCgYNCQoNCgYMAAMNJUJsIUJtJUJsAAANpQQOWggNBaQNhGQOhWQMqlgOolgOJgQNGQgNCgYNCQoNCgYNIWKcAAANIQQOEggOaAgOlggOaAgNWYAOVCQOmgANaggNVYgMZgQOpQQOlkgMqAgOlkgMqAgOkkgNoAgOkkgMoAgOkkgMqAgOlkgMqAgOlkgMqAgOWAgMKAAOIBgMZAgMqRgNYQANqBgOpkANqBgNZQANlAQOqkQNlAQMYQAOqZYMAAAMUqgNilIMAAAOaAgNVYgOaAgNWYAOVCQOmgAMViQOmAQOZgQNmQgNCgYNCQoNCgYOYpZMAAAMRgQMiQgMlUQMABgNJYQNaogNqhQNqFgNiQgORgQNCgYNCQoNCgYOolYsAAANFAgOKAQOIRgMViQMEAANYgQMqRgMYQAMkAQOqkQNmgQMikgNWYANikAMWYgMhkQOhAANVggOqgQMahgOqQQNEgANEiQOqRgNKAANkAgOVCQOmgAMYAgNUYgOaAgNmgQNESQMmQAMIgAOIBgNqAgOEQAMgAgMVQAOSYAMRAQMhAQMgkAOmgANSAANmQAMYQAMqRgNYgQNEAAOViQNIBgOEAYMAAANYhAMYhAMoSoMAAAMlgANhkgOkgAMikAMmgAMikAOkgANikANWYAMhkgOmiYMAAAOKUANKEAOiQQNRggNCgYNCQoNCgYNlUaMAAANEQgOIgQMVAQOGCQOVAQOECQMUAQOECQOVAQOGCQMVAQOECQOUAQOECQMVAQOGCQMVAQOWhIMAAAMAQAOKgQMahgMIgQMEQgNCgYNCQoNCgYNZGacAAAOEggNIQQOphQNqVgOkWAMmGAOJBQMChgNKAQOFAgNCgYNCQoNCgYNaWKMAAAOIgQNEQgMoAgOEQANpAQMUAQNZYQMUggMiAQOhkQNRYQNRAAOlQgOokQMkAQMZAQNFgAOaAgMIBgNJQANGQAMEiQOWQQOlSQNWQAOlSQNUQAOlSQNWQANqAgOlkgMqAgOlkgMqAgOWAgNJAgNqRgMZQAMmAgMWAgMQYQMmkgMQYQOmkgMSYQOkkgMSYQOkkgMSYQOhkQOhQgNSgQNCgYNCQoNCgYMYhaMAAAMQggMgQQOIkgNGkAMSBgMVoQOIYANhiQMgQgMRAANpQAMUQANlSQMUAQNEiQMahgNECQNIRgMESQMIRgNViQNIhgOaAgMIhgNYAgMqRgMYQAMkAQOqkQMmQANSAANVYgMhkAMhAQOWAgMQYgOWQQMiAgMEQAOpAgMIRgNpQANFgAOEiQOIhgOGCQMqRgOESQMlAQNESQNmgQOViQNkgAOaAgOmgANZAgMWYgNYQAMRYAOSAgNiAgMhkANlhIMAAAMapgOilgOKEQMKkANqhQOphANIQQOEggNCgYNCQoNCgYOQJYsAAAOKAQNFAgMEiQNEgAMpQAMIRgOoAgMEQAMgAgOVQAMRYgOWAgMgAQNhkANVYgNQAAMlQgNaQQOlQQOYAQOEAANFSQOahgNGCQNahgMGCQOaBgMGCQOVAQOECQMVAQNGiQMVAQNGiQOWgAMYgANlgAOhkgOhAAMWgAMSYgOWQQMSYgOWQQMZYQNUAQNZYQNWAQMZYQOVQAOgYoMAAANKYgNFYgOkoZMAAAMUiQMlgAOUiQNkgQMGSQOlAQOESQMqRgOGCQOIhgOEiQOFAANoAQOVAQNYYQOWAgNklIMAAANAiQNqUAMolAMqhQNCYgMhQQNaAANRYQNYgQMhAgMikgMSYgMSAAOqQQMmkgOoAgMWAgNKgAMUAQNEiQOUgAMIQANIBgNViQMFAANYgQOlQQNaQQMmQANQAANUYgMikQMiAQNUggMQYgMVQAMgAgMEQANqgAOahgOqQQOFAAOEiQOIhgNKgAMlQgOViQMkgANZAgNmQgOZgQNCgYNCQoNCgYMAAPM="
                    },
                    "colors": [
                      "#1d2a52",
                      "#c9a227",
                      "#9b111e"
                    ]
                  }
                },
                "example2": {
                  "summary": "Name tag EXP → optimised DST",
                  "value": {
                    "file": {
                      "filename": "tag.exp",
                      "contentBase64": "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"
                    },
                    "outputFormat": "dst",
                    "spm": 800
                  }
                },
                "example3": {
                  "summary": "Stitch list: two red squares around a blue one (red blocks merged)",
                  "value": {
                    "stitches": "{\"cmds\":[[0,0],[5,0],[5,5],[0,5],[0,0],[0,0,\"trim\"],[20,0,\"jump\"],[20,0,\"color\"],[20,0],[25,0],[25,5],[20,5],[20,0],[20,0,\"trim\"],[40,0,\"jump\"],[40,0,\"color\"],[40,0],[45,0],[45,5],[40,5],[40,0]],\"colors\":[\"#9b111e\",\"#0f4c81\",\"#9b111e\"]}",
                    "outputFormat": "dst"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThreadsmithSequenceOptimizerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tool": {
      "get": {
        "operationId": "getToolDefinition",
        "summary": "Inputs, output schema and examples for this tool",
        "responses": {
          "200": {
            "description": "Tool definition.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details. 422 responses include per-field `errors`.",
        "required": [
          "type",
          "title",
          "status",
          "detail"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "detail": {
            "type": "string"
          },
          "code": {
            "type": "string"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "field",
                "message"
              ],
              "properties": {
                "field": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "ThreadsmithSequenceOptimizerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "file": {
            "title": "Embroidery file",
            "description": "Tajima .dst, Brother .pes, Janome .jef or Melco .exp. Upload as {filename, contentType?, contentBase64}. Max 6144 KiB. Accepts .dst,.exp,.pes,.jef.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "stitches": {
            "title": "Or: stitch list (JSON)",
            "description": "Same format as threadsmith-stitch-file.",
            "type": "string",
            "maxLength": 8000000
          },
          "colors": {
            "title": "Thread colours in sewing order",
            "description": "Optional #rrggbb per colour block. DST and EXP files store no colours, so blocks are only merged when you give their colours (PES/JEF colours are read from the file).",
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 60
          },
          "outputFormat": {
            "title": "Write the optimised file as",
            "type": "string",
            "enum": [
              "same",
              "dst",
              "pes",
              "jef",
              "exp"
            ],
            "default": "same"
          },
          "trimDistance": {
            "title": "Trim gaps of at least",
            "description": "Shorter gaps are jumped without a trim.",
            "type": "number",
            "minimum": 1,
            "maximum": 50,
            "default": 5,
            "x-unit": "mm"
          },
          "allowReverse": {
            "title": "Allow sewing segments backwards",
            "type": "boolean",
            "default": true
          },
          "mergeColors": {
            "title": "Merge colour blocks with the same thread",
            "description": "Only blocks whose stitches do not overlap anything sewn in between are moved together.",
            "type": "boolean",
            "default": true
          },
          "spm": {
            "title": "Machine speed",
            "type": "integer",
            "minimum": 100,
            "maximum": 1500,
            "default": 700,
            "x-unit": "stitches/min"
          },
          "label": {
            "title": "Design label (DST/PES header)",
            "type": "string",
            "maxLength": 16,
            "default": "OPTIMIZED"
          }
        },
        "required": []
      },
      "ThreadsmithSequenceOptimizerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "required": [
              "improved",
              "format",
              "filename",
              "segments",
              "reversedSegments",
              "mergedColorBlocks",
              "before",
              "after",
              "stitchesPreserved",
              "verified",
              "bytes",
              "sha256",
              "artifactUrl",
              "base64",
              "colors"
            ],
            "properties": {
              "improved": {
                "type": "boolean",
                "description": "False when no order with fewer colour changes, trims or jumps was found (the file is then written unchanged)."
              },
              "format": {
                "type": "string",
                "enum": [
                  "dst",
                  "exp",
                  "pes",
                  "jef"
                ]
              },
              "filename": {
                "type": "string"
              },
              "segments": {
                "type": "integer",
                "description": "Continuously sewn segments found in the file."
              },
              "reversedSegments": {
                "type": "integer"
              },
              "mergedColorBlocks": {
                "type": "integer"
              },
              "before": {
                "type": "object",
                "properties": {
                  "stitches": {
                    "type": "integer"
                  },
                  "colorChanges": {
                    "type": "integer"
                  },
                  "trims": {
                    "type": "integer"
                  },
                  "jumps": {
                    "type": "integer"
                  },
                  "sewingSeconds": {
                    "type": "integer"
                  }
                }
              },
              "after": {
                "type": "object",
                "properties": {
                  "stitches": {
                    "type": "integer"
                  },
                  "colorChanges": {
                    "type": "integer"
                  },
                  "trims": {
                    "type": "integer"
                  },
                  "jumps": {
                    "type": "integer"
                  },
                  "sewingSeconds": {
                    "type": "integer"
                  }
                }
              },
              "stitchesPreserved": {
                "type": "boolean",
                "description": "Every penetration of the input is in the output (same multiset on the 0.1 mm grid)."
              },
              "verified": {
                "type": "boolean",
                "description": "The written file was decoded again and has the same penetrations."
              },
              "bytes": {
                "type": "integer"
              },
              "sha256": {
                "type": "string"
              },
              "artifactUrl": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "base64": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "colors": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "hex": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      }
    }
  }
}