{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://attention.run/schema/flow-v1.json",
  "title": "attention.run flow (v1)",
  "description": "A flow: steps that act on and wait for elements of a library, found by their pixels. Reference: https://attention.run/docs/flow-json",
  "type": "object",
  "properties": {
    "$schema": {
      "type": "string"
    },
    "flow": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120,
      "pattern": "^[a-z0-9][a-z0-9-]*(\\/[a-z0-9][a-z0-9-]*)*$"
    },
    "name": {
      "type": "string",
      "maxLength": 200
    },
    "description": {
      "type": "string",
      "maxLength": 5000
    },
    "library": {
      "type": "string",
      "minLength": 1,
      "maxLength": 60,
      "pattern": "^[a-z0-9][a-z0-9-]*$"
    },
    "params": {
      "type": "object",
      "propertyNames": {
        "type": "string",
        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
      },
      "additionalProperties": {
        "$ref": "#/$defs/Param"
      }
    },
    "outputs": {
      "type": "object",
      "propertyNames": {
        "type": "string",
        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
      },
      "additionalProperties": {
        "$ref": "#/$defs/Output"
      }
    },
    "defaults": {
      "type": "object",
      "properties": {
        "timeout": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 600000
        }
      },
      "additionalProperties": false
    },
    "handlers": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/Handler"
      }
    },
    "steps": {
      "minItems": 1,
      "type": "array",
      "items": {
        "$ref": "#/$defs/Step"
      }
    }
  },
  "required": [
    "flow",
    "steps"
  ],
  "additionalProperties": false,
  "$defs": {
    "Param": {
      "type": "object",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "string",
            "number",
            "boolean",
            "json"
          ]
        },
        "default": {
          "$ref": "#/$defs/Value"
        },
        "description": {
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "additionalProperties": false
    },
    "Value": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "number"
        },
        {
          "type": "boolean"
        },
        {
          "type": "null"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/Value"
          }
        },
        {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "$ref": "#/$defs/Value"
          }
        }
      ]
    },
    "Output": {
      "type": "object",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "string",
            "number",
            "boolean",
            "json"
          ]
        },
        "default": {
          "$ref": "#/$defs/Value"
        },
        "description": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "Handler": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[a-z0-9][a-z0-9-]*$"
        },
        "when": {
          "$ref": "#/$defs/Condition"
        },
        "do": {
          "minItems": 1,
          "type": "array",
          "items": {
            "$ref": "#/$defs/Step"
          }
        },
        "max": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100
        }
      },
      "required": [
        "id",
        "when",
        "do"
      ],
      "additionalProperties": false
    },
    "Condition": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "visible": {
              "$ref": "#/$defs/Selector"
            }
          },
          "required": [
            "visible"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "gone": {
              "$ref": "#/$defs/Selector"
            }
          },
          "required": [
            "gone"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "screen": {
              "type": "string",
              "minLength": 1,
              "maxLength": 120,
              "pattern": "^[a-z0-9][a-z0-9-]*(\\/[a-z0-9][a-z0-9-]*)*$"
            }
          },
          "required": [
            "screen"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "any": {
              "minItems": 1,
              "type": "array",
              "items": {
                "$ref": "#/$defs/Condition"
              }
            }
          },
          "required": [
            "any"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "all": {
              "minItems": 1,
              "type": "array",
              "items": {
                "$ref": "#/$defs/Condition"
              }
            }
          },
          "required": [
            "all"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "not": {
              "$ref": "#/$defs/Condition"
            }
          },
          "required": [
            "not"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "stable": {
              "type": "object",
              "properties": {
                "region": {
                  "$ref": "#/$defs/Rect"
                },
                "forMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 600000
                }
              },
              "required": [
                "forMs"
              ],
              "additionalProperties": false
            }
          },
          "required": [
            "stable"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "changed": {
              "type": "object",
              "properties": {
                "region": {
                  "$ref": "#/$defs/Rect"
                }
              },
              "additionalProperties": false
            }
          },
          "required": [
            "changed"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "var": {
              "type": "string",
              "pattern": "^[A-Za-z_][A-Za-z0-9_]*(\\.([A-Za-z_][A-Za-z0-9_]*|\\d+))*$"
            },
            "eq": {
              "type": [
                "string",
                "number",
                "boolean",
                "null"
              ]
            },
            "ne": {
              "type": [
                "string",
                "number",
                "boolean",
                "null"
              ]
            },
            "gt": {
              "type": "number"
            },
            "gte": {
              "type": "number"
            },
            "lt": {
              "type": "number"
            },
            "lte": {
              "type": "number"
            },
            "matches": {
              "type": "string",
              "minLength": 1
            },
            "exists": {
              "type": "boolean"
            }
          },
          "required": [
            "var"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "param": {
              "type": "string",
              "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
            },
            "eq": {
              "type": [
                "string",
                "number",
                "boolean",
                "null"
              ]
            },
            "ne": {
              "type": [
                "string",
                "number",
                "boolean",
                "null"
              ]
            },
            "gt": {
              "type": "number"
            },
            "gte": {
              "type": "number"
            },
            "lt": {
              "type": "number"
            },
            "lte": {
              "type": "number"
            },
            "matches": {
              "type": "string",
              "minLength": 1
            },
            "exists": {
              "type": "boolean"
            }
          },
          "required": [
            "param"
          ],
          "additionalProperties": false
        }
      ]
    },
    "Selector": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "object",
          "properties": {
            "element": {
              "type": "string",
              "minLength": 1
            },
            "variant": {
              "type": "string",
              "minLength": 1
            },
            "index": {
              "type": "integer",
              "minimum": 0
            },
            "within": {
              "type": "string",
              "pattern": "^[A-Za-z_][A-Za-z0-9_]*(\\.([A-Za-z_][A-Za-z0-9_]*|\\d+))*$"
            },
            "region": {
              "$ref": "#/$defs/Rect"
            }
          },
          "required": [
            "element"
          ],
          "additionalProperties": false
        }
      ]
    },
    "Rect": {
      "type": "object",
      "properties": {
        "x": {
          "type": "integer"
        },
        "y": {
          "type": "integer"
        },
        "width": {
          "type": "integer",
          "exclusiveMinimum": 0
        },
        "height": {
          "type": "integer",
          "exclusiveMinimum": 0
        }
      },
      "required": [
        "x",
        "y",
        "width",
        "height"
      ]
    },
    "Step": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "click": {
              "$ref": "#/$defs/Target"
            },
            "button": {
              "type": "string",
              "enum": [
                "left",
                "right",
                "middle"
              ]
            }
          },
          "required": [
            "click"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "doubleClick": {
              "$ref": "#/$defs/Target"
            }
          },
          "required": [
            "doubleClick"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "rightClick": {
              "$ref": "#/$defs/Target"
            }
          },
          "required": [
            "rightClick"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "hover": {
              "$ref": "#/$defs/Target"
            }
          },
          "required": [
            "hover"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "drag": {
              "type": "object",
              "properties": {
                "from": {
                  "$ref": "#/$defs/Target"
                },
                "to": {
                  "$ref": "#/$defs/Target"
                }
              },
              "required": [
                "from",
                "to"
              ],
              "additionalProperties": false
            },
            "durationMs": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            }
          },
          "required": [
            "drag"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "type": {
              "$ref": "#/$defs/Text"
            },
            "into": {
              "$ref": "#/$defs/Target"
            },
            "clear": {
              "type": "boolean"
            }
          },
          "required": [
            "type"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "press": {
              "type": "string",
              "minLength": 1
            }
          },
          "required": [
            "press"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "navigate": {
              "type": "string",
              "minLength": 1
            }
          },
          "required": [
            "navigate"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "scroll": {
              "type": "object",
              "properties": {
                "at": {
                  "$ref": "#/$defs/Target"
                },
                "dx": {
                  "type": "integer"
                },
                "dy": {
                  "type": "integer"
                },
                "until": {
                  "$ref": "#/$defs/Condition"
                },
                "max": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 1000
                }
              },
              "additionalProperties": false
            }
          },
          "required": [
            "scroll"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "waitFor": {
              "$ref": "#/$defs/Condition"
            },
            "stableFor": {
              "type": "integer",
              "minimum": 0,
              "maximum": 60000
            }
          },
          "required": [
            "waitFor"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "waitStable": {
              "type": "object",
              "properties": {
                "region": {
                  "$ref": "#/$defs/Rect"
                },
                "forMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 600000
                }
              },
              "required": [
                "forMs"
              ],
              "additionalProperties": false
            }
          },
          "required": [
            "waitStable"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "wait": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            }
          },
          "required": [
            "wait"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "assert": {
              "$ref": "#/$defs/Condition"
            },
            "message": {
              "type": "string"
            }
          },
          "required": [
            "assert"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "if": {
              "$ref": "#/$defs/Condition"
            },
            "then": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/Step"
              }
            },
            "else": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/Step"
              }
            }
          },
          "required": [
            "if",
            "then"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "repeat": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10000
                },
                "until": {
                  "$ref": "#/$defs/Condition"
                },
                "while": {
                  "$ref": "#/$defs/Condition"
                },
                "max": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10000
                },
                "as": {
                  "type": "string",
                  "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
                }
              },
              "additionalProperties": false
            },
            "do": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/Step"
              }
            }
          },
          "required": [
            "repeat",
            "do"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "fail": {
              "type": "string",
              "minLength": 1
            }
          },
          "required": [
            "fail"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "pass": {
              "type": "string"
            }
          },
          "required": [
            "pass"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "set": {
              "type": "object",
              "propertyNames": {
                "type": "string",
                "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
              },
              "additionalProperties": {
                "type": "string"
              }
            }
          },
          "required": [
            "set"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "find": {
              "$ref": "#/$defs/Selector"
            },
            "as": {
              "type": "string",
              "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
            },
            "all": {
              "type": "boolean"
            }
          },
          "required": [
            "find",
            "as"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "read": {
              "anyOf": [
                {
                  "type": "string",
                  "const": "clipboard"
                },
                {
                  "type": "object",
                  "properties": {
                    "text": {
                      "anyOf": [
                        {
                          "type": "string",
                          "minLength": 1
                        },
                        {
                          "type": "object",
                          "properties": {
                            "element": {
                              "type": "string",
                              "minLength": 1
                            },
                            "variant": {
                              "type": "string",
                              "minLength": 1
                            },
                            "index": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "within": {
                              "type": "string",
                              "pattern": "^[A-Za-z_][A-Za-z0-9_]*(\\.([A-Za-z_][A-Za-z0-9_]*|\\d+))*$"
                            },
                            "region": {
                              "$ref": "#/$defs/Rect"
                            },
                            "rect": {
                              "$ref": "#/$defs/Rect"
                            }
                          },
                          "required": [
                            "element"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "var": {
                              "type": "string",
                              "pattern": "^[A-Za-z_][A-Za-z0-9_]*(\\.([A-Za-z_][A-Za-z0-9_]*|\\d+))*$"
                            },
                            "rect": {
                              "$ref": "#/$defs/Rect"
                            }
                          },
                          "required": [
                            "var"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "rect": {
                              "$ref": "#/$defs/Rect"
                            }
                          },
                          "required": [
                            "rect"
                          ],
                          "additionalProperties": false
                        }
                      ]
                    }
                  },
                  "required": [
                    "text"
                  ],
                  "additionalProperties": false
                }
              ]
            },
            "as": {
              "type": "string",
              "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
            },
            "trim": {
              "type": "boolean"
            },
            "matches": {
              "type": "string",
              "minLength": 1
            }
          },
          "required": [
            "read",
            "as"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "switch": {
              "minItems": 1,
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "when": {
                    "$ref": "#/$defs/Condition"
                  },
                  "do": {
                    "type": "array",
                    "items": {
                      "$ref": "#/$defs/Step"
                    }
                  }
                },
                "required": [
                  "when",
                  "do"
                ],
                "additionalProperties": false
              }
            },
            "else": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/Step"
              }
            }
          },
          "required": [
            "switch"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "forEach": {
              "type": "object",
              "properties": {
                "in": {
                  "type": "string",
                  "pattern": "^[A-Za-z_][A-Za-z0-9_]*(\\.([A-Za-z_][A-Za-z0-9_]*|\\d+))*$"
                },
                "as": {
                  "type": "string",
                  "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
                }
              },
              "required": [
                "in",
                "as"
              ],
              "additionalProperties": false
            },
            "do": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/Step"
              }
            }
          },
          "required": [
            "forEach",
            "do"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "try": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/Step"
              }
            },
            "catch": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/Step"
              }
            },
            "finally": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/Step"
              }
            }
          },
          "required": [
            "try"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]*$"
            },
            "name": {
              "type": "string",
              "maxLength": 200
            },
            "timeout": {
              "type": "integer",
              "minimum": 0,
              "maximum": 600000
            },
            "optional": {
              "type": "boolean"
            },
            "retry": {
              "type": "object",
              "properties": {
                "times": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "backoffMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60000
                }
              },
              "required": [
                "times"
              ],
              "additionalProperties": false
            },
            "comment": {
              "type": "string"
            },
            "disabled": {
              "type": "boolean"
            },
            "call": {
              "type": "string",
              "minLength": 1,
              "maxLength": 120,
              "pattern": "^[a-z0-9][a-z0-9-]*(\\/[a-z0-9][a-z0-9-]*)*$"
            },
            "version": {
              "type": "integer",
              "exclusiveMinimum": 0
            },
            "params": {
              "type": "object",
              "propertyNames": {
                "type": "string",
                "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
              },
              "additionalProperties": {
                "$ref": "#/$defs/Value"
              }
            },
            "as": {
              "type": "string",
              "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
            }
          },
          "required": [
            "call"
          ],
          "additionalProperties": false
        }
      ]
    },
    "Target": {
      "anyOf": [
        {
          "$ref": "#/$defs/Selector"
        },
        {
          "type": "object",
          "properties": {
            "element": {
              "type": "string",
              "minLength": 1
            },
            "offset": {
              "type": "object",
              "properties": {
                "dx": {
                  "type": "integer"
                },
                "dy": {
                  "type": "integer"
                }
              },
              "required": [
                "dx",
                "dy"
              ],
              "additionalProperties": false
            }
          },
          "required": [
            "element",
            "offset"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "x": {
              "type": "integer",
              "minimum": 0
            },
            "y": {
              "type": "integer",
              "minimum": 0
            }
          },
          "required": [
            "x",
            "y"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "var": {
              "type": "string",
              "pattern": "^[A-Za-z_][A-Za-z0-9_]*(\\.([A-Za-z_][A-Za-z0-9_]*|\\d+))*$"
            },
            "offset": {
              "type": "object",
              "properties": {
                "dx": {
                  "type": "integer"
                },
                "dy": {
                  "type": "integer"
                }
              },
              "required": [
                "dx",
                "dy"
              ],
              "additionalProperties": false
            }
          },
          "required": [
            "var"
          ],
          "additionalProperties": false
        }
      ]
    },
    "Text": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "object",
          "properties": {
            "param": {
              "type": "string",
              "minLength": 1
            }
          },
          "required": [
            "param"
          ],
          "additionalProperties": false
        }
      ]
    }
  }
}
