flightdeck 0.2.3 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/flightdeck.$configPath.schema.json +3 -0
- package/dist/flightdeck.bin.js +6 -6071
- package/dist/flightdeck.main.schema.json +3 -0
- package/dist/flightdeck_log.json +68 -0
- package/dist/klaxon.bin.js +3 -88
- package/dist/lib.d.ts +891 -2
- package/dist/lib.js +6 -6030
- package/gen/.gitkeep +0 -0
- package/gen/flightdeck_log.json +168 -0
- package/gen/lnav-format-schema.gen.ts +1558 -0
- package/package.json +15 -11
- package/src/flightdeck.bin.ts +20 -2
- package/src/flightdeck.lib.ts +233 -30
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://lnav.org/schemas/format-v1.schema.json",
|
|
3
|
+
"flightdeck_log": {
|
|
4
|
+
"title": "FlightDeck Log",
|
|
5
|
+
"description": "Format for events logged by the FlightDeck process manager.",
|
|
6
|
+
"file-type": "json",
|
|
7
|
+
"timestamp-field": "timestamp",
|
|
8
|
+
"subsecond-field": "subsecond",
|
|
9
|
+
"subsecond-units": "milli",
|
|
10
|
+
"opid-field": "service",
|
|
11
|
+
"level-field": "level",
|
|
12
|
+
"level": {
|
|
13
|
+
"info": "info",
|
|
14
|
+
"warning": "warn",
|
|
15
|
+
"error": "err!"
|
|
16
|
+
},
|
|
17
|
+
"ordered-by-time": true,
|
|
18
|
+
"line-format": [
|
|
19
|
+
{
|
|
20
|
+
"field": "__level__"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"prefix": " ",
|
|
24
|
+
"field": "__timestamp__",
|
|
25
|
+
"timestamp-format": "%Y-%m-%dT%H:%M:%S.%L%Z"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"prefix": " ",
|
|
29
|
+
"field": "package"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"prefix": "::",
|
|
33
|
+
"field": "service",
|
|
34
|
+
"default-value": ""
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"prefix": "[",
|
|
38
|
+
"field": "process",
|
|
39
|
+
"suffix": "]",
|
|
40
|
+
"min-width": 5
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"prefix": ": ",
|
|
44
|
+
"field": "body"
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"value": {
|
|
48
|
+
"timestamp": {
|
|
49
|
+
"kind": "integer"
|
|
50
|
+
},
|
|
51
|
+
"level": {
|
|
52
|
+
"kind": "string"
|
|
53
|
+
},
|
|
54
|
+
"package": {
|
|
55
|
+
"kind": "string"
|
|
56
|
+
},
|
|
57
|
+
"service": {
|
|
58
|
+
"kind": "string"
|
|
59
|
+
},
|
|
60
|
+
"process": {
|
|
61
|
+
"kind": "integer"
|
|
62
|
+
},
|
|
63
|
+
"body": {
|
|
64
|
+
"kind": "string"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
package/dist/klaxon.bin.js
CHANGED
|
@@ -1,90 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
var L=Object.defineProperty;var M=(q,w)=>{for(var x in w)L(q,x,{get:w[x],enumerable:!0,configurable:!0,set:(y)=>w[x]=()=>y})};import{cli as N,required as O}from"comline";import{z as j}from"zod";var E={};M(E,{scramble:()=>B,alert:()=>D});async function D({secret:q,endpoint:w,version:x}){return await fetch(w,{method:"POST",headers:{"Content-Type":"text/plain;charset=UTF-8",Authorization:`Bearer ${q}`},body:x})}async function B({packageConfig:q,secretsConfig:w,publishedPackages:x}){let y=[];for(let z of x)if(z.name in q){let A=z.name,{endpoint:G}=q[A],H=w[A],I=z.version,J=D({secret:H,endpoint:G,version:I}).then((K)=>[A,K]);y.push(J)}let F=await Promise.all(y);return Object.fromEntries(F)}var Q=j.object({packageConfig:j.record(j.string(),j.object({endpoint:j.string()})),secretsConfig:j.record(j.string(),j.string()),publishedPackages:j.array(j.object({name:j.string(),version:j.string()}))}),T=N({cliName:"klaxon",routes:O({scramble:null}),routeOptions:{scramble:{options:{packageConfig:{description:"Maps the names of your packages to the endpoints that klaxon will POST to.",example:'--packageConfig="{\\"my-app\\":{\\"endpoint\\":\\"https://my-app.com\\"}}"',flag:"c",parse:JSON.parse,required:!0},secretsConfig:{description:"Maps the names of your packages to the secrets that klaxon will use to authenticate with their respective endpoints.",example:'--secretsConfig="{\\"my-app\\":\\"XXXX-XXXX-XXXX\\"}"',flag:"s",parse:JSON.parse,required:!0},publishedPackages:{description:'The output of the "Publish" step in Changesets.',example:'--publishedPackages="[{\\"name\\":\\"my-app\\",\\"version\\":\\"0.0.0\\"}]"',flag:"p",parse:JSON.parse,required:!0}},optionsSchema:Q}}}),{inputs:U}=T(process.argv);await B(U.opts).then((q)=>{console.log(q)});
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import { z } from "zod";
|
|
6
|
-
|
|
7
|
-
// src/klaxon.lib.ts
|
|
8
|
-
async function alert({
|
|
9
|
-
secret,
|
|
10
|
-
endpoint,
|
|
11
|
-
version
|
|
12
|
-
}) {
|
|
13
|
-
const response = await fetch(endpoint, {
|
|
14
|
-
method: `POST`,
|
|
15
|
-
headers: {
|
|
16
|
-
"Content-Type": `text/plain;charset=UTF-8`,
|
|
17
|
-
Authorization: `Bearer ${secret}`
|
|
18
|
-
},
|
|
19
|
-
body: version
|
|
20
|
-
});
|
|
21
|
-
return response;
|
|
22
|
-
}
|
|
23
|
-
async function scramble({
|
|
24
|
-
packageConfig,
|
|
25
|
-
secretsConfig,
|
|
26
|
-
publishedPackages
|
|
27
|
-
}) {
|
|
28
|
-
const alertResults = [];
|
|
29
|
-
for (const publishedPackage of publishedPackages) {
|
|
30
|
-
if (publishedPackage.name in packageConfig) {
|
|
31
|
-
const name = publishedPackage.name;
|
|
32
|
-
const { endpoint } = packageConfig[name];
|
|
33
|
-
const secret = secretsConfig[name];
|
|
34
|
-
const version = publishedPackage.version;
|
|
35
|
-
const alertResultPromise = alert({ secret, endpoint, version }).then((alertResult) => [name, alertResult]);
|
|
36
|
-
alertResults.push(alertResultPromise);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
const alertResultsResolved = await Promise.all(alertResults);
|
|
40
|
-
const scrambleResult = Object.fromEntries(alertResultsResolved);
|
|
41
|
-
return scrambleResult;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// src/klaxon.bin.ts
|
|
45
|
-
var changesetsPublishedPackagesSchema = z.object({
|
|
46
|
-
packageConfig: z.record(z.string(), z.object({ endpoint: z.string() })),
|
|
47
|
-
secretsConfig: z.record(z.string(), z.string()),
|
|
48
|
-
publishedPackages: z.array(z.object({
|
|
49
|
-
name: z.string(),
|
|
50
|
-
version: z.string()
|
|
51
|
-
}))
|
|
52
|
-
});
|
|
53
|
-
var klaxon = cli({
|
|
54
|
-
cliName: `klaxon`,
|
|
55
|
-
routes: required({
|
|
56
|
-
scramble: null
|
|
57
|
-
}),
|
|
58
|
-
routeOptions: {
|
|
59
|
-
scramble: {
|
|
60
|
-
options: {
|
|
61
|
-
packageConfig: {
|
|
62
|
-
description: `Maps the names of your packages to the endpoints that klaxon will POST to.`,
|
|
63
|
-
example: `--packageConfig="{\\"my-app\\":{\\"endpoint\\":\\"https://my-app.com\\"}}"`,
|
|
64
|
-
flag: `c`,
|
|
65
|
-
parse: JSON.parse,
|
|
66
|
-
required: true
|
|
67
|
-
},
|
|
68
|
-
secretsConfig: {
|
|
69
|
-
description: `Maps the names of your packages to the secrets that klaxon will use to authenticate with their respective endpoints.`,
|
|
70
|
-
example: `--secretsConfig="{\\"my-app\\":\\"XXXX-XXXX-XXXX\\"}"`,
|
|
71
|
-
flag: `s`,
|
|
72
|
-
parse: JSON.parse,
|
|
73
|
-
required: true
|
|
74
|
-
},
|
|
75
|
-
publishedPackages: {
|
|
76
|
-
description: `The output of the "Publish" step in Changesets.`,
|
|
77
|
-
example: `--publishedPackages="[{\\"name\\":\\"my-app\\",\\"version\\":\\"0.0.0\\"}]"`,
|
|
78
|
-
flag: `p`,
|
|
79
|
-
parse: JSON.parse,
|
|
80
|
-
required: true
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
optionsSchema: changesetsPublishedPackagesSchema
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
var { inputs } = klaxon(process.argv);
|
|
88
|
-
await scramble(inputs.opts).then((scrambleResult) => {
|
|
89
|
-
console.log(scrambleResult);
|
|
90
|
-
});
|
|
4
|
+
//# debugId=F19DE54014786B8464756E2164756E21
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2tsYXhvbi5iaW4udHMiLCAiLi4vc3JjL2tsYXhvbi5saWIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgeyBjbGksIHJlcXVpcmVkIH0gZnJvbSBcImNvbWxpbmVcIlxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIlxuXG5pbXBvcnQgKiBhcyBLbGF4b24gZnJvbSBcIi4va2xheG9uLmxpYlwiXG5cbmNvbnN0IGNoYW5nZXNldHNQdWJsaXNoZWRQYWNrYWdlc1NjaGVtYTogei5ab2RTY2hlbWE8S2xheG9uLlNjcmFtYmxlT3B0aW9ucz4gPVxuXHR6Lm9iamVjdCh7XG5cdFx0cGFja2FnZUNvbmZpZzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5vYmplY3QoeyBlbmRwb2ludDogei5zdHJpbmcoKSB9KSksXG5cdFx0c2VjcmV0c0NvbmZpZzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSksXG5cdFx0cHVibGlzaGVkUGFja2FnZXM6IHouYXJyYXkoXG5cdFx0XHR6Lm9iamVjdCh7XG5cdFx0XHRcdG5hbWU6IHouc3RyaW5nKCksXG5cdFx0XHRcdHZlcnNpb246IHouc3RyaW5nKCksXG5cdFx0XHR9KSxcblx0XHQpLFxuXHR9KVxuXG5jb25zdCBrbGF4b24gPSBjbGkoe1xuXHRjbGlOYW1lOiBga2xheG9uYCxcblx0cm91dGVzOiByZXF1aXJlZCh7XG5cdFx0c2NyYW1ibGU6IG51bGwsXG5cdH0pLFxuXHRyb3V0ZU9wdGlvbnM6IHtcblx0XHRzY3JhbWJsZToge1xuXHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRwYWNrYWdlQ29uZmlnOiB7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IGBNYXBzIHRoZSBuYW1lcyBvZiB5b3VyIHBhY2thZ2VzIHRvIHRoZSBlbmRwb2ludHMgdGhhdCBrbGF4b24gd2lsbCBQT1NUIHRvLmAsXG5cdFx0XHRcdFx0ZXhhbXBsZTogYC0tcGFja2FnZUNvbmZpZz1cIntcXFxcXCJteS1hcHBcXFxcXCI6e1xcXFxcImVuZHBvaW50XFxcXFwiOlxcXFxcImh0dHBzOi8vbXktYXBwLmNvbVxcXFxcIn19XCJgLFxuXHRcdFx0XHRcdGZsYWc6IGBjYCxcblx0XHRcdFx0XHRwYXJzZTogSlNPTi5wYXJzZSxcblx0XHRcdFx0XHRyZXF1aXJlZDogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0c2VjcmV0c0NvbmZpZzoge1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBgTWFwcyB0aGUgbmFtZXMgb2YgeW91ciBwYWNrYWdlcyB0byB0aGUgc2VjcmV0cyB0aGF0IGtsYXhvbiB3aWxsIHVzZSB0byBhdXRoZW50aWNhdGUgd2l0aCB0aGVpciByZXNwZWN0aXZlIGVuZHBvaW50cy5gLFxuXHRcdFx0XHRcdGV4YW1wbGU6IGAtLXNlY3JldHNDb25maWc9XCJ7XFxcXFwibXktYXBwXFxcXFwiOlxcXFxcIlhYWFgtWFhYWC1YWFhYXFxcXFwifVwiYCxcblx0XHRcdFx0XHRmbGFnOiBgc2AsXG5cdFx0XHRcdFx0cGFyc2U6IEpTT04ucGFyc2UsXG5cdFx0XHRcdFx0cmVxdWlyZWQ6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHB1Ymxpc2hlZFBhY2thZ2VzOiB7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IGBUaGUgb3V0cHV0IG9mIHRoZSBcIlB1Ymxpc2hcIiBzdGVwIGluIENoYW5nZXNldHMuYCxcblx0XHRcdFx0XHRleGFtcGxlOiBgLS1wdWJsaXNoZWRQYWNrYWdlcz1cIlt7XFxcXFwibmFtZVxcXFxcIjpcXFxcXCJteS1hcHBcXFxcXCIsXFxcXFwidmVyc2lvblxcXFxcIjpcXFxcXCIwLjAuMFxcXFxcIn1dXCJgLFxuXHRcdFx0XHRcdGZsYWc6IGBwYCxcblx0XHRcdFx0XHRwYXJzZTogSlNPTi5wYXJzZSxcblx0XHRcdFx0XHRyZXF1aXJlZDogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRvcHRpb25zU2NoZW1hOiBjaGFuZ2VzZXRzUHVibGlzaGVkUGFja2FnZXNTY2hlbWEsXG5cdFx0fSxcblx0fSxcbn0pXG5cbmNvbnN0IHsgaW5wdXRzIH0gPSBrbGF4b24ocHJvY2Vzcy5hcmd2KVxuYXdhaXQgS2xheG9uLnNjcmFtYmxlKGlucHV0cy5vcHRzKS50aGVuKChzY3JhbWJsZVJlc3VsdCkgPT4ge1xuXHRjb25zb2xlLmxvZyhzY3JhbWJsZVJlc3VsdClcbn0pXG4iLAogICAgImV4cG9ydCB0eXBlIEFsZXJ0T3B0aW9ucyA9IHtcblx0c2VjcmV0OiBzdHJpbmdcblx0ZW5kcG9pbnQ6IHN0cmluZ1xuXHR2ZXJzaW9uOiBzdHJpbmdcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFsZXJ0KHtcblx0c2VjcmV0LFxuXHRlbmRwb2ludCxcblx0dmVyc2lvbixcbn06IEFsZXJ0T3B0aW9ucyk6IFByb21pc2U8UmVzcG9uc2U+IHtcblx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChlbmRwb2ludCwge1xuXHRcdG1ldGhvZDogYFBPU1RgLFxuXHRcdGhlYWRlcnM6IHtcblx0XHRcdFwiQ29udGVudC1UeXBlXCI6IGB0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLThgLFxuXHRcdFx0QXV0aG9yaXphdGlvbjogYEJlYXJlciAke3NlY3JldH1gLFxuXHRcdH0sXG5cdFx0Ym9keTogdmVyc2lvbixcblx0fSlcblxuXHRyZXR1cm4gcmVzcG9uc2Vcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFuZ2VzZXRzL2FjdGlvbi9ibG9iL21haW4vc3JjL3J1bi50c1xuICovXG5leHBvcnQgdHlwZSBDaGFuZ2VzZXRzUHVibGlzaGVkUGFja2FnZSA9IHtcblx0bmFtZTogc3RyaW5nXG5cdHZlcnNpb246IHN0cmluZ1xufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYW5nZXNldHMvYWN0aW9uL2Jsb2IvbWFpbi9zcmMvcnVuLnRzXG4gKi9cbmV4cG9ydCB0eXBlIENoYW5nZXNldHNQdWJsaXNoUmVzdWx0ID1cblx0fCB7XG5cdFx0XHRwdWJsaXNoZWQ6IHRydWVcblx0XHRcdHB1Ymxpc2hlZFBhY2thZ2VzOiBDaGFuZ2VzZXRzUHVibGlzaGVkUGFja2FnZVtdXG5cdCAgfVxuXHR8IHsgcHVibGlzaGVkOiBmYWxzZSB9XG5cbmV4cG9ydCB0eXBlIFBhY2thZ2VDb25maWc8SyBleHRlbmRzIHN0cmluZz4gPSB7XG5cdFtrZXkgaW4gS106IHsgZW5kcG9pbnQ6IHN0cmluZyB9XG59XG5leHBvcnQgdHlwZSBTZWNyZXRzQ29uZmlnPEsgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuXHRba2V5IGluIEtdOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgU2NyYW1ibGVPcHRpb25zPEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0ge1xuXHRwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnPEs+XG5cdHNlY3JldHNDb25maWc6IFNlY3JldHNDb25maWc8Sz5cblx0cHVibGlzaGVkUGFja2FnZXM6IENoYW5nZXNldHNQdWJsaXNoZWRQYWNrYWdlW11cbn1cblxuZXhwb3J0IHR5cGUgU2NyYW1ibGVSZXN1bHQ8SyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XG5cdFtrZXkgaW4gS106IFJlc3BvbnNlXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzY3JhbWJsZTxLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPih7XG5cdHBhY2thZ2VDb25maWcsXG5cdHNlY3JldHNDb25maWcsXG5cdHB1Ymxpc2hlZFBhY2thZ2VzLFxufTogU2NyYW1ibGVPcHRpb25zPEs+KTogUHJvbWlzZTxTY3JhbWJsZVJlc3VsdDxLPj4ge1xuXHRjb25zdCBhbGVydFJlc3VsdHM6IFByb21pc2U8cmVhZG9ubHkgW0ssIFJlc3BvbnNlXT5bXSA9IFtdXG5cdGZvciAoY29uc3QgcHVibGlzaGVkUGFja2FnZSBvZiBwdWJsaXNoZWRQYWNrYWdlcykge1xuXHRcdGlmIChwdWJsaXNoZWRQYWNrYWdlLm5hbWUgaW4gcGFja2FnZUNvbmZpZykge1xuXHRcdFx0Y29uc3QgbmFtZSA9IHB1Ymxpc2hlZFBhY2thZ2UubmFtZSBhcyBLXG5cdFx0XHRjb25zdCB7IGVuZHBvaW50IH0gPSBwYWNrYWdlQ29uZmlnW25hbWVdXG5cdFx0XHRjb25zdCBzZWNyZXQgPSBzZWNyZXRzQ29uZmlnW25hbWVdXG5cdFx0XHRjb25zdCB2ZXJzaW9uID0gcHVibGlzaGVkUGFja2FnZS52ZXJzaW9uXG5cdFx0XHRjb25zdCBhbGVydFJlc3VsdFByb21pc2UgPSBhbGVydCh7IHNlY3JldCwgZW5kcG9pbnQsIHZlcnNpb24gfSkudGhlbihcblx0XHRcdFx0KGFsZXJ0UmVzdWx0KSA9PiBbbmFtZSwgYWxlcnRSZXN1bHRdIGFzIGNvbnN0LFxuXHRcdFx0KVxuXHRcdFx0YWxlcnRSZXN1bHRzLnB1c2goYWxlcnRSZXN1bHRQcm9taXNlKVxuXHRcdH1cblx0fVxuXHRjb25zdCBhbGVydFJlc3VsdHNSZXNvbHZlZCA9IGF3YWl0IFByb21pc2UuYWxsKGFsZXJ0UmVzdWx0cylcblx0Y29uc3Qgc2NyYW1ibGVSZXN1bHQgPSBPYmplY3QuZnJvbUVudHJpZXMoXG5cdFx0YWxlcnRSZXN1bHRzUmVzb2x2ZWQsXG5cdCkgYXMgU2NyYW1ibGVSZXN1bHQ8Sz5cblx0cmV0dXJuIHNjcmFtYmxlUmVzdWx0XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzhIQUVBLGNBQVMsY0FBSyxnQkFDZCxZQUFTLHVEQ0dULGVBQXNCLENBQUssRUFDMUIsU0FDQSxXQUNBLFdBQ21DLENBVW5DLE9BVGlCLE1BQU0sTUFBTSxFQUFVLENBQ3RDLE9BQVEsT0FDUixRQUFTLENBQ1IsZUFBZ0IsMkJBQ2hCLGNBQWUsVUFBVSxHQUMxQixFQUNBLEtBQU0sQ0FDUCxDQUFDLEVBd0NGLGVBQXNCLENBQW1DLEVBQ3hELGdCQUNBLGdCQUNBLHFCQUNrRCxDQUNsRCxJQUFNLEVBQWtELENBQUMsRUFDekQsUUFBVyxLQUFvQixFQUM5QixHQUFJLEVBQWlCLFFBQVEsRUFBZSxDQUMzQyxJQUFNLEVBQU8sRUFBaUIsTUFDdEIsWUFBYSxFQUFjLEdBQzdCLEVBQVMsRUFBYyxHQUN2QixFQUFVLEVBQWlCLFFBQzNCLEVBQXFCLEVBQU0sQ0FBRSxTQUFRLFdBQVUsU0FBUSxDQUFDLEVBQUUsS0FDL0QsQ0FBQyxJQUFnQixDQUFDLEVBQU0sQ0FBVyxDQUNwQyxFQUNBLEVBQWEsS0FBSyxDQUFrQixFQUd0QyxJQUFNLEVBQXVCLE1BQU0sUUFBUSxJQUFJLENBQVksRUFJM0QsT0FIdUIsT0FBTyxZQUM3QixDQUNELEVEeEVELElBQU0sRUFDTCxFQUFFLE9BQU8sQ0FDUixjQUFlLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRyxFQUFFLE9BQU8sQ0FBRSxTQUFVLEVBQUUsT0FBTyxDQUFFLENBQUMsQ0FBQyxFQUN0RSxjQUFlLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRyxFQUFFLE9BQU8sQ0FBQyxFQUM5QyxrQkFBbUIsRUFBRSxNQUNwQixFQUFFLE9BQU8sQ0FDUixLQUFNLEVBQUUsT0FBTyxFQUNmLFFBQVMsRUFBRSxPQUFPLENBQ25CLENBQUMsQ0FDRixDQUNELENBQUMsRUFFSSxFQUFTLEVBQUksQ0FDbEIsUUFBUyxTQUNULE9BQVEsRUFBUyxDQUNoQixTQUFVLElBQ1gsQ0FBQyxFQUNELGFBQWMsQ0FDYixTQUFVLENBQ1QsUUFBUyxDQUNSLGNBQWUsQ0FDZCxZQUFhLDZFQUNiLFFBQVMsNkVBQ1QsS0FBTSxJQUNOLE1BQU8sS0FBSyxNQUNaLFNBQVUsRUFDWCxFQUNBLGNBQWUsQ0FDZCxZQUFhLHVIQUNiLFFBQVMsd0RBQ1QsS0FBTSxJQUNOLE1BQU8sS0FBSyxNQUNaLFNBQVUsRUFDWCxFQUNBLGtCQUFtQixDQUNsQixZQUFhLGtEQUNiLFFBQVMsOEVBQ1QsS0FBTSxJQUNOLE1BQU8sS0FBSyxNQUNaLFNBQVUsRUFDWCxDQUNELEVBQ0EsY0FBZSxDQUNoQixDQUNELENBQ0QsQ0FBQyxHQUVPLFVBQVcsRUFBTyxRQUFRLElBQUksRUFDdEMsTUFBYSxFQUFTLEVBQU8sSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFtQixDQUMzRCxRQUFRLElBQUksQ0FBYyxFQUMxQiIsCiAgImRlYnVnSWQiOiAiRjE5REU1NDAxNDc4NkI4NDY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|