Feat: Add Parent Task External ID to workflow run details, Fix input type marshalling to null (#1505)

* feat: add parent task external id to api for workflow run

* feat: wire up parent ids

* feat: custom go type for non-null json

* feat: gen

* feat: send action ids back over the api

* fix: lint
This commit is contained in:
Matt Kaye
2025-04-07 23:40:13 -04:00
committed by GitHub
parent d8bb9e8b68
commit 771b733e10
12 changed files with 469 additions and 350 deletions
@@ -8,6 +8,9 @@ V1TaskSummary:
properties:
metadata:
$ref: ".././metadata.yaml#/APIResourceMeta"
actionId:
type: string
description: The action ID of the task.
additionalMetadata:
type: object
description: Additional metadata for the task run.
@@ -35,12 +38,22 @@ V1TaskSummary:
description: The timestamp the task run finished.
input:
type: object
x-go-type: openapi.NonNullableJSON
x-go-type-import:
path: github.com/hatchet-dev/hatchet/api/v1/server/oas
name: NonNullableJSON
x-nullable: false
description: The input of the task run.
numSpawnedChildren:
type: integer
description: The number of spawned children tasks
output:
type: object
x-go-type: openapi.NonNullableJSON
x-go-type-import:
path: github.com/hatchet-dev/hatchet/api/v1/server/oas
name: NonNullableJSON
x-nullable: false
description: The output of the task run (for the latest run)
status:
$ref: "#/V1TaskStatus"
@@ -91,6 +104,7 @@ V1TaskSummary:
format: uuid
description: The version ID of the workflow
required:
- actionId
- metadata
- createdAt
- displayName
@@ -33,6 +33,11 @@ V1WorkflowRun:
format: uuid
output:
type: object
x-go-type: openapi.NonNullableJSON
x-go-type-import:
path: github.com/hatchet-dev/hatchet/api/v1/server/oas
name: NonNullableJSON
x-nullable: false
description: The output of the task run (for the latest run)
errorMessage:
type: string
@@ -43,11 +48,21 @@ V1WorkflowRun:
description: The ID of the workflow version.
input:
type: object
x-go-type: openapi.NonNullableJSON
x-go-type-import:
path: github.com/hatchet-dev/hatchet/api/v1/server/oas
name: NonNullableJSON
x-nullable: false
description: The input of the task run.
createdAt:
type: string
format: date-time
description: The timestamp the task run was created.
parentTaskExternalId:
type: string
format: uuid
minLength: 36
maxLength: 36
required:
- metadata
- id
@@ -138,6 +138,12 @@ func (t *V1WorkflowRunsService) WithDags(ctx echo.Context, request gen.V1Workflo
}
}
taskIdToActionId := make(map[int64]string)
for _, task := range tasks {
taskIdToActionId[task.ID] = task.ActionID
}
parsedTasks := transformers.TaskRunDataRowToWorkflowRunsMany(tasks, taskIdToWorkflowName, total, limit, offset)
dagChildren := make(map[uuid.UUID][]gen.V1TaskSummary)
@@ -153,7 +159,7 @@ func (t *V1WorkflowRunsService) WithDags(ctx echo.Context, request gen.V1Workflo
}
}
result := transformers.ToWorkflowRunMany(dags, dagChildren, workflowNames, total, limit, offset)
result := transformers.ToWorkflowRunMany(dags, dagChildren, taskIdToActionId, workflowNames, total, limit, offset)
// Search for api errors to see how we handle errors in other cases
return gen.V1WorkflowRunList200JSONResponse(
+248 -241
View File
@@ -16,6 +16,7 @@ import (
"time"
"github.com/getkin/kin-openapi/openapi3"
"github.com/hatchet-dev/hatchet/api/v1/server/oas/openapi"
"github.com/labstack/echo/v4"
"github.com/oapi-codegen/runtime"
openapi_types "github.com/oapi-codegen/runtime/types"
@@ -1266,6 +1267,9 @@ type V1TaskStatus string
// V1TaskSummary defines model for V1TaskSummary.
type V1TaskSummary struct {
// ActionId The action ID of the task.
ActionId string `json:"actionId"`
// AdditionalMetadata Additional metadata for the task run.
AdditionalMetadata *map[string]interface{} `json:"additionalMetadata,omitempty"`
@@ -1288,14 +1292,14 @@ type V1TaskSummary struct {
FinishedAt *time.Time `json:"finishedAt,omitempty"`
// Input The input of the task run.
Input map[string]interface{} `json:"input"`
Metadata APIResourceMeta `json:"metadata"`
Input openapi.NonNullableJSON `json:"input"`
Metadata APIResourceMeta `json:"metadata"`
// NumSpawnedChildren The number of spawned children tasks
NumSpawnedChildren int `json:"numSpawnedChildren"`
// Output The output of the task run (for the latest run)
Output map[string]interface{} `json:"output"`
Output openapi.NonNullableJSON `json:"output"`
// StartedAt The timestamp the task run started.
StartedAt *time.Time `json:"startedAt,omitempty"`
@@ -1364,11 +1368,12 @@ type V1WorkflowRun struct {
FinishedAt *time.Time `json:"finishedAt,omitempty"`
// Input The input of the task run.
Input map[string]interface{} `json:"input"`
Metadata APIResourceMeta `json:"metadata"`
Input openapi.NonNullableJSON `json:"input"`
Metadata APIResourceMeta `json:"metadata"`
// Output The output of the task run (for the latest run)
Output map[string]interface{} `json:"output"`
Output openapi.NonNullableJSON `json:"output"`
ParentTaskExternalId *openapi_types.UUID `json:"parentTaskExternalId,omitempty"`
// StartedAt The timestamp the task run started.
StartedAt *time.Time `json:"startedAt,omitempty"`
@@ -12654,241 +12659,243 @@ func (sh *strictHandler) WorkflowVersionGet(ctx echo.Context, workflow openapi_t
// Base64 encoded, gzipped, json marshaled Swagger object
var swaggerSpec = []string{
"H4sIAAAAAAAC/+y9+2/bOrI4/q8I/n6Buws4z7bnni1wf0gTt/U2TbJ20mLvuUFAS4zNE1nyEamk3iL/",
"+wd8ipJIifIrdiNgsSe1+BgOZ4Yzw+HMz44fT2dxBCOCO+9/drA/gVPA/jy56veSJE7o37MknsGEIMi+",
"+HEA6X8DiP0EzQiKo877DvD8FJN46n0GxJ9A4kHa22ONux34A0xnIey8P3p7eNjt3MfJFJDO+06KIvLb",
"2063Q+Yz2HnfQRGBY5h0nrv54cuzaf/27uPEIxOE+Zz6dJ2TrOEjFDBNIcZgDLNZMUlQNGaTxj6+C1H0",
"YJqS/u6R2CMT6AWxn05hRIABgK6H7j1EPPgDYYJz4IwRmaSjfT+eHkw4nvYC+Cj/NkF0j2AYlKGhMLBP",
"HpkAok3uIewBjGMfAQID7wmRCYMHzGYh8sEozG1HJwJTAyKeu50E/pWiBAad93/kpr5VjePRn9AnFEZJ",
"K7hMLFD9jgicsj/+/wTed953/r+DjPYOBOEdKKp7VtOAJAHzEkhiXAs0XyEBZVhAGMZPpxMQjeEVwPgp",
"TgyIfZpAMoGJFydeFBMvxTDBng8iz2cd6eajxJvJ/houSZJCBc4ojkMIIgoPnzaBgMBrGIGINJmUdfMi",
"+OQR1hc7z9iPHhHhC3ecDLEeXsy+8p8ZtSPsoQgTEPnQefYhGkfprMHkGI0jL51lrNRoypRMHEiLksUJ",
"bfrc7cxiTCbx2LHXlWhNO87DODqZzfoWrryi3ym7ef0ztpoUQ9aHcj2lIuLhdDaLE5JjxKPjN2/f/fbf",
"v+/RPwr/R3//x+HRsZFRbfR/InCS5wG2LhNVUNAFXDDw6KDYi+89ilkYEeQzQadD/EdnBDDyO93OOI7H",
"IaS8qHi8JMZKzGwDu09PgARIsV+QJhEVYBVcKyhHDUGloejkxRGT3BpdlQmJiUMjbugXihA+RAZjWbrX",
"ilMhc+ViKmTYVUakBVE2Q59jTCwUGGPyOR57J1d9b0Jb6TBOCJnh9wcHgv73xRdKnKbjB8zQFzivn+cB",
"znPTzCYPdxnpgpEfwHtn8h1AHKeJD81inMvE4MSyeoKmUDsUEzGW9wSwEKc5qd05Pjw+3js63jt6c330",
"7v3hb+/f/r7/+++/v3n3+97hu/eHhx1NXQkAgXt0AhOqkEUgoIDTjQZM10ORd3PDBQQdWgdoNDo+evv7",
"4X/vHb/9De69fQPe7YHjd8He26P//u0oOPLv7/9B55+CH+cwGlMmf/ObAZx0FiyKphBg4on+68BVgR8Q",
"nSTbVR10C29cxw/QJB5+zFACsWnJ3yeQsz8lVkK7e6L1vvMGTyEBAeAkWXNm5CjYKleuC3JFwbaf39/j",
"d+/qcKhg6yrxopBhRKLvwxnhOsIA/pVCLkzy+OQKAcfsctQ5RZGdWLudH3sxmKE9aiyMYbQHf5AE7BEw",
"ZlA8ghDRfem8VyvupikKOs8lQuLwmtb7IQ0fuA7We4QRsS4ZPkpbyElfNQxZq7nyGW6fu51Teg6FDgD1",
"gzxIjbcjM7hSxm1NtsdpQRRCtqQ48tMkgZE/P0dTRIYkAQSO5/z0Tqe0w+nJxWnv/K5/cXc1uPw06A2H",
"nW7nbHB5dXfR+94bXne6nX/d9G562T8/DS5vru4GlzcXZ3eDyw/9C22PMyj5ZkjxYMcoZ4x+ZGbIIE0y",
"o+5pgvwJ400uMxD2GDnudxYn4niKSITCrpyIIdQsIE64eOA68VLygY1vYowi0vAsjjAsY41IkVvGWA6s",
"ajD4KHY4TpM4+h4nD/dh/HSdoPEYJtZ9BEGAKBQg/KoJ5tLAfhJHvR+zBGIsdMoS4dAmF2IDysd6NEuJ",
"YeSS7KHNuiaotAlK4NyqpVeLAfNiC9Si2njyOFCkw5hU258MP+axGCe4DfBg0g9p/wc4t3a30AdXIxlI",
"GWaGF0PNKrCiiMQz5J8kNiKdgv/EkScPZo9uh/e3k8HF3+XpO7wYemyMZZhbnVBTFP3PUXcKfvzP8bvf",
"ykeVAtbOC9xZcBLChPSmAIWfkjid2aUabYJNIiREmNA18hbSJE1wx9leW2D5AXqEXTZjee0C1LqV1ygn",
"fHDjXrNPclvpWj0SC+/GSvZWrqvbSeIQ1ukIfDVf4XQEkwFtb8RHRwxWhxUrPtxUTO5FWgUW2DJwmI7N",
"k9Ivq5+0KzylTJg+WwxrBpQZj9npgl1lbPbrldY654nKHzZGftI8F2WvgzpiGs21hDkyhWQSB/XKrYau",
"r7yLpqqUZQZn28D48UkMVPPZegzLBt9gQg9O4zB2m0iBZhqoMHsOVrGl2QYq5NUS2DkysekMjFGk3FtV",
"6L9SLZVWxiTOUxPzRCd4JzecadM13f2s9/Hk5pzq5CdXfYsWrg1wmQQw+TD/KC8x5DCRVIZgydDPRmIa",
"0SZVoaU0maUYkqiLgfqTpMhqZXD7Z3nJW7wQEtdF1oVI+h+k0TCdTkEyr4OMbdX3crcKluSqnlrIrdzw",
"M2By+jXRUr2//XN4eeGN5gTiv9frnErbZNN/WY4G5BhbwPxqOWW+l4BuC5QVIAoJcoYS6EuQpBQB2O/w",
"i2K7/LBJIAfRM4Qg8SfG08hG72VnNXPxGO8smGqWUq2Qcqtq6CVplHdK2u/I7wFyGJq3ajLuDEYBXWnN",
"wKJZk5H/SmFaDzFv1WTcJI0iB4hFsyYj49T3IQzqgVYN3UdXVI6rPJEGA4d929ctuAV4bIkTyy7WNffm",
"P+ORQZBXhXUwea4FdohT7M94tL8mh3xpTEzgzF16DQmcmRBbqQoTNIVxSszLFx/rlv64rBr8qKm/0m5i",
"Szfptf+MR4M0qpBu/MrF7RpFdVLxRfYmAwiwxaK6RxHCk2ZT/8kpsmpHKdHylpbdW4LoEojTkBi9lJiA",
"hDRbDCaApNhhPfR84m0FfQ/SqBmJ081vTuX+A0yqWaDJcjWltA5k7WAu9FzebOSDSAJRu2DnmqHaJql6",
"XPUuzvoXnzrdzuDm4oL/Nbw5Pe31znpnnW7n40n/nP3BL0r43x9OTr9cfvxo1FaoGmcOn3ANuip2NWy2",
"mIRdE2D7PcFGlUd1FWzUHynEed8xfmF489DU3qxpsImJTGTGlhkC/+E7HE3i+OHFF6nBsqolxuNzFMFG",
"sSD0MGWfqSJBJYs8UsN47IUogk0u/nnAqHEOOpxoUKuk2HrzFgafRAFbepBEFsWqZrjNUHUOH2GYd9x8",
"uKGCpn/x8bLT7Xw/GVx0up3eYHA5MMsUbRxlPDntfw4CkyAR31/e9pRkZZYe/OMS9md+hIYWqOhcYYMa",
"EKCHBvzs8It4cjdjtHvc7UTwh/zXm24nSqfsH7jz/uiQGn15zsp1NkUQiRbejFOhmvjYyazSYDGG28Ef",
"5ZHfuI2crcsY+BQTEOpGLG3KPDshwoRfS2Th6ocuVpxBYv2LWrBfIUmQb5DHUTq9cjOxGR1LQ3vftt5/",
"OVnVfCzE46CYiW0dcOBmTvMRhVG9b0ZN7oJGgZqbpasjxCT/B4BAFk5SRqWTzzah4j+kAxhFdAgwGcB7",
"FFruE1k8nAiY0wdjwXIJ6whZSMgaogrZRN9AmFqOnyn4gabpVPdx8BtC7LFAbOHyFbv+hKIgfjJv+yp8",
"yjWIfrSvQ0oTwzqmIICui+DfzFPwb2wZdC9RpIX3ZGjmIcP3ceLDwDVgQbMTtP2S61VQ5SjtVqfrLTgM",
"Mx4zHofq8xIHYnGM0pHIsSmxpqHSOBr0YUSGmj1buCdi4NnomX/1TKFcugOiiYW6iEdiCW/C2lwGAqWZ",
"z6BkQBfDCat5RG1EV7etBSzF0Y3iH9K/Xk+w6gDOQjD/peJC+ZI0xwy2rixHDy+7Pq35u8PDmvUW4Lat",
"2uY40bq7C+2Cp8sVPgldQrmcMXsFWzUIf6SjFnwchgHHEJObxKJr3QzOPRJ7GEYBi8gTZi72SLyeS3fb",
"AZFG6C+qDQQwIugewURpk0IBEo8neOCg/uZoBMM4GkuIa2Rld51xi26uzcpYxKE/gUEaQo3Slo3ItZFU",
"t0N4yK/7kdYkCDcb/FZbV7A6Fy0LWqd/DE8/985u6I8mvUXNvN5QtC0NKiuvPossq75PaEobq4s5G6TR",
"qe5obHxhwQHY9OmlAeCyxKGTcvi91OElg/MyoqiMyysT3RYYXAY54BShZ+WgRmF65VFsRpmO42qf5RBO",
"wWwSJ3AYxmTFFlnO2jFfm3MXBA5j7pgRPdzd/AtaR+JG1bYs+tlLUrmwenVAvxqtXygKQxkz4L7Skmgy",
"OEtEE3fQCwyeoaWrW4DFe1R5f0rJR784Kl/1TEAUwdAGr/jsocDsmcJ0cO+Jj262+fkIF9Y4ejkFi6df",
"cJKl1FUwta2eflti6bS7fd1s8GUWvRWKtpsqLBGh0J2ni65GhsaDhsCZTe6ZI10mKAwSmL+sr7Gz1xSd",
"MgNJ6e1rLSQJBAEYhdC2ufK7egXPBWItmSwVNGWZwU4B2ipy5CCDPMQG8luriq1fQ5DUCenN4twNoObt",
"XlEoFSPC7zb/Qy0N5Lrj0ziNiBlcaIVyEddp1qcCQ0VbMxcL5hBKJCLfVPvVs12cEhuIC3Iku9o7uScw",
"cUfmykPTeJeKnVlC23KNyqRtbeLEQdY0WbHqUrFiqvpYIuKcDidFgWplleFnAnUniT9Bj3An5VJzo3ur",
"RExMLSpzpwquTyBJ5hVSdG38qJkxm2GJCotBQ4LEo9n6tNH7Nhj4eQY0XquKNpanbr6dCuze1cDcQQti",
"M5Cc5EGH9Yh7KdaD0g18hAki8ya9h7KPE919RAkmQ8iVZHfaOwdNezUMFOZWRg7AwswKsxqa9Mg9vr8V",
"xLwtr7RyZFpLyJlIlz6kQY87x+8uLu++Xw6+9Aadbvbj4OS6d3fe/9q/zpzn/YtPd9f9r72zu8sb5sca",
"DvufLrh7/fpkcM3+Ojn9cnH5/bx39ol75fsX/eHnvIN+0Lse/Js78HVfPR368ub6btD7OOiJPoOeNok+",
"9/D8krY8750M1Zj93tndh3/f3QzZUuiaPp5ffr8b3Fzc8Ww1X3r/vtOvDCxNBKBGd5qJYzSkaqGcYoGD",
"/nX/9OS8arSquw7x1x1Hw9feRQHxDe5CxN+8dVXsepYSs5isEyYiaULPktriu0z6F3ustfQXTFkvvG/M",
"8AciEM4J8vHljFympGLUzAExAdiLZwQGnjAy1SDmOdaeKMyWUGHpjAzZyyK3t8jCT++QjozBlY1uknnG",
"hCebzXSypjdx9oQnxjVvgcA374UpMcw43uNE2xmwK4zn/KpQNB5CQv+DN8fkPFlD78cM0V1mT0QYMNXj",
"8158Guw9sYyB7LWLBxLogdksiYE/QdGYpw5kCK6aXyZs4UTCAt8WhIIvWeZoLMPDIuUqcaF5dz4CFKYJ",
"dACFBWHogOiXApi9KzbPGQLMl2q/sMliakEkdpZd2oiH9Y7Rc+CHJLKPzO8R+XNrmKx3L5t4gMjQT0FV",
"q/XV2yWBEWC7XOirmLb15D56VmkiKy+bZJJQkSB6k4kzF0uwVHflIBjKdmEiP9uxxltUXZmwEXLZ+6xn",
"bs3BITNDZXulp82ooZ2tOUoEKTc7QfieluF/MYJyz9BCWa+u9Q2GCe9xlY5C5FeRAhuvIkeYDvPWbLrY",
"v0U2fSD2SVopl98vmKV1cva1f9Hpdr72vn7oDSpMiuoXOMxHju3hUSYPSjlcLSYgrMNEDg7NyVA1d5Px",
"inGZCgGS8nUsKtub/3FHLdtOt9P7xm093UalNvDJ8Iv483RweaFFtlXgPafvmFQ+kEwr3rOw7x57AmAW",
"zvzlDYm9J5CwDBElRYj3Nr8PafbUx/zKZzUPd/jY9iWa4V8u+4Cih3rWVdTj9mynbsOav9aZQgIT+WZH",
"nqF8LO9vaB/ue0deAOZd78h7gvCB/ncaR2Ty9wWv/hV6jG947CJXIuoqDpFvyADEdfMqc1XlXudNDQpD",
"A5GbZ7+6mHABnH11wmvkKkytwuhb5lWQsujbYafb+XZkFiU85mwDQcfWOPYbloT+NSZh1Vde8+hmJflP",
"rTqNDoh9/3fYUdj6KV7WT7FG/8Fa8sE38AMv7Ma1cOF3FrxgfyaEr0CKTW/QdTbhERAewt6MtfZAFHg+",
"iKKYeIBVpGClrmT+tOKGGaHDJgOx1kECgiCBGOuOkpxqJy3vsr+EfvgM8MQk5ScAT/Qh/wsXphNyn2tH",
"vFLUkBdd8k4ngFgn/AYTdI/q0MvcPVQGPYrmolpZDgYzJ0wAttdEM84BVBE0D0OywYuQAOFZCOY5RpD7",
"19izksfurYXA8kXj7Cm44ZMdiYx34VOGNanmmWFf4LhXRemeWexYFSAKiEr8LQdDKdOPKpmn48mG8vN4",
"jKLFk78vxt9L5YLfOozLNc7qcD2AY4RJhXTfRnS7nZAWwbCFuyXLNrlumq5W4wma4V31+pW8oBs8zddx",
"yvDJTNv27YhXfLoG+KGiPBGBSQRC8fbdakiKZl7/DHeFNuqDyEvgvdDPET+zAX7w4iT/nkfvrFugK00H",
"0O3co5DUe8G/HVF8fORtjTret6MzMD7VXkoUXwYZ3lDUz6hylJcBD8DYNdGFAdg2W51ztjqFrC0QXtnG",
"GQPcvh3xbA4t8zZlXtrCEuDKwrW/VkSmsiQi1+xXF0B6qvmCkbAVcdl0M874qWB9Tk3bOEkOHiiKCZjO",
"msWnygcEzV678SYcOH1qHcEZYm6rt3EreDUjKgu35slh/bGoDYNP5Vi5oNNioKk5SrUYfDrsXVzfXeuL",
"UWu44wk+S5Gyp4PeyXUhacWX/tWVJRI1x+WOHnj3iDuMIn4r1eSZNmxKLNkTouL8aUS4etk0q0QehHqO",
"r7qJ4Uiwc95VjKhmTRKTgiwIzijtslBd86U2msIFs62IRoZYYKdlGC6S+Cu0pjuro8YpgwLvNkgjGz79",
"ytc3Ds/W8iRXeuciMp/Zw/8LEDbFSLY0A7nnYNPkopIEWZj36eXXq/PedSm6uyJoPa9br7x4E9OIkjQy",
"1m/SDQHThTtXvmQrNhZ2vV2ttRlqlHt15mbL0CqSu2v3QV4DcTNcDVjTRkyzVF0V5XALQ7ES5lMUhghD",
"P44CbL7hLyp4BguetpA2SXEW72/q5h8QiAn97e/1uRed0E+Hl93c8a/ukctzsE8VKF9JlqUonQ5n4CmC",
"wWkltWt1aXjzMt1XvUosD8i/Ndwgyyti5/1ZUw6XokaQPRS25G/Rst8C/LC/gsyJVDtVxqKFMzJDbw2z",
"OyT6FZMZlAbaP8IwaS7wkOjmvqXN8hLn0zBvMg1mHcmputbCPM1nJ6vVHptkK1uAsnQXg0uaImPKr/JM",
"4hraMNEyGVt0z5J+IHa5oSvTABpkpZJxWgLaAi/qhnKezvOpYrjNrO3ibVH9Wa+hbNdwVqnYLFSv49vR",
"5gK4ypxRfSMkW9c78guJ57LQsIyXjQlf1qvjNlYz6TnaqpqtqrlEZprXpQ1uv8KxoOpQc1YblAFxfC+V",
"Xg0FucM2O0HzJ3cur6c6pC1C9wwSGepZ8CDVp3TKS29KJRNQr7/peU9p+49xYoBHavYVtTv1Q1oU8lSS",
"v6CELe8K5+DgVd2MFgN3GZTagiUu5bTlfcsfKYXSoDWXK2t4j6lPWQXsS2ly+gnbQKOzYHxVyl3OktGz",
"zp58Eq+GjK5BkdqTR5Ku9FGfWyyQSFEpolCNCkpqS0sv+6ZJ2CjOUET10HFNuMyhhOeYtkcXrmqRGPoJ",
"tJy8/JsqniRCmOgR4PXvvSgm3iyJH1EAg64HvAREQTyVnVgu2hH0xjCCiVQ19aPseG0Yb47mYDsJcLG9",
"2TQpKzhrkU0F55YUC82LH6eLolwXK2MKw+oOWPaNhfOAKNBKiPGhFjPL3PLsm0DPMu1zdew0DixU+/n6",
"+srjjTw/DhQFJwL5DrXeNKwomHMT3zoivJqEZJWw6nNU0rxs7fyozkgBC9NOOVH7p951p9u5uhyy/9xc",
"My3EdkLyNLS4Kn065m8uxUMLH0TeDCaUrvYbJcEBjwCFYBRCmQ22pqh+eVr4A/opgZ4fR+KNaDg32+1U",
"xwHEn8jIlnLJxix3MMAYjSMYeFkn5h24uemfeYJ9Nm+OhWAEQ1z9QJa1YSyV80TxY8C51g9Mzuk4pi0L",
"ASafIUjICAKH7PFiq9h7Z0wBBN5E9l5XKUPAmZmqBz1MwChkDpEthHQKftgJ31BxcTkGWL/eYdc3klIR",
"PVMOb9pGFTLIm6sNCLhQsM+UuziN6Jb0o/vYjRsGWgeW/Cy2nQRY1qbgdRM4Iy64kEKdC1NIk3I8mS4U",
"2bFa2ht5JJycXve/9VipZvXn1cnN0BJw4XL5xJGlLp74yWSt/CDOSi5RC0DW+5p475s67fNmcG4Yvqky",
"ytobFQlNWDarGSvjrmnXVZdwqEikwBMo1ExuxwddUgUeXj5i06p2KyAHeeYvZFEA0TgVjn1nsTA8+4L5",
"wcM7a0kIyoG/ZsVISKTeD5IAYwMcPNiHLS2OQaSrf5fnJzz15r+vP7MMK9f/vuoNTwf9q2uzDyXjZG2Y",
"Ye/84+fLIQ/U+npyccKjPL/3Pny+vPxiHUimoSm44XTaNNoz2S8Ol2rdBm+Dme9TvQ42vyn9Mx5ZBCv9",
"YgLIiT7/GY9Wmg2yydlsxZx8SWZQj8B48bUq/x0wKv/C6d+8CqVgBFWwpsrXWJTlNuFFxz2VKpQpv8oY",
"Eu27yhlauG6NZHkp/thiDAlmuPOzrt6Y9lWHkuZD3bfm9xmSBBA4rk1+rUF4nuvXXNnM9Ml8moPc6Ywi",
"8ua43kaXUxdX0zVitWqL+mem9y4KwP6ZEYey9xcU5azijzcXp9d9Jg/PbgYnH86pDnR28qlSktFB5EHX",
"iGzZ7AY+kN/Np+dSlXY2fPAyQe/mtRCtrSHajEm+wKxAgUE2xQSEJopVPPYA55ZLfDk8JcuKKQq2F+VZ",
"4OEZ9NE98rNJvL/NAMYw8B4R8PiDpr+bucKKiAYRHo0KbdZddumhEsrCPTrUqhCvrbDOYpVDeXUSd7rM",
"Kuus8MzlFXNeptwmn3uolzPYNAhrKwlvrPrpUq4VBh/mDQa/1nqVAxca6iFrr0yaBTVoYN9WC5MtMcWq",
"ioZXgS+KhJ6hBKqidspxMTylx3RveFp5TmejlEqN6nGdGS3npJgmGWsmGcqwjlZ2t7K7ld0vJbtrim//",
"QqK9Ii5sAdHMRusTOLVHmlnslfrO1hQaQ/YQpvpd65J5BbK3Nit/QrOCAS0yvfjytfhiQNXjKyJSG7WO",
"eioK8zQovKNecVYV3SlNu5DdnBcodmK8zouTYvBEHF1pkt9QBDCOZLFye4qIdZXD/d6sJFiW3KR6szFP",
"BGQNKclVIlsjO1pePIhp6xZhdRKwh81N6EgOdco71mmhheal+TOGML7hrnouL5nO+FEwl/Gb5NHmj/Cr",
"FnsNxib0hlxlXN43H634zYy4l+MQVtGPEAqnCTVk7s1yoaIo7h2ycGPdhKJAnWFGJkfuxN3gqqfF5hU2",
"1wwKeDNIXvhYKhrcYGCFn9Uq91zdMqMv08DuxNVDczTzJLUrSE9bfwVVBYamzRZZNneF4bIh+q0HNSrh",
"PUhDcpWgWBYCNLE/a+TNRCsTA9deEmR3bC90c6bq5jqAioVqcJ3VhzfYSch/mNuiMeg3D4urD7drOY2n",
"G7AWLuRltr+WdQFCryPi6v+vtMnstpKEOavEq796rWcHtq+rvEBpQiCvCuE8PCC7Oclj/D6BLGSporj0",
"FPyoadGwSK4txw2PdU+pkKLa/ZRDOIIggclJSlh6bYZRJnvZz9mmTAhhxQj9OH5AUDZHdFf5T/JW+X1n",
"wqJEtczaYIa+QBF4gkSsiSEAmnfzTq76LGEaYZ6g/K+KsjpH+4f7h4wwZzACM9R533mzf7R/yPK4kglb",
"2gGYoYNQVGIfm2L8P8lLadoqghh7ygtBd5G5FCnKO+fi+ye2LhmTzWY5PjwsD/wZgpBMmFR+Z/p+ERM1",
"Z25nOu//uO12sEzmQyHMGsrwhD/E+P4E+g+dW9qfrTWBIJjXL5Y2Q1WrHcgGq1wuA46l7+dp50kC7u9F",
"Ba6q1Stoa5f/eHQARG2BPZYSdo9dS+KDn+xn/bdnDmMIiUEXP2O/Yw/I8gq8hAVPfMu6lzBWKFfCR2C0",
"mABWVoeCXVG2rjSDJ9IqdN4zes64q7SUjs793NvM5eLSpuvzbWnv35axNUx9H2J8n4bh3OMoDfQKHWXk",
"PXc7bzmV+HFERJZKMJuFyGcYPfhT1LLO1lFzWvWSJE5EcuNiRMQUhBQLMPDixBuBQL5I4GC8WTkYJig+",
"xskIBQHkumxG35xOqshMUrwoc3fb7fzYU9U+mGOMf+gaCOOWGVHENxRO4Mr7MiTOR/g1SJzRw4eYy86V",
"EINDKSMDmVRii8ReKnGex8azWUSvZCGWqsRl2HNigAPaigFHMcCpZX1iQD8gZ2iPly46+Kn+ZqfhLMYG",
"pWEAH+MHVjH45KrPix6J2B81Y0FMzBCrqiTdA7S7i5RQw1tkgoR1q467hC1P0DmD7tcmatyEqgXp0I29",
"FjsnyTj7rYqS1ZbnKNgP4zQ40E1Zu7ZbSvQjzQk2iIciTEDEChDmifiUfpbBCnYleP24ZYB4aaReB24N",
"gdVo7RzB+u2v2Pqv2n3Njz05xF4846ET4kTT9ps7Vw9+sv8+V+03lVKs1X5pQ5mPlW9krSRiQ1iVE/Z1",
"o0JodZstUpbUHN4JJAmCj0KscWywHWtlW47ENcxk5M1RXCHVOP3c2in8oE6ssW1RUq2G5s+UAHvtdH/G",
"SLil/e2i/Slc+Ay3nt6bO7hFsqMmNKWOxB05yFdxhNMxDphDm+8Stu74OcLUAAq9XGvbBtPW/XzDte02",
"nUvsuDZlw82XyTFyq9smQlBbzzaisAnl/c9tchwhElNpfvCTc/zzwSyJR9BuXMpbOg9kF8Ek9phfl+Er",
"/3DbzvBq6qsYk0EaXbF53X1TtkNPSa4Nn3oVBCWSHHB6Yvjd3+ipcBETD6RkEifoPxSKWKY74ekY+Ju/",
"kpuTABTCwON+e49tj/dRyPN+tq3mgyNHZjgE/sPBT/YfBy++N6QN5Rv4EuWwryJvjLvTPjemlXgYiFvp",
"nc/jZJtUm6PNgHETZSTMJ363mYl5OiKW1Q2EYfwEA/ONQJFqpehlv1epWJzo8hwT4YOfOMJO3HIx1KV+",
"mV8i3IBN8oPZGUWc3FvHJgVktIyyhYxSIljFKhfDSkaJsIFNpOKieZvMqgudV5rEJRZpfDf2YvpH1+4I",
"eIDzRT0BGgzH797lgDhahQ40S2L6Dxi0Z9gWsabNiERkko48MJtJai8fa7xNgR8JGIXwIABjfKBSKluN",
"RsysRtbOIxNAvBEM42isv1FXGX7ppEWuZQVv6UDXopJDvbtMVvTIcuXxbLyMZf5KYTLPeCYA4zsUVB9z",
"63pv4CR3CvC+lOHjTL0rK8Wh1zk2pkqqkEN0Snn7x2Z93V7CbufdpoQftULRdBbCKYxISTdgzgtVc0te",
"nQP8YJQwrOHBT/qfmuslnkF+NOd8UxQgdAJHVzsbx3roU0B309FeSGbfyDfGlv3aGegtN07WP+u1XiGM",
"HuX3ccpz8mwJD2cMV+Jhu1JPXHj8IIzHdcqErAEvE90IOIosr5dSf9VsryOiwakpHk61l2v5o0tRn0b6",
"5/F4ecqn/7+XvVazX8FoVVKsxJ+vTr7l5N+tyGlFYg8/oJlFFY7v7zE71Q2goIj89taY3qp6Opb7zRvN",
"LVOyzw1nXP+xnu31ArforW7cHu05GWeSMMsf86yF5sdjAm+aPZqv0O0FfKpQVJJGnuhZHfHKuYMuiudm",
"kG/0d9X9x9LiiGzwsTfmMQASDRaJxWvpOwFaWe3emL9avRFm1433KApUDkILOOp1M/e5vIyPhb9fZ8T0",
"X1h3F1mAFu/dafs72fqOl3LbGdNPq5/f3PrTWa51pWyPGcb2ZqqkmpuUdhfPsxhFxFFIT1GUEuiN5uqv",
"BIKHIH6KlNxuILM/QXJFJ991ic1kNbgnMMlX/hbJ/YoVO472Dun/rg8P37P//a9FIMncgHTgzmpkOYN0",
"BO/jBBZAjSl8SwArU/d9YIM3B3f9sjFHagtIR8YnrXzcUvmY352VS0l84LP8VfYbaZ7fSrm9TfKON9mZ",
"uLjVP8v8dsRRwFSVmneY/Cox9nyJNKdHlxUszQcK2wuj1ig2CJIC+65cfCRwFoJ51UNPVva2SnzwJq9a",
"fHAUNBEfiUTasuKDD9RKj1Z6GKRHgXtXKD2kK2UvSaO6W7NcdZScAbZvECnFFO27an39SrcI3XJFGRlX",
"w99iQMx9cCE1Nq1Ty7Zm35tDBIElya0lXhEkIYKY8LK/LuCt0VsZAtIElDQiKFyBcX2iks9nD+Ye9h69",
"GUCJ05Zl2evvtCdfht1byBeq+XDxTjlxRXlR6XquxiFvvFqfbdeaPjP2UOSHacDiDjE9lOMonOu/q1A4",
"k0CKwvmdbGBnhHIqzhpXdy4u0gFnv4LXWwQ8NY1+aJW4bbuUzCkwmh4lVRWP1exYoUJ1IAqb7FFuqFOv",
"RFs6LMsVzR5G2nWuapXrLKuognda/dLkTak+o6gTzW8xBfoE6uznjiaFXiRge73yykwCrehqRVdT0SVy",
"Mtc+7/aAF8GnHIDVoumU3Tu9aj+TQJ2GlBp/k45d5rWWONxcqsC8bJFFc2pkirhjLEntNiZUcw0zHBUZ",
"aAUMnufnn49He/ovdY8hciQHosBDerYWEqsDN47Y9v5fJ2BE8X8dbwbGsFoGOD6kyMHADY4x62mQBoXl",
"7Wys9QJc1p7cO/RQyZGhuyWCXoDF3SPCs+eV3MZwP85V7LCznfFLe1QtYsvoEfs1BVizYPJWdr1C2QVn",
"QmDJP58PQOJP0COsE1OilSxQTuDMKKFE4VGW1UsO7CCZ5Hj2XCYC3vYSajufsoh9F3vevmbZiat3xXWF",
"6/eyPMqxv8b8KikM/WmQVuadVixcL5MaP6VzkUdcV2ql0euRRu3Lul9RFmmMv35JtMCbdglUOTan4bP2",
"Vgy9bGROCB9h6BTkwVvmZq7MeSvogPb6iGAYWJ8MQnrwemw2DY6K94KsQ1NAhryXMSgCEDoxK95nXz/7",
"/GHO19Jw8ku9rwUPfPoAJdAX2egqoDjTmi0CSdZ/vYdUm9vhhXM7mI8BcTtX8SCEXRtgcf1miQngBYVO",
"9duiVd9m8cH5RG7Fr17m/krUVmpyYyWQ2layKlxVaS/1q+tWmSha3Tcz0q6qX8eKX/xAmKBoXE3gu5OR",
"cwMF6dyYMCtk+6Kl51p+XFlluQZ15Cr50lxltbqKB8jyM1qq3OG6ipO7EqV2u+lyjAt4Duyb0PJO/oKj",
"glrdmanbQEVrXor11cdL6Rrm6qqtOqugRy9cbbV8ArbVVl111KWqrbqdkgcYEvpfXF+ZXXbxZJfqgG6N",
"XFA0Hoo+rjloX8cxqSFmiTNS35OWlfLZL2xoWhkfqZLF1RdtqoIwdqtQ3OqTqqoZwwceiFka8omM42h9",
"fUXlUZU5xs1qH9cpjAuU4251RIYASeuaWrhOF0Zx0pa/VhwTv2Bx8eoDxyGqg5cbyecwtSQ6aJYiuU1w",
"8GLXqA9w7nSJSts1T2zAyOALnLs8PM9gUoHC/TPs+gKdy4rGAMrQzf7ZgiAmabR8kggXCAdpxBNECMfX",
"i1xJs/18mQtpNvUWXEfrcOiX0RXEkuWmgHPvEYQpNGeoUCkg/6DsdvSeNT3qdOm/jvm/jql4r85k8XW1",
"iSyyZchS6U50zhr3N5PDYu1V1NsogJVYBlDGeDrWTnd1IbNxLTpIawIwBDBc1LiFOX+/TBgCp4QmPl9e",
"kPHVR4Ee/2Mzsw4Efwr1FP7wIQzK+Ry5gSKLZTrzeb1hcjBKwwd72M+HNHwQ5IEzmYArhQLt84oFA11+",
"Q+GAX1I64ObioY0S3zL5wNhUFxJ4xVLCLV80d2RouYNyKq5NavCwklefTpojwF2hEAZDs5SwzpBmAVv0",
"X0+ZsUxtjzWmzZM/xKM/oe+guTCkweyxcyuktlZIibSya5FPzI3m6GPlvjkHP+sXOG+v9TJn40LWOkN2",
"a7GbLHZP+H5XyQduidlxs6P51adq5wjYlqN5NW61XAb49sB8NQcmih4RgU0DrGUvc9BYn31tz0oZK6bh",
"Y6EoMYntNjbMFD6d0eKaYqb5BJW03rq/tShpjhK34GiO2xeNiObgLhIILQijZUtz9LPim9WEago+lz/s",
"8X8/cyYOIYFldj5jv2Nl2LmwMu+zu+Uac3xVDdueQseun6213MspZJu5N8dInAgzcrUWq87tIzvXqt60",
"NuOE3XnXuiucsN6nt4uduy/2+NaRczl8O8O54lFsY86tOvmmcDpizNfIRpO9zCz+lX1tbTRJjRo+FrLR",
"JLZbZdBko2W0uBpdUIx38JP/4aAEekAA4d0n8bTu2Runhl9DFRTLtsHGP2+Ud9+uhXcX0QFfB9duUZa7",
"C0tSO8WkuY1Zmbz4K4Up3JMFtKtKD1DiYK1ztf61/B9mgfEJkn/RXrtc7X+nXgbsUrD3+rWXHO0t9gLM",
"e4QJRnGkysy3MvGFZSIVR2p3ysX/JecsKhMTQOAeu3ByCZWgrfn1VF2sxAAQeE4btu/StrlMxCreMDnU",
"E13fSyVFZ1vwWqkIy6bSZ+Z5rUEwjsbObTROwWbVcZOJW4pq75z/uqjEFT32ZnGI/Hl9yhbZweMdXBK2",
"yFCCK9ajTddyYELLYi6ewm60rp6NZz3CIfAfqhO1DGkT7wmOJnH8UHZ+ss/f+dfW+clztOg4aWI9FFC9",
"TeywoSJGNxFIySRO0H9gwCd+t5mJv0IyiQNWIgCEYfxkLqDEN4jpgZwF9POMfVyKEQ8wAQmxsuOQfuXn",
"2OVJSiYeM1aKDHmDYcLvTBhAlxShrOcucuabw2MDHnTuYSgTx0oOKxMIAnHHE8acYPK0UpybUQWGfpog",
"Mmf48eP4AUE6KEt+fKvTA0NpfkZJCHQHFqaDurxZw4thkQALAjnCrRwWcvhi2NdR1UASF7HcyuKtk8Vl",
"RlCS+GK4RLquwsAmBmujExkC8vxVmaVrdTSbn9Q5yrC4qy1DbxFDWznPkaMrT1RRj2NvE1dWokTYrt1c",
"rd9dYEJMM5+BqluV25n2UmUbLlXU3pQvVZb0Txiqp9UUulewjOacoYylG3fEj9fd1gpuG6izuKB8aCXC",
"1hVY1EXESooqOsmJ2pwaJ4TA6Uwkh2FtHWq+7loyjVaCVAWwIczC+4UI4UQQbp+B8MKXeHWMsimGTiDt",
"WPH2niUpceVh1rxl4W3MBpCkkdiqmscXKJqlLB6CX+6alvu8FZpKmwugQr6wDX8JgZKtqdIXwJs5FoX/",
"BMmQD9uKlpfTDpplubJ4GsRwrUGxzQaF3KW1SA1xF7/3FCcPVQ/GsrBOa6BEGyORhahzVHxnSKUIqaq1",
"QZGhwuh5R09uR+vE37ZbOY38F08VIgaxsdCrv33L8Q/HxoZK5BhmDhol+pBb23Lu9l2/6Yy3iLOeS+Vq",
"9zw9Ibnwro69zc6GV39YZphoK1EtbWrKJ0D5t9Mcx4teUklEc/OyeYZIvSaPIVGkVkinTReppYvU8IJr",
"3ES5qkcvlzzSBLdzkTnNg5QjmNY83cqkkvk9Kj8yrDZQmwicn/o/627Hc5xQewILMt3ly/IC65tB0zG4",
"w2qC2K5F3yu3l+f218J5v3T9S+FunqYW5+cDdsVR66LmFyGcoXWg92v4us9Gb5n75Zk7y41wpZWG4DAu",
"483O44htd+vQ3pBD+7uO+8glK0G2SU1VhtVJHDwBM7gmPWLIxm7lzc4oE3zDWo3iF9IoVES8Q+nsXNXs",
"MFS3btiga1SxPnuOxS/IezLdfisDVg7gOcDE65+xpJUT6IVA7qAt+QnApB9Ys5+8OTZlP9lA5F6TMhu6",
"5Glja7b0xn4BWeJ+ne8mC7HTzQRr6abRvMp0TAG8B2lIOu8PuzlRsYnETGrud4tMzsu/e6O5xyYwTyo+",
"2V+Jb0Ltai97Vq9vrTLRmxrTsWynB7wRIP6kdNlTpTG9+nqd+j0JR4ZrMLCIUS9flbzqIp5he3tUk3SJ",
"k80mbm7wgZ/EUb1GQlt5f8ajDCiSoPG4NnziNImjV62m7EzWSLWxKKDTjiFRKvF+TXJgm+G26uTFu5QZ",
"uCJX5Wju3Yt8mCtLmanzGXZPmzmary9zpnZsbjh3Zg4ZS+iw7cFk0GNLJ8GaFFp6LB38pP/Zk7+6FYMo",
"H1XOVwOUcHa8NIRavQ2sHEY3XxzCsYqDcRPbvJzFqgpmNDXz5ucJ4va5W3XdtiRz7XIAzxZz1pqOzvbY",
"3AXXd6PDegXywe38ZjTg6ufWne/1t/etHbnNdqQsjO9qRLL267Ugt9q8pcDNQEKRZrnRLYDFG3/XfXwb",
"gs/wHtsIm7g73ZRbIIc2TABJMXQqbiTbLmLSDllfYVy6APeAosAJKtawMUhfUBTUQ7PzHhSCptAD9xTQ",
"UkzhE8DyiZ++hM7x4fHR3iH93/Xh4Xv2v/+14F50P6ETmIk3AATuUSg6rrX6KMQjeB8ncJ0gf2AzrBLm",
"CizfowjhyeIwy/4bxfOqgF4pptfnESy7316tP7CoO7ZmzVqiCNfjCGSBgy7JcoEnQKMHXZ799ey5jvHB",
"u1zusVXDWzV882p4q1u2uuWLvAzAS5ZHZQKoTeNdf76voVRpds5TUIM0pMdjjddQtVzEfziUnVsv4jZ7",
"EddnFykC2KlwiVaZapWpnVGmsmVkonolvlmnuvOKwZWXdsOF28sSpvU6rFYrsWgA69VLDn6qP/dKmU5q",
"o5LMIDfUWXY8NsmAA2tmXyOqtzZcyby7bbxSMV7JgqdmAQkW2qiJXFoJA+50tZ6d4r51HsftUbzrcU3r",
"lSNuioFKZvCcvaGprOcJvAg+2V/SuD+kueYddif9cLX1qr+CNWcvqARto5VGDdvQpDKIdfM3mv6xWZCn",
"njXZDn8rFjdf/nDrUk4KQVdF5et5xKjJ4pwf2SyPpUYgJLK7PlhSJQZp1ErhTUphuQPaBjSRv1a9YYOl",
"mpqro7oEfpWWZit+ncSvUEjqdOKVi1yex3zPj9OI1ITosDYyK5RMwA8eAQrBKIRM+mrixmyNf4KE50nH",
"p2zGnRe9dcm7djx5X26zFjS9Oalw8mm94ZY7+hySFkvpl2f/FMMEH/hpksBqzsbcOuANPdqtxL03GCaf",
"IDkVg62R7uhMDemMQdyWgnn5UjDQTxNE5kyM+3H8gOBJSmXXH7dUVBUet+XJTZI7234DGY8RmaSjAx+E",
"4Qj4D1ZyPo2nsxASyGn6ks7vGc8jOhEvhPGJDX1JcXkqhy8Q+JvD45r7BF/MG5TnnUAQiKpvYcw3w1hl",
"UIn15wIyc7iTC8zP4Yg+TEBiFwVD+nUxxLGuzbHG4Fk/zhh0DREWx+MQrofe2NC/OL1x9K2Y3jLE/XL0",
"hqJHRKBLaUipDfMOTOl2Or7pCNesb1/MtcZTXJ/IKX4iRFhuTH6Brb7ofKyy7KgF7GWUd22wEHO0dwB8",
"H86I3fN2wr5j5WETk5SoTd983qezHn8SH5xPVF+6sIL6+MpN9NdGAWT1+xmSSnvvTl8JZHkGK2qa0e/N",
"6Iv36ayrQhgdfAX0xVfe0ldN/XaKpAXoK4zHKLKT1Xk8xh6KPMDOxv0KBeOcDbQeWmJHMB1/QzVWnezo",
"MB6PYeChqDWft8p8zh/rlGpc7eQwHscpqWGGOCVu3BCnL+/rETQab1nFoZZIa5RRRj2uZDuF0xFM8ATN",
"GphAWic3M4gfIV+zbuIZ0VoJ3Dxpc3tIR1FrEy1iE+kYrCfJGcD4KU4qIhG4mBSS1JPtq0TqlRxzfTrG",
"6QREYzXRNikbPoMsUIhqxfkOiXNOVnlKd2CiBI6pIEuqjD7eAldqJCpOZ11sI8HYJoaRyGuvuXZCT5ck",
"5Krz4BD4D2u5YRjSkbf4gqFG1DS8cXiECRYgVBa3Fe1k/AqGyaNBR+xH9/EnSL6JQVda2kODNMvocLR/",
"uH9oyhmhhY38obreOlTtuK5YbCFUroKcv0MvgSRNohzyCno2lVJpFKFonE3xY08OuRfP+BPVbDa5aU9w",
"NInjhz0RRXTwU/zg8B6PnhSidTnKiP/u/tRODGSP4lETbTiIx/HtmoSvPRde/lwovpfTydQauiNa3Dox",
"x4HAs4uRLJvKsnjVHCP0HuyaWGNr+WY1wW8ceh77JlBDMTMQE9qkrsobKrCjtqtlzy1iT+YTKG1RUx5V",
"vMn+eHaodG3QNjiFOT5MFRGCVQGnhjN+d8JNGwf+iRW33rBSRGnptQ5VmqsDSJlaTamQ+JMKX1clIfNW",
"O0PLa3AlMATkzg3bWSEwkEqUbe4RiyOvcchaTjNzmmCIZZitcJoUX2Y4ZSZR4eNOqRAa2EVb+byhSVYP",
"BWD7umrzr6tM5pBGMQs+bujWaVjunNBA5XoNr3wWfNnT8tZL85b+hGgZxnJR+9y5q5keuBUMtr7K0xwZ",
"rg+dudaV57JNK4dOEqGoHrbywKogLsecNWqiU3p9ukn5PPqK8R7VTYf1pGyQTn8b+NmQ0pInpFxBvaHF",
"qw2ZARsncTpjeUIzEORGWUFhnb7Aeac2h8OahcSSubvlpVKbvnsLtYmF8oU3Elwyr4w1NkSmRGia6WWh",
"BC9bKbmuDeyy7/XvmXcbp5Q6YNBlXBUCAjFRPIWwdw+JP4GBLZt0Jvi3XJESZLBg1pgXyxWjwdsoSUyb",
"GqZNDbOG1DCNRLOQDdjhVit3kjuJZRFbs0MumF9BLq9ZysmAqeVUwVbebZUKmJHioipgMfBvBEECExX4",
"1zWGArJIMi4P0iTsvO90nm+f/18AAAD//1fUBx9GZQIA",
"H4sIAAAAAAAC/+y9+2/bOrI4/q8I+n6Buws4z7bnng1wf0gTt/U2TbJ20mLvuUFAS4ytE1nSEak8tsj/",
"/gGfoiRSovyK3QhY7EktPobDmeHMcDjz0/XiWRJHMMLIPfrpIm8KZ4D+eXw56KdpnJK/kzROYIoDSL94",
"sQ/Jf32IvDRIcBBH7pELHC9DOJ45XwD2phA7kPR2aOOeC5/ALAmhe3Twfn+/597F6Qxg98jNggj/9t7t",
"ufg5ge6RG0QYTmDqvvSKw1dnU/7t3MWpg6cBYnOq07nHecMHyGGaQYTABOazIpwG0YROGnvoNgyie92U",
"5HcHxw6eQsePvWwGIww0APSc4M4JsAOfAoRRAZxJgKfZeNeLZ3tThqcdHz6Iv3UQ3QUw9KvQEBjoJwdP",
"AVYmdwLkAIRiLwAY+s5jgKcUHpAkYeCBcVjYDjcCMw0iXnpuCv/KghT67tEfhalvZON4/Cf0MIFR0Aqq",
"EguUvwcYzugf/38K79wj9//by2lvjxPenqS6FzkNSFPwXAGJj2uA5hvEoAoLCMP48WQKogm8BAg9xqkG",
"sY9TiKcwdeLUiWLsZAimyPFA5Hi0I9n8IHUS0V/BJU4zKMEZx3EIQUTgYdOmEGB4BSMQ4TaT0m5OBB8d",
"TPsi6xkH0UOA2cItJwtoDyemX9nPlNoD5AQRwiDyoPXso2ASZUmLyVEwiZwsyVmp1ZQZnlqQFiGLY9L0",
"pecmMcLTeGLZ65K3Jh2fwzg6TpKBgSsvyXfCbs7glK4mQ5D2IVxPqAg7KEuSOMUFRjw4fPf+w2///fsO",
"+aP0f+T3f+wfHGoZ1UT/xxwnRR6g69JRBQGdwwV9hwyKnPjOIZiFEQ48KuhUiP9wxwAFnttzJ3E8CSHh",
"RcnjFTFWYWYT2ANyAqRAiP2SNImIAKvhWk45cggiDXknJ46o5FboqkpIVBxqcUO+EISwIXIYq9K9UZxy",
"mSsWUyPDLnMiLYmyJPgSI2ygwBjhL/HEOb4cOFPSSoVxinGCjvb2OP3v8i+EOHXHD0iCr/C5eZ57+FyY",
"Jpne3+akC8aeD++syXcIUZylHtSLcSYT/WPD6nEwg8qhmPKxnEeAuDgtSG33cP/wcOfgcOfg3dXBh6P9",
"347e/777+++/v/vw+87+h6P9fVdRV3yA4Q6ZQIeqwCAQAp/RjQJMzwki5/qaCQgytArQeHx48P73/f/e",
"OXz/G9x5/w582AGHH/yd9wf//duBf+Dd3f2DzD8DT2cwmhAmf/ebBpws8edFUwgQdnj/VeCqxA8BmSTf",
"VRV0A29cxfdQJx6ekiCFSLfkH1PI2J8QKybdHd5613qDZxADHzCSbDgzChRslCtXJbkiYdst7u/hhw9N",
"OJSw9aR4kcjQItHzYIKZjjCEf2WQCZMiPplCwDC7GHXOgshMrD33aScGSbBDjIUJjHbgE07BDgYTCsUD",
"CAOyL+6RXHEvywLffakQEoNXt96PWXjPdLD+A4ywccnwQdhCVvqqZshGzZXNcPPSc0/IORRaADTwiyC1",
"3o7c4Moot7XZHqsFEQjpkuLIy9IURt7zWTAL8AinAMPJMzu9sxnpcHJ8ftI/ux2c314OLz4P+6OR23NP",
"hxeXt+f9H/3Rldtz/3Xdv+7n//w8vLi+vB1eXJ+f3g4vPg7OlT3OoWSbIcSDGaOMMQaRniH9LM2Nusdp",
"4E0pbzKZESCHkuOuOz8Rx7MAR0HYExNRhOoFxDETD0wnXkg+0PF1jFFGGkriCMEq1rAQuVWMFcCqB4ON",
"YobjJI2jH3F6fxfGj1dpMJnA1LiPwPcDAgUIvymCuTKwl8ZR/ylJIUJcp6wQDmlyzjegeqxHSYY1I1dk",
"D2nW00GlTFAB50YuvV4M6BdbohbZxhHHgSQdyqTK/uT40Y9FOcFugHudfkj638NnY3cDfTA1koKUY2Z0",
"PlKsAiOKcJwE3nFqItIZ+E8cOeJgdsh2OH87Hp7/XZy+o/ORQ8dYhLnlCTULov856M3A0/8cfvitelRJ",
"YM28wJwFxyFMcX8GgvBzGmeJWaqRJkgnQsIAYbJG1kKYpClyre21OZbvBw+wR2esrp2D2rTyBuWEDa7d",
"a/pJbCtZq4Nj7t1Yyt6KdfXcNA5hk47AVvMNzsYwHZL2Wny4fLAmrBjxYadiMi/SMrBAl4HCbKKflHxZ",
"/qQ97imlwvTFYFhToPR4zE8XZCtj818vldYFT1TxsNHyk+K5qHod5BHTaq4FzJEZxNPYb1ZuFXR9Y10U",
"VaUqMxjb+tqPj3yghs/GY1g0+A5TcnBqhzHbRBI03UCl2Quw8i3NN1Air5HAzgIdmyZgEkTSvVWH/kvZ",
"UmplVOI8tjFPVIK3csPpNl3R3U/7n46vz4hOfnw5MGjhygAXqQ/Tj8+fxCWGGCYSyhCsGPr5SFQjWqcq",
"tJAmsxBDYnkx0HySlFmtCu7gtCh5yxdC/LrIuBBB/8MsGmWzGUifmyCjW/Wj2q2GJZmqJxdyIzb8FOic",
"fm20VOdv/xxdnDvjZwzR35t1Tqlt0um/LkYDYowNYH65nCrfC0A3BcoaELkEOQ1S6AmQhBQByHPZRbFZ",
"fpgkkIXoGUGQelPtaWSi96qzmrp4tHcWVDXLiFZIuFU2dNIsKjolzXfkdyCwGJq1ajNuAiOfrLRhYN6s",
"zch/ZTBrhpi1ajNumkWRBcS8WZuRUeZ5EPrNQMuG9qNLKkd1nkiNgUO/7aoW3Bw8tsCJZRbrinvzn/FY",
"I8jrwjqoPFcCO/gp9mc83l2RQ74yJsIwsZdeIwwTHWJrVWEczGCcYf3y+cempT8sqgY/KOqvsJvo0nV6",
"7T/j8TCLaqQbu3Kxu0aRnWR8kbnJEAJksKjugihA03ZT/8kosm5HCdGylobdW4DoUoiyEGu9lAiDFLdb",
"DMIAZ8hiPeR8Ym05fQ+zqB2Jk81vT+XePUzrWaDNchWltAlk5WAu9VzcbGSDCAKRu2DmmpHcJqF6XPbP",
"Twfnn92eO7w+P2d/ja5PTvr90/6p23M/HQ/O6B/sooT9/fH45OvFp09abYWocfrwCdugq3JXzWbzSeg1",
"ATLfE6xVeZRXwVr9kUBc9B2jV4a3CE3jzZoCG59IR2Z0mSHw7n/A8TSO7199kQosy1piPDkLItgqFoQc",
"pvQzUSSIZBFHahhPnDCIYJuLfxYwqp2DDMcbNCoppt6shcYnUcKWGiSRR7HKGW5yVJ3BBxgWHTcfr4mg",
"GZx/unB77o/j4bnbc/vD4cVQL1OUcaTxZLX/BQh0goR/f33bU5CVXnqwjwvYn8URWlqgvHONDapBgBoa",
"8NNlF/H4NqG0e9hzI/gk/vWu50bZjP4DuUcH+8ToK3JWobMugoi3cBJGhXLiQyuzSoFFG24Hn6ojv7Mb",
"OV+XNvApxiBUjVjSlHp2wgBhdi2Rh6vv21hxGon1L2LBfoM4DTyNPI6y2aWdiU3pWBjau6b1/svKqmZj",
"BSwOiprYxgGHduY0G5Eb1bt61BQuaCSohVl6KkJ08n8IMKThJFVUWvlsUyL+QzKAVkSHAOEhvAtCw30i",
"jYfjAXPqYDRYLqUdIQ0JWUFUIZ3oOwgzw/EzA0/BLJupPg52Q4gcGojNXb581x+DyI8f9du+DJ9yA6If",
"zOsQ0kSzjhnwoe0i2Df9FOwbXQbZyyBSwntyNLOQ4bs49aBvG7Cg2AnKfon1SqgKlHaj0vUGHIY5j2mP",
"Q/l5gQOxPEblSGTYFFhTUKkdDXowwiPFni3dE1HwTPTMvjq6UC7VAdHGQp3HI7GAN2FlLgOO0txnUDGg",
"y+GE9TwiN6Kn2tYclvLoWvEPyV9vJ1h1CJMQPP9ScaFsSYpjBhlXVqCH112f0vzD/n7Dektwm1Ztcpwo",
"3e2FdsnTZQufgC4lXE6ZvYatWoQ/klFLPg7NgBOI8HVq0LWuh2cOjh0EI59G5HEzFzk4Xs2lu+mAyKLg",
"L6IN+DDCwV0AU6lNcgWIP55ggYPqm6MxDONoIiBukJW9VcYt2rk2a2MRR94U+lkIFUpbNCLXRFI9F7OQ",
"X/sjrU0Qbj74jbIuf3kuWhq0Tv4YnXzpn16TH3V6i5x5taFoGxpUVl19HllWf5/QljaWF3M2zKIT1dHY",
"+sKCAbDu00sBwGaJIyvl8Eelw2sG5+VEURuXVyW6DTC4NHLAKkLPyEGtwvSqo5iMMhXH9T7LEZyBZBqn",
"cBTGeMkWWcHa0V+bMxcECmPmmOE97N38c1pH/EbVtCzy2UkzsbBmdUC9Gm1eaBCGImbAfqUV0aRxlvAm",
"9qCXGDxHS0+1AMv3qOL+lJCPenFUveqZgiiCoQle/tkJfL1nCpHBnUc2ut7mZyOcG+PoxRQ0nn7OSRZS",
"V8HMtHrybYGlk+7mddPBF1n0RijadqqwQIREd5EuegoZag8aDBOT3NNHukyD0E9h8bK+wc5eUXRKAtLK",
"29dGSFIIfDAOoWlzxXf5Cp4JxEYyWShoyjCDmQKUVRTIQQR58A1kt1Y1W7+CIKlj3E/iwg2g4u1eUigV",
"JcIfJv9DIw0UuqOTOIuwHlxohHIe12nepwZDZVuzEAtmEUrEI99k++WzXZxhE4hzciS92ju+wzC1R+bS",
"Q9NYl5qdWUDbso3KJG1N4sRC1rRZsexSs2Ki+hgi4qwOJ0mBcmW14WccdcepNw0e4FbKpfZG90aJmJhY",
"VPpONVyfQpw+10jRlfGjYsashyVqLAYFCQKPeuvTRO+bYOAXGVB7rcrbGJ66eWYqMHtXfX0HJYhNQ3KC",
"By3Ww++laA9CN/ABpgF+btN7JPpY0d2nIEV4BJmSbE97Z6Btr5aBwszKKABYmlliVkGTGrnH9reGmDfl",
"lVaBTBsJORfpwoc07DPn+O35xe2Pi+HX/tDt5T8Oj6/6t2eDb4Or3Hk+OP98ezX41j+9vbimfqzRaPD5",
"nLnXr46HV/Sv45Ov5xc/zvqnn5lXfnA+GH0pOuiH/avhv5kDX/XVk6Evrq9uh/1Pwz7vM+wrk6hzj84u",
"SMuz/vFIjjnon95+/Pft9Yguhazp09nFj9vh9fkty1bztf/vW/XKwNCEA6p1p+k4RkGqEsrJFzgcXA1O",
"js/qRqu76+B/3TI0fOuflxDf4i6E/81a18Wu5ykxy8k6YcqTJvQNqS1+iKR/sUNbC3/BjPZCu9oMfyAC",
"4TMOPHSR4IsM14yaOyCmADlxgqHvcCNTDqKfY+WJwkwJFRbOyJC/LLJ7i8z99BbpyChc+eg6madNeLLe",
"TCcrehNnTniiXfMGCHz9XugSw0ziHUa07pBeYbwUVxVEkxHE5D9ofUzOkjX0n5KA7DJ9IkKBqR+f9WLT",
"IOeRZgykr10ckEIHJEkaA28aRBOWOpAiuG5+kbCFEQkNfJsTCrZkkaOxCg+NlKvFheLd+QSCMEuhBSg0",
"CEMFRL0UQPRdsX7OECC2VPOFTR5TCyK+s/TShj+st4yeA0+CyD5Rv0fkPRvDZJ070cQBWIR+cqparq/e",
"LAm0AJvlwkDGtK0m99GLTBNZe9kkkoTyBNHrTJw5X4KlpisHzlCmCxPx2Yw11qLuyoSOUMjeZzxzGw4O",
"kRkq3ys1bUYD7WzMUcJJud0Jwva0Cv+rEZR9hhbCek2trxFMWY/LbBwGXh0p0PFqcoSpMG/MpvP9m2fT",
"h3yfhJVy8eOcWlrHp98G527P/db/9rE/rDEp6l/gUB85ModH6Two1XC1GIOwCRMFOBQnQ93cbcYrx2VK",
"BAjKV7EobW/2xy2xbN2e2//ObD3VRiU28PHoK//zZHhxrkS21eC9oO/oVD6Qzmres9DvDn0CoBfO7OUN",
"jp1HkNIMERVFiPXWvw9p99RH/8pnOQ932NjmJerhXyz7gKSHZtaV1GP3bKdpw9q/1plBDFPxZkecoWws",
"52/BLtx1DhwfPPecA+cRwnvy31kc4enf57z6l+jRvuExi1yBqMs4DDxNBiCmm9eZqzL3OmuqURhaiNwi",
"+zXFhHPgzKvjXiNbYWoURt9zr4KQRd/33Z77/UAvSljM2RqCjo1x7Nc0Cf1bTMKqrrzh0c1S8p8adRoV",
"EPP+b7GjsPNTvK6fYoX+g5Xkg2/hB57bjWvgwh80eMH8TAhdggzp3qCrbMIiIJwAOQlt7YDIdzwQRTF2",
"AK1IQUtdifxp5Q3TQod0BmKjgwT4fgoRUh0lBdVOWN5Vfwn58AWgqU7KTwGaqkP+FypNx+U+045YpagR",
"K7rknEwBNk74HabBXdCEXuruITLogTfn1coKMOg5YQqQuSaadg4gi6A5COI1XoT4AUpC8FxgBLF/rT0r",
"RezeGAisWDTOnIIbPpqRSHkXPuZYE2qeHvY5jntZlO6Fxo7VASKBqMXfYjBUMv3IknkqnkwoP4snQTR/",
"8vf5+HuhXPAbh3GxxqQJ10M4CRCuke6biG67E9IgGDZwt0TZJttNU9VqNA0StK1ev4oXdI2n+SpOGTaZ",
"btu+H7CKT1cA3deUJ8IwjUDI374bDUnezBmcoh7XRj0QOSm84/p5wM5sgO6dOC2+51E7qxboUtMB9Ny7",
"IMTNXvDvBwQfn1hbrY73/eAUTE6UlxLll0GaNxTNM8oc5VXAfTCxTXShAbbLVmedrU4iawOEV75x2gC3",
"7wcsm0PHvG2Zl7QwBLjScO1vNZGpNInIFf3VBpC+bD5nJGxNXDbZjFN2KhifU5M2VpKDBYoiDGZJu/hU",
"8YCg3Ws31oQBp06tIjhHzE39Nm4Er+ZEZeDWIjmsPha1ZfCpGKsQdFoONNVHqZaDT0f986vbK3Uxcg23",
"LMFnJVL2ZNg/violrfg6uLw0RKIWuNzSA28fcYeCiN1KtXmmDdsSS/6EqDx/FmGmXrbNKlEEoZnj625i",
"GBLMnHcZB0SzxqlOQeYEp5V2eaiu/lI7mME5s63wRppYYKtlaC6S2Cu0tjurosYqgwLrNswiEz692tc3",
"Fs/WiiRXeefCM5+Zw/9LELbFSL40DbkXYFPkopQEeZj3ycW3y7P+VSW6uyZovahbz5cCQsk1CZD+Sfmi",
"RaCoZpVmkbYOlGpQ6C7umRInWtGxkO0tbaPt0WAkyLM7X4ZS2dzeSvCLmoydAazBmjJilqf8qimrWxqK",
"lkKfBWEYIOjFkY/0kQJlRVHjCSAthG1TnsX5m4wgABgiTH77e3MORyv0k+FFN3v8y/vo6hz0Uw3KOaFy",
"f4r4MYERSILd8zg6z8IQjEP4zxGN2ZGtdoJZEqc4LxbpVhsngBgI7iTA02y868WzPV5xcceHD+LvPZAE",
"ew8HewimDzDdiwE9Vp92Ij6We3QHQgQXvADIZqMEPEbQP6llR6UAD2teZcy655fVAdm3lhS0RXtikUlH",
"Q+EryqZT1s3yJ9uGTDrVs2FRu5fYCdJsN8iW3ORewewWKZeLx6CqvpH+EYJp+yMj4N3st7RdhuhiQux1",
"JiRtIjlZYZw7Cop54hr1+DZ54+agLNXZY5MwSpt8rToTDwjQTNQ6d44+oa/q7lO1ix7zPojcjBq5LuWx",
"khW4xJaq96JI8sX8PcyRoWzoTVknXa33wqwuLlNLnKuIyveD9UXVVZmk/ppOtG6+XSllA8zj9XK21mbh",
"Wa3B0FpnJ0dqp7d3evuvp7e/ZdWaJWy6qmiUC2o1G62xb75SOKd616BPaRQ2rmItlIww8AtaUK7aFFWq",
"QhZcqT0ZTsNTiEVgdMnf2pwArXisEiqZgmYdW80STNp/ilMNPML6qql0q2pPvOytPJJLivLiF0cMHLSs",
"OIJymDuFUlmwwKWYtrpvxbO+VEi34SpyBa+X1SnrgH0tFVtVfVqo2gaML0vrLlibao7m48/8jZ3Wkc4T",
"4bK466U+gbWLnOMJXXnMtlZzzExFHETfLA1bReXyGDgyrg6XBZSwjOzmWNxlLRJBL4WGk5d9k6XGeMAf",
"OQKcwZ0TxdhJ0vgh8KHfc4CTgsiPZ6ITzdw8hs4ERjAVNoB6lB2uDOPt0exvJgHOtzfrJmUJZyOyieDc",
"kNK6RfFjda1a6GJkTG7x3gLDvtHgNxD5SsE9NtR89rJdVQod6HldCqaOncS+gWq/XF1dOqyR48W+pOCU",
"I9+iMqKCFQlzYeIbS4TXk5CoqVd/jgqaF62tn6BqKWBu2qmWNfjcv3J77uXFiP7n+opqIaYTknkpUd1N",
"M2IvlPmzJA9ETgJTQle7rVJGgQcQUEtQ5E6uu6WiT9LK08In6GUYOl4c8RfV4bPeoUJ0HGqWpjrDhFBd",
"nmkbIBRMIug7eSfqtrm+Hpw6nH3Wb46FYAxDVP+cnLahLFVwEbJjwLoyFkzPyDi6LQsBwl8gSPEYAota",
"C3yraHYARAAEzlT0XlXhT8CYmagHfYTBOKSeqg2EdAaezISvqU+6GAOsXu8w6xtppeSkLuM9aSPLfhTN",
"1RYEXCpvqcv0nUVkSwbRXWzHDUOlA00VGJtOAiQqubAqI4wR51xIqSqMLgBQOp50l770WK3sjTgSjk+u",
"Bt/7tLC5/PPy+HpkCE+yuSBkyJKXg+xkMtZJ4Wclk6glIJt9Taz3dZP2eT080wzfVhml7bWKhCIs21VY",
"Fq8USNdlFzypSTvC0o00TG7GB1lSDR5eP77ZqHZLIIdF5i/lHAHRJOM3LtZiYXT6FbGDh3VWUnZUw+T1",
"ihGXSP0nnAJtA+Tfm4etLI5CpKp/F2fHLFHtv6++UP/91b8v+6OT4eDySu9DyTlZGWbUP/v05WLEwhq/",
"HZ8fs5joH/2PXy4uvhoHEkmbSm44lTa19kz+i8VtZ6/FS3rq+5Rv6fUvsP+MxwbBSr7oALKiz3/G46Xm",
"Tm1zNhsxJ95datQjMJl/rdJ/B7TKP3f6t6/ZyhlBlneq8zWWZblJeJFxT4QKpctGNIFY+S4z7JbuwSMR",
"icueJk0gRhR3Xt7VmZC+8lBSfKi7xmxYI5wCDCeNqeIVCM8K/dorm7k+WUwKUjidgwi/O2y20cXU5dX0",
"tFit26LBqe51mARwcKrFoej9NYgKVvGn6/OTqwGVh6fXw+OPZ0QHOj3+XCvJyCDioGtFtnR2DR+I7/rT",
"c6G6VGs+eKmgt/Na8NbGBw2USb7CvJyHRjbFGIQ6ipU8dg+fDdEVYnhCljVTlGwvwrPAQQn0grvAyydx",
"/pYAhKDvPATAYc///q7nCiMiWoTetCpL23TZpcawSAv3YF+p2b2yMlTz1dlltXzs6TKvQ7XEM5eFK7xO",
"cVo290gt/rFuEOYrpDNvjVyb4sbQ//jcYvArpVc1cKGlHrLyOr55UIMC9k29MNkQU6yuxH4d+Lyk7mmQ",
"QlkCUjouRifkmO6PTmrP6XyUSmFeNeA2p+WCFFMkY8MkIxHW0cnuTnZ3svu1ZHdDqfpfSLTXxIXNIZrp",
"aAMMZ+ZIM4O90tzZmHBmRB8r1b8CXzALR/4eaunPnJYwoEGml9+Jl59yyOqVZUQqozZRT00ZqxZlquSb",
"57oSVZVp57KbiwLFTIxXRXFSDp6Io0tF8mtKZsaRKO1vTqiyquLRP9oV0MtTAdVvNmJps4whJYW6fStk",
"R8NTFD5t0yKMTgKaBqANHYmhTljHJi201Lwyf84Q2owHdcklBNNpP3Lm0n4TPNo+ZUXdYq/ARIfekKmM",
"i/vmoyU/ZuL3cgzCOvrhQuEkJYbMnV4u1JSQvg0M3Ng0IS/nqJmRypFbfje47GmRfoXtNYMS3jSSFz5U",
"Smy3GFjiZ7nKPVO39OjLNbBbfvXQHs0spfMSkjk3X0HVgaFos2WWLVxh2GyIeutBjEp4B7IQX6ZBLMpm",
"6tifNnIS3krHwI2XBPkd2yvdnMkq0xagIq4aXLHazPo7Whx498+maAzyzUH86sPuWk7h6RashUpZzM0v",
"mm2AUKvu2Pr/a20ys60kYM7rVqvPkZvZge7rMi9Q2hDIm0I4Cw/Ib06KGL9LIQ1ZqinFPgNPDS1alpQ2",
"ZYRise4ZEVJEu58xCMcQpDA9zjBNRk8xSmUv/TnflCnGtHSnF8f3ARTNA7Kr7Cdxq3zk8hePeV+QBF8h",
"DzwJeKyJJgCadXOOLwc0vSCmnqDir5Ky3IPd/d19SpjsEad75L7bPdjd5+8x6dLom8sweID80ro672dx",
"KU1aRRAhR3ohyC4CkWfKPePfP9N1iZhsOsvh/n514C8QhHhKpfIH3ffzGMs5CzvjHv1x03ORSH1FIMwb",
"ivCEP/j43hR69+4N6U/XmkLgPzcvljQL6lY7FA2WuVwKHC12wYo04BTc3fF6dXWrl9A2Lv/hYA/wShw7",
"NIHyDr2WRHs/6c/qby8MxhBijS5+Sn9HDhDFSFjBF5YmmnavYKxU3IeNQGkxBbQIFQG7pshjZQaH57tw",
"j9j7YsldlaW4KvczbzOTiwubri83lb1/X8XWKPM8iNBdFobPDkOpr9azqSLvpee+Z1TixRHmOV1BkoSB",
"RzG69yev/J6vo+G06qdpnPJU4OWIiBkICRag78SpMwa+eJHAwHi3dDB0UHyK03Hg+5Dpsjl9MzqpIzNB",
"8bwo5E3PfdqRtXGoY4x96GkI44YaUdjTlBlhyvsiJM5G+DVInNLDx5jJzqUQg0XhLw2Z1GILx04mcF7E",
"xoteRC9lIYYa3lXYC2KAAdqJAUsxwKhldWJAPSCTYIcV+tr7Kf+mp2ESI43SMIQP8T2tr318OWAlwnjs",
"j5yxJCaSgNYgE+4B0t1GSsjhDTJBwLpRx11Kl8fpnEL3axM1akPVnHTIxl7xnRNknP9WR8lyywsU7IVx",
"5u+ppqxZ261kYBLmBB3ECSKEQUTLdRaJ+IR8FsEKZiV49bilgDhZJF8HbgyBNWjtDMHq7S/f+m/Kfc3T",
"jhhiJ05Y6AQ/0ZT9Zs7VvZ/0vy91+02kFG21W9lQ6mNlG9koiegQRuWEfl2rEFreZvOUJQ2HdwpxGsAH",
"LtYYNuiOdbKtQOIKZnLyZiiukWqMfm7MFL7XJNbotkip1kDzp1KAvXW6P6Uk3NH+ZtH+DM59hhtP7/Ud",
"3DzZURuakkfilhzkyzjCyRh71KHNdgkZd/wsQMQACp1Ca9MGk9aDYsOV7TaZi++4MmXLzRfJMQqr2yRC",
"kFtPN6K0CdX9L2xyHAU4JtJ87yfj+Je9JI3H0Gxcils6B+QXwTh2qF+X4qv4cNvM8HLqyxjhYRZd0nnt",
"fVOmQ09KrjWfejUExZMcMHqi+N1d66lwHmMHZHgap8F/CBSxSHfC0jGwN38VNycGQQh9h/ntHbo9zicu",
"zwf5tuoPjgKZoRB493s/6X8svPjOiDQUb+ArlEO/8rwx9k77wphG4qEgbqR3voiTTVJtDtYDxnWUkzCb",
"+MN6JmbpiGhWNxCG8SP09TcCZaoVopf+XqdiMaIrckyE9n6iCFlxy/lIlfpVfolQCzYpDmZmFH5ybxyb",
"lJDRMcoGMkqFYCWrnI9qGSVCGjYRiovibdKrLmReYRJXWKT13dir6R89syPgHj7P6wlQYDj88KEAxMEy",
"dKAkjck/oN+dYRvEmiYjkuZFd0CSCGqvHmusTYkfMRiHcM8HE7QnUyobjUZErUbazsFTgJ0xDONoor5R",
"lxl+yaRlrqXloclAV7zERrO7TFRdyXPlsWy8lGX+ymD6nPOMDya3gV9/zK3qvYGV3CnB+1qGjzX1Lq1G",
"iloVXJsqqUYOkSnF7R+d9W17CXvuh3UJP2KFBrMkhDMY4YpuQJ0XsnCbuDoH6F4rYWjDvZ/kPw3XSyyD",
"/PiZ8U1ZgJAJLF3tdBzjoU8A3U5HeymZfSvfGF32W2eg98w4Wf2sV2oVN3KU38UZy8mzITycM1yFh81K",
"Pbbh8b0wnjQpE2E8ccIggiLRDYejzPK82D99y/mm2V5FRItTkz+c6i7XikeXpD6F9M/iyeKUT/5/J3+t",
"Zr6CUaqkGIm/WMt/w8m/V5PTCscOug8Sgyoc390heqprQAki/Nt7bXqr+ulo7jdn/GyYkn5uOePqj/V8",
"r+e4Re904+5oL8g4nYRZ/JinLRQ/HhV4s/zRfI1uz+GThaLSLHJ4z/qIV8YdZFEsN4N4o7+t7j+aFodn",
"g4+dCYsBEGgwSCwUsAs8C0Br8uvo4cnfCNPrxrsg8mUOQgM48nUz87m8jo+FvV+nxPRfSHUXGYDm791J",
"+1vR+paVctsa02+YRYL821t/Kst1rpTNMcPo3sykVLOT0vbiOYmDCFsK6VkQZRg642f5VwrBvR8/RlJu",
"t5DZnyG+JJNvu8SmshrcYZgWq7Pz5H7lih0HO/vkf1f7+0f0f/9rEEgiNyAZ2F2OLKeQjuFdnMISqDGB",
"bwFgReq+j3Tw9uCuXjYWSG0O6Uj5pJOPGyofi7uzdCmJ9jyav8p8I83yW0m3t07esSZbExe3/GeZ3w8Y",
"Cqiq0vAOk10lxo4nkGb16LKGpdlAYXdh1BnFGkFSYt+li48UJiF4rnvoScve1okP1uRNiw+GgjbiIxVI",
"W1R8sIE66dFJD430KHHvEqWHcKXspFnUdGtWqI5SMMB2NSKlnKJ9W62vX+kWoVetKCPiathbDIiYDy4k",
"xqZxatFW73uziCAwJLk1xCuCNAwgwqzsrw14K/RWhgC3ASWLcBAuwbg+lsnn8wdz9zsPTgKC1GrL8uz1",
"t8qTL83uzeULVXy4aKucuLy8qHA91+OQNV6uz7ZnTJ8ZO0HkhZlP4w4ROZTjKHxWf5ehcDqBFIXPt6KB",
"mRGqqTgbXN2FuEgLnP0KXm8e8NQ2+qFT4jbtUrKgwCh6lFBVHFqzY4kK1R4vbLJDuKFJveJtybA0VzR9",
"GGnWuepVrtO8ograavVLkTeV+oy8TjS7xeTo46gznzuKFHqVgO3Vyis9CXSiqxNdbUUXz8nc+LzbAU4E",
"HwsA1oumE3rv9Kb9TBx1ClIa/E0qdqnXWuBwfakCi7JFFM1pkCn8jrEitbuYUMU1THFUZqAlMHiRn38+",
"HOyovzQ9hiiQHIh8J1CzteBYHrhxRLf3/1yfEsX/uU4CJrBeBlg+pCjAwAyOCe2pkQal5W1trPUcXNad",
"3Fv0UMmSoXsVgp6Dxe0jwvPnlczGsD/OZeywtZ3xS3tUDWJL6xH7NQVYu2DyTna9QdkFEy6wxJ8veyD1",
"psEDbBJTvJUoUI5hopVQvPAozeolBraQTGI8cy4TDm93CbWZT1n4vvM9716zbMXVu+S60vV7VR4V2F9h",
"fpkUhvw0zGrzTksWbpZJrZ/S2cgjpit10ujtSKPuZd2vKIsUxl+9JJrjTbsAqhqb0/JZeyeGXjcyJ4QP",
"MLQK8mAtCzPX5rzldEB6fQpg6BufDEJy8Dp0NgWOmveCtENbQEaslzYoAmAyMS3eZ14//fzxma2l5eQX",
"al8DHtj0fpBCj2ejq4HiVGk2DyR5/9UeUl1uh1fO7aA/BvjtXM2DEHptgPj1myEmgBUUOlFvi5Z9m8UG",
"ZxPZFb96nfsrXlupzY0VR2pXyap0VaW81K+vW6WjaHnfTEm7rn4dLX7xFCAcRJN6At+ejJxrKEhnx4R5",
"IdtXLT3X8ePSKsu1qCNXy5f6Kqv1VTxAnp/RUOUONVWc3JYotZt1l2Ocw3Ng3oSOd4oXHDXUas9MvRYq",
"WvtSrG8+XkrVMJdXbdVaBT145Wqr1ROwq7Zqq6MuVG3V7pTcQxCT/6LmyuyiiyO61Ad0K+QSRJMR72Ob",
"g/ZtHJMKYhY4I9U96VipmP3ChKal8ZEsWVx/0SYrCCO7CsWdPimrmlF8oCGfpSWfiDiOztdXVh5lmWPU",
"rvZxk8I4RznuTkekCBC0rqiFq3RhlCft+GvJMfFzFhevP3AsojpYuZFiDlNDooN2KZK7BAevdo16D5+t",
"LlFJu/aJDSgZfIXPNg/Pc5hkoPDgFNm+QGeyojWAInRzcDoniGkWLZ4kwgbCYRaxBBHc8fUqV9J0P1/n",
"QppOvQHX0Soc6mV0DbHkuSngs/MAwgzqM1TIFJB/EHY7OKJND9we+dch+9chEe/1mSy+LTeRRb4MUSrd",
"is5p48F6clisvIp6FwWwFMsAihhPy9rpti5kOq5BB+lMAIoAiosGtzDj79cJQ2CU0Mbnywoyvvko0MN/",
"rGfWIedPrp7CJw9Cv5rPkRkoolimNZ83GyZ74yy8N4f9fMzCe04eKJcJqFYokD5vWDCQ5bcUDug1pQNq",
"Lx66KPENkw+UTVUhgZYsJezyRTNHhpI7qKDimqQGCyt58+mkGQLsFQpuMLRLCWsNaR6wRf71mBvLxPZY",
"Ydo88UM8/hN6FpoLRRrMHzt3QmpjhRRPK7sS+UTdaJY+Vuabs/CzfoXP3bVe7mycy1qnyO4sdp3F7nDf",
"7zL5wC4xO2p3NL/5VO0MAZtyNC/HrVbIAN8dmG/mwAyihwDDtgHWopc+aGxAv3ZnpYgVU/AxV5SYwHYX",
"G6YLn85pcUUx02yCWlrv3N9KlDRDiV1wNMPtq0ZEM3DnCYTmhNGxpT76WfLNckI1OZ+LH3bYv18YE4cQ",
"wyo7n9LfkTTsbFiZ9dneco0FvqqHbUeiY9vP1kbuZRSyydxbYCRGhDm5GotVF/aRnmt1b1rbccL2vGvd",
"Fk5Y7dPb+c7dV3t8a8m5DL6t4Vz+KLY159adfDM4G1Pma2WjiV56Fv9Gv3Y2mqBGBR9z2WgC250yqLPR",
"clpcji7Ix9v7yf6wUAIdwIFw7tJ41vTsjVHDr6EK8mWbYGOf18q771fCu/PogG+Dazcoy925IamdZNLC",
"xixNXvyVwQzuiALadaUHCHHQ1oVa/0r+D73A+Azxv0ivba72v1UvA7Yp2Hv12kuB9uZ7AeY8wBQFcSTL",
"zHcy8ZVlIhFHcneqxf8F58wrE1OA4Q69cLIJlSCt2fVUU6zEEGB4Rhp279I2uUzEMt4wWdQTXd1LJUln",
"G/BaqQzLutJnFnmtRTCOws5dNE7JZlVxk4tbgmrnjP06r8TlPXaSOAy85+aULaKDwzrYJGwRoQSXtEeX",
"rmVPh5b5XDyl3ehcPWvPeoRC4N3XJ2oZkSbOIxxP4/i+6vykn3+wr53zk+VoUXHSxnoooXqT2GFNRYyu",
"I5DhaZwG/4E+m/jDeib+BvE09mmJABCG8aO+gBLbIKoHMhZQzzP6cSFG3EMYpNjIjiPylZ1jF8cZnjrU",
"WCkz5DWCKbszoQBdEITSntvIme/2DzV4ULmHoowfKwWsTCHw+R1PGDOCKdJKeW5KFQh6WRrgZ4ofL47v",
"A0gGpcmPb1R6oCgtzigIgezA3HTQlDdrdD4qE2BJIEeok8NcDp+PBiqqWkjiMpY7WbxxsrjKCFISn48W",
"SNdVGljHYF10IkVAkb9qs3Qtj2aLk1pHGZZ3tWPoDWJoI+dZcnTticrrceys48qKlwjbtpur1bsLdIhp",
"5zOQdasKO9NdqmzCpYrcm+qlyoL+CU31tIZC9xKW8TNjKG3pxi3x4/U2tYLbGuoszikfOomwcQUWVRGx",
"lKKKVnKiMafGMcZwlvDkMLStRc3XbUum0UmQugC2ANHwfi5CGBGEm2cgvPIlXhOjrIuhU0g61ry9p0lK",
"bHmYNu9YeBOzAaRZxLeq4fFFECUZjYdgl7u65b5shKbS5QKokS90w19DoORrqvUFsGaWReE/Qzxiw3ai",
"5fW0g3ZZrgyeBj5cZ1BsskEhdmklUoPfxe88xul93YOxPKzTGCjRxUjkIeoMFT8oUglC6mptEGTIMHrW",
"0RHb0TnxN+1WTiH/+VOF8EFMLPTmb98K/MOwsaYSOZqZ/VaJPsTWdpy7eddvKuPN46xnUrnePU9OSCa8",
"62Nv87PhzR+WOSa6SlQLm5riCVDx7TTD8byXVALRzLxsnyFSrcmjSRSpFNLp0kUq6SIVvKAGN1Gh6tHr",
"JY/UwW1dZE7xIBUIpjNPNzKpZHGPqo8M6w3UNgLnp/rPptvxAic0nsCcTLf5srzE+nrQVAxusZrAt2ve",
"98rd5bn5tXDRL938UrhXpKn5+XmPXnE0uqjZRQhjaBXo3Qa+HtDRO+Z+febOcyNcKqUhGIyLeLOLOKLb",
"3Tm01+TQ/qHiPrLJSpBvUluVYXkSB01BAlekR4zo2J282Rplgm1Yp1H8QhqFjIi3KJ1dqJodhvLWDWl0",
"jTrWp8+x2AV5X6Tb72TA0gE8Awg7g1OatHIKnRCIHTQlPwEID3xj9pN3h7rsJ2uI3GtTZkOVPF1szYbe",
"2M8hS+yv8+1kIbK6maAt7TSaN5mOyYd3IAuxe7TfK4iKdSRmknN/mGdyVv7dGT87dAL9pPyT+ZX4OtSu",
"7rJn+frWMhO9yTEty3Y6wBkD7E0rlz11GtObr9ep3pMwZNgGA/MY9epVyZsu4hl2t0cNSZcY2azj5gbt",
"eWkcNWskpJXzZzzOgcJpMJk0hk+cpHH0ptWUrckaKTc28Mm0E4ilSrzbkBzYZLgtO3nxNmUGrslVOX52",
"7ng+zKWlzFT5DNmnzRw/ry5zpnJsrjl3ZgEZC+iw3cGk0WMrJ8GKFFpyLO39JP/ZEb/aFYOoHlXWVwOE",
"cLa8NIRcvQmsAkbXXxzCsoqDdhO7vJzlqgp6NLXz5hcJ4ualV3fdtiBzbXMAzwZz1oqOzu7Y3AbXd6vD",
"egnywe78pjRg6+dWne/Nt/edHbnJdqQojG9rRNL2q7UgN9q8JcAlICVIM9zolsBijX+oPr41wad5j62F",
"jd+drsstUEAbwgBnCFoVNxJt5zFpR7QvNy5tgLsPIt8KKtqwNUhfg8hvhmbrPSg4mEEH3BFAKzGFjwCJ",
"J37qEtzD/cODnX3yv6v9/SP6v/814J53PyYT6InXBxjuEChc21p9BOIxvItTuEqQP9IZlglzDZbvgihA",
"0/lhFv3XiudlAb1UTK/OI1h1v71Zf2BZd+zMmpVEEa7GEUgDB22S5QKHg0YOuiL7q9lzLeODt7ncY6eG",
"d2r4+tXwTrfsdMtXeRmAFiyPSgVQl8a7+XxfQanS/JwnoPpZSI7HBq+hbDmP/3AkOndexE32Iq7OLpIE",
"sFXhEp0y1SlTW6NM5cvIRfVSfLNWdeclg0sv7ZoLt1clTOd1WK5WYtAAVquX7P2Uf+5UMp00RiXpQW6p",
"s2x5bJIGB8bMvlpUb2y4kn53u3ilcrySAU/tAhIMtNEQubQUBtzqaj1bxX2rPI67o3jb45pWK0fsFAOZ",
"zOAlf0NTW88TOBF8NL+ksX9Ic8U6bE/64XrrVX0Fq89eUAvaWiuNarahTWUQ4+avNf1juyBPNWuyGf5O",
"LK6//OHGpZzkgq6OylfziFGRxQU/sl4eC42AS2R7fbCiSgyzqJPC65TCYgeUDWgjf416wxpLNbVXR1UJ",
"/CYtzU78WolfrpA06cRLF7ksj/mOF2cRbgjRoW1EViiRgB88gCAE4xBS6auIG701/hlilicdndAZt170",
"NiXv2vLkfYXNmtP0ZqTCyKfzhhvu6AtImi+lX5H9MwRTtOdlaQrrORsx64A1dEi3CvdeI5h+hviED7ZC",
"uiMztaQzCnFXCub1S8FAL0sD/EzFuBfH9wE8zojs+uOGiKrS47YiuQlyp9uvIeNJgKfZeM8DYTgG3r2R",
"nE/iWRJCDBlNX5D5He15RCZihTA+06EvCC5PxPAlAn+3f9hwn+Dxef3qvFMIfF71LYzZZmirDEqx/lJC",
"ZgF3YoHFOSzRhzBIzaJgRL7OhzjatT3WKDyrxxmFriXC4ngSwtXQGx36F6c3hr4l01uOuF+O3oLoIcDQ",
"pjSk0IZZB6p0Wx3fZIQr2nfA51rhKa5OZBU/EQZIbExxgZ2+aH2s0uyoJezllHelsRALtLcHPA8m2Ox5",
"O6bfkfSw8Ukq1KZuPuvjrsafxAZnEzWXLqyhPrZyHf11UQB5/X6KpMre29NXCmmewZqaZuR7O/pifdxV",
"VQgjgy+BvtjKO/pqqN9OkDQHfYXxJIjMZHUWT5ATRA6gZ+NujYJxRgdaDS3RI5iMv6Yaq1Z2dBhPJtB3",
"gqgznzfKfC4e64RqbO3kMJ7EGW5ghjjDdtwQZ6/v6+E0Gm9YxaGOSBuUUUo9tmQ7g7MxTNE0SFqYQEon",
"OzOIHSHf8m78GdFKCVw/aXt7SEVRZxPNYxOpGGwmyQQg9BinNZEITExySeqI9nUi9VKMuTod42QKoomc",
"aJOUDY9C5ktEdeJ8i8Q5I6sipVswUQonRJCldUYfa4FqNRIZp7MqthFgbBLDCOR111xboacLErLVeVAI",
"vPuV3DCMyMgbfMHQIGpa3jg8wBRxEGqL2/J2In4FwfRBoyMOorv4M8Tf+aBLLe2hQJpndDjY3d/d1+WM",
"UMJG/pBdbyyqdlzVLLYUKldDzj+gk0KcpVEBeSU9m0ipLIqCaJJP8bQjhtyJE/ZENZ9NbNojHE/j+H6H",
"RxHt/eQ/WLzHIycFb12NMmK/2z+14wOZo3jkRGsO4rF8uybg686F1z8Xyu/lVDI1hu7wFjdWzLHH8Wxj",
"JIumoixePcdwvQfZJtbYWL5ZTvAbg57FvnHUEMwM+YQmqSvzhnLsyO3q2HOD2JP6BCpb1JZHJW/SP14s",
"Kl1rtA1GYZYPU3mEYF3AqeaM355w09aBf3zFnTesElFaea1DlOb6AFKqVhMqxN60xtdVS8is1dbQ8gpc",
"CRQBhXPDdFZwDGQCZet7xGLJawyyjtP0nMYZYhFmK50m5ZcZVplJZPi4VSqEFnbRRj5vaJPVQwLYva5a",
"/+sqnTmkUMycjxt6TRqWPSe0ULnewiufOV/2dLz12rylPiFahLFs1D577mqnB24Eg62u8jRDhu1DZ6Z1",
"Fbls3cqhlUQoq4edPDAqiIsxZ4OaaJVen2xSMY++ZLwHedNhPClbpNPfBH7WpLRkCSmXUG9o/mpDesAm",
"aZwlNE9oDoLYKCMotNNX+Ow25nBYsZBYMHe3uFTq0ndvoDYxV77wVoJL5JUxxoaIlAhtM73MleBlIyXX",
"lYZddp3BHfVuo4xQB/R7lKtCgCHCkqcC5NxB7E2hb8omnQv+DVekOBnMmTXm1XLFKPC2ShLTpYbpUsOs",
"IDVMK9HMZQOyuNUqnORWYpnH1myRC+ZXkMsrlnIiYGoxVbCTdxulAuakOK8KWA78G0OQwlQG/vW0oYA0",
"kozJgywN3SPXfbl5+X8BAAD//zKpR8x0aAIA",
}
// GetSwagger returns the content of the embedded swagger specification file
+29
View File
@@ -0,0 +1,29 @@
package openapi
import (
"bytes"
"encoding/json"
)
type NonNullableJSON map[string]interface{}
func (m *NonNullableJSON) UnmarshalJSON(data []byte) error {
if bytes.Equal(data, []byte("null")) {
*m = NonNullableJSON{}
return nil
}
var raw map[string]interface{}
if err := json.Unmarshal(data, &raw); err != nil {
return err
}
*m = NonNullableJSON(raw)
return nil
}
func (m NonNullableJSON) MarshalJSON() ([]byte, error) {
if m == nil {
return []byte("{}"), nil
}
return json.Marshal(map[string]interface{}(m))
}
+14 -6
View File
@@ -69,6 +69,7 @@ func ToTaskSummary(task *sqlcv1.PopulateTaskRunDataRow) gen.V1TaskSummary {
TaskInsertedAt: task.InsertedAt.Time,
TaskExternalId: taskExternalId,
StepId: &stepId,
ActionId: task.ActionID,
}
}
@@ -288,6 +289,7 @@ func ToTask(taskWithData *sqlcv1.PopulateSingleTaskRunDataRow, workflowRunExtern
Type: gen.V1WorkflowTypeTASK,
NumSpawnedChildren: int(taskWithData.SpawnedChildren.Int64),
StepId: &stepId,
ActionId: taskWithData.ActionID,
}
}
@@ -310,13 +312,19 @@ func ToWorkflowRunDetails(
additionalMetadata := jsonToMap(workflowRun.AdditionalMetadata)
parentTaskExternalId := uuid.UUID{}
if workflowRun.ParentTaskExternalId != nil {
parentTaskExternalId = uuid.MustParse(sqlchelpers.UUIDToStr(*workflowRun.ParentTaskExternalId))
}
parsedWorkflowRun := gen.V1WorkflowRun{
AdditionalMetadata: &additionalMetadata,
CreatedAt: &workflowRun.CreatedAt.Time,
DisplayName: workflowRun.DisplayName,
Duration: &duration,
ErrorMessage: &workflowRun.ErrorMessage,
FinishedAt: &workflowRun.FinishedAt.Time,
AdditionalMetadata: &additionalMetadata,
CreatedAt: &workflowRun.CreatedAt.Time,
DisplayName: workflowRun.DisplayName,
Duration: &duration,
ErrorMessage: &workflowRun.ErrorMessage,
FinishedAt: &workflowRun.FinishedAt.Time,
ParentTaskExternalId: &parentTaskExternalId,
Metadata: gen.APIResourceMeta{
Id: sqlchelpers.UUIDToStr(workflowRun.ExternalID),
CreatedAt: workflowRun.InsertedAt.Time,
@@ -13,7 +13,7 @@ import (
"github.com/hatchet-dev/hatchet/pkg/repository/v1/sqlcv1"
)
func WorkflowRunDataToV1TaskSummary(task *v1.WorkflowRunData, workflowIdsToNames map[pgtype.UUID]string) gen.V1TaskSummary {
func WorkflowRunDataToV1TaskSummary(task *v1.WorkflowRunData, workflowIdsToNames map[pgtype.UUID]string, actionId string) gen.V1TaskSummary {
additionalMetadata := jsonToMap(task.AdditionalMetadata)
var finishedAt *time.Time
@@ -88,12 +88,14 @@ func WorkflowRunDataToV1TaskSummary(task *v1.WorkflowRunData, workflowIdsToNames
Type: gen.V1WorkflowTypeDAG,
WorkflowName: workflowName,
StepId: &stepId,
ActionId: actionId,
}
}
func ToWorkflowRunMany(
tasks []*v1.WorkflowRunData,
dagExternalIdToChildren map[uuid.UUID][]gen.V1TaskSummary,
taskIdToActionId map[int64]string,
workflowIdsToNames map[pgtype.UUID]string,
total int, limit, offset int64,
) gen.V1TaskSummaryList {
@@ -101,7 +103,18 @@ func ToWorkflowRunMany(
for i, task := range tasks {
dagExternalId := uuid.MustParse(sqlchelpers.UUIDToStr(task.ExternalID))
toReturn[i] = WorkflowRunDataToV1TaskSummary(task, workflowIdsToNames)
actionId := ""
if task.TaskId != nil {
actionIdFromMap, ok := taskIdToActionId[*task.TaskId]
if ok {
actionId = actionIdFromMap
}
}
toReturn[i] = WorkflowRunDataToV1TaskSummary(task, workflowIdsToNames, actionId)
children, ok := dagExternalIdToChildren[dagExternalId]
@@ -176,6 +189,7 @@ func PopulateTaskRunDataRowToV1TaskSummary(task *sqlcv1.PopulateTaskRunDataRow,
Type: gen.V1WorkflowTypeTASK,
WorkflowName: workflowName,
StepId: &stepId,
ActionId: task.ActionID,
}
}
@@ -34,6 +34,8 @@ export interface APIResourceMeta {
export interface V1TaskSummary {
metadata: APIResourceMeta;
/** The action ID of the task. */
actionId: string;
/** Additional metadata for the task run. */
additionalMetadata?: object;
/** The list of children tasks */
@@ -332,6 +334,12 @@ export interface V1WorkflowRun {
* @format date-time
*/
createdAt?: string;
/**
* @format uuid
* @minLength 36
* @maxLength 36
*/
parentTaskExternalId?: string;
}
export interface WorkflowRunShapeItemForWorkflowRunDetails {
+11 -6
View File
@@ -14,6 +14,7 @@ import (
"strings"
"time"
"github.com/hatchet-dev/hatchet/api/v1/server/oas/openapi"
"github.com/oapi-codegen/runtime"
openapi_types "github.com/oapi-codegen/runtime/types"
)
@@ -1263,6 +1264,9 @@ type V1TaskStatus string
// V1TaskSummary defines model for V1TaskSummary.
type V1TaskSummary struct {
// ActionId The action ID of the task.
ActionId string `json:"actionId"`
// AdditionalMetadata Additional metadata for the task run.
AdditionalMetadata *map[string]interface{} `json:"additionalMetadata,omitempty"`
@@ -1285,14 +1289,14 @@ type V1TaskSummary struct {
FinishedAt *time.Time `json:"finishedAt,omitempty"`
// Input The input of the task run.
Input map[string]interface{} `json:"input"`
Metadata APIResourceMeta `json:"metadata"`
Input openapi.NonNullableJSON `json:"input"`
Metadata APIResourceMeta `json:"metadata"`
// NumSpawnedChildren The number of spawned children tasks
NumSpawnedChildren int `json:"numSpawnedChildren"`
// Output The output of the task run (for the latest run)
Output map[string]interface{} `json:"output"`
Output openapi.NonNullableJSON `json:"output"`
// StartedAt The timestamp the task run started.
StartedAt *time.Time `json:"startedAt,omitempty"`
@@ -1361,11 +1365,12 @@ type V1WorkflowRun struct {
FinishedAt *time.Time `json:"finishedAt,omitempty"`
// Input The input of the task run.
Input map[string]interface{} `json:"input"`
Metadata APIResourceMeta `json:"metadata"`
Input openapi.NonNullableJSON `json:"input"`
Metadata APIResourceMeta `json:"metadata"`
// Output The output of the task run (for the latest run)
Output map[string]interface{} `json:"output"`
Output openapi.NonNullableJSON `json:"output"`
ParentTaskExternalId *openapi_types.UUID `json:"parentTaskExternalId,omitempty"`
// StartedAt The timestamp the task run started.
StartedAt *time.Time `json:"startedAt,omitempty"`
+54 -51
View File
@@ -75,25 +75,26 @@ type ReadTaskRunMetricsOpts struct {
}
type WorkflowRunData struct {
AdditionalMetadata []byte `json:"additional_metadata"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
DisplayName string `json:"display_name"`
ErrorMessage string `json:"error_message"`
ExternalID pgtype.UUID `json:"external_id"`
FinishedAt pgtype.Timestamptz `json:"finished_at"`
Input []byte `json:"input"`
InsertedAt pgtype.Timestamptz `json:"inserted_at"`
Kind sqlcv1.V1RunKind `json:"kind"`
Output *[]byte `json:"output,omitempty"`
ReadableStatus sqlcv1.V1ReadableStatusOlap `json:"readable_status"`
StepId *pgtype.UUID `json:"step_id,omitempty"`
StartedAt pgtype.Timestamptz `json:"started_at"`
TaskExternalId *pgtype.UUID `json:"task_external_id,omitempty"`
TaskId *int64 `json:"task_id,omitempty"`
TaskInsertedAt *pgtype.Timestamptz `json:"task_inserted_at,omitempty"`
TenantID pgtype.UUID `json:"tenant_id"`
WorkflowID pgtype.UUID `json:"workflow_id"`
WorkflowVersionId pgtype.UUID `json:"workflow_version_id"`
AdditionalMetadata []byte `json:"additional_metadata"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
DisplayName string `json:"display_name"`
ErrorMessage string `json:"error_message"`
ExternalID pgtype.UUID `json:"external_id"`
FinishedAt pgtype.Timestamptz `json:"finished_at"`
Input []byte `json:"input"`
InsertedAt pgtype.Timestamptz `json:"inserted_at"`
Kind sqlcv1.V1RunKind `json:"kind"`
Output *[]byte `json:"output,omitempty"`
ParentTaskExternalId *pgtype.UUID `json:"parent_task_external_id,omitempty"`
ReadableStatus sqlcv1.V1ReadableStatusOlap `json:"readable_status"`
StepId *pgtype.UUID `json:"step_id,omitempty"`
StartedAt pgtype.Timestamptz `json:"started_at"`
TaskExternalId *pgtype.UUID `json:"task_external_id,omitempty"`
TaskId *int64 `json:"task_id,omitempty"`
TaskInsertedAt *pgtype.Timestamptz `json:"task_inserted_at,omitempty"`
TenantID pgtype.UUID `json:"tenant_id"`
WorkflowID pgtype.UUID `json:"workflow_id"`
WorkflowVersionId pgtype.UUID `json:"workflow_version_id"`
}
type V1WorkflowRunPopulator struct {
@@ -380,20 +381,21 @@ func (r *OLAPRepositoryImpl) ReadWorkflowRun(ctx context.Context, workflowRunExt
return &V1WorkflowRunPopulator{
WorkflowRun: &WorkflowRunData{
TenantID: row.TenantID,
InsertedAt: row.InsertedAt,
ExternalID: row.ExternalID,
ReadableStatus: row.ReadableStatus,
Kind: row.Kind,
WorkflowID: row.WorkflowID,
DisplayName: row.DisplayName,
AdditionalMetadata: row.AdditionalMetadata,
CreatedAt: row.CreatedAt,
StartedAt: row.StartedAt,
FinishedAt: row.FinishedAt,
ErrorMessage: row.ErrorMessage.String,
WorkflowVersionId: row.WorkflowVersionID,
Input: row.Input,
TenantID: row.TenantID,
InsertedAt: row.InsertedAt,
ExternalID: row.ExternalID,
ReadableStatus: row.ReadableStatus,
Kind: row.Kind,
WorkflowID: row.WorkflowID,
DisplayName: row.DisplayName,
AdditionalMetadata: row.AdditionalMetadata,
CreatedAt: row.CreatedAt,
StartedAt: row.StartedAt,
FinishedAt: row.FinishedAt,
ErrorMessage: row.ErrorMessage.String,
WorkflowVersionId: row.WorkflowVersionID,
Input: row.Input,
ParentTaskExternalId: &row.ParentTaskExternalID,
},
TaskMetadata: taskMetadata,
}, nil
@@ -770,24 +772,25 @@ func (r *OLAPRepositoryImpl) ListWorkflowRuns(ctx context.Context, tenantId stri
}
res = append(res, &WorkflowRunData{
TenantID: dag.TenantID,
InsertedAt: dag.InsertedAt,
ExternalID: dag.ExternalID,
WorkflowID: dag.WorkflowID,
DisplayName: dag.DisplayName,
ReadableStatus: dag.ReadableStatus,
AdditionalMetadata: dag.AdditionalMetadata,
CreatedAt: dag.CreatedAt,
StartedAt: dag.StartedAt,
FinishedAt: dag.FinishedAt,
ErrorMessage: dag.ErrorMessage.String,
Kind: sqlcv1.V1RunKindDAG,
WorkflowVersionId: dag.WorkflowVersionID,
TaskExternalId: nil,
TaskId: nil,
TaskInsertedAt: nil,
Output: &dag.Output,
Input: dag.Input,
TenantID: dag.TenantID,
InsertedAt: dag.InsertedAt,
ExternalID: dag.ExternalID,
WorkflowID: dag.WorkflowID,
DisplayName: dag.DisplayName,
ReadableStatus: dag.ReadableStatus,
AdditionalMetadata: dag.AdditionalMetadata,
CreatedAt: dag.CreatedAt,
StartedAt: dag.StartedAt,
FinishedAt: dag.FinishedAt,
ErrorMessage: dag.ErrorMessage.String,
Kind: sqlcv1.V1RunKindDAG,
WorkflowVersionId: dag.WorkflowVersionID,
TaskExternalId: nil,
TaskId: nil,
TaskInsertedAt: nil,
Output: &dag.Output,
Input: dag.Input,
ParentTaskExternalId: &dag.ParentTaskExternalID,
})
} else {
task, ok := tasksToPopulated[externalId]
+6 -3
View File
@@ -885,7 +885,8 @@ WITH input AS (
d.display_name,
d.input,
d.additional_metadata,
d.workflow_version_id
d.workflow_version_id,
d.parent_task_external_id
FROM v1_runs_olap r
JOIN v1_dags_olap d ON (r.tenant_id, r.external_id, r.inserted_at) = (d.tenant_id, d.external_id, d.inserted_at)
WHERE
@@ -1010,7 +1011,8 @@ WITH runs AS (
d.display_name AS display_name,
d.input AS input,
d.additional_metadata AS additional_metadata,
d.workflow_version_id AS workflow_version_id
d.workflow_version_id AS workflow_version_id,
d.parent_task_external_id AS parent_task_external_id
FROM
v1_lookup_table_olap lt
JOIN
@@ -1036,7 +1038,8 @@ WITH runs AS (
t.display_name AS display_name,
t.input AS input,
t.additional_metadata AS additional_metadata,
t.workflow_version_id AS workflow_version_id
t.workflow_version_id AS workflow_version_id,
NULL :: UUID AS parent_task_external_id
FROM
v1_lookup_table_olap lt
JOIN
+47 -40
View File
@@ -761,7 +761,8 @@ WITH input AS (
d.display_name,
d.input,
d.additional_metadata,
d.workflow_version_id
d.workflow_version_id,
d.parent_task_external_id
FROM v1_runs_olap r
JOIN v1_dags_olap d ON (r.tenant_id, r.external_id, r.inserted_at) = (d.tenant_id, d.external_id, d.inserted_at)
WHERE
@@ -811,7 +812,7 @@ WITH input AS (
)
SELECT
r.dag_id, r.run_id, r.tenant_id, r.inserted_at, r.external_id, r.readable_status, r.kind, r.workflow_id, r.display_name, r.input, r.additional_metadata, r.workflow_version_id,
r.dag_id, r.run_id, r.tenant_id, r.inserted_at, r.external_id, r.readable_status, r.kind, r.workflow_id, r.display_name, r.input, r.additional_metadata, r.workflow_version_id, r.parent_task_external_id,
m.created_at,
m.started_at,
m.finished_at,
@@ -831,23 +832,24 @@ type PopulateDAGMetadataParams struct {
}
type PopulateDAGMetadataRow struct {
DagID int64 `json:"dag_id"`
RunID int64 `json:"run_id"`
TenantID pgtype.UUID `json:"tenant_id"`
InsertedAt pgtype.Timestamptz `json:"inserted_at"`
ExternalID pgtype.UUID `json:"external_id"`
ReadableStatus V1ReadableStatusOlap `json:"readable_status"`
Kind V1RunKind `json:"kind"`
WorkflowID pgtype.UUID `json:"workflow_id"`
DisplayName string `json:"display_name"`
Input []byte `json:"input"`
AdditionalMetadata []byte `json:"additional_metadata"`
WorkflowVersionID pgtype.UUID `json:"workflow_version_id"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
StartedAt pgtype.Timestamptz `json:"started_at"`
FinishedAt pgtype.Timestamptz `json:"finished_at"`
ErrorMessage pgtype.Text `json:"error_message"`
Output []byte `json:"output"`
DagID int64 `json:"dag_id"`
RunID int64 `json:"run_id"`
TenantID pgtype.UUID `json:"tenant_id"`
InsertedAt pgtype.Timestamptz `json:"inserted_at"`
ExternalID pgtype.UUID `json:"external_id"`
ReadableStatus V1ReadableStatusOlap `json:"readable_status"`
Kind V1RunKind `json:"kind"`
WorkflowID pgtype.UUID `json:"workflow_id"`
DisplayName string `json:"display_name"`
Input []byte `json:"input"`
AdditionalMetadata []byte `json:"additional_metadata"`
WorkflowVersionID pgtype.UUID `json:"workflow_version_id"`
ParentTaskExternalID pgtype.UUID `json:"parent_task_external_id"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
StartedAt pgtype.Timestamptz `json:"started_at"`
FinishedAt pgtype.Timestamptz `json:"finished_at"`
ErrorMessage pgtype.Text `json:"error_message"`
Output []byte `json:"output"`
}
func (q *Queries) PopulateDAGMetadata(ctx context.Context, db DBTX, arg PopulateDAGMetadataParams) ([]*PopulateDAGMetadataRow, error) {
@@ -872,6 +874,7 @@ func (q *Queries) PopulateDAGMetadata(ctx context.Context, db DBTX, arg Populate
&i.Input,
&i.AdditionalMetadata,
&i.WorkflowVersionID,
&i.ParentTaskExternalID,
&i.CreatedAt,
&i.StartedAt,
&i.FinishedAt,
@@ -1414,7 +1417,8 @@ WITH runs AS (
d.display_name AS display_name,
d.input AS input,
d.additional_metadata AS additional_metadata,
d.workflow_version_id AS workflow_version_id
d.workflow_version_id AS workflow_version_id,
d.parent_task_external_id AS parent_task_external_id
FROM
v1_lookup_table_olap lt
JOIN
@@ -1440,7 +1444,8 @@ WITH runs AS (
t.display_name AS display_name,
t.input AS input,
t.additional_metadata AS additional_metadata,
t.workflow_version_id AS workflow_version_id
t.workflow_version_id AS workflow_version_id,
NULL :: UUID AS parent_task_external_id
FROM
v1_lookup_table_olap lt
JOIN
@@ -1490,7 +1495,7 @@ WITH runs AS (
LIMIT 1
)
SELECT
r.dag_id, r.task_id, r.id, r.tenant_id, r.inserted_at, r.external_id, r.readable_status, r.kind, r.workflow_id, r.display_name, r.input, r.additional_metadata, r.workflow_version_id,
r.dag_id, r.task_id, r.id, r.tenant_id, r.inserted_at, r.external_id, r.readable_status, r.kind, r.workflow_id, r.display_name, r.input, r.additional_metadata, r.workflow_version_id, r.parent_task_external_id,
m.created_at,
m.started_at,
m.finished_at,
@@ -1503,24 +1508,25 @@ ORDER BY r.inserted_at DESC
`
type ReadWorkflowRunByExternalIdRow struct {
DagID pgtype.Int8 `json:"dag_id"`
TaskID pgtype.Int8 `json:"task_id"`
ID int64 `json:"id"`
TenantID pgtype.UUID `json:"tenant_id"`
InsertedAt pgtype.Timestamptz `json:"inserted_at"`
ExternalID pgtype.UUID `json:"external_id"`
ReadableStatus V1ReadableStatusOlap `json:"readable_status"`
Kind V1RunKind `json:"kind"`
WorkflowID pgtype.UUID `json:"workflow_id"`
DisplayName string `json:"display_name"`
Input []byte `json:"input"`
AdditionalMetadata []byte `json:"additional_metadata"`
WorkflowVersionID pgtype.UUID `json:"workflow_version_id"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
StartedAt pgtype.Timestamptz `json:"started_at"`
FinishedAt pgtype.Timestamptz `json:"finished_at"`
ErrorMessage pgtype.Text `json:"error_message"`
TaskMetadata []byte `json:"task_metadata"`
DagID pgtype.Int8 `json:"dag_id"`
TaskID pgtype.Int8 `json:"task_id"`
ID int64 `json:"id"`
TenantID pgtype.UUID `json:"tenant_id"`
InsertedAt pgtype.Timestamptz `json:"inserted_at"`
ExternalID pgtype.UUID `json:"external_id"`
ReadableStatus V1ReadableStatusOlap `json:"readable_status"`
Kind V1RunKind `json:"kind"`
WorkflowID pgtype.UUID `json:"workflow_id"`
DisplayName string `json:"display_name"`
Input []byte `json:"input"`
AdditionalMetadata []byte `json:"additional_metadata"`
WorkflowVersionID pgtype.UUID `json:"workflow_version_id"`
ParentTaskExternalID pgtype.UUID `json:"parent_task_external_id"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
StartedAt pgtype.Timestamptz `json:"started_at"`
FinishedAt pgtype.Timestamptz `json:"finished_at"`
ErrorMessage pgtype.Text `json:"error_message"`
TaskMetadata []byte `json:"task_metadata"`
}
func (q *Queries) ReadWorkflowRunByExternalId(ctx context.Context, db DBTX, workflowrunexternalid pgtype.UUID) (*ReadWorkflowRunByExternalIdRow, error) {
@@ -1540,6 +1546,7 @@ func (q *Queries) ReadWorkflowRunByExternalId(ctx context.Context, db DBTX, work
&i.Input,
&i.AdditionalMetadata,
&i.WorkflowVersionID,
&i.ParentTaskExternalID,
&i.CreatedAt,
&i.StartedAt,
&i.FinishedAt,