@pipeline-builder/pipeline-data 4.3.10 → 4.3.12
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/lib/api/managed-toolchain.d.ts +199 -0
- package/lib/api/managed-toolchain.js +445 -0
- package/lib/api/reporting/ingest.js +52 -12
- package/lib/api/reporting/toolchain-runs.d.ts +162 -0
- package/lib/api/reporting/toolchain-runs.js +268 -0
- package/lib/api/reporting/types.d.ts +17 -1
- package/lib/api/reporting/types.js +1 -1
- package/lib/api/version-references.d.ts +2 -24
- package/lib/api/version-references.js +46 -7
- package/lib/database/drizzle-schema.d.ts +650 -0
- package/lib/database/drizzle-schema.js +11 -1
- package/lib/database/index.d.ts +1 -1
- package/lib/database/index.js +2 -2
- package/lib/database/schema/ecosystem.d.ts +55 -0
- package/lib/database/schema/ecosystem.js +13 -2
- package/lib/database/schema/pipeline.d.ts +19 -0
- package/lib/database/schema/pipeline.js +17 -1
- package/lib/database/schema/toolchain.d.ts +643 -0
- package/lib/database/schema/toolchain.js +102 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +5 -1
- package/lib/testing/exports.json +39 -0
- package/package.json +3 -3
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Toolchain RUN DATA (docs/plans/bootstrap-image-versioning.md §6, §7, §9):
|
|
5
|
+
* which managed toolchain release each `synth` / `self-mutation` action ran on,
|
|
6
|
+
* and the two queries built over those rows — the canary gate and the Affected
|
|
7
|
+
* view.
|
|
8
|
+
*
|
|
9
|
+
* WHERE THE RELEASE COMES FROM. pipeline-events is a Lambda in the CUSTOMER's
|
|
10
|
+
* account; everything it posts is customer-controlled, and the tags it reads
|
|
11
|
+
* are cached for 15 minutes. So the release is never read from the payload or
|
|
12
|
+
* a tag: the ingest joins the event to the PLATFORM's deployed step manifest
|
|
13
|
+
* for that pipeline (`pipeline_step_manifests`, written by the registry POST
|
|
14
|
+
* after a deploy) and takes the release from its `build-image` entry — the
|
|
15
|
+
* `pipeline-bootstrap` row, whose version IS the release (both halves share
|
|
16
|
+
* it). The manifest is replaced on every deploy, so it is the release the
|
|
17
|
+
* pipeline was deployed with when the event arrives.
|
|
18
|
+
*
|
|
19
|
+
* THE GATE IS ADVISORY. Outcomes are customer-reported (the events Lambda and
|
|
20
|
+
* its key live in the customer's account), so a canary org could forge them.
|
|
21
|
+
* Each org therefore counts for at most `ceil(N / M)` runs, so one org cannot
|
|
22
|
+
* satisfy the gate alone; the release comes from the platform's manifest; and
|
|
23
|
+
* the gate only informs a human — an override records a reason.
|
|
24
|
+
*/
|
|
25
|
+
import { BUILD_IMAGE_STEP_KEY } from '@pipeline-builder/api-core';
|
|
26
|
+
import { sql } from 'drizzle-orm';
|
|
27
|
+
import { executeRows } from '../../database/pg-result.js';
|
|
28
|
+
/**
|
|
29
|
+
* CDK Pipelines' self-mutation action: a fixed stage and action name
|
|
30
|
+
* (`aws-cdk-lib/pipelines/lib/codepipeline/codepipeline.js`).
|
|
31
|
+
*/
|
|
32
|
+
export const SELF_MUTATION_STAGE = 'UpdatePipeline';
|
|
33
|
+
export const SELF_MUTATION_ACTION = 'SelfMutate';
|
|
34
|
+
/**
|
|
35
|
+
* The synth step's `stepKey` in the step manifest (`pluginStepLabel(null, …)`).
|
|
36
|
+
* The synth ACTION's name is a generated id, so it is identified by the
|
|
37
|
+
* manifest row carrying this key — the names the built pipeline really used.
|
|
38
|
+
*/
|
|
39
|
+
export const SYNTH_STEP_KEY = 'synth';
|
|
40
|
+
/**
|
|
41
|
+
* The `build-image` entry's plugin: the release's bootstrap half. The entry is
|
|
42
|
+
* the manifest's non-step row under `step_key` {@link BUILD_IMAGE_STEP_KEY}
|
|
43
|
+
* (api-core `BUILD_IMAGE_MANIFEST_*`), and its `plugin_version` IS the release.
|
|
44
|
+
*/
|
|
45
|
+
export const BUILD_IMAGE_PLUGIN = 'pipeline-bootstrap';
|
|
46
|
+
const RELEASE_VERSION_RE = /^\d+\.\d+\.\d+$/;
|
|
47
|
+
/**
|
|
48
|
+
* Each pipeline's deployed toolchain, from its manifest rows. A pipeline
|
|
49
|
+
* whose manifest records no `build-image` entry (deployed before releases, or
|
|
50
|
+
* a placeholder bootstrap) has none, and its actions are not stamped. Only an
|
|
51
|
+
* OWN-ORG row (no publisher) counts: a managed name can never be a listing.
|
|
52
|
+
*/
|
|
53
|
+
export function deployedToolchainOf(rows) {
|
|
54
|
+
const release = new Map();
|
|
55
|
+
const synth = new Map();
|
|
56
|
+
for (const r of rows) {
|
|
57
|
+
if (r.stepKey === BUILD_IMAGE_STEP_KEY && r.pluginName === BUILD_IMAGE_PLUGIN && r.pluginPublisher === null
|
|
58
|
+
&& typeof r.pluginVersion === 'string' && RELEASE_VERSION_RE.test(r.pluginVersion)) {
|
|
59
|
+
release.set(r.pipelineId, { orgId: r.orgId, releaseVersion: r.pluginVersion });
|
|
60
|
+
}
|
|
61
|
+
if (r.stepKey === SYNTH_STEP_KEY)
|
|
62
|
+
synth.set(r.pipelineId, { stageName: r.stageName, actionName: r.actionName });
|
|
63
|
+
}
|
|
64
|
+
const out = new Map();
|
|
65
|
+
for (const [pipelineId, r] of release)
|
|
66
|
+
out.set(pipelineId, { ...r, synth: synth.get(pipelineId) ?? null });
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Which toolchain action (if any) an ACTION event is, given its pipeline's
|
|
71
|
+
* deployed toolchain. Names are compared post-scrub, as the manifest stores them.
|
|
72
|
+
*/
|
|
73
|
+
export function toolchainActionOf(event, deployed) {
|
|
74
|
+
if (event.eventType !== 'ACTION' || !deployed || !event.stageName || !event.actionName)
|
|
75
|
+
return null;
|
|
76
|
+
if (event.stageName === SELF_MUTATION_STAGE && event.actionName === SELF_MUTATION_ACTION)
|
|
77
|
+
return 'self-mutation';
|
|
78
|
+
if (deployed.synth && event.stageName === deployed.synth.stageName && event.actionName === deployed.synth.actionName)
|
|
79
|
+
return 'synth';
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
/** The terminal outcome of a status, or null for a non-terminal / non-judging one. */
|
|
83
|
+
export function toolchainOutcomeOf(status) {
|
|
84
|
+
if (status === 'SUCCEEDED')
|
|
85
|
+
return 'succeeded';
|
|
86
|
+
if (status === 'FAILED')
|
|
87
|
+
return 'failed';
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
/** SQL: a stamped row's action (stamped rows are synth or self-mutation only). */
|
|
91
|
+
const IS_SELF_MUTATION = sql `(e.stage_name = ${SELF_MUTATION_STAGE} AND e.action_name = ${SELF_MUTATION_ACTION})`;
|
|
92
|
+
export const DEFAULT_CANARY_GATE = Object.freeze({
|
|
93
|
+
minRuns: 20,
|
|
94
|
+
minOrgs: 2,
|
|
95
|
+
maxFailurePointsAboveDefault: 5,
|
|
96
|
+
});
|
|
97
|
+
/** Round to 2 dp, so the numbers the console shows are stable. */
|
|
98
|
+
function r2(n) {
|
|
99
|
+
return Math.round(n * 100) / 100;
|
|
100
|
+
}
|
|
101
|
+
function resolveParams(p) {
|
|
102
|
+
const merged = { ...DEFAULT_CANARY_GATE, ...(p ?? {}) };
|
|
103
|
+
const minRuns = Math.max(1, Math.floor(merged.minRuns));
|
|
104
|
+
const minOrgs = Math.max(1, Math.floor(merged.minOrgs));
|
|
105
|
+
const maxFailurePointsAboveDefault = Math.max(0, merged.maxFailurePointsAboveDefault);
|
|
106
|
+
if (![minRuns, minOrgs, maxFailurePointsAboveDefault].every(Number.isFinite))
|
|
107
|
+
return { ...DEFAULT_CANARY_GATE };
|
|
108
|
+
return { minRuns, minOrgs, maxFailurePointsAboveDefault };
|
|
109
|
+
}
|
|
110
|
+
/** The per-org contribution cap: ceil(N / M). */
|
|
111
|
+
export function canaryPerOrgCap(params) {
|
|
112
|
+
return Math.ceil(params.minRuns / params.minOrgs);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* The canary gate: at least N counted synth runs across at least M orgs, and a
|
|
116
|
+
* failure rate within T points of the current default's. Each org counts its
|
|
117
|
+
* most recent `ceil(N / M)` runs only — toward N AND toward the failure rate,
|
|
118
|
+
* so one org can neither satisfy N alone nor dominate the rate. Being BETTER
|
|
119
|
+
* than the default never fails the gate.
|
|
120
|
+
*/
|
|
121
|
+
export function evaluateCanaryGate(input) {
|
|
122
|
+
const params = resolveParams(input.params);
|
|
123
|
+
const perOrgCap = canaryPerOrgCap(params);
|
|
124
|
+
let countedRuns = 0;
|
|
125
|
+
let failures = 0;
|
|
126
|
+
let totalRuns = 0;
|
|
127
|
+
let orgs = 0;
|
|
128
|
+
for (const org of input.candidate) {
|
|
129
|
+
totalRuns += org.outcomes.length;
|
|
130
|
+
const counted = org.outcomes.slice(0, perOrgCap);
|
|
131
|
+
if (counted.length === 0)
|
|
132
|
+
continue;
|
|
133
|
+
orgs++;
|
|
134
|
+
countedRuns += counted.length;
|
|
135
|
+
failures += counted.filter((o) => o === 'failed').length;
|
|
136
|
+
}
|
|
137
|
+
const failureRate = countedRuns > 0 ? r2((failures / countedRuns) * 100) : null;
|
|
138
|
+
const baselineFailureRate = input.baseline.runs > 0 ? r2((input.baseline.failures / input.baseline.runs) * 100) : 0;
|
|
139
|
+
const pointsAboveDefault = failureRate === null ? null : r2(failureRate - baselineFailureRate);
|
|
140
|
+
const shortfalls = [];
|
|
141
|
+
if (countedRuns < params.minRuns)
|
|
142
|
+
shortfalls.push('runs');
|
|
143
|
+
if (orgs < params.minOrgs)
|
|
144
|
+
shortfalls.push('orgs');
|
|
145
|
+
if (pointsAboveDefault === null || pointsAboveDefault > params.maxFailurePointsAboveDefault)
|
|
146
|
+
shortfalls.push('failure-rate');
|
|
147
|
+
return {
|
|
148
|
+
passed: shortfalls.length === 0,
|
|
149
|
+
releaseVersion: input.releaseVersion,
|
|
150
|
+
params,
|
|
151
|
+
perOrgCap,
|
|
152
|
+
countedRuns,
|
|
153
|
+
totalRuns,
|
|
154
|
+
orgs,
|
|
155
|
+
failures,
|
|
156
|
+
failureRate,
|
|
157
|
+
baselineReleaseVersion: input.baseline.releaseVersion,
|
|
158
|
+
baselineRuns: input.baseline.runs,
|
|
159
|
+
baselineFailureRate,
|
|
160
|
+
pointsAboveDefault,
|
|
161
|
+
shortfalls,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
// -----------------------------------------------------------------------------
|
|
165
|
+
// Canary gate — the read
|
|
166
|
+
// -----------------------------------------------------------------------------
|
|
167
|
+
/**
|
|
168
|
+
* Evaluate the canary gate for `releaseVersion` against `baselineReleaseVersion`
|
|
169
|
+
* (the current platform default; null when none) from the stamped rows.
|
|
170
|
+
*
|
|
171
|
+
* Window: since the release was registered (`toolchain_release.created_at`),
|
|
172
|
+
* for both the candidate and the default, so the two rates are contemporaneous.
|
|
173
|
+
* Only terminal (SUCCEEDED / FAILED) SYNTH runs count; self-mutation is not
|
|
174
|
+
* part of the gate (§6 counts synth runs).
|
|
175
|
+
*
|
|
176
|
+
* Reads every org's rows: run it ELEVATED (the plugin service's toolchain tx
|
|
177
|
+
* is). The candidate read is bounded at `ceil(N/M)` rows per org.
|
|
178
|
+
*/
|
|
179
|
+
export async function readCanaryGate(db, releaseVersion, baselineReleaseVersion, params) {
|
|
180
|
+
const resolved = resolveParams(params);
|
|
181
|
+
const cap = canaryPerOrgCap(resolved);
|
|
182
|
+
const since = sql `(SELECT created_at FROM toolchain_release WHERE release_version = ${releaseVersion})`;
|
|
183
|
+
const candidate = await executeRows(db, sql `
|
|
184
|
+
SELECT org_id, status, total FROM (
|
|
185
|
+
SELECT e.org_id, e.status,
|
|
186
|
+
row_number() OVER (PARTITION BY e.org_id ORDER BY coalesce(e.completed_at, e.created_at) DESC, e.id) AS rn,
|
|
187
|
+
count(*) OVER (PARTITION BY e.org_id) AS total
|
|
188
|
+
FROM pipeline_events e
|
|
189
|
+
WHERE e.toolchain_release = ${releaseVersion}
|
|
190
|
+
AND e.event_type = 'ACTION' AND e.status IN ('SUCCEEDED', 'FAILED')
|
|
191
|
+
AND NOT ${IS_SELF_MUTATION}
|
|
192
|
+
AND e.created_at >= coalesce(${since}, '-infinity'::timestamptz)
|
|
193
|
+
) x
|
|
194
|
+
WHERE rn <= ${cap}
|
|
195
|
+
ORDER BY org_id, rn
|
|
196
|
+
`);
|
|
197
|
+
const byOrg = new Map();
|
|
198
|
+
for (const row of candidate) {
|
|
199
|
+
const entry = byOrg.get(row.org_id) ?? { outcomes: [], total: Number(row.total) };
|
|
200
|
+
entry.outcomes.push(row.status === 'FAILED' ? 'failed' : 'succeeded');
|
|
201
|
+
byOrg.set(row.org_id, entry);
|
|
202
|
+
}
|
|
203
|
+
let baseline = { releaseVersion: baselineReleaseVersion, runs: 0, failures: 0 };
|
|
204
|
+
if (baselineReleaseVersion !== null && baselineReleaseVersion !== releaseVersion) {
|
|
205
|
+
const [b] = await executeRows(db, sql `
|
|
206
|
+
SELECT count(*) AS runs, count(*) FILTER (WHERE e.status = 'FAILED') AS failures
|
|
207
|
+
FROM pipeline_events e
|
|
208
|
+
WHERE e.toolchain_release = ${baselineReleaseVersion}
|
|
209
|
+
AND e.event_type = 'ACTION' AND e.status IN ('SUCCEEDED', 'FAILED')
|
|
210
|
+
AND NOT ${IS_SELF_MUTATION}
|
|
211
|
+
AND e.created_at >= coalesce(${since}, '-infinity'::timestamptz)
|
|
212
|
+
`);
|
|
213
|
+
baseline = { releaseVersion: baselineReleaseVersion, runs: Number(b?.runs ?? 0), failures: Number(b?.failures ?? 0) };
|
|
214
|
+
}
|
|
215
|
+
const result = evaluateCanaryGate({
|
|
216
|
+
releaseVersion,
|
|
217
|
+
candidate: [...byOrg.entries()].map(([orgId, e]) => ({ orgId, outcomes: e.outcomes })),
|
|
218
|
+
baseline,
|
|
219
|
+
params: resolved,
|
|
220
|
+
});
|
|
221
|
+
// The read is already capped per org, so the pre-cap total is the window count.
|
|
222
|
+
return { ...result, totalRuns: [...byOrg.values()].reduce((n, e) => n + e.total, 0) };
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Pipelines whose DEPLOYED release is `releaseVersion` (their manifest's
|
|
226
|
+
* `build-image` entry) and whose LATEST terminal synth run failed, grouped by
|
|
227
|
+
* org — the console's Affected view and the "Notify affected owners" target
|
|
228
|
+
* set. A pipeline whose latest synth succeeded has healed and is not listed.
|
|
229
|
+
*
|
|
230
|
+
* Elevated read: it spans every org. Callers show the system-org operator
|
|
231
|
+
* counts, and notify each org about its own pipelines only.
|
|
232
|
+
*/
|
|
233
|
+
export async function readAffectedPipelines(db, releaseVersion) {
|
|
234
|
+
const rows = await executeRows(db, sql `
|
|
235
|
+
SELECT m.org_id, m.pipeline_id::text AS pipeline_id
|
|
236
|
+
FROM pipeline_step_manifests m
|
|
237
|
+
JOIN LATERAL (
|
|
238
|
+
SELECT e.status
|
|
239
|
+
FROM pipeline_events e
|
|
240
|
+
WHERE e.pipeline_id = m.pipeline_id
|
|
241
|
+
AND e.toolchain_release IS NOT NULL
|
|
242
|
+
AND e.event_type = 'ACTION' AND e.status IN ('SUCCEEDED', 'FAILED')
|
|
243
|
+
AND NOT ${IS_SELF_MUTATION}
|
|
244
|
+
ORDER BY coalesce(e.completed_at, e.created_at) DESC, e.created_at DESC
|
|
245
|
+
LIMIT 1
|
|
246
|
+
) latest ON latest.status = 'FAILED'
|
|
247
|
+
WHERE m.step_key = ${BUILD_IMAGE_STEP_KEY} AND m.plugin_name = ${BUILD_IMAGE_PLUGIN} AND m.plugin_publisher IS NULL
|
|
248
|
+
AND m.plugin_version = ${releaseVersion}
|
|
249
|
+
ORDER BY m.org_id, m.pipeline_id
|
|
250
|
+
`);
|
|
251
|
+
const byOrg = new Map();
|
|
252
|
+
for (const r of rows) {
|
|
253
|
+
const ids = byOrg.get(r.org_id) ?? [];
|
|
254
|
+
if (!ids.includes(r.pipeline_id))
|
|
255
|
+
ids.push(r.pipeline_id);
|
|
256
|
+
byOrg.set(r.org_id, ids);
|
|
257
|
+
}
|
|
258
|
+
const orgs = [...byOrg.entries()].map(([orgId, pipelineIds]) => ({ orgId, pipelines: pipelineIds.length, pipelineIds }));
|
|
259
|
+
return { releaseVersion, totalPipelines: orgs.reduce((n, o) => n + o.pipelines, 0), orgs };
|
|
260
|
+
}
|
|
261
|
+
/** The current platform default (elevated read), or null. */
|
|
262
|
+
export async function readPlatformDefaultRelease(db) {
|
|
263
|
+
const [row] = await executeRows(db, sql `
|
|
264
|
+
SELECT release_version FROM toolchain_platform_default WHERE singleton = true
|
|
265
|
+
`);
|
|
266
|
+
return row?.release_version ?? null;
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGNoYWluLXJ1bnMuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcmVwb3J0aW5nL3Rvb2xjaGFpbi1ydW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUVILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUFFLFdBQVcsRUFBb0IsTUFBTSw2QkFBNkIsQ0FBQztBQVk1RTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUNwRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxZQUFZLENBQUM7QUFFakQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUM7QUFFdEM7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLG9CQUFvQixDQUFDO0FBRXZELE1BQU0sa0JBQWtCLEdBQUcsaUJBQWlCLENBQUM7QUF1QjdDOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLElBQXFDO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFxRCxDQUFDO0lBQzdFLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFxRCxDQUFDO0lBQzNFLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLG9CQUFvQixJQUFJLENBQUMsQ0FBQyxVQUFVLEtBQUssa0JBQWtCLElBQUksQ0FBQyxDQUFDLGVBQWUsS0FBSyxJQUFJO2VBQ3RHLE9BQU8sQ0FBQyxDQUFDLGFBQWEsS0FBSyxRQUFRLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FB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QUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pILE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUM3RixDQUFDO0FBRUQsNkRBQTZEO0FBQzdELE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCLENBQUMsRUFBZTtJQUM5RCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxXQUFXLENBQThCLEVBQUUsRUFBRSxHQUFHLENBQUE7O0dBRW5FLENBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxFQUFFLGVBQWUsSUFBSSxJQUFJLENBQUM7QUFDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRvb2xjaGFpbiBSVU4gREFUQSAoZG9jcy9wbGFucy9ib290c3RyYXAtaW1hZ2UtdmVyc2lvbmluZy5tZCDCpzYsIMKnNywgwqc5KTpcbiAqIHdoaWNoIG1hbmFnZWQgdG9vbGNoYWluIHJlbGVhc2UgZWFjaCBgc3ludGhgIC8gYHNlbGYtbXV0YXRpb25gIGFjdGlvbiByYW4gb24sXG4gKiBhbmQgdGhlIHR3byBxdWVyaWVzIGJ1aWx0IG92ZXIgdGhvc2Ugcm93cyDigJQgdGhlIGNhbmFyeSBnYXRlIGFuZCB0aGUgQWZmZWN0ZWRcbiAqIHZpZXcuXG4gKlxuICogV0hFUkUgVEhFIFJFTEVBU0UgQ09NRVMgRlJPTS4gcGlwZWxpbmUtZXZlbnRzIGlzIGEgTGFtYmRhIGluIHRoZSBDVVNUT01FUidzXG4gKiBhY2NvdW50OyBldmVyeXRoaW5nIGl0IHBvc3RzIGlzIGN1c3RvbWVyLWNvbnRyb2xsZWQsIGFuZCB0aGUgdGFncyBpdCByZWFkc1xuICogYXJlIGNhY2hlZCBmb3IgMTUgbWludXRlcy4gU28gdGhlIHJlbGVhc2UgaXMgbmV2ZXIgcmVhZCBmcm9tIHRoZSBwYXlsb2FkIG9yXG4gKiBhIHRhZzogdGhlIGluZ2VzdCBqb2lucyB0aGUgZXZlbnQgdG8gdGhlIFBMQVRGT1JNJ3MgZGVwbG95ZWQgc3RlcCBtYW5pZmVzdFxuICogZm9yIHRoYXQgcGlwZWxpbmUgKGBwaXBlbGluZV9zdGVwX21hbmlmZXN0c2AsIHdyaXR0ZW4gYnkgdGhlIHJlZ2lzdHJ5IFBPU1RcbiAqIGFmdGVyIGEgZGVwbG95KSBhbmQgdGFrZXMgdGhlIHJlbGVhc2UgZnJvbSBpdHMgYGJ1aWxkLWltYWdlYCBlbnRyeSDigJQgdGhlXG4gKiBgcGlwZWxpbmUtYm9vdHN0cmFwYCByb3csIHdob3NlIHZlcnNpb24gSVMgdGhlIHJlbGVhc2UgKGJvdGggaGFsdmVzIHNoYXJlXG4gKiBpdCkuIFRoZSBtYW5pZmVzdCBpcyByZXBsYWNlZCBvbiBldmVyeSBkZXBsb3ksIHNvIGl0IGlzIHRoZSByZWxlYXNlIHRoZVxuICogcGlwZWxpbmUgd2FzIGRlcGxveWVkIHdpdGggd2hlbiB0aGUgZXZlbnQgYXJyaXZlcy5cbiAqXG4gKiBUSEUgR0FURSBJUyBBRFZJU09SWS4gT3V0Y29tZXMgYXJlIGN1c3RvbWVyLXJlcG9ydGVkICh0aGUgZXZlbnRzIExhbWJkYSBhbmRcbiAqIGl0cyBrZXkgbGl2ZSBpbiB0aGUgY3VzdG9tZXIncyBhY2NvdW50KSwgc28gYSBjYW5hcnkgb3JnIGNvdWxkIGZvcmdlIHRoZW0uXG4gKiBFYWNoIG9yZyB0aGVyZWZvcmUgY291bnRzIGZvciBhdCBtb3N0IGBjZWlsKE4gLyBNKWAgcnVucywgc28gb25lIG9yZyBjYW5ub3RcbiAqIHNhdGlzZnkgdGhlIGdhdGUgYWxvbmU7IHRoZSByZWxlYXNlIGNvbWVzIGZyb20gdGhlIHBsYXRmb3JtJ3MgbWFuaWZlc3Q7IGFuZFxuICogdGhlIGdhdGUgb25seSBpbmZvcm1zIGEgaHVtYW4g4oCUIGFuIG92ZXJyaWRlIHJlY29yZHMgYSByZWFzb24uXG4gKi9cblxuaW1wb3J0IHsgQlVJTERfSU1BR0VfU1RFUF9LRVkgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBzcWwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgeyBleGVjdXRlUm93cywgdHlwZSBTcWxFeGVjdXRvciB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL3BnLXJlc3VsdC5qcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXaGljaCBhY3Rpb25zIGFyZSB0b29sY2hhaW4gcnVuc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFRoZSB0d28gdG9vbGNoYWluIGFjdGlvbnMgYSByZWxlYXNlIGlzIGp1ZGdlZCBvbi4gKi9cbmV4cG9ydCB0eXBlIFRvb2xjaGFpbkFjdGlvbiA9ICdzeW50aCcgfCAnc2VsZi1tdXRhdGlvbic7XG5cbi8qKiBUZXJtaW5hbCB0b29sY2hhaW4gb3V0Y29tZXM7IGFueXRoaW5nIGVsc2UgKFNUQVJURUQsIENBTkNFTEVELCBBQkFORE9ORUTigKYpIHNheXMgbm90aGluZyBhYm91dCB0aGUgdG9vbGNoYWluLiAqL1xuZXhwb3J0IHR5cGUgVG9vbGNoYWluT3V0Y29tZSA9ICdzdWNjZWVkZWQnIHwgJ2ZhaWxlZCc7XG5cbi8qKlxuICogQ0RLIFBpcGVsaW5lcycgc2VsZi1tdXRhdGlvbiBhY3Rpb246IGEgZml4ZWQgc3RhZ2UgYW5kIGFjdGlvbiBuYW1lXG4gKiAoYGF3cy1jZGstbGliL3BpcGVsaW5lcy9saWIvY29kZXBpcGVsaW5lL2NvZGVwaXBlbGluZS5qc2ApLlxuICovXG5leHBvcnQgY29uc3QgU0VMRl9NVVRBVElPTl9TVEFHRSA9ICdVcGRhdGVQaXBlbGluZSc7XG5leHBvcnQgY29uc3QgU0VMRl9NVVRBVElPTl9BQ1RJT04gPSAnU2VsZk11dGF0ZSc7XG5cbi8qKlxuICogVGhlIHN5bnRoIHN0ZXAncyBgc3RlcEtleWAgaW4gdGhlIHN0ZXAgbWFuaWZlc3QgKGBwbHVnaW5TdGVwTGFiZWwobnVsbCwg4oCmKWApLlxuICogVGhlIHN5bnRoIEFDVElPTidzIG5hbWUgaXMgYSBnZW5lcmF0ZWQgaWQsIHNvIGl0IGlzIGlkZW50aWZpZWQgYnkgdGhlXG4gKiBtYW5pZmVzdCByb3cgY2FycnlpbmcgdGhpcyBrZXkg4oCUIHRoZSBuYW1lcyB0aGUgYnVpbHQgcGlwZWxpbmUgcmVhbGx5IHVzZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBTWU5USF9TVEVQX0tFWSA9ICdzeW50aCc7XG5cbi8qKlxuICogVGhlIGBidWlsZC1pbWFnZWAgZW50cnkncyBwbHVnaW46IHRoZSByZWxlYXNlJ3MgYm9vdHN0cmFwIGhhbGYuIFRoZSBlbnRyeSBpc1xuICogdGhlIG1hbmlmZXN0J3Mgbm9uLXN0ZXAgcm93IHVuZGVyIGBzdGVwX2tleWAge0BsaW5rIEJVSUxEX0lNQUdFX1NURVBfS0VZfVxuICogKGFwaS1jb3JlIGBCVUlMRF9JTUFHRV9NQU5JRkVTVF8qYCksIGFuZCBpdHMgYHBsdWdpbl92ZXJzaW9uYCBJUyB0aGUgcmVsZWFzZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEJVSUxEX0lNQUdFX1BMVUdJTiA9ICdwaXBlbGluZS1ib290c3RyYXAnO1xuXG5jb25zdCBSRUxFQVNFX1ZFUlNJT05fUkUgPSAvXlxcZCtcXC5cXGQrXFwuXFxkKyQvO1xuXG4vKiogQSBtYW5pZmVzdCByb3csIGFzIHtAbGluayBkZXBsb3llZFRvb2xjaGFpbk9mfSByZWFkcyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbGNoYWluTWFuaWZlc3RSb3cge1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBhY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHBsdWdpblB1Ymxpc2hlcjogc3RyaW5nIHwgbnVsbDtcbiAgcGx1Z2luTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgcGx1Z2luVmVyc2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgc3RlcEtleT86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBPbmUgcGlwZWxpbmUncyBkZXBsb3llZCB0b29sY2hhaW4sIGZyb20gaXRzIG1hbmlmZXN0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBsb3llZFRvb2xjaGFpbiB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIC8qKiBUaGUgcmVsZWFzZSBpdHMgYGJ1aWxkLWltYWdlYCBlbnRyeSByZWNvcmRzLiAqL1xuICByZWxlYXNlVmVyc2lvbjogc3RyaW5nO1xuICAvKiogVGhlIHN5bnRoIGFjdGlvbiBhcyB0aGUgYnVpbHQgcGlwZWxpbmUgbmFtZXMgaXQ7IG51bGwgd2hlbiB0aGUgbWFuaWZlc3QgaGFzIG5vIHN5bnRoIHJvdy4gKi9cbiAgc3ludGg6IHsgc3RhZ2VOYW1lOiBzdHJpbmc7IGFjdGlvbk5hbWU6IHN0cmluZyB9IHwgbnVsbDtcbn1cblxuLyoqXG4gKiBFYWNoIHBpcGVsaW5lJ3MgZGVwbG95ZWQgdG9vbGNoYWluLCBmcm9tIGl0cyBtYW5pZmVzdCByb3dzLiBBIHBpcGVsaW5lXG4gKiB3aG9zZSBtYW5pZmVzdCByZWNvcmRzIG5vIGBidWlsZC1pbWFnZWAgZW50cnkgKGRlcGxveWVkIGJlZm9yZSByZWxlYXNlcywgb3JcbiAqIGEgcGxhY2Vob2xkZXIgYm9vdHN0cmFwKSBoYXMgbm9uZSwgYW5kIGl0cyBhY3Rpb25zIGFyZSBub3Qgc3RhbXBlZC4gT25seSBhblxuICogT1dOLU9SRyByb3cgKG5vIHB1Ymxpc2hlcikgY291bnRzOiBhIG1hbmFnZWQgbmFtZSBjYW4gbmV2ZXIgYmUgYSBsaXN0aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwbG95ZWRUb29sY2hhaW5PZihyb3dzOiByZWFkb25seSBUb29sY2hhaW5NYW5pZmVzdFJvd1tdKTogTWFwPHN0cmluZywgRGVwbG95ZWRUb29sY2hhaW4+IHtcbiAgY29uc3QgcmVsZWFzZSA9IG5ldyBNYXA8c3RyaW5nLCB7IG9yZ0lkOiBzdHJpbmc7IHJlbGVhc2VWZXJzaW9uOiBzdHJpbmcgfT4oKTtcbiAgY29uc3Qgc3ludGggPSBuZXcgTWFwPHN0cmluZywgeyBzdGFnZU5hbWU6IHN0cmluZzsgYWN0aW9uTmFtZTogc3RyaW5nIH0+KCk7XG4gIGZvciAoY29uc3QgciBvZiByb3dzKSB7XG4gICAgaWYgKHIuc3RlcEtleSA9PT0gQlVJTERfSU1BR0VfU1RFUF9LRVkgJiYgci5wbHVnaW5OYW1lID09PSBCVUlMRF9JTUFHRV9QTFVHSU4gJiYgci5wbHVnaW5QdWJsaXNoZXIgPT09IG51bGxcbiAgICAgICYmIHR5cGVvZiByLnBsdWdpblZlcnNpb24gPT09ICdzdHJpbmcnICYmIFJFTEVBU0VfVkVSU0lPTl9SRS50ZXN0KHIucGx1Z2luVmVyc2lvbikpIHtcbiAgICAgIHJlbGVhc2Uuc2V0KHIucGlwZWxpbmVJZCwgeyBvcmdJZDogci5vcmdJZCwgcmVsZWFzZVZlcnNpb246IHIucGx1Z2luVmVyc2lvbiB9KTtcbiAgICB9XG4gICAgaWYgKHIuc3RlcEtleSA9PT0gU1lOVEhfU1RFUF9LRVkpIHN5bnRoLnNldChyLnBpcGVsaW5lSWQsIHsgc3RhZ2VOYW1lOiByLnN0YWdlTmFtZSwgYWN0aW9uTmFtZTogci5hY3Rpb25OYW1lIH0pO1xuICB9XG4gIGNvbnN0IG91dCA9IG5ldyBNYXA8c3RyaW5nLCBEZXBsb3llZFRvb2xjaGFpbj4oKTtcbiAgZm9yIChjb25zdCBbcGlwZWxpbmVJZCwgcl0gb2YgcmVsZWFzZSkgb3V0LnNldChwaXBlbGluZUlkLCB7IC4uLnIsIHN5bnRoOiBzeW50aC5nZXQocGlwZWxpbmVJZCkgPz8gbnVsbCB9KTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBXaGljaCB0b29sY2hhaW4gYWN0aW9uIChpZiBhbnkpIGFuIEFDVElPTiBldmVudCBpcywgZ2l2ZW4gaXRzIHBpcGVsaW5lJ3NcbiAqIGRlcGxveWVkIHRvb2xjaGFpbi4gTmFtZXMgYXJlIGNvbXBhcmVkIHBvc3Qtc2NydWIsIGFzIHRoZSBtYW5pZmVzdCBzdG9yZXMgdGhlbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvb2xjaGFpbkFjdGlvbk9mKFxuICBldmVudDogeyBldmVudFR5cGU6IHN0cmluZzsgc3RhZ2VOYW1lPzogc3RyaW5nIHwgbnVsbDsgYWN0aW9uTmFtZT86IHN0cmluZyB8IG51bGwgfSxcbiAgZGVwbG95ZWQ6IERlcGxveWVkVG9vbGNoYWluIHwgdW5kZWZpbmVkLFxuKTogVG9vbGNoYWluQWN0aW9uIHwgbnVsbCB7XG4gIGlmIChldmVudC5ldmVudFR5cGUgIT09ICdBQ1RJT04nIHx8ICFkZXBsb3llZCB8fCAhZXZlbnQuc3RhZ2VOYW1lIHx8ICFldmVudC5hY3Rpb25OYW1lKSByZXR1cm4gbnVsbDtcbiAgaWYgKGV2ZW50LnN0YWdlTmFtZSA9PT0gU0VMRl9NVVRBVElPTl9TVEFHRSAmJiBldmVudC5hY3Rpb25OYW1lID09PSBTRUxGX01VVEFUSU9OX0FDVElPTikgcmV0dXJuICdzZWxmLW11dGF0aW9uJztcbiAgaWYgKGRlcGxveWVkLnN5bnRoICYmIGV2ZW50LnN0YWdlTmFtZSA9PT0gZGVwbG95ZWQuc3ludGguc3RhZ2VOYW1lICYmIGV2ZW50LmFjdGlvbk5hbWUgPT09IGRlcGxveWVkLnN5bnRoLmFjdGlvbk5hbWUpIHJldHVybiAnc3ludGgnO1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIFRoZSB0ZXJtaW5hbCBvdXRjb21lIG9mIGEgc3RhdHVzLCBvciBudWxsIGZvciBhIG5vbi10ZXJtaW5hbCAvIG5vbi1qdWRnaW5nIG9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b29sY2hhaW5PdXRjb21lT2Yoc3RhdHVzOiBzdHJpbmcpOiBUb29sY2hhaW5PdXRjb21lIHwgbnVsbCB7XG4gIGlmIChzdGF0dXMgPT09ICdTVUNDRUVERUQnKSByZXR1cm4gJ3N1Y2NlZWRlZCc7XG4gIGlmIChzdGF0dXMgPT09ICdGQUlMRUQnKSByZXR1cm4gJ2ZhaWxlZCc7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogU1FMOiBhIHN0YW1wZWQgcm93J3MgYWN0aW9uIChzdGFtcGVkIHJvd3MgYXJlIHN5bnRoIG9yIHNlbGYtbXV0YXRpb24gb25seSkuICovXG5jb25zdCBJU19TRUxGX01VVEFUSU9OID0gc3FsYChlLnN0YWdlX25hbWUgPSAke1NFTEZfTVVUQVRJT05fU1RBR0V9IEFORCBlLmFjdGlvbl9uYW1lID0gJHtTRUxGX01VVEFUSU9OX0FDVElPTn0pYDtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENhbmFyeSBnYXRlICjCpzYpIOKAlCBwdXJlIGNvbXB1dGF0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogVGhlIGdhdGUncyB0aHJlc2hvbGRzIChzZXQgb24gdGhlIGNvbnNvbGUsIFBoYXNlIDUpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYW5hcnlHYXRlUGFyYW1zIHtcbiAgLyoqIE46IGNvdW50ZWQgc3ludGggcnVucyByZXF1aXJlZC4gKi9cbiAgbWluUnVuczogbnVtYmVyO1xuICAvKiogTTogZGlzdGluY3Qgb3JncyByZXF1aXJlZC4gKi9cbiAgbWluT3JnczogbnVtYmVyO1xuICAvKiogVDogdGhlIHJlbGVhc2UncyBmYWlsdXJlIHJhdGUgbWF5IGV4Y2VlZCB0aGUgZGVmYXVsdCdzIGJ5IGF0IG1vc3QgdGhpcyBtYW55IHBlcmNlbnRhZ2UgcG9pbnRzLiAqL1xuICBtYXhGYWlsdXJlUG9pbnRzQWJvdmVEZWZhdWx0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NBTkFSWV9HQVRFOiBSZWFkb25seTxDYW5hcnlHYXRlUGFyYW1zPiA9IE9iamVjdC5mcmVlemUoe1xuICBtaW5SdW5zOiAyMCxcbiAgbWluT3JnczogMixcbiAgbWF4RmFpbHVyZVBvaW50c0Fib3ZlRGVmYXVsdDogNSxcbn0pO1xuXG4vKiogT25lIG9yZydzIHRlcm1pbmFsIHN5bnRoIG91dGNvbWVzIG9uIHRoZSBjYW5kaWRhdGUsIE5FV0VTVCBmaXJzdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JnUnVucyB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIG91dGNvbWVzOiByZWFkb25seSBUb29sY2hhaW5PdXRjb21lW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuYXJ5R2F0ZUlucHV0IHtcbiAgcmVsZWFzZVZlcnNpb246IHN0cmluZztcbiAgY2FuZGlkYXRlOiByZWFkb25seSBPcmdSdW5zW107XG4gIC8qKiBUaGUgY3VycmVudCBwbGF0Zm9ybSBkZWZhdWx0J3Mgc3ludGggcnVucyBvdmVyIHRoZSBzYW1lIHdpbmRvdyAodW5jYXBwZWQpLiAqL1xuICBiYXNlbGluZTogeyByZWxlYXNlVmVyc2lvbjogc3RyaW5nIHwgbnVsbDsgcnVuczogbnVtYmVyOyBmYWlsdXJlczogbnVtYmVyIH07XG4gIHBhcmFtcz86IFBhcnRpYWw8Q2FuYXJ5R2F0ZVBhcmFtcz47XG59XG5cbmV4cG9ydCB0eXBlIENhbmFyeUdhdGVTaG9ydGZhbGwgPSAncnVucycgfCAnb3JncycgfCAnZmFpbHVyZS1yYXRlJztcblxuLyoqIFRoZSBnYXRlJ3MgdmVyZGljdCBhbmQgZXZlcnkgbnVtYmVyIGJlaGluZCBpdCDigJQgd2hhdCB0aGUgY29uc29sZSBzaG93cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuYXJ5R2F0ZVJlc3VsdCB7XG4gIHBhc3NlZDogYm9vbGVhbjtcbiAgcmVsZWFzZVZlcnNpb246IHN0cmluZztcbiAgcGFyYW1zOiBDYW5hcnlHYXRlUGFyYW1zO1xuICAvKiogY2VpbChOIC8gTSk6IHRoZSBtb3N0IHJ1bnMgYW55IG9uZSBvcmcgY29udHJpYnV0ZXMuICovXG4gIHBlck9yZ0NhcDogbnVtYmVyO1xuICAvKiogUnVucyBjb3VudGVkIHRvd2FyZCBOLCBhZnRlciB0aGUgcGVyLW9yZyBjYXAuICovXG4gIGNvdW50ZWRSdW5zOiBudW1iZXI7XG4gIC8qKiBFdmVyeSB0ZXJtaW5hbCBzeW50aCBydW4gb24gdGhlIHJlbGVhc2UsIGJlZm9yZSB0aGUgY2FwLiAqL1xuICB0b3RhbFJ1bnM6IG51bWJlcjtcbiAgLyoqIERpc3RpbmN0IG9yZ3Mgd2l0aCBhdCBsZWFzdCBvbmUgY291bnRlZCBydW4uICovXG4gIG9yZ3M6IG51bWJlcjtcbiAgLyoqIEZhaWx1cmVzIGFtb25nIHRoZSBjb3VudGVkIHJ1bnMuICovXG4gIGZhaWx1cmVzOiBudW1iZXI7XG4gIC8qKiBQZXJjZW50ICgw4oCTMTAwKSBvdmVyIHRoZSBjb3VudGVkIHJ1bnM7IG51bGwgd2l0aCBub25lLiAqL1xuICBmYWlsdXJlUmF0ZTogbnVtYmVyIHwgbnVsbDtcbiAgYmFzZWxpbmVSZWxlYXNlVmVyc2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgYmFzZWxpbmVSdW5zOiBudW1iZXI7XG4gIC8qKiBQZXJjZW50ICgw4oCTMTAwKTsgMCB3aGVuIHRoZSBkZWZhdWx0IGhhcyBubyBydW5zIGluIHRoZSB3aW5kb3cgKHRoZSBzdHJpY3QgcmVhZGluZykuICovXG4gIGJhc2VsaW5lRmFpbHVyZVJhdGU6IG51bWJlcjtcbiAgLyoqIGZhaWx1cmVSYXRlIOKIkiBiYXNlbGluZUZhaWx1cmVSYXRlLCBpbiBwb2ludHM7IG51bGwgd2l0aCBubyBjb3VudGVkIHJ1bnMuICovXG4gIHBvaW50c0Fib3ZlRGVmYXVsdDogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIFdoaWNoIHRocmVzaG9sZHMgd2VyZSBub3QgbWV0IChlbXB0eSB3aGVuIHBhc3NlZCkuICovXG4gIHNob3J0ZmFsbHM6IENhbmFyeUdhdGVTaG9ydGZhbGxbXTtcbn1cblxuLyoqIFJvdW5kIHRvIDIgZHAsIHNvIHRoZSBudW1iZXJzIHRoZSBjb25zb2xlIHNob3dzIGFyZSBzdGFibGUuICovXG5mdW5jdGlvbiByMihuOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5yb3VuZChuICogMTAwKSAvIDEwMDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhcmFtcyhwOiBQYXJ0aWFsPENhbmFyeUdhdGVQYXJhbXM+IHwgdW5kZWZpbmVkKTogQ2FuYXJ5R2F0ZVBhcmFtcyB7XG4gIGNvbnN0IG1lcmdlZCA9IHsgLi4uREVGQVVMVF9DQU5BUllfR0FURSwgLi4uKHAgPz8ge30pIH07XG4gIGNvbnN0IG1pblJ1bnMgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKG1lcmdlZC5taW5SdW5zKSk7XG4gIGNvbnN0IG1pbk9yZ3MgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKG1lcmdlZC5taW5PcmdzKSk7XG4gIGNvbnN0IG1heEZhaWx1cmVQb2ludHNBYm92ZURlZmF1bHQgPSBNYXRoLm1heCgwLCBtZXJnZWQubWF4RmFpbHVyZVBvaW50c0Fib3ZlRGVmYXVsdCk7XG4gIGlmICghW21pblJ1bnMsIG1pbk9yZ3MsIG1heEZhaWx1cmVQb2ludHNBYm92ZURlZmF1bHRdLmV2ZXJ5KE51bWJlci5pc0Zpbml0ZSkpIHJldHVybiB7IC4uLkRFRkFVTFRfQ0FOQVJZX0dBVEUgfTtcbiAgcmV0dXJuIHsgbWluUnVucywgbWluT3JncywgbWF4RmFpbHVyZVBvaW50c0Fib3ZlRGVmYXVsdCB9O1xufVxuXG4vKiogVGhlIHBlci1vcmcgY29udHJpYnV0aW9uIGNhcDogY2VpbChOIC8gTSkuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuYXJ5UGVyT3JnQ2FwKHBhcmFtczogUGljazxDYW5hcnlHYXRlUGFyYW1zLCAnbWluUnVucycgfCAnbWluT3Jncyc+KTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguY2VpbChwYXJhbXMubWluUnVucyAvIHBhcmFtcy5taW5PcmdzKTtcbn1cblxuLyoqXG4gKiBUaGUgY2FuYXJ5IGdhdGU6IGF0IGxlYXN0IE4gY291bnRlZCBzeW50aCBydW5zIGFjcm9zcyBhdCBsZWFzdCBNIG9yZ3MsIGFuZCBhXG4gKiBmYWlsdXJlIHJhdGUgd2l0aGluIFQgcG9pbnRzIG9mIHRoZSBjdXJyZW50IGRlZmF1bHQncy4gRWFjaCBvcmcgY291bnRzIGl0c1xuICogbW9zdCByZWNlbnQgYGNlaWwoTiAvIE0pYCBydW5zIG9ubHkg4oCUIHRvd2FyZCBOIEFORCB0b3dhcmQgdGhlIGZhaWx1cmUgcmF0ZSxcbiAqIHNvIG9uZSBvcmcgY2FuIG5laXRoZXIgc2F0aXNmeSBOIGFsb25lIG5vciBkb21pbmF0ZSB0aGUgcmF0ZS4gQmVpbmcgQkVUVEVSXG4gKiB0aGFuIHRoZSBkZWZhdWx0IG5ldmVyIGZhaWxzIHRoZSBnYXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVDYW5hcnlHYXRlKGlucHV0OiBDYW5hcnlHYXRlSW5wdXQpOiBDYW5hcnlHYXRlUmVzdWx0IHtcbiAgY29uc3QgcGFyYW1zID0gcmVzb2x2ZVBhcmFtcyhpbnB1dC5wYXJhbXMpO1xuICBjb25zdCBwZXJPcmdDYXAgPSBjYW5hcnlQZXJPcmdDYXAocGFyYW1zKTtcbiAgbGV0IGNvdW50ZWRSdW5zID0gMDtcbiAgbGV0IGZhaWx1cmVzID0gMDtcbiAgbGV0IHRvdGFsUnVucyA9IDA7XG4gIGxldCBvcmdzID0gMDtcbiAgZm9yIChjb25zdCBvcmcgb2YgaW5wdXQuY2FuZGlkYXRlKSB7XG4gICAgdG90YWxSdW5zICs9IG9yZy5vdXRjb21lcy5sZW5ndGg7XG4gICAgY29uc3QgY291bnRlZCA9IG9yZy5vdXRjb21lcy5zbGljZSgwLCBwZXJPcmdDYXApO1xuICAgIGlmIChjb3VudGVkLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgb3JncysrO1xuICAgIGNvdW50ZWRSdW5zICs9IGNvdW50ZWQubGVuZ3RoO1xuICAgIGZhaWx1cmVzICs9IGNvdW50ZWQuZmlsdGVyKChvKSA9PiBvID09PSAnZmFpbGVkJykubGVuZ3RoO1xuICB9XG4gIGNvbnN0IGZhaWx1cmVSYXRlID0gY291bnRlZFJ1bnMgPiAwID8gcjIoKGZhaWx1cmVzIC8gY291bnRlZFJ1bnMpICogMTAwKSA6IG51bGw7XG4gIGNvbnN0IGJhc2VsaW5lRmFpbHVyZVJhdGUgPSBpbnB1dC5iYXNlbGluZS5ydW5zID4gMCA/IHIyKChpbnB1dC5iYXNlbGluZS5mYWlsdXJlcyAvIGlucHV0LmJhc2VsaW5lLnJ1bnMpICogMTAwKSA6IDA7XG4gIGNvbnN0IHBvaW50c0Fib3ZlRGVmYXVsdCA9IGZhaWx1cmVSYXRlID09PSBudWxsID8gbnVsbCA6IHIyKGZhaWx1cmVSYXRlIC0gYmFzZWxpbmVGYWlsdXJlUmF0ZSk7XG5cbiAgY29uc3Qgc2hvcnRmYWxsczogQ2FuYXJ5R2F0ZVNob3J0ZmFsbFtdID0gW107XG4gIGlmIChjb3VudGVkUnVucyA8IHBhcmFtcy5taW5SdW5zKSBzaG9ydGZhbGxzLnB1c2goJ3J1bnMnKTtcbiAgaWYgKG9yZ3MgPCBwYXJhbXMubWluT3Jncykgc2hvcnRmYWxscy5wdXNoKCdvcmdzJyk7XG4gIGlmIChwb2ludHNBYm92ZURlZmF1bHQgPT09IG51bGwgfHwgcG9pbnRzQWJvdmVEZWZhdWx0ID4gcGFyYW1zLm1heEZhaWx1cmVQb2ludHNBYm92ZURlZmF1bHQpIHNob3J0ZmFsbHMucHVzaCgnZmFpbHVyZS1yYXRlJyk7XG5cbiAgcmV0dXJuIHtcbiAgICBwYXNzZWQ6IHNob3J0ZmFsbHMubGVuZ3RoID09PSAwLFxuICAgIHJlbGVhc2VWZXJzaW9uOiBpbnB1dC5yZWxlYXNlVmVyc2lvbixcbiAgICBwYXJhbXMsXG4gICAgcGVyT3JnQ2FwLFxuICAgIGNvdW50ZWRSdW5zLFxuICAgIHRvdGFsUnVucyxcbiAgICBvcmdzLFxuICAgIGZhaWx1cmVzLFxuICAgIGZhaWx1cmVSYXRlLFxuICAgIGJhc2VsaW5lUmVsZWFzZVZlcnNpb246IGlucHV0LmJhc2VsaW5lLnJlbGVhc2VWZXJzaW9uLFxuICAgIGJhc2VsaW5lUnVuczogaW5wdXQuYmFzZWxpbmUucnVucyxcbiAgICBiYXNlbGluZUZhaWx1cmVSYXRlLFxuICAgIHBvaW50c0Fib3ZlRGVmYXVsdCxcbiAgICBzaG9ydGZhbGxzLFxuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ2FuYXJ5IGdhdGUg4oCUIHRoZSByZWFkXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEV2YWx1YXRlIHRoZSBjYW5hcnkgZ2F0ZSBmb3IgYHJlbGVhc2VWZXJzaW9uYCBhZ2FpbnN0IGBiYXNlbGluZVJlbGVhc2VWZXJzaW9uYFxuICogKHRoZSBjdXJyZW50IHBsYXRmb3JtIGRlZmF1bHQ7IG51bGwgd2hlbiBub25lKSBmcm9tIHRoZSBzdGFtcGVkIHJvd3MuXG4gKlxuICogV2luZG93OiBzaW5jZSB0aGUgcmVsZWFzZSB3YXMgcmVnaXN0ZXJlZCAoYHRvb2xjaGFpbl9yZWxlYXNlLmNyZWF0ZWRfYXRgKSxcbiAqIGZvciBib3RoIHRoZSBjYW5kaWRhdGUgYW5kIHRoZSBkZWZhdWx0LCBzbyB0aGUgdHdvIHJhdGVzIGFyZSBjb250ZW1wb3JhbmVvdXMuXG4gKiBPbmx5IHRlcm1pbmFsIChTVUNDRUVERUQgLyBGQUlMRUQpIFNZTlRIIHJ1bnMgY291bnQ7IHNlbGYtbXV0YXRpb24gaXMgbm90XG4gKiBwYXJ0IG9mIHRoZSBnYXRlICjCpzYgY291bnRzIHN5bnRoIHJ1bnMpLlxuICpcbiAqIFJlYWRzIGV2ZXJ5IG9yZydzIHJvd3M6IHJ1biBpdCBFTEVWQVRFRCAodGhlIHBsdWdpbiBzZXJ2aWNlJ3MgdG9vbGNoYWluIHR4XG4gKiBpcykuIFRoZSBjYW5kaWRhdGUgcmVhZCBpcyBib3VuZGVkIGF0IGBjZWlsKE4vTSlgIHJvd3MgcGVyIG9yZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRDYW5hcnlHYXRlKFxuICBkYjogU3FsRXhlY3V0b3IsXG4gIHJlbGVhc2VWZXJzaW9uOiBzdHJpbmcsXG4gIGJhc2VsaW5lUmVsZWFzZVZlcnNpb246IHN0cmluZyB8IG51bGwsXG4gIHBhcmFtcz86IFBhcnRpYWw8Q2FuYXJ5R2F0ZVBhcmFtcz4sXG4pOiBQcm9taXNlPENhbmFyeUdhdGVSZXN1bHQ+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlUGFyYW1zKHBhcmFtcyk7XG4gIGNvbnN0IGNhcCA9IGNhbmFyeVBlck9yZ0NhcChyZXNvbHZlZCk7XG4gIGNvbnN0IHNpbmNlID0gc3FsYChTRUxFQ1QgY3JlYXRlZF9hdCBGUk9NIHRvb2xjaGFpbl9yZWxlYXNlIFdIRVJFIHJlbGVhc2VfdmVyc2lvbiA9ICR7cmVsZWFzZVZlcnNpb259KWA7XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IGF3YWl0IGV4ZWN1dGVSb3dzPHsgb3JnX2lkOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nOyB0b3RhbDogc3RyaW5nIHwgbnVtYmVyIH0+KGRiLCBzcWxgXG4gICAgU0VMRUNUIG9yZ19pZCwgc3RhdHVzLCB0b3RhbCBGUk9NIChcbiAgICAgIFNFTEVDVCBlLm9yZ19pZCwgZS5zdGF0dXMsXG4gICAgICAgICAgICAgcm93X251bWJlcigpIE9WRVIgKFBBUlRJVElPTiBCWSBlLm9yZ19pZCBPUkRFUiBCWSBjb2FsZXNjZShlLmNvbXBsZXRlZF9hdCwgZS5jcmVhdGVkX2F0KSBERVNDLCBlLmlkKSBBUyBybixcbiAgICAgICAgICAgICBjb3VudCgqKSBPVkVSIChQQVJUSVRJT04gQlkgZS5vcmdfaWQpIEFTIHRvdGFsXG4gICAgICAgIEZST00gcGlwZWxpbmVfZXZlbnRzIGVcbiAgICAgICBXSEVSRSBlLnRvb2xjaGFpbl9yZWxlYXNlID0gJHtyZWxlYXNlVmVyc2lvbn1cbiAgICAgICAgIEFORCBlLmV2ZW50X3R5cGUgPSAnQUNUSU9OJyBBTkQgZS5zdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJylcbiAgICAgICAgIEFORCBOT1QgJHtJU19TRUxGX01VVEFUSU9OfVxuICAgICAgICAgQU5EIGUuY3JlYXRlZF9hdCA+PSBjb2FsZXNjZSgke3NpbmNlfSwgJy1pbmZpbml0eSc6OnRpbWVzdGFtcHR6KVxuICAgICkgeFxuICAgIFdIRVJFIHJuIDw9ICR7Y2FwfVxuICAgIE9SREVSIEJZIG9yZ19pZCwgcm5cbiAgYCk7XG4gIGNvbnN0IGJ5T3JnID0gbmV3IE1hcDxzdHJpbmcsIHsgb3V0Y29tZXM6IFRvb2xjaGFpbk91dGNvbWVbXTsgdG90YWw6IG51bWJlciB9PigpO1xuICBmb3IgKGNvbnN0IHJvdyBvZiBjYW5kaWRhdGUpIHtcbiAgICBjb25zdCBlbnRyeSA9IGJ5T3JnLmdldChyb3cub3JnX2lkKSA/PyB7IG91dGNvbWVzOiBbXSwgdG90YWw6IE51bWJlcihyb3cudG90YWwpIH07XG4gICAgZW50cnkub3V0Y29tZXMucHVzaChyb3cuc3RhdHVzID09PSAnRkFJTEVEJyA/ICdmYWlsZWQnIDogJ3N1Y2NlZWRlZCcpO1xuICAgIGJ5T3JnLnNldChyb3cub3JnX2lkLCBlbnRyeSk7XG4gIH1cblxuICBsZXQgYmFzZWxpbmUgPSB7IHJlbGVhc2VWZXJzaW9uOiBiYXNlbGluZVJlbGVhc2VWZXJzaW9uLCBydW5zOiAwLCBmYWlsdXJlczogMCB9O1xuICBpZiAoYmFzZWxpbmVSZWxlYXNlVmVyc2lvbiAhPT0gbnVsbCAmJiBiYXNlbGluZVJlbGVhc2VWZXJzaW9uICE9PSByZWxlYXNlVmVyc2lvbikge1xuICAgIGNvbnN0IFtiXSA9IGF3YWl0IGV4ZWN1dGVSb3dzPHsgcnVuczogc3RyaW5nIHwgbnVtYmVyOyBmYWlsdXJlczogc3RyaW5nIHwgbnVtYmVyIH0+KGRiLCBzcWxgXG4gICAgICBTRUxFQ1QgY291bnQoKikgQVMgcnVucywgY291bnQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKSBBUyBmYWlsdXJlc1xuICAgICAgICBGUk9NIHBpcGVsaW5lX2V2ZW50cyBlXG4gICAgICAgV0hFUkUgZS50b29sY2hhaW5fcmVsZWFzZSA9ICR7YmFzZWxpbmVSZWxlYXNlVmVyc2lvbn1cbiAgICAgICAgIEFORCBlLmV2ZW50X3R5cGUgPSAnQUNUSU9OJyBBTkQgZS5zdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJylcbiAgICAgICAgIEFORCBOT1QgJHtJU19TRUxGX01VVEFUSU9OfVxuICAgICAgICAgQU5EIGUuY3JlYXRlZF9hdCA+PSBjb2FsZXNjZSgke3NpbmNlfSwgJy1pbmZpbml0eSc6OnRpbWVzdGFtcHR6KVxuICAgIGApO1xuICAgIGJhc2VsaW5lID0geyByZWxlYXNlVmVyc2lvbjogYmFzZWxpbmVSZWxlYXNlVmVyc2lvbiwgcnVuczogTnVtYmVyKGI/LnJ1bnMgPz8gMCksIGZhaWx1cmVzOiBOdW1iZXIoYj8uZmFpbHVyZXMgPz8gMCkgfTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGV2YWx1YXRlQ2FuYXJ5R2F0ZSh7XG4gICAgcmVsZWFzZVZlcnNpb24sXG4gICAgY2FuZGlkYXRlOiBbLi4uYnlPcmcuZW50cmllcygpXS5tYXAoKFtvcmdJZCwgZV0pID0+ICh7IG9yZ0lkLCBvdXRjb21lczogZS5vdXRjb21lcyB9KSksXG4gICAgYmFzZWxpbmUsXG4gICAgcGFyYW1zOiByZXNvbHZlZCxcbiAgfSk7XG4gIC8vIFRoZSByZWFkIGlzIGFscmVhZHkgY2FwcGVkIHBlciBvcmcsIHNvIHRoZSBwcmUtY2FwIHRvdGFsIGlzIHRoZSB3aW5kb3cgY291bnQuXG4gIHJldHVybiB7IC4uLnJlc3VsdCwgdG90YWxSdW5zOiBbLi4uYnlPcmcudmFsdWVzKCldLnJlZHVjZSgobiwgZSkgPT4gbiArIGUudG90YWwsIDApIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBBZmZlY3RlZCB2aWV3ICjCpzkpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIEFmZmVjdGVkT3JnIHtcbiAgb3JnSWQ6IHN0cmluZztcbiAgLyoqIFBpcGVsaW5lcyBpbiB0aGlzIG9yZyBvbiB0aGUgcmVsZWFzZSB3aG9zZSBsYXRlc3Qgc3ludGggZmFpbGVkLiAqL1xuICBwaXBlbGluZXM6IG51bWJlcjtcbiAgcGlwZWxpbmVJZHM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFmZmVjdGVkUGlwZWxpbmVzIHtcbiAgcmVsZWFzZVZlcnNpb246IHN0cmluZztcbiAgdG90YWxQaXBlbGluZXM6IG51bWJlcjtcbiAgb3JnczogQWZmZWN0ZWRPcmdbXTtcbn1cblxuLyoqXG4gKiBQaXBlbGluZXMgd2hvc2UgREVQTE9ZRUQgcmVsZWFzZSBpcyBgcmVsZWFzZVZlcnNpb25gICh0aGVpciBtYW5pZmVzdCdzXG4gKiBgYnVpbGQtaW1hZ2VgIGVudHJ5KSBhbmQgd2hvc2UgTEFURVNUIHRlcm1pbmFsIHN5bnRoIHJ1biBmYWlsZWQsIGdyb3VwZWQgYnlcbiAqIG9yZyDigJQgdGhlIGNvbnNvbGUncyBBZmZlY3RlZCB2aWV3IGFuZCB0aGUgXCJOb3RpZnkgYWZmZWN0ZWQgb3duZXJzXCIgdGFyZ2V0XG4gKiBzZXQuIEEgcGlwZWxpbmUgd2hvc2UgbGF0ZXN0IHN5bnRoIHN1Y2NlZWRlZCBoYXMgaGVhbGVkIGFuZCBpcyBub3QgbGlzdGVkLlxuICpcbiAqIEVsZXZhdGVkIHJlYWQ6IGl0IHNwYW5zIGV2ZXJ5IG9yZy4gQ2FsbGVycyBzaG93IHRoZSBzeXN0ZW0tb3JnIG9wZXJhdG9yXG4gKiBjb3VudHMsIGFuZCBub3RpZnkgZWFjaCBvcmcgYWJvdXQgaXRzIG93biBwaXBlbGluZXMgb25seS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBZmZlY3RlZFBpcGVsaW5lcyhkYjogU3FsRXhlY3V0b3IsIHJlbGVhc2VWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPEFmZmVjdGVkUGlwZWxpbmVzPiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCBleGVjdXRlUm93czx7IG9yZ19pZDogc3RyaW5nOyBwaXBlbGluZV9pZDogc3RyaW5nIH0+KGRiLCBzcWxgXG4gICAgU0VMRUNUIG0ub3JnX2lkLCBtLnBpcGVsaW5lX2lkOjp0ZXh0IEFTIHBpcGVsaW5lX2lkXG4gICAgICBGUk9NIHBpcGVsaW5lX3N0ZXBfbWFuaWZlc3RzIG1cbiAgICAgIEpPSU4gTEFURVJBTCAoXG4gICAgICAgIFNFTEVDVCBlLnN0YXR1c1xuICAgICAgICAgIEZST00gcGlwZWxpbmVfZXZlbnRzIGVcbiAgICAgICAgIFdIRVJFIGUucGlwZWxpbmVfaWQgPSBtLnBpcGVsaW5lX2lkXG4gICAgICAgICAgIEFORCBlLnRvb2xjaGFpbl9yZWxlYXNlIElTIE5PVCBOVUxMXG4gICAgICAgICAgIEFORCBlLmV2ZW50X3R5cGUgPSAnQUNUSU9OJyBBTkQgZS5zdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJylcbiAgICAgICAgICAgQU5EIE5PVCAke0lTX1NFTEZfTVVUQVRJT059XG4gICAgICAgICBPUkRFUiBCWSBjb2FsZXNjZShlLmNvbXBsZXRlZF9hdCwgZS5jcmVhdGVkX2F0KSBERVNDLCBlLmNyZWF0ZWRfYXQgREVTQ1xuICAgICAgICAgTElNSVQgMVxuICAgICAgKSBsYXRlc3QgT04gbGF0ZXN0LnN0YXR1cyA9ICdGQUlMRUQnXG4gICAgIFdIRVJFIG0uc3RlcF9rZXkgPSAke0JVSUxEX0lNQUdFX1NURVBfS0VZfSBBTkQgbS5wbHVnaW5fbmFtZSA9ICR7QlVJTERfSU1BR0VfUExVR0lOfSBBTkQgbS5wbHVnaW5fcHVibGlzaGVyIElTIE5VTExcbiAgICAgICBBTkQgbS5wbHVnaW5fdmVyc2lvbiA9ICR7cmVsZWFzZVZlcnNpb259XG4gICAgIE9SREVSIEJZIG0ub3JnX2lkLCBtLnBpcGVsaW5lX2lkXG4gIGApO1xuICBjb25zdCBieU9yZyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgZm9yIChjb25zdCByIG9mIHJvd3MpIHtcbiAgICBjb25zdCBpZHMgPSBieU9yZy5nZXQoci5vcmdfaWQpID8/IFtdO1xuICAgIGlmICghaWRzLmluY2x1ZGVzKHIucGlwZWxpbmVfaWQpKSBpZHMucHVzaChyLnBpcGVsaW5lX2lkKTtcbiAgICBieU9yZy5zZXQoci5vcmdfaWQsIGlkcyk7XG4gIH1cbiAgY29uc3Qgb3JncyA9IFsuLi5ieU9yZy5lbnRyaWVzKCldLm1hcCgoW29yZ0lkLCBwaXBlbGluZUlkc10pID0+ICh7IG9yZ0lkLCBwaXBlbGluZXM6IHBpcGVsaW5lSWRzLmxlbmd0aCwgcGlwZWxpbmVJZHMgfSkpO1xuICByZXR1cm4geyByZWxlYXNlVmVyc2lvbiwgdG90YWxQaXBlbGluZXM6IG9yZ3MucmVkdWNlKChuLCBvKSA9PiBuICsgby5waXBlbGluZXMsIDApLCBvcmdzIH07XG59XG5cbi8qKiBUaGUgY3VycmVudCBwbGF0Zm9ybSBkZWZhdWx0IChlbGV2YXRlZCByZWFkKSwgb3IgbnVsbC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkUGxhdGZvcm1EZWZhdWx0UmVsZWFzZShkYjogU3FsRXhlY3V0b3IpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgW3Jvd10gPSBhd2FpdCBleGVjdXRlUm93czx7IHJlbGVhc2VfdmVyc2lvbjogc3RyaW5nIH0+KGRiLCBzcWxgXG4gICAgU0VMRUNUIHJlbGVhc2VfdmVyc2lvbiBGUk9NIHRvb2xjaGFpbl9wbGF0Zm9ybV9kZWZhdWx0IFdIRVJFIHNpbmdsZXRvbiA9IHRydWVcbiAgYCk7XG4gIHJldHVybiByb3c/LnJlbGVhc2VfdmVyc2lvbiA/PyBudWxsO1xufVxuIl19
|
|
@@ -540,9 +540,25 @@ export interface ComputeIngestMetric {
|
|
|
540
540
|
durationMs: number | null;
|
|
541
541
|
credits: number | null;
|
|
542
542
|
}
|
|
543
|
+
/**
|
|
544
|
+
* One terminal managed-toolchain run (docs/plans/bootstrap-image-versioning.md
|
|
545
|
+
* §7): a `synth` or `self-mutation` action whose row was stamped with the
|
|
546
|
+
* release from the platform's deployed manifest. ALERTING ONLY — the canary
|
|
547
|
+
* gate and the Affected view read the rows, never this metric.
|
|
548
|
+
*
|
|
549
|
+
* `platformDefaultRelease` is the default at ingest time, for the alert's
|
|
550
|
+
* baseline (`pipeline_toolchain_platform_default_seen_timestamp_seconds`).
|
|
551
|
+
*/
|
|
552
|
+
export interface ToolchainIngestMetric {
|
|
553
|
+
kind: 'toolchain';
|
|
554
|
+
toolchainRelease: string;
|
|
555
|
+
action: 'synth' | 'self-mutation';
|
|
556
|
+
outcome: 'succeeded' | 'failed';
|
|
557
|
+
platformDefaultRelease: string | null;
|
|
558
|
+
}
|
|
543
559
|
/** What the ingest fans out to its caller's metric registry. Discriminated, so
|
|
544
560
|
* a new kind cannot be silently counted as a stage outcome. */
|
|
545
|
-
export type IngestMetric = StageIngestMetric | ComputeIngestMetric;
|
|
561
|
+
export type IngestMetric = StageIngestMetric | ComputeIngestMetric | ToolchainIngestMetric;
|
|
546
562
|
/** Counts + the (possibly truncated) list of unregistered pipeline ids the caller can log. */
|
|
547
563
|
export interface IngestResult {
|
|
548
564
|
inserted: number;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
export {};
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcmVwb3J0aW5nL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBQdWJsaWMgcmVzdWx0IHNoYXBlcyBmb3IgdGhlIHJlcG9ydGluZyBzZXJ2aWNlLlxuICpcbiAqIFNwbGl0IG91dCBvZiByZXBvcnRpbmctc2VydmljZS50cyBwdXJlbHkgZm9yIHNpemU6IHRoZXNlIGFyZSBkYXRhIGNvbnRyYWN0c1xuICogd2l0aCBubyBiZWhhdmlvdXIuIHJlcG9ydGluZy1zZXJ2aWNlLnRzIHJlLWV4cG9ydHMgdGhlbSwgc28gdGhlXG4gKiBgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YWAgcHVibGljIHN1cmZhY2UgaXMgdW5jaGFuZ2VkLlxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uQ291bnQge1xuICBpZDogc3RyaW5nO1xuICBwcm9qZWN0OiBzdHJpbmc7XG4gIG9yZ2FuaXphdGlvbjogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHRvdGFsOiBudW1iZXI7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgY2FuY2VsZWQ6IG51bWJlcjtcbiAgZmlyc3RFeGVjdXRpb246IHN0cmluZyB8IG51bGw7XG4gIGxhc3RFeGVjdXRpb246IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZVNlcmllc0VudHJ5IHtcbiAgcGVyaW9kOiBzdHJpbmc7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgY2FuY2VsZWQ6IG51bWJlcjtcbiAgc3VjY2Vzc1BjdDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIER1cmF0aW9uU3RhdHMge1xuICBpZDogc3RyaW5nO1xuICBwcm9qZWN0OiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgYXZnTXM6IG51bWJlcjtcbiAgbWluTXM6IG51bWJlcjtcbiAgbWF4TXM6IG51bWJlcjtcbiAgcDk1TXM6IG51bWJlcjtcbiAgZXhlY3V0aW9uczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lRXhlY3V0aW9uIHtcbiAgZXhlY3V0aW9uSWQ6IHN0cmluZztcbiAgLyoqIFJvbGxlZC11cCB0ZXJtaW5hbCBzdGF0dXM6IHN1Y2NlZWRlZCB8IGZhaWxlZCB8IGNhbmNlbGVkIHwgaW4tcHJvZ3Jlc3MuICovXG4gIHN0YXR1czogc3RyaW5nO1xuICBzdGFydGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIGVuZGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIGR1cmF0aW9uTXM6IG51bWJlciB8IG51bGw7XG4gIC8qKiBGaXJzdCBmYWlsaW5nIHN0YWdlL2FjdGlvbiBmb3IgdGhlIGV4ZWN1dGlvbiAobnVsbCB3aGVuIGl0IGRpZG4ndCBmYWlsKS4gKi9cbiAgZmFpbGluZ1N0YWdlOiBzdHJpbmcgfCBudWxsO1xuICBmYWlsaW5nQWN0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhlIGZpcnN0IGZhaWx1cmUgZGV0YWlsIGFuIGV2ZW50IG9mIHRoZSBleGVjdXRpb24gY2FycmllZCAoYGRldGFpbC5mYWlsdXJlYCksIG9yIG51bGwuICovXG4gIGZhaWx1cmU6IHVua25vd24gfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlRmFpbHVyZSB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBmYWlsdXJlczogbnVtYmVyO1xuICB0b3RhbDogbnVtYmVyO1xuICBmYWlsdXJlUGN0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhZ2VCb3R0bGVuZWNrIHtcbiAgaWQ6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgYXZnTXM6IG51bWJlcjtcbiAgbWF4TXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25GYWlsdXJlIHtcbiAgYWN0aW9uTmFtZTogc3RyaW5nO1xuICBmYWlsdXJlczogbnVtYmVyO1xuICB0b3RhbDogbnVtYmVyO1xuICBmYWlsdXJlUGN0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JFbnRyeSB7XG4gIGVycm9yUGF0dGVybjogc3RyaW5nO1xuICBvY2N1cnJlbmNlczogbnVtYmVyO1xuICBhZmZlY3RlZFBpcGVsaW5lczogbnVtYmVyO1xuICBsYXN0U2Vlbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblN1bW1hcnkge1xuICB0b3RhbDogbnVtYmVyO1xuICBhY3RpdmU6IG51bWJlcjtcbiAgaW5hY3RpdmU6IG51bWJlcjtcbiAgLyoqIENvdW50cyBwZXIgc2hhcmluZyBydW5nIOKAlCBvbmUgYnVja2V0IHBlciBgdmlzaWJpbGl0eWAgdmFsdWUuICovXG4gIHB1YmxpYzogbnVtYmVyO1xuICBvcmc6IG51bWJlcjtcbiAgcHJpdmF0ZTogbnVtYmVyO1xuICB1bmlxdWVOYW1lczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uIHtcbiAgcGx1Z2luVHlwZTogc3RyaW5nO1xuICBjb21wdXRlVHlwZTogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcnNpb25Db3VudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbkNvdW50OiBudW1iZXI7XG4gIGxhdGVzdFZlcnNpb246IHN0cmluZztcbiAgaGFzRGVmYXVsdDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZFRpbWVTZXJpZXNFbnRyeSB7XG4gIHBlcmlvZDogc3RyaW5nO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIHN1Y2Nlc3NQY3Q6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZER1cmF0aW9uIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBhdmdNczogbnVtYmVyO1xuICBtYXhNczogbnVtYmVyO1xuICBidWlsZHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQbHVnaW4gcnVudGltZSByZXBvcnQgZmlsdGVycy4gYHB1Ymxpc2hlcjogbnVsbGAgc2VsZWN0cyBvd24tb3JnXG4gKiAocHVibGlzaGVyLWxlc3MpIHBsdWdpbnM7IGFuIG9taXR0ZWQgZmllbGQgZG9lc24ndCBmaWx0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luUnVudGltZUZpbHRlciB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHB1Ymxpc2hlcj86IHN0cmluZyB8IG51bGw7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG59XG5cbi8qKiBQZXIgcGx1Z2luIHZlcnNpb24gcnVudGltZSBzdGF0cyBvdmVyIGEgd2luZG93ICh0ZXJtaW5hbCBBQ1RJT04gcnVucykuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblJ1bnRpbWVTdGF0cyB7XG4gIHBsdWdpblB1Ymxpc2hlcjogc3RyaW5nIHwgbnVsbDtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7XG4gIHJ1bnM6IG51bWJlcjtcbiAgc3VjY2VlZGVkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICAvKiogMOKAkzEwMCwgb25lIGRlY2ltYWwuICovXG4gIHN1Y2Nlc3NQY3Q6IG51bWJlcjtcbiAgLyoqIE51bGwgd2hlbiBubyBydW4gaW4gdGhlIGdyb3VwIGNhcnJpZWQgYSBkdXJhdGlvbi4gKi9cbiAgcDUwTXM6IG51bWJlciB8IG51bGw7XG4gIHA5NU1zOiBudW1iZXIgfCBudWxsO1xuICBsYXN0UnVuOiBzdHJpbmc7XG59XG5cbi8qKiBDcm9zcy1vcmcgMzAtZGF5IGFnZ3JlZ2F0ZSBmb3Igb25lIGAocHVibGlzaGVyLCBuYW1lKWAgbGlzdGluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luUnVudGltZUFnZ3JlZ2F0ZSB7XG4gIHJ1bnMzMGQ6IG51bWJlcjtcbiAgLyoqIDDigJMxOyBudWxsIHdoZW4gdGhlcmUgd2VyZSBubyBydW5zLiAqL1xuICBzdWNjZXNzUmF0ZTMwZDogbnVtYmVyIHwgbnVsbDtcbiAgYWN0aXZlT3JnQ291bnQzMGQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZEZhaWx1cmUge1xuICBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gIGVycm9yTWVzc2FnZTogc3RyaW5nO1xuICBvY2N1cnJlbmNlczogbnVtYmVyO1xuICBsYXN0U2Vlbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBET1JBIGhlYWRsaW5lIGVudmlyb25tZW50LiBEZXBsb3ltZW50IHRvIHRoaXMgbGl0ZXJhbCBlbnYgbmFtZSBpcyB0aGVcbiAqIGluZHVzdHJ5LXN0YW5kYXJkIERPUkEgc2lnbmFsOyBNVFRSIGlzIG1lYXN1cmVkIHByb2R1Y3Rpb24tb25seSwgYW5kIHRoaXNcbiAqIGVudmlyb25tZW50J3MgY2FyZCBpcyB0aGUgc3VtbWFyeSBzaG93biBhdCB0aGUgdG9wIG9mIHRoZSBwYW5lbC5cbiAqL1xuXG4vKiogUGVyLW9yZyByZXRlbnRpb24gb3ZlcnJpZGUgcm93LiBCb3RoIG51bGxhYmxlIOKHkiBnbG9iYWwgZGVmYXVsdHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGluZ1JldGVudGlvblNldHRpbmdzIHtcbiAgZXZlbnRSZXRlbnRpb25EYXlzOiBudW1iZXIgfCBudWxsO1xuICBkb3JhUmV0ZW50aW9uRGF5czogbnVtYmVyIHwgbnVsbDtcbiAgZGVmYXVsdEV2ZW50UmV0ZW50aW9uRGF5czogbnVtYmVyO1xuICBkZWZhdWx0RG9yYVJldGVudGlvbkRheXM6IG51bWJlcjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHRoZSByZXBvcnRpbmcgcmV0ZW50aW9uIHN3ZWVwLiAqL1xuLyoqXG4gKiBIb3cgYSB0aW1lLWJ1Y2tldGVkIHJlcG9ydCBzbGljZXMgaXRzIHBlcmlvZHMuIEFic2VudCBtZWFucyBVVEMgKyBNb25kYXksIHdoaWNoXG4gKiBpcyB3aGF0IGV2ZXJ5IHByZS10aW1lem9uZSBjYWxsZXIgZ290IOKAlCBzbyBhbiBvbWl0dGVkIHZhbHVlIGNhbiBuZXZlciBzaWxlbnRseVxuICogY2hhbmdlIGFuIGV4aXN0aW5nIHJlcG9ydCdzIGJvdW5kYXJpZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0T3B0aW9ucyB7XG4gIC8qKiBJQU5BIHRpbWV6b25lIHRoZSBidWNrZXRzIGFyZSBjdXQgaW4gKHZhbGlkYXRlZCBhdCB0aGUgcm91dGUpLiAqL1xuICB0ej86IHN0cmluZztcbiAgLyoqIFdoZXJlIHRoZSB3ZWVrIHN0YXJ0cy4gUG9zdGdyZXMgREFURV9UUlVOQyBpcyBNb25kYXktb25seSwgc28gYHN1bmRheWBcbiAgICogIHNoaWZ0cyB0aGUgYm91bmRhcnkgZXhwbGljaXRseS4gKi9cbiAgd2Vla1N0YXJ0PzogJ21vbmRheScgfCAnc3VuZGF5Jztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRpbmdSZXRlbnRpb25PcHRpb25zIHtcbiAgLyoqIFJvd3MgZGVsZXRlZCBwZXIgc3RhdGVtZW50IChkZWZhdWx0IDEwMDApLiAqL1xuICBiYXRjaFNpemU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbGVhZGVyLWxvY2tlZCBydW4gdGhpcyBzd2VlcCBiZWxvbmdzIHRvLiBDaGVja2VkIEJFVFdFRU4gT1JHUzogYWJvcnRlZFxuICAgKiBtZWFucyB0aGUgbG9jayB3YXMgbG9zdCAoYW5vdGhlciBwb2QgaXMgdGFraW5nIG92ZXIpIG9yIHRoZSBwcm9jZXNzIGlzXG4gICAqIHNodXR0aW5nIGRvd24sIGFuZCB0aGUgcmVtYWluaW5nIG9yZ3MgYXJlIHBpY2tlZCB1cCBuZXh0IHRpY2suIFdpdGhvdXQgaXQgYVxuICAgKiBsb25nIHN3ZWVwIGtlcHQgZGVsZXRpbmcgYWZ0ZXIgYW5vdGhlciBwb2QgaGFkIGFscmVhZHkgdGFrZW4gdGhlIGxvY2suXG4gICAqL1xuICBydW4/OiB7IHNpZ25hbDogQWJvcnRTaWduYWwgfTtcbiAgLyoqIE1heCBiYXRjaGVzIHBlciB0YWJsZSBwZXIgb3JnIHBlciB0aWNrIChkZWZhdWx0IDUwKTsgdGhlIHJlc3QgZGVmZXJzIHRvXG4gICAqICB0aGUgbmV4dCB0aWNrIHNvIGEgaHVnZSBiYWNrbG9nIGNhbid0IGhvbGQgbG9ja3MgdG9vIGxvbmcuICovXG4gIG1heEJhdGNoZXNQZXJUYWJsZT86IG51bWJlcjtcbiAgLyoqIEZpeGVkIFwibm93XCIgZm9yIHRoZSB3aG9sZSBzd2VlcCAoZGVmYXVsdCBgbmV3IERhdGUoKWApLiAqL1xuICBub3c/OiBEYXRlO1xuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgb3JnIHdob3NlIGBkb3JhX3NldHRpbmdzYCByZXRlbnRpb24gZ292ZXJucyBgb3JnSWRgJ3Mgcm93cyDigJQgaXRzXG4gICAqIGFjY291bnQgUk9PVC4gUmV0ZW50aW9uIGlzIGEgYmlsbGluZyBlbnRpdGxlbWVudCBzeW5jZWQgb250byB0aGUgcm9vdCBvbmx5LFxuICAgKiBzbyBhIHRlYW0ncyByb3dzIG11c3QgZm9sbG93IHRoZSByb290J3MgKHB1cmNoYXNlZCkgd2luZG93LCBub3QgdGhlIGVudlxuICAgKiBkZWZhdWx0LiBSZXR1cm4gYG51bGxgIHdoZW4gdGhlIHJvb3QgY2FuJ3QgYmUgcmVzb2x2ZWQ6IHRoYXQgb3JnIGlzIFNLSVBQRURcbiAgICogdGhpcyB0aWNrIChuZXZlciBwdXJnZWQgb24gYSBwb3NzaWJseS1zaG9ydGVyIHdpbmRvdykuIERlZmF1bHQ6IGlkZW50aXR5XG4gICAqIChldmVyeSBvcmcgaXMgaXRzIG93biByb290IOKAlCBhIGZsYXQgZGVwbG95bWVudCkuXG4gICAqL1xuICByZXNvbHZlUmV0ZW50aW9uT3JnSWQ/OiAob3JnSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbn1cblxuLyoqIFBlci1ydW4gcHVyZ2UgdGFsbGllcyAoYWxzbyBsb2dnZWQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRpbmdSZXRlbnRpb25Db3VudHMge1xuICAvKiogT3JncyBzd2VwdCB0aGlzIHJ1bi4gKi9cbiAgb3JnczogbnVtYmVyO1xuICAvKiogU3RhbmRhcmQgYHBpcGVsaW5lX2V2ZW50c2AgKGVudmlyb25tZW50IElTIE5VTEwpIHJvd3MgcHVyZ2VkLiAqL1xuICBzdGFuZGFyZEV2ZW50czogbnVtYmVyO1xuICAvKiogRE9SQS1zb3VyY2UgYHBpcGVsaW5lX2V2ZW50c2AgKGVudmlyb25tZW50IElTIE5PVCBOVUxMKSByb3dzIHB1cmdlZC4gKi9cbiAgZG9yYUV2ZW50czogbnVtYmVyO1xuICAvKiogYGRlcGxveW1lbnRfb3V0Y29tZXNgIHJvd3MgcHVyZ2VkLiAqL1xuICBkZXBsb3ltZW50T3V0Y29tZXM6IG51bWJlcjtcbiAgLyoqIGBpbmNpZGVudHNgIHJvd3MgcHVyZ2VkLiAqL1xuICBpbmNpZGVudHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBET1JBIHBlcmZvcm1hbmNlIGJhbmQuIGBudWxsYCA9IGluc3VmZmljaWVudCBkYXRhIHRvIGNsYXNzaWZ5IChub1xuICogZGVwbG95bWVudHMvZmFpbHVyZXMvbGVhZC10aW1lIHNhbXBsZSBpbiB0aGUgd2luZG93KSwgc28gdGhlIFVJIHNob3dzIGFcbiAqIG5ldXRyYWwgc3RhdGUgcmF0aGVyIHRoYW4gbWlzbGFiZWxpbmcgYW4gZW1wdHkgd2luZG93IGFzIFwibG93XCIuXG4gKi9cbmV4cG9ydCB0eXBlIERvcmFMZXZlbCA9ICdlbGl0ZScgfCAnaGlnaCcgfCAnbWVkaXVtJyB8ICdsb3cnIHwgbnVsbDtcblxuLyoqIE9wdGlvbmFsIHNjb3BpbmcgZm9yIHtAbGluayBSZXBvcnRpbmdTZXJ2aWNlLmdldERvcmFNZXRyaWNzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9yYU9wdGlvbnMge1xuICAvKiogUmVzdHJpY3QgdG8gYSBzaW5nbGUgcGlwZWxpbmUgKHBlci1waXBlbGluZSBET1JBKS4gKi9cbiAgcGlwZWxpbmVJZD86IHN0cmluZztcbiAgLyoqIFJlc3RyaWN0IHRvIGEgc2luZ2xlIGRlcGxveSBlbnZpcm9ubWVudCAoZWxzZSBhbGwgZGVwbG95IGVudmlyb25tZW50cykuICovXG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICAvKipcbiAgICogUGVyLW9yZyBpbmNpZGVudOKGkmRlcGxveSBjb3JyZWxhdGlvbiB3aW5kb3cgb3ZlcnJpZGUgKGhvdXJzKS4gV2hlbiBzZXQgKGFcbiAgICogcG9zaXRpdmUgZmluaXRlIG51bWJlciksIHRoZSBpbmNpZGVudCBjb3JyZWxhdGlvbiB1c2VzIGl0IGluc3RlYWQgb2YgdGhlXG4gICAqIGdsb2JhbCBgRE9SQV9JTkNJREVOVF9XSU5ET1dfSE9VUlNgLiBUaGUgcm91dGUgcmVzb2x2ZXMgdGhpcyBmcm9tIHRoZSBvcmcnc1xuICAgKiBgZG9yYV9zZXR0aW5nc2Agcm93IChzZWUge0BsaW5rIFJlcG9ydGluZ1NlcnZpY2UuZ2V0UmVwb3J0aW5nU2V0dGluZ3N9KSBhbmRcbiAgICogcGFzc2VzIGl0IGluOyB1bnNldCBmYWxscyBiYWNrIHRvIHRoZSBlbnYgZGVmYXVsdC5cbiAgICovXG4gIGluY2lkZW50V2luZG93SG91cnM/OiBudW1iZXI7XG4gIC8qKiBJQU5BIHRpbWV6b25lIGZvciB0aGUgdHJlbmQncyBidWNrZXRzIChzZWUge0BsaW5rIEJ1Y2tldE9wdGlvbnN9KS4gKi9cbiAgdHo/OiBzdHJpbmc7XG4gIC8qKiBXZWVrIHN0YXJ0IGZvciB0aGUgdHJlbmQncyBidWNrZXRzLiAqL1xuICB3ZWVrU3RhcnQ/OiAnbW9uZGF5JyB8ICdzdW5kYXknO1xufVxuXG4vKipcbiAqIFBlci1vcmcgcmVwb3J0aW5nIHNldHRpbmdzIHN1cmZhY2VkIHRvIHRoZSBvcmctYWRtaW4gcGFuZWwuIGBpbmNpZGVudFdpbmRvd0hvdXJzYFxuICogaXMgdGhlIGluY2lkZW504oaSZGVwbG95IGNvcnJlbGF0aW9uIHdpbmRvdzsgYGV2ZW50UmV0ZW50aW9uRGF5c2AgL1xuICogYGRvcmFSZXRlbnRpb25EYXlzYCBhcmUgdGhlIHR3byByZXRlbnRpb24tc3dlZXAgd2luZG93cy4gRWFjaCBvdmVycmlkZVxuICogaXMgYG51bGxgIHdoZW4gdW5zZXQgKHRoZSBwYWlyZWQgYGRlZmF1bHQqYCBmaWVsZCBzaG93cyB0aGUgZW52IGZhbGxiYWNrIGFwcGxpZWQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGluZ1NldHRpbmdzIHtcbiAgLyoqIFRoZSBvcmcncyBzdG9yZWQgY29ycmVsYXRpb24td2luZG93IG92ZXJyaWRlIGluIGhvdXJzLCBvciBgbnVsbGAgd2hlbiB1bnNldC4gKi9cbiAgaW5jaWRlbnRXaW5kb3dIb3VyczogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIFRoZSBnbG9iYWwgZW52IGRlZmF1bHQgYXBwbGllZCB3aGVuIG5vIG92ZXJyaWRlIGlzIHN0b3JlZC4gKi9cbiAgZGVmYXVsdFdpbmRvd0hvdXJzOiBudW1iZXI7XG4gIC8qKiBTdGFuZGFyZC1ldmVudCByZXRlbnRpb24gb3ZlcnJpZGUgaW4gZGF5cywgb3IgYG51bGxgIHdoZW4gdW5zZXQuICovXG4gIGV2ZW50UmV0ZW50aW9uRGF5czogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIERPUkEtc291cmNlIHJldGVudGlvbiBvdmVycmlkZSBpbiBkYXlzLCBvciBgbnVsbGAgd2hlbiB1bnNldC4gKi9cbiAgZG9yYVJldGVudGlvbkRheXM6IG51bWJlciB8IG51bGw7XG4gIC8qKiBHbG9iYWwgc3RhbmRhcmQtZXZlbnQgcmV0ZW50aW9uIGRlZmF1bHQgYXBwbGllZCB3aGVuIHVuc2V0IChkYXlzKS4gKi9cbiAgZGVmYXVsdEV2ZW50UmV0ZW50aW9uRGF5czogbnVtYmVyO1xuICAvKiogR2xvYmFsIERPUkEtc291cmNlIHJldGVudGlvbiBkZWZhdWx0IGFwcGxpZWQgd2hlbiB1bnNldCAoZGF5cykuICovXG4gIGRlZmF1bHREb3JhUmV0ZW50aW9uRGF5czogbnVtYmVyO1xufVxuXG4vKiogQSBwYXJ0aWFsIHJlcG9ydGluZy1zZXR0aW5ncyB3cml0ZSAoNykuIE9ubHkgcHJvdmlkZWQgZmllbGRzIGFyZVxuICogIHVwc2VydGVkOyBvbWl0dGVkIGZpZWxkcyBhcmUgbGVmdCB1bmNoYW5nZWQgKGFuIG9taXR0ZWQgcmV0ZW50aW9uIGZpZWxkIGtlZXBzXG4gKiAgaXRzIHN0b3JlZCBvdmVycmlkZSAvIHRoZSBnbG9iYWwgZGVmYXVsdCkuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGluZ1NldHRpbmdzUGF0Y2gge1xuICBpbmNpZGVudFdpbmRvd0hvdXJzPzogbnVtYmVyO1xuICBldmVudFJldGVudGlvbkRheXM/OiBudW1iZXI7XG4gIGRvcmFSZXRlbnRpb25EYXlzPzogbnVtYmVyO1xufVxuXG4vKiogT25lIHJvdyBvZiB0aGUgb3JnLWFkbWluIGluY2lkZW50cyBsaXN0IChyZWNlbnQgaW5jaWRlbnRzICsgZGVwbG95IGNvcnJlbGF0aW9uKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jaWRlbnRMaXN0SXRlbSB7XG4gIGluY2lkZW50SWQ6IHN0cmluZztcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgc2V2ZXJpdHk6IHN0cmluZztcbiAgb3BlbmVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIHJlc29sdmVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIGNyZWF0ZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRydWUgb25jZSB0aGUgaW5jaWRlbnQgaGFzIGEgYHJlc29sdmVkX2F0YC4gKi9cbiAgcmVzb2x2ZWQ6IGJvb2xlYW47XG4gIC8qKiBUaGUgY29ycmVsYXRlZCBkZXBsb3kgZXhlY3V0aW9uIGlkIChtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSBpbi13aW5kb3cpLCBvciBudWxsLiAqL1xuICBjb3JyZWxhdGVkRXhlY3V0aW9uSWQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBUaGF0IGRlcGxveSdzIGNvbXBsZXRpb24gaW5zdGFudCwgb3IgbnVsbCB3aGVuIHVuY29ycmVsYXRlZC4gKi9cbiAgZGVwbG95Q29tcGxldGVkQXQ6IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBSZXN1bHQgb2YgdGhlIHdpcmluZy10ZXN0IGRyeS1ydW4gY29ycmVsYXRpb24gKHtAbGluayBSZXBvcnRpbmdTZXJ2aWNlLnRlc3RJbmNpZGVudENvcnJlbGF0aW9ufSkuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50VGVzdFJlc3VsdCB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIC8qKiBUaGUgc3ludGhldGljIGluY2lkZW50J3Mgb3BlbmVkQXQgKG5vdywgSVNPKS4gKi9cbiAgb3BlbmVkQXQ6IHN0cmluZztcbiAgLyoqIFRoZSBlZmZlY3RpdmUgY29ycmVsYXRpb24gd2luZG93IHVzZWQuICovXG4gIHdpbmRvd0hvdXJzOiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIGEgcmVjZW50IHN1Y2Nlc3NmdWwgZGVwbG95IHRvIGBlbnZpcm9ubWVudGAgY29ycmVsYXRlZC4gKi9cbiAgY29ycmVsYXRlZDogYm9vbGVhbjtcbiAgLyoqIFRoZSBjb3JyZWxhdGVkIGRlcGxveSBleGVjdXRpb24gaWQsIG9yIG51bGwuICovXG4gIGV4ZWN1dGlvbklkOiBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhhdCBkZXBsb3kncyBjb21wbGV0aW9uIGluc3RhbnQsIG9yIG51bGwuICovXG4gIGRlcGxveUNvbXBsZXRlZEF0OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vLyBET1JBIHBlcmZvcm1hbmNlIGJhbmRzICh0aHJlc2hvbGRzIGZyb20gdGhlIERPUkEvQWNjZWxlcmF0ZSByZXBvcnRzKS4gRWFjaFxuLy8gaGVscGVyIHJldHVybnMgYG51bGxgIHdoZW4gdGhlcmUncyBubyBzYW1wbGUgdG8gY2xhc3NpZnkuXG4vKiogRGVwbG95bWVudCBmcmVxdWVuY3kgYnkgZGVwbG95cy9kYXk6IGVsaXRlIOKJpTEvZGF5LCBoaWdoIOKJpTEvd2VlaywgbWVkaXVtIOKJpTEvbW9udGguICovXG5cbi8qKlxuICogRE9SQSBtZXRyaWNzIG92ZXIgYSBbZnJvbSx0b10gd2luZG93LCBvcmctc2NvcGVkIChzaW5nbGUtb3JnIG9yIHJvbGx1cCBzdWJ0cmVlKS5cbiAqXG4gKiBERVBMT1ktQkFTSVMg4oCUIGV2ZXJ5IG1ldHJpYyBkZXJpdmVzIGZyb20gcmVhbCBERVBMT1ktU1RBR0UgZXhlY3V0aW9ucywgaS5lLlxuICogYHBpcGVsaW5lX2V2ZW50c2Agcm93cyB3aXRoIGBldmVudF90eXBlPSdTVEFHRSdgIGFuZCBhIG5vbi1udWxsIGBlbnZpcm9ubWVudGBcbiAqICh0aGUgZm9yd2FyZGVyIHNldHMgYGVudmlyb25tZW50YCBvbmx5IGZvciB0aGUgc3RhZ2VzIGEgdXNlciBkZWNsYXJlZCBpblxuICogYHBiLmRlcGxveXNgKS4gQSBDSS1vbmx5IGJ1aWxkL3Rlc3QgcGlwZWxpbmUgd2l0aCBubyBkZXBsb3kgc3RhZ2UgcHJvZHVjZXMgTk9cbiAqIERPUkEgZGF0YSDigJQgdGhlcmUgaXMgbm8gcnVuLWJhc2VkIGZhbGxiYWNrLiBUaGUgcGFuZWwgaXMgZW1wdHkgdW50aWwgZGVwbG95ZWRcbiAqIHBpcGVsaW5lcyByZS1zeW50aCB3aXRoIHRoZSBuZXcgZGVwbG95IHRhZ3MgYW5kIHN0YXJ0IGVtaXR0aW5nIGRlcGxveSBldmVudHMuXG4gKlxuICogYHByb2R1Y3Rpb25gIGlzIHRoZSBoZWFkbGluZSBlbnZpcm9ubWVudDsgTVRUUiBpcyBtZWFzdXJlZCBwcm9kdWN0aW9uLW9ubHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9yYU1ldHJpY3Mge1xuICAvKiogVGhlIFtmcm9tLHRvXSB3aW5kb3cgZWNob2VkIGJhY2sgKGRlcGxveSBgY29tcGxldGVkX2F0YCByYW5nZSkuICovXG4gIHdpbmRvdzogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfTtcbiAgLyoqIFRoZSBzY29waW5nIGFwcGxpZWQgKGVjaG9lZCBmb3IgdGhlIFVJKTsgYG51bGxgIHdoZW4gdW5zY29wZWQuICovXG4gIGZpbHRlcnM6IHsgcGlwZWxpbmVJZDogc3RyaW5nIHwgbnVsbDsgZW52aXJvbm1lbnQ6IHN0cmluZyB8IG51bGwgfTtcbiAgLyoqIFRoZSBoZWFkbGluZSBlbnZpcm9ubWVudCBuYW1lIChgcHJvZHVjdGlvbmApLiAqL1xuICBoZWFkbGluZTogc3RyaW5nO1xuICAvKiogUGVyLWVudmlyb25tZW50IERGIC8gQ0ZSIC8gbGVhZCB0aW1lLiBTb3J0ZWQgaGVhZGxpbmUtZmlyc3QsIHRoZW4gQeKGklouICovXG4gIGVudmlyb25tZW50czogRG9yYUVudk1ldHJpY3NbXTtcbiAgLyoqXG4gICAqIE1lYW4gVGltZSBUbyBSZXN0b3JlIOKAlCBQUk9EVUNUSU9OLU9OTFksIGZyb20gYGRlcGxveW1lbnRfb3V0Y29tZXNgLlxuICAgKiBgbWVkaWFuKHJlc3RvcmVkLmF0IOKIkiBkZXBsb3llZC5jb21wbGV0ZWRfYXQpYCBvdmVyIHJlc3RvcmVkIHByb2R1Y3Rpb25cbiAgICogaW5jaWRlbnRzIChkZWx0YXMgY2xhbXBlZCDiiaUwKS4gYGluY2lkZW50c2AgY291bnRzIHByb2R1Y3Rpb24gZGVwbG95cyBtYXJrZWRcbiAgICogZmFpbGVkOyBgcmVzdG9yZWRgIGNvdW50cyB0aG9zZSB0aGF0IHJlY292ZXJlZDsgYG1lZGlhblNlY29uZHNgIGlzIG51bGwgd2hlblxuICAgKiBubyByZXN0b3JlZCBpbmNpZGVudCBoYXMgYSByZXNvbHZhYmxlIGRlcGxveSB0aW1lLlxuICAgKi9cbiAgbWVhblRpbWVUb1Jlc3RvcmU6IHtcbiAgICBpbmNpZGVudHM6IG51bWJlcjtcbiAgICByZXN0b3JlZDogbnVtYmVyO1xuICAgIG1lZGlhblNlY29uZHM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqIDkwdGgvOTV0aCBwZXJjZW50aWxlIHJlY292ZXJ5LCBvdmVyIHRoZSBzYW1lIHNhbXBsZSBhcyB0aGUgbWVkaWFuLiBUaGVcbiAgICAgKiAgbWVkaWFuIGFsb25lIGhpZGVzIHRoZSBsb25nIHRhaWwgdGhhdCBhY3R1YWxseSBkZWZpbmVzIGFuIG91dGFnZSdzIGNvc3Q7XG4gICAgICogIGBudWxsYCB3aGVuIG5vIHJlY292ZXJ5IGdhcCB3YXMgb2JzZXJ2ZWQuICovXG4gICAgcDkwU2Vjb25kczogbnVtYmVyIHwgbnVsbDtcbiAgICBwOTVTZWNvbmRzOiBudW1iZXIgfCBudWxsO1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG4gIC8qKlxuICAgKiBDb3ZlcmFnZSByZWNvbmNpbGlhdGlvbiDigJQgcmVnaXN0ZXJlZCBwaXBlbGluZXMgd2l0aCBubyBvYnNlcnZlZCBkZXBsb3kgaW5cbiAgICogdGhlIHdpbmRvdy4gQSBoaWdoIGB3aXRob3V0RGVwbG95c2AgY291bnQgbWVhbnMgRE9SQSBpcyBibGluZCB0byBtb3N0IG9mIHRoZVxuICAgKiBmbGVldCAocGlwZWxpbmVzIHRoYXQgaGF2ZW4ndCByZS1zeW50aGVkIHdpdGggZGVwbG95IHRhZ3MsIG9yIGRvbid0IGRlcGxveSkuXG4gICAqL1xuICBjb3ZlcmFnZToge1xuICAgIC8qKiBQaXBlbGluZXMgaW4gdGhlIHJlZ2lzdHJ5IChvcmctc2NvcGVkKS4gKi9cbiAgICByZWdpc3RlcmVkOiBudW1iZXI7XG4gICAgLyoqIFJlZ2lzdGVyZWQgcGlwZWxpbmVzIHdpdGgg4omlMSBkZXBsb3ktc3RhZ2UgZXhlY3V0aW9uIGluIHRoZSB3aW5kb3cuICovXG4gICAgZGVwbG95aW5nOiBudW1iZXI7XG4gICAgLyoqIHJlZ2lzdGVyZWQg4oiSIGRlcGxveWluZyAoY2xhbXBlZCDiiaUwKS4gKi9cbiAgICB3aXRob3V0RGVwbG95czogbnVtYmVyO1xuICB9O1xufVxuXG4vKiogUGVyLWVudmlyb25tZW50IERPUkEgbWV0cmljcyAoZGVwbG95bWVudCBmcmVxdWVuY3ksIENGUiwgbGVhZCB0aW1lKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9yYUVudk1ldHJpY3Mge1xuICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICAvKiogRGVwbG95bWVudCBGcmVxdWVuY3kg4oCUIHN1Y2Nlc3NmdWwgZGVwbG95LXN0YWdlIGV4ZWN1dGlvbnMgZm9yIHRoaXMgZW52LiAqL1xuICBkZXBsb3ltZW50RnJlcXVlbmN5OiB7XG4gICAgZGVwbG95bWVudHM6IG51bWJlcjtcbiAgICBwZXJEYXk6IG51bWJlcjtcbiAgICBsZXZlbDogRG9yYUxldmVsO1xuICB9O1xuICAvKipcbiAgICogQ2hhbmdlIEZhaWx1cmUgUmF0ZSDigJQgdHdvLWNsYXNzOlxuICAgKiBgKGRlcGxveVRpbWVGYWlsdXJlcyArIHBvc3REZXBsb3lGYWlsdXJlcykgLyBhdHRlbXB0c2AuXG4gICAqIC0gYGRlcGxveVRpbWVGYWlsdXJlc2Ag4oCUIGRlcGxveSBzdGFnZSBgcmVzdWx0PWZhaWxlZGAgKGZyb20gZXZlbnRzKS5cbiAgICogLSBgcG9zdERlcGxveUZhaWx1cmVzYCDigJQgYSBzdWNjZXNzZnVsIGRlcGxveSBsYXRlciBtYXJrZWQgZmFpbGVkIGluIHByb2RcbiAgICogICAoZnJvbSBgZGVwbG95bWVudF9vdXRjb21lc2ApLlxuICAgKiAtIGBhdHRlbXB0c2Ag4oCUIGFsbCB0ZXJtaW5hbCBkZXBsb3ktc3RhZ2UgYXR0ZW1wdHMgKHN1Y2NlZWRlZCArIGZhaWxlZCkuXG4gICAqL1xuICBjaGFuZ2VGYWlsdXJlUmF0ZToge1xuICAgIHJhdGU6IG51bWJlcjtcbiAgICBkZXBsb3lUaW1lRmFpbHVyZXM6IG51bWJlcjtcbiAgICBwb3N0RGVwbG95RmFpbHVyZXM6IG51bWJlcjtcbiAgICBhdHRlbXB0czogbnVtYmVyO1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG4gIC8qKlxuICAgKiBMZWFkIFRpbWUg4oCUIE1FQVNVUkVEOiBgbWVkaWFuKGRlcGxveV9jb21wbGV0ZWQg4oiSIG9sZGVzdF9jb21taXRfdGltZSlgIG92ZXJcbiAgICogc3VjY2Vzc2Z1bCBkZXBsb3lzIHdpdGggYSByZXNvbHZhYmxlIGNvbW1pdCB0aW1lc3RhbXAgKGRlbHRhcyBjbGFtcGVkIOKJpTApLlxuICAgKiBgbWVkaWFuU2Vjb25kc2AgaXMgYG51bGxgICg9IHVua25vd24pIHdoZW4gbm8gc3VjY2Vzc2Z1bCBkZXBsb3kgaW4gdGhpcyBlbnZcbiAgICogY2FycmllZCBhIGBjb21taXRfdGltZXN0YW1wYC4gVGhlIG9sZCBtZWRpYW4tcnVuLWR1cmF0aW9uIHByb3h5IGlzIHJlbW92ZWQuXG4gICAqXG4gICAqIGBwOTBTZWNvbmRzYC9gcDk1U2Vjb25kc2AgY29tZSBmcm9tIHRoZSBzYW1lIHNhbXBsZS4gVGhlIGxldmVsIGlzIHNjb3JlZCBvZmZcbiAgICogdGhlIE1FRElBTiBvbmx5LCBzbyBhZGRpbmcgdGhlIHRhaWxzIGNhbm5vdCBtb3ZlIGEgdGVhbSdzIERPUkEgYmFuZC5cbiAgICovXG4gIGxlYWRUaW1lOiB7XG4gICAgLyoqIFN1Y2Nlc3NmdWwgZGVwbG95cyB3aXRoIGEgcmVzb2x2YWJsZSBjb21taXQgdGltZSAodGhlIG1lZGlhbiBzYW1wbGUpLiAqL1xuICAgIGRlcGxveW1lbnRzOiBudW1iZXI7XG4gICAgbWVkaWFuU2Vjb25kczogbnVtYmVyIHwgbnVsbDtcbiAgICBwOTBTZWNvbmRzOiBudW1iZXIgfCBudWxsO1xuICAgIHA5NVNlY29uZHM6IG51bWJlciB8IG51bGw7XG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbn1cblxuLyoqIE9uZSBpbnRlcnZhbCBidWNrZXQgb2YgdGhlIERPUkEgdHJlbmQgKGRlcGxveSBmcmVxdWVuY3kgKyBjaGFuZ2UgZmFpbHVyZSkuICovXG5leHBvcnQgaW50ZXJmYWNlIERvcmFUcmVuZFBvaW50IHtcbiAgLyoqIEJ1Y2tldCBzdGFydCAoREFURV9UUlVOQyBvZiB0aGUgZGVwbG95IGBjb21wbGV0ZWRfYXRgKSwgSVNPIHRleHQuICovXG4gIHBlcmlvZDogc3RyaW5nO1xuICAvKiogU3VjY2Vzc2Z1bCBkZXBsb3ktc3RhZ2UgZXhlY3V0aW9ucyBpbiB0aGUgYnVja2V0LiAqL1xuICBkZXBsb3ltZW50czogbnVtYmVyO1xuICAvKiogRmFpbGVkIGRlcGxveS1zdGFnZSBleGVjdXRpb25zIGluIHRoZSBidWNrZXQuICovXG4gIGZhaWxlZDogbnVtYmVyO1xuICAvKiogc3VjY2VlZGVkICsgZmFpbGVkIGluIHRoZSBidWNrZXQgKGRlcGxveSBhdHRlbXB0cykuICovXG4gIHRvdGFsOiBudW1iZXI7XG4gIC8qKiBmYWlsZWQvdG90YWwgYXMgYSBwZXJjZW50ICgwIHdoZW4gdG90YWwgaXMgMCkuIERlcGxveS10aW1lIENGUiBvbmx5LiAqL1xuICBjaGFuZ2VGYWlsdXJlUGN0OiBudW1iZXI7XG59XG5cbi8qKiBQZXItc3RhZ2UgYnVpbGQtaGVhbHRoIG1ldHJpY3MgZm9yIG9uZSBwaXBlbGluZSBvdmVyIGEgd2luZG93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEhlYWx0aFN0YWdlIHtcbiAgc3RhZ2U6IHN0cmluZztcbiAgLyoqIFRlcm1pbmFsIHN0YWdlIHJ1bnMgKHN1Y2NlZWRlZCArIGZhaWxlZCkgaW4gdGhlIHdpbmRvdy4gKi9cbiAgcnVuczogbnVtYmVyO1xuICBzdWNjZXNzZXM6IG51bWJlcjtcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgLyoqIHN1Y2Nlc3NlcyAvIHJ1bnMgYXMgYSBwZXJjZW50ICgwIHdoZW4gcnVucyBpcyAwKS4gKi9cbiAgc3VjY2Vzc1JhdGU6IG51bWJlcjtcbiAgLyoqIER1cmF0aW9uIHBlcmNlbnRpbGVzIG92ZXIgdGhlIHN0YWdlJ3MgdGVybWluYWwgcnVuczsgbnVsbCB3aGVuIG5vIGR1cmF0aW9ucy4gKi9cbiAgcDUwTXM6IG51bWJlciB8IG51bGw7XG4gIHA5ME1zOiBudW1iZXIgfCBudWxsO1xuICBwOTlNczogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBQZXItcGlwZWxpbmUgYnVpbGQtaGVhbHRoIGJyZWFrZG93bi4gU3RhbmRhcmQgcmVwb3J0aW5nIChOT1RcbiAqIGBhZHZhbmNlZF9yZXBvcnRpbmdgLWdhdGVkKSDigJQgcGVyLXN0YWdlIHN1Y2Nlc3MgcmF0ZSArIHRpbWluZyBwZXJjZW50aWxlcywgd2l0aFxuICogdG90YWxzIHN1bW1lZCBhY3Jvc3Mgc3RhZ2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkSGVhbHRoIHtcbiAgc3RhZ2VzOiBCdWlsZEhlYWx0aFN0YWdlW107XG4gIHRvdGFsczogeyBydW5zOiBudW1iZXI7IGZhaWx1cmVzOiBudW1iZXI7IGZhaWx1cmVSYXRlOiBudW1iZXIgfTtcbn1cblxuLyoqIFBvc3QtZGVwbG95IGluY2lkZW50IG1hcmtlciBhY2NlcHRlZCBieSBgUmVwb3J0aW5nU2VydmljZS5yZWNvcmRJbmNpZGVudGAuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50SW5wdXQge1xuICBpbmNpZGVudElkOiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIG9wZW5lZEF0OiBzdHJpbmc7XG4gIHJlc29sdmVkQXQ/OiBzdHJpbmc7XG4gIHNldmVyaXR5OiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgcGVyc2lzdGVkIGluY2lkZW50IHN0YXRlIGFzIGFuIGF1ZGl0IHJvdyByZWNvcmRzIGl0IChzY3J1YmJlZCB2YWx1ZXMsIElTTyBpbnN0YW50cykuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50U3RhdGUge1xuICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICBvcGVuZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgcmVzb2x2ZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgc2V2ZXJpdHk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGBSZXBvcnRpbmdTZXJ2aWNlLnJlY29yZEluY2lkZW50YCBkaWQuIGBjaGFuZ2VkYCBpcyBmYWxzZSBmb3IgYSBzZW5kZXInc1xuICogcmVwZWF0LWludGVydmFsIHJlLXBvc3Qgb2YgYW4gdW5jaGFuZ2VkIGFsZXJ0LCBzbyB0aGUgcm91dGUgcmVjb3JkcyBhbiBhdWRpdFxuICogcm93IG9ubHkgZm9yIGFuIGluY2lkZW50IHRoYXQgaXMgbmV3IG9yIGFjdHVhbGx5IG1vdmVkIChvcGVuZWQsIHJlLW9wZW5lZCxcbiAqIHJlc29sdmVkLCByZS1yYW5rZWQpIOKAlCBhIHdlYmhvb2sgcmUtZmlyaW5nIGV2ZXJ5IGZldyBob3VycyBtdXN0IG5vdCBidXJ5IHRoZVxuICogdHJhaWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jaWRlbnRXcml0ZSB7XG4gIC8qKiBUaGUgc3RvcmVkIChzY3J1YmJlZCkgaW5jaWRlbnQgaWQuICovXG4gIGluY2lkZW50SWQ6IHN0cmluZztcbiAgY3JlYXRlZDogYm9vbGVhbjtcbiAgY2hhbmdlZDogYm9vbGVhbjtcbiAgYmVmb3JlOiBJbmNpZGVudFN0YXRlIHwgbnVsbDtcbiAgYWZ0ZXI6IEluY2lkZW50U3RhdGU7XG59XG5cbi8qKiBXaGF0IGBSZXBvcnRpbmdTZXJ2aWNlLnJlY29yZERlcGxveW1lbnRPdXRjb21lYCByZXBsYWNlZDogdGhlIHByaW9yIG1hcmtlciBvZiB0aGUgc2FtZSBvdXRjb21lLCBpZiBhbnkuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveW1lbnRPdXRjb21lV3JpdGUge1xuICBwcmV2aW91czogeyBhdDogc3RyaW5nIHwgbnVsbDsgZW52aXJvbm1lbnQ6IHN0cmluZyB8IG51bGwgfSB8IG51bGw7XG59XG5cbi8qKiBFdmVudCBwYXlsb2FkIGFjY2VwdGVkIGJ5IGBSZXBvcnRpbmdTZXJ2aWNlLmluZ2VzdEV2ZW50c2AuIE1pcnJvcnMgdGhlIHJvdXRlJ3MgWm9kIHNoYXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RFdmVudCB7XG4gIC8qKiBTdGFibGUgcGlwZWxpbmUgaWQgdGhlIGV2ZW50cyBMYW1iZGEgcmVhZCBmcm9tIHRoZSBgcGIucGlwZWxpbmUtaWRgXG4gICAqICB0YWcgKD0gdGhlIHBsYXRmb3JtIHBpcGVsaW5lSWQpLiBUaGUgcmVnaXN0cnkgam9pbiBrZXkuICovXG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIHwgJ2NvZGVidWlsZCcgfCAncGx1Z2luLWJ1aWxkJztcbiAgZXZlbnRUeXBlOiAnUElQRUxJTkUnIHwgJ1NUQUdFJyB8ICdBQ1RJT04nIHwgJ0JVSUxEJztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiAoQWN0aW9uIGV2ZW50cykuICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgLyoqIFNvdXJjZSBjb21taXQgaWQgb2YgdGhlIGNoYW5nZSBiZWluZyBzaGlwcGVkIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuICovXG4gIGNvbW1pdFNoYT86IHN0cmluZztcbiAgLyoqIFNvdXJjZSByZWYvYnJhbmNoIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuICovXG4gIGNvbW1pdFJlZj86IHN0cmluZztcbiAgLyoqIERlcGxveSB0YXJnZXQgKGUuZy4gXCJwcm9kdWN0aW9uXCIpLiBJdHMgcHJlc2VuY2Ugb24gYSBTVEFHRS9BQ1RJT04gZXZlbnRcbiAgICogIG1hcmtzIGEgcmVhbCBkZXBsb3ltZW50IChkZXJpdmVkIHNlcnZlci1zaWRlIOKAlCB0aGVyZSBpcyBubyBgaXNEZXBsb3lgKS4gKi9cbiAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIC8qKiBPbGRlc3QgdW5zaGlwcGVkIGNvbW1pdCB0aW1lc3RhbXAgKElTTyA4NjAxKSBmb3IgbWVhc3VyZWQgbGVhZCB0aW1lLiAqL1xuICBjb21taXRUaW1lc3RhbXA/OiBzdHJpbmc7XG4gIC8qKiBOdW1iZXIgb2YgY29tbWl0cyBzaGlwcGVkIGluIHRoaXMgY2hhbmdlICjiiaUxKS4gKi9cbiAgY29tbWl0Q291bnQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgRXZlbnRCcmlkZ2UgZXZlbnQgYGlkYCB0aGUgZm9yd2FyZGVyIHJlY2VpdmVkIHRoaXMgc3RhdGUgY2hhbmdlIGFzLlxuICAgKiBBV1MtYXNzaWduZWQgYW5kIHVuaXF1ZSBwZXIgZGVsaXZlcnkgc291cmNlIGV2ZW50LCBzbyBpdCBpcyB0aGUgc3Ryb25nZXN0XG4gICAqIGRlZHVwIGtleSB0aGVyZSBpcyAoYGV2ZW50X3NvdXJjZV9ldmVudF9pZHhgKSBhbmQgdGhlIHRocmVhZCBhbiBhdWRpdCBvclxuICAgKiBET1JBIHJvdyBmb2xsb3dzIGJhY2sgdG8gdGhlIGV4YWN0IEFXUyBldmVudC4gQWJzZW50IGZvciBwbHVnaW4tYnVpbGRcbiAgICogZXZlbnRzLCB3aGljaCBoYXZlIG5vIEV2ZW50QnJpZGdlIG9yaWdpbi5cbiAgICovXG4gIHNvdXJjZUV2ZW50SWQ/OiBzdHJpbmc7XG4gIC8qKiBUaGUgU1FTIG1lc3NhZ2UgaWQgaXQgYXJyaXZlZCBpbiAoZm9sZGVkIGludG8gYGRldGFpbC5zb3VyY2VNZXNzYWdlSWRgOyBub3QgYSBjb2x1bW4pLiAqL1xuICBzb3VyY2VNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIGRldGFpbD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIFBlci1ldmVudCBtZXRyaWMgZGVzY3JpcHRvciBlbWl0dGVkICh2aWEgdGhlIHtAbGluayBSZXBvcnRpbmdTZXJ2aWNlLmluZ2VzdEV2ZW50c31cbiAqIGBvbk1ldHJpY2AgaG9vaykgZm9yIGVhY2ggUkVHSVNURVJFRCB0ZXJtaW5hbCBkZXBsb3kvc3RhZ2UgZXZlbnQsIHNvIHRoZSByb3V0ZVxuICogbGF5ZXIgY2FuIGZhbiB0aGVtIGludG8gUHJvbWV0aGV1cyBjb3VudGVycyB3aXRob3V0IHBpcGVsaW5lLWRhdGEgaW1wb3J0aW5nXG4gKiBhcGktc2VydmVyJ3MgbWV0cmljcyByZWdpc3RyeS4gYHJlc3VsdGAgaXMgdGhlIHRlcm1pbmFsIG91dGNvbWU7IGBlbnZpcm9ubWVudGBcbiAqIGlzIG5vbi1udWxsIG9ubHkgZm9yIGEgZGVwbG95LXN0YWdlIGV2ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlSW5nZXN0TWV0cmljIHtcbiAga2luZDogJ3N0YWdlJztcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBvcmdJZDogc3RyaW5nO1xuICBzdGFnZTogc3RyaW5nO1xuICBlbnZpcm9ubWVudDogc3RyaW5nIHwgbnVsbDtcbiAgcmVzdWx0OiAnc3VjY2VlZGVkJyB8ICdmYWlsZWQnO1xufVxuXG4vKipcbiAqIE9uZSB0ZXJtaW5hbCBDb2RlQnVpbGQgQUNUSU9OJ3MgY29tcHV0ZSBjb25zdW1wdGlvbiAoUGhhc2UgNCwgbWVhc3VyZW1lbnRcbiAqIGhhbGYpLlxuICpcbiAqIGBjcmVkaXRzYCBpcyBOVUxMIHJhdGhlciB0aGFuIDAgd2hlbiB0aGUgYWN0aW9uIGNvdWxkIG5vdCBiZSBtZWFzdXJlZCDigJQgbm9cbiAqIGRlY2xhcmVkIHN0YXJ0IHRpbWUsIG9yIGEgY29tcHV0ZSBzaXplIHRoZSBmb3J3YXJkZXIgY291bGQgbm90IHJlYWQuIFRoZVxuICogZGlzdGluY3Rpb24gaXMgdGhlIHdob2xlIHZhbHVlIG9mIHRoaXMgbWV0cmljOiB6ZXJvIHdvdWxkIG1ha2UgYSBjb3ZlcmFnZSBnYXBcbiAqIGxvb2sgbGlrZSBpZGxlbmVzcywgYW5kIGEgdGllciBsYWRkZXIgcmUtZGVyaXZlZCBhZ2FpbnN0IGFuIHVua25vd25cbiAqIGRlbm9taW5hdG9yIGlzIGEgcmVwcmljaW5nIG5vYm9keSBjYW4gZGVmZW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXB1dGVJbmdlc3RNZXRyaWMge1xuICBraW5kOiAnY29tcHV0ZSc7XG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgb3JnSWQ6IHN0cmluZztcbiAgY29tcHV0ZVR5cGU6IHN0cmluZyB8IG51bGw7XG4gIGR1cmF0aW9uTXM6IG51bWJlciB8IG51bGw7XG4gIGNyZWRpdHM6IG51bWJlciB8IG51bGw7XG59XG5cbi8qKiBXaGF0IHRoZSBpbmdlc3QgZmFucyBvdXQgdG8gaXRzIGNhbGxlcidzIG1ldHJpYyByZWdpc3RyeS4gRGlzY3JpbWluYXRlZCwgc29cbiAqICBhIG5ldyBraW5kIGNhbm5vdCBiZSBzaWxlbnRseSBjb3VudGVkIGFzIGEgc3RhZ2Ugb3V0Y29tZS4gKi9cbmV4cG9ydCB0eXBlIEluZ2VzdE1ldHJpYyA9IFN0YWdlSW5nZXN0TWV0cmljIHwgQ29tcHV0ZUluZ2VzdE1ldHJpYztcblxuLyoqIENvdW50cyArIHRoZSAocG9zc2libHkgdHJ1bmNhdGVkKSBsaXN0IG9mIHVucmVnaXN0ZXJlZCBwaXBlbGluZSBpZHMgdGhlIGNhbGxlciBjYW4gbG9nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RSZXN1bHQge1xuICBpbnNlcnRlZDogbnVtYmVyO1xuICBza2lwcGVkOiBudW1iZXI7XG4gIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEV2ZXJ5IG9yZyB3aXRoIGF0IGxlYXN0IG9uZSByb3cgaW4gdGhpcyBiYXRjaCwgZGVkdXBlZC5cbiAgICpcbiAgICogQWxyZWFkeSBjb21wdXRlZCBmb3IgcG9zdC1jb21taXQgY2FjaGUgaW52YWxpZGF0aW9uOyBzdXJmYWNlZCBiZWNhdXNlIHRoZVxuICAgKiBpbmdlc3Qgcm91dGUgbmVlZHMgdGhlIHNhbWUgc2V0IHRvIHB1c2ggaXRzIGxpdmUgU1NFIGZyYW1lLiBUaGUgc3RhZ2UtbWV0cmljXG4gICAqIGhvb2sgY2FuJ3QgZHJpdmUgdGhhdCBmYW4tb3V0OiBpdCBvbmx5IGZpcmVzIGZvciBTVEFHRSBldmVudHMsIHNvIGEgYmF0Y2ggb2ZcbiAgICogUElQRUxJTkUgb3IgQlVJTEQgZXZlbnRzIHdvdWxkIGxhbmQgcm93cyBhbmQgcHVzaCBubyBmcmFtZSBhdCBhbGwuXG4gICAqL1xuICBhZmZlY3RlZE9yZ3M6IHN0cmluZ1tdO1xuICAvKipcbiAgICogRXZlbnRzIGRyb3BwZWQgYmVjYXVzZSB0aGUgcGlwZWxpbmUgdGhleSBuYW1lIGJlbG9uZ3MgdG8gYW4gb3JnIHRoZSBjYWxsZXJcbiAgICogbWF5IG5vdCB3cml0ZSBmb3IuIFN1cmZhY2VkIHNvIHRoZSByb3V0ZSBjYW4gbG9nIGFuZCBjb3VudCB0aGVtOiBhIG5vbi16ZXJvXG4gICAqIHZhbHVlIGlzIGVpdGhlciBhIG1pc3JvdXRlZCBwcm9kdWNlciBvciBhbiBhdHRlbXB0IHRvIGluamVjdCBldmVudHMgaW50b1xuICAgKiBhbm90aGVyIHRlbmFudCdzIHJlcG9ydHMsIGFuZCBib3RoIG5lZWQgdG8gYmUgdmlzaWJsZS5cbiAgICovXG4gIGRyb3BwZWRGb3JlaWduT3JnOiBudW1iZXI7XG4gIC8qKlxuICAgKiBFdmVudHMgZHJvcHBlZCBiZWNhdXNlIHRoZWlyIHRpbWVzdGFtcHMgYXJlIGltcG9zc2libGUg4oCUIGRhdGVkIGluIHRoZSBmdXR1cmUsXG4gICAqIG9yIGNvbXBsZXRpbmcgYmVmb3JlIHRoZXkgc3RhcnRlZC4gUmVqZWN0ZWQgaGVyZSByYXRoZXIgdGhhbiBjbGFtcGVkIGxhdGVyOlxuICAgKiBhIGRlcGxveSB3aG9zZSBkdXJhdGlvbiBvciBsZWFkIHRpbWUgaXMgbmVnYXRpdmUgc2lsZW50bHkgc2tld3MgZGVwbG95bWVudFxuICAgKiBmcmVxdWVuY3ksIGNoYW5nZS1mYWlsdXJlIHJhdGUgYW5kIGxlYWQgdGltZSBmb3IgdGhlIHdob2xlIG9yZywgYW5kIGEgY2xhbXBcbiAgICogdG8gMCBtYWtlcyBhIGJhZCBjbG9jayBsb29rIGxpa2UgYW4gaW5zdGFudCBkZXBsb3kuXG4gICAqL1xuICBkcm9wcGVkSW52YWxpZFRpbWU6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIHBpcGVsaW5lIGlkcyB3aG9zZSBldmVudHMgd2VyZSBkcm9wcGVkIGFzIEZPUkVJR04tT1JHIOKAlCB0aGVcbiAgICogdGVuYW5jeSByZWZ1c2FsIHRoZSByb3V0ZSBhdWRpdHMgYXMgYSBmYWlsdXJlLiBJZHMgb25seSAobmV2ZXIgdGhlIG9yZyB0aGV5XG4gICAqIHJlc29sdmVkIHRvOiB0aGF0IHdvdWxkIHRlbGwgYSBwcm9iZXIgd2hpY2ggdGVuYW50IG93bnMgdGhlIHBpcGVsaW5lKS5cbiAgICovXG4gIGZvcmVpZ25QaXBlbGluZUlkczogc3RyaW5nW107XG4gIC8qKiBEaXN0aW5jdCBleGVjdXRpb24gaWRzIG9mIHRoZSByb3dzIHRoYXQgYWN0dWFsbHkgbGFuZGVkICh0aGUgYXVkaXQncyBjb3JyZWxhdGlvbiBzZXQpLiAqL1xuICBpbnNlcnRlZEV4ZWN1dGlvbklkczogc3RyaW5nW107XG4gIC8qKiBEaXN0aW5jdCBwaXBlbGluZSBpZHMgb2YgdGhlIHJvd3MgdGhhdCBhY3R1YWxseSBsYW5kZWQuICovXG4gIGluc2VydGVkUGlwZWxpbmVJZHM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFdobyBpcyB3cml0aW5nLCBmb3IgdGhlIGluZ2VzdCB0ZW5hbmN5IGNoZWNrLlxuICpcbiAqIGAvcmVwb3J0cy9ldmVudHNgIHJlc29sdmVzIGFuIGV2ZW50J3Mgb3JnIGZyb20gdGhlIHBpcGVsaW5lIHJlZ2lzdHJ5LCBzb1xuICogd2l0aG91dCB0aGlzIGEgdG9rZW4gaG9sZGluZyBgcmVwb3J0aW5nOmluZ2VzdGAgY291bGQgcG9zdCBldmVudHMgZm9yIEFOWVxuICogcGlwZWxpbmUgaWQgYW5kIGhhdmUgdGhlbSBhdHRyaWJ1dGVkIHRvIHRoYXQgcGlwZWxpbmUncyBvcmcg4oCUIG9uZSBvcmdcbiAqIGluamVjdGluZyByb3dzIGludG8gYW5vdGhlcidzIHJlcG9ydHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0Q2FsbGVyIHtcbiAgLyoqXG4gICAqIE9yZyBpZHMgdGhpcyBjYWxsZXIgbWF5IHdyaXRlIGV2ZW50cyBmb3I6IGl0cyBvd24sIHBsdXMgZGVzY2VuZGFudCB0ZWFtcy5cbiAgICogUmVzb2x2ZWQgYnkgdGhlIHJvdXRlLiBBbiBldmVudCB3aG9zZSBwaXBlbGluZSBiZWxvbmdzIHRvIGFueXRoaW5nIGVsc2UgaXNcbiAgICogZHJvcHBlZC5cbiAgICovXG4gIGFsbG93ZWRPcmdJZHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogQSB2ZXJpZmllZCBJTlRFUk5BTCBzZXJ2aWNlIHByaW5jaXBhbCAodGhlIHBsdWdpbiBzZXJ2aWNlIHBvc3RzIHBsdWdpbi1idWlsZFxuICAgKiBldmVudHMgZm9yIGV2ZXJ5IHRlbmFudCkuIFN1Y2ggY2FsbGVycyBhcmUgZXhlbXB0OiB0aGV5IGhvbGQgYSBzaWduZWRcbiAgICogc2VydmljZSBrZXkgbm8gZXh0ZXJuYWwgY2xpZW50IGNhbiBtaW50LCBhbmQgdGhleSBsZWdpdGltYXRlbHkgd3JpdGVcbiAgICogY3Jvc3MtdGVuYW50LiBOZXZlciBzZXQgdGhpcyBmcm9tIGFueXRoaW5nIGEgcmVxdWVzdCBib2R5IGNhbiBpbmZsdWVuY2UuXG4gICAqL1xuICBjcm9zc1RlbmFudD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgYWNjZXNzIGtleSAoc2VydmljZS1hY2NvdW50IC8gUEFUIGtleSBpZCkgdGhlIGluZ2VzdCB0b2tlbiB3YXMgZXhjaGFuZ2VkXG4gICAqIGZyb20sIHN0YW1wZWQgb24gZXZlcnkgcm93IGFzIGBpbmdlc3Rfa2V5X2lkYCBzbyBhIGZvcmdlZCBvciBtaXNyb3V0ZWQgcm93XG4gICAqIG5hbWVzIHRoZSBjcmVkZW50aWFsIHRoYXQgd3JvdGUgaXQuIEEga2V5IElELCBuZXZlciB0aGUgc2VjcmV0LlxuICAgKi9cbiAga2V5SWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT25lIG9yZydzIGluZ2VzdGlvbi1oZWFsdGggcm93IGFzIFJFQUQgYmFjayBieSB0aGUgUmVwb3J0cyBVSS4gVGhlXG4gKiBBV1MgZXZlbnRzIExhbWJkYSB3cml0ZXMgaXQ7IHRoaXMgaXMgdGhlIHNoYXBlIHRoYXQgbGV0cyB0aGUgVUkgdGVsbFxuICogXCJpbmdlc3Rpb24gaXMgaGVhbHRoeSwgdGhlcmUgd2VyZSBzaW1wbHkgbm8gZGVwbG95cyBpbiB0aGUgcmFuZ2VcIiBhcGFydCBmcm9tXG4gKiBcIndlIGhhdmVuJ3QgaGVhcmQgZnJvbSB0aGUgaW5nZXN0IHBpcGVsaW5lIHNpbmNlIFhcIi5cbiAqXG4gKiBgbnVsbGAgZnJvbSB7QGxpbmsgUmVwb3J0aW5nU2VydmljZS5nZXRJbmdlc3RIZWFsdGh9IG1lYW5zIHRoZSBkZXBsb3ltZW50IGhhc1xuICogTkVWRVIgcmVwb3J0ZWQg4oCUIG5vdCBcInN0YWxlXCIuIFRoZSB0d28gbXVzdCBub3QgYmUgY29uZmxhdGVkOiBhIGZyZXNoIGluc3RhbGxcbiAqIChvciBvbmUgd2hvc2UgZm9yd2FyZGVyIHdhcyBuZXZlciB3aXJlZCB1cCkgaGFzIG5vIGhlYXJ0YmVhdCBhdCBhbGwsIGFuZFxuICogY2FsbGluZyB0aGF0IFwic3RhbGVcIiB3b3VsZCBpbnZlbnQgYSByZWdyZXNzaW9uIHRoYXQgbmV2ZXIgaGFwcGVuZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0SGVhbHRoU3RhdHVzIHtcbiAgLyoqIFdoZW4gdGhlIGZvcndhcmRlciBsYXN0IHBvc3RlZCBhIGhlYXJ0YmVhdCAoaXRzIG93biBjbG9jaywgSVNPIDg2MDEpLiAqL1xuICB1cGRhdGVkQXQ6IHN0cmluZztcbiAgLyoqIFRpbWVzdGFtcCBvZiB0aGUgbmV3ZXN0IGV2ZW50IGl0IGhhZCBmb3J3YXJkZWQsIG9yIG51bGwgaWYgaXQgaGFzIHNlZW4gbm9uZS4gKi9cbiAgbGFzdEV2ZW50QXQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBDdW11bGF0aXZlIGV2ZW50cyBmb3J3YXJkZWQsIG9yIG51bGwgd2hlbiB0aGUgZm9yd2FyZGVyIGRvZXNuJ3QgcmVwb3J0IGl0LiAqL1xuICBmb3J3YXJkZWQ6IG51bWJlciB8IG51bGw7XG4gIC8qKiBDdW11bGF0aXZlIGV2ZW50cyBEUk9QUEVEIChub24temVybyDih5IgZGF0YSBsb3NzIHVwc3RyZWFtIG9mIHRoZSByZXBvcnRzKS4gKi9cbiAgZHJvcHBlZDogbnVtYmVyIHwgbnVsbDtcbn1cblxuXG4vKipcbiAqIFJlYWQtb25seSByZXBvcnRpbmcgc2VydmljZSBmb3IgcGlwZWxpbmUgZXhlY3V0aW9uIGFuZCBwbHVnaW4gaW52ZW50b3J5IGFnZ3JlZ2F0aW9ucy5cbiAqIERvZXMgbm90IGV4dGVuZCBDcnVkU2VydmljZSDigJQgcmVwb3J0cyBhcmUgYWdncmVnYXRlIHF1ZXJpZXMsIG5vdCBlbnRpdHkgQ1JVRC5cbiAqXG4gKiBBbGwgcXVlcmllcyBhcmUgY2FjaGVkIGluLW1lbW9yeSB0byBhdm9pZCByZXBlYXRlZCBleHBlbnNpdmUgU1FMIGFnZ3JlZ2F0aW9uczpcbiAqIC0gSW52ZW50b3J5IHF1ZXJpZXMgKHBsdWdpbiBzdW1tYXJ5L2Rpc3RyaWJ1dGlvbi92ZXJzaW9ucyk6IDUgbWluIFRUTFxuICogLSBUaW1lc2VyaWVzIHF1ZXJpZXMgKGV4ZWN1dGlvbi9idWlsZCBtZXRyaWNzIHdpdGggZGF0ZSByYW5nZXMpOiAyIG1pbiBUVExcbiAqL1xuXG4vKipcbiAqIEludGVybmFsIHJvdyBzaGFwZXMgZm9yIHRoZSBET1JBIHF1ZXJpZXMuIEV4cG9ydGVkIGJlY2F1c2UgLi9kb3JhLnRzIGNvbnN1bWVzXG4gKiB0aGVtOyBub3QgcGFydCBvZiB0aGUgcGFja2FnZSdzIHB1YmxpYyBzdXJmYWNlIChyZXBvcnRpbmctc2VydmljZS50c1xuICogcmUtZXhwb3J0cyB0aGlzIG1vZHVsZSB3aG9sZXNhbGUsIHdoaWNoIGlzIGEgZGVsaWJlcmF0ZSBzaW1wbGlmaWNhdGlvbiDigJQgdGhlc2VcbiAqIGRlc2NyaWJlIHF1ZXJ5IHJlc3VsdHMsIG5vdCBBUEkgY29udHJhY3RzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBsb3lSb3cge1xuICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICBzdGF0dXM6ICdTVUNDRUVERUQnIHwgJ0ZBSUxFRCcgfCBzdHJpbmc7XG4gIC8qKiBEZXBsb3kgZXhlY3V0aW9uIGlkIOKAlCB0aGUgYXR0cmlidXRpb24ga2V5IGZvciBkZWR1cCBhZ2FpbnN0IG91dGNvbWVzL2luY2lkZW50cy4gKi9cbiAgZXhlY3V0aW9uX2lkOiBzdHJpbmcgfCBudWxsO1xuICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gIGNvbW1pdF90czogc3RyaW5nIHwgbnVsbDtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGRlcGxveSBjb21wbGV0ZWQgaW5zaWRlIFtmcm9tLHRvXS4gQWJzZW50ICh1bmRlZmluZWQpIGluIHVuaXRcbiAgICogZml4dHVyZXMg4oeSIHRyZWF0ZWQgYXMgaW4td2luZG93LiBgdGAvYGZgIHRvbGVyYXRlZCAocGcgYm9vbGVhbiB0ZXh0IGZvcm0pLlxuICAgKi9cbiAgaW5fd2luZG93PzogYm9vbGVhbiB8IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBSYXcgcG9zdC1kZXBsb3kgb3V0Y29tZSBtYXJrZXIgcm93IChmcm9tIGBkZXBsb3ltZW50X291dGNvbWVzYCwgaW4td2luZG93KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3V0Y29tZVJvdyB7XG4gIGVudmlyb25tZW50OiBzdHJpbmcgfCBudWxsO1xuICBvdXRjb21lOiAnZmFpbGVkJyB8ICdyZXN0b3JlZCcgfCBzdHJpbmc7XG4gIC8qKiBFeGVjdXRpb24gdGhlIHVzZXIgbWFya2VkIOKAlCBkZWR1cCBrZXkgYWdhaW5zdCBpbmNpZGVudC1jb3JyZWxhdGVkIGRlcGxveXMuICovXG4gIGV4ZWN1dGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIFByb2R1Y3Rpb24gcmVzdG9yZWQtaW5jaWRlbnQgcGFpcjogcmVjb3ZlcnkgdGltZSArIHRoZSBkZXBsb3kncyBjb21wbGV0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdHRyUGFpclJvdyB7XG4gIHJlc3RvcmVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICBkZXBsb3llZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIEV4ZWN1dGlvbiBpZCDigJQgbGV0cyBpbmNpZGVudCBwcmVjZWRlbmNlIG92ZXJyaWRlIHRoZSBtYW51YWwgb3V0Y29tZSBwZXIgZGVwbG95LiAqL1xuICBleGVjdXRpb25faWQ6IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICogUmF3IGluY2lkZW50IHJvdyAoZnJvbSBgaW5jaWRlbnRzYCwgb3BlbmVkIGluLXdpbmRvdykuIENvcnJlbGF0ZWQgaW4gSlMgdG8gdGhlXG4gKiBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSB0byBgZW52aXJvbm1lbnRgIHdpdGhpbiBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSU1xuICog4oaSIGFuIGF1dG9tYXRlZCBwb3N0LWRlcGxveSBmYWlsdXJlIChDRlIpICsgcmVhbCByZWNvdmVyeSB0aW1lIChNVFRSKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNpZGVudFJvdyB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIG9wZW5lZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgcmVzb2x2ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBDb3ZlcmFnZSBjb3VudHM6IHJlZ2lzdGVyZWQgcGlwZWxpbmVzIHZzIHRob3NlIHRoYXQgYWN0dWFsbHkgZGVwbG95ZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIENvdmVyYWdlUm93IHtcbiAgcmVnaXN0ZXJlZDogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgZGVwbG95aW5nOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xufVxuIl19
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcmVwb3J0aW5nL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBQdWJsaWMgcmVzdWx0IHNoYXBlcyBmb3IgdGhlIHJlcG9ydGluZyBzZXJ2aWNlLlxuICpcbiAqIFNwbGl0IG91dCBvZiByZXBvcnRpbmctc2VydmljZS50cyBwdXJlbHkgZm9yIHNpemU6IHRoZXNlIGFyZSBkYXRhIGNvbnRyYWN0c1xuICogd2l0aCBubyBiZWhhdmlvdXIuIHJlcG9ydGluZy1zZXJ2aWNlLnRzIHJlLWV4cG9ydHMgdGhlbSwgc28gdGhlXG4gKiBgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YWAgcHVibGljIHN1cmZhY2UgaXMgdW5jaGFuZ2VkLlxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uQ291bnQge1xuICBpZDogc3RyaW5nO1xuICBwcm9qZWN0OiBzdHJpbmc7XG4gIG9yZ2FuaXphdGlvbjogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHRvdGFsOiBudW1iZXI7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgY2FuY2VsZWQ6IG51bWJlcjtcbiAgZmlyc3RFeGVjdXRpb246IHN0cmluZyB8IG51bGw7XG4gIGxhc3RFeGVjdXRpb246IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZVNlcmllc0VudHJ5IHtcbiAgcGVyaW9kOiBzdHJpbmc7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgY2FuY2VsZWQ6IG51bWJlcjtcbiAgc3VjY2Vzc1BjdDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIER1cmF0aW9uU3RhdHMge1xuICBpZDogc3RyaW5nO1xuICBwcm9qZWN0OiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgYXZnTXM6IG51bWJlcjtcbiAgbWluTXM6IG51bWJlcjtcbiAgbWF4TXM6IG51bWJlcjtcbiAgcDk1TXM6IG51bWJlcjtcbiAgZXhlY3V0aW9uczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lRXhlY3V0aW9uIHtcbiAgZXhlY3V0aW9uSWQ6IHN0cmluZztcbiAgLyoqIFJvbGxlZC11cCB0ZXJtaW5hbCBzdGF0dXM6IHN1Y2NlZWRlZCB8IGZhaWxlZCB8IGNhbmNlbGVkIHwgaW4tcHJvZ3Jlc3MuICovXG4gIHN0YXR1czogc3RyaW5nO1xuICBzdGFydGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIGVuZGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIGR1cmF0aW9uTXM6IG51bWJlciB8IG51bGw7XG4gIC8qKiBGaXJzdCBmYWlsaW5nIHN0YWdlL2FjdGlvbiBmb3IgdGhlIGV4ZWN1dGlvbiAobnVsbCB3aGVuIGl0IGRpZG4ndCBmYWlsKS4gKi9cbiAgZmFpbGluZ1N0YWdlOiBzdHJpbmcgfCBudWxsO1xuICBmYWlsaW5nQWN0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhlIGZpcnN0IGZhaWx1cmUgZGV0YWlsIGFuIGV2ZW50IG9mIHRoZSBleGVjdXRpb24gY2FycmllZCAoYGRldGFpbC5mYWlsdXJlYCksIG9yIG51bGwuICovXG4gIGZhaWx1cmU6IHVua25vd24gfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlRmFpbHVyZSB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBmYWlsdXJlczogbnVtYmVyO1xuICB0b3RhbDogbnVtYmVyO1xuICBmYWlsdXJlUGN0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhZ2VCb3R0bGVuZWNrIHtcbiAgaWQ6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgYXZnTXM6IG51bWJlcjtcbiAgbWF4TXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25GYWlsdXJlIHtcbiAgYWN0aW9uTmFtZTogc3RyaW5nO1xuICBmYWlsdXJlczogbnVtYmVyO1xuICB0b3RhbDogbnVtYmVyO1xuICBmYWlsdXJlUGN0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JFbnRyeSB7XG4gIGVycm9yUGF0dGVybjogc3RyaW5nO1xuICBvY2N1cnJlbmNlczogbnVtYmVyO1xuICBhZmZlY3RlZFBpcGVsaW5lczogbnVtYmVyO1xuICBsYXN0U2Vlbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblN1bW1hcnkge1xuICB0b3RhbDogbnVtYmVyO1xuICBhY3RpdmU6IG51bWJlcjtcbiAgaW5hY3RpdmU6IG51bWJlcjtcbiAgLyoqIENvdW50cyBwZXIgc2hhcmluZyBydW5nIOKAlCBvbmUgYnVja2V0IHBlciBgdmlzaWJpbGl0eWAgdmFsdWUuICovXG4gIHB1YmxpYzogbnVtYmVyO1xuICBvcmc6IG51bWJlcjtcbiAgcHJpdmF0ZTogbnVtYmVyO1xuICB1bmlxdWVOYW1lczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uIHtcbiAgcGx1Z2luVHlwZTogc3RyaW5nO1xuICBjb21wdXRlVHlwZTogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcnNpb25Db3VudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbkNvdW50OiBudW1iZXI7XG4gIGxhdGVzdFZlcnNpb246IHN0cmluZztcbiAgaGFzRGVmYXVsdDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZFRpbWVTZXJpZXNFbnRyeSB7XG4gIHBlcmlvZDogc3RyaW5nO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIHN1Y2Nlc3NQY3Q6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZER1cmF0aW9uIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBhdmdNczogbnVtYmVyO1xuICBtYXhNczogbnVtYmVyO1xuICBidWlsZHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQbHVnaW4gcnVudGltZSByZXBvcnQgZmlsdGVycy4gYHB1Ymxpc2hlcjogbnVsbGAgc2VsZWN0cyBvd24tb3JnXG4gKiAocHVibGlzaGVyLWxlc3MpIHBsdWdpbnM7IGFuIG9taXR0ZWQgZmllbGQgZG9lc24ndCBmaWx0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luUnVudGltZUZpbHRlciB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHB1Ymxpc2hlcj86IHN0cmluZyB8IG51bGw7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG59XG5cbi8qKiBQZXIgcGx1Z2luIHZlcnNpb24gcnVudGltZSBzdGF0cyBvdmVyIGEgd2luZG93ICh0ZXJtaW5hbCBBQ1RJT04gcnVucykuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblJ1bnRpbWVTdGF0cyB7XG4gIHBsdWdpblB1Ymxpc2hlcjogc3RyaW5nIHwgbnVsbDtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7XG4gIHJ1bnM6IG51bWJlcjtcbiAgc3VjY2VlZGVkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICAvKiogMOKAkzEwMCwgb25lIGRlY2ltYWwuICovXG4gIHN1Y2Nlc3NQY3Q6IG51bWJlcjtcbiAgLyoqIE51bGwgd2hlbiBubyBydW4gaW4gdGhlIGdyb3VwIGNhcnJpZWQgYSBkdXJhdGlvbi4gKi9cbiAgcDUwTXM6IG51bWJlciB8IG51bGw7XG4gIHA5NU1zOiBudW1iZXIgfCBudWxsO1xuICBsYXN0UnVuOiBzdHJpbmc7XG59XG5cbi8qKiBDcm9zcy1vcmcgMzAtZGF5IGFnZ3JlZ2F0ZSBmb3Igb25lIGAocHVibGlzaGVyLCBuYW1lKWAgbGlzdGluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luUnVudGltZUFnZ3JlZ2F0ZSB7XG4gIHJ1bnMzMGQ6IG51bWJlcjtcbiAgLyoqIDDigJMxOyBudWxsIHdoZW4gdGhlcmUgd2VyZSBubyBydW5zLiAqL1xuICBzdWNjZXNzUmF0ZTMwZDogbnVtYmVyIHwgbnVsbDtcbiAgYWN0aXZlT3JnQ291bnQzMGQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZEZhaWx1cmUge1xuICBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gIGVycm9yTWVzc2FnZTogc3RyaW5nO1xuICBvY2N1cnJlbmNlczogbnVtYmVyO1xuICBsYXN0U2Vlbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBET1JBIGhlYWRsaW5lIGVudmlyb25tZW50LiBEZXBsb3ltZW50IHRvIHRoaXMgbGl0ZXJhbCBlbnYgbmFtZSBpcyB0aGVcbiAqIGluZHVzdHJ5LXN0YW5kYXJkIERPUkEgc2lnbmFsOyBNVFRSIGlzIG1lYXN1cmVkIHByb2R1Y3Rpb24tb25seSwgYW5kIHRoaXNcbiAqIGVudmlyb25tZW50J3MgY2FyZCBpcyB0aGUgc3VtbWFyeSBzaG93biBhdCB0aGUgdG9wIG9mIHRoZSBwYW5lbC5cbiAqL1xuXG4vKiogUGVyLW9yZyByZXRlbnRpb24gb3ZlcnJpZGUgcm93LiBCb3RoIG51bGxhYmxlIOKHkiBnbG9iYWwgZGVmYXVsdHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGluZ1JldGVudGlvblNldHRpbmdzIHtcbiAgZXZlbnRSZXRlbnRpb25EYXlzOiBudW1iZXIgfCBudWxsO1xuICBkb3JhUmV0ZW50aW9uRGF5czogbnVtYmVyIHwgbnVsbDtcbiAgZGVmYXVsdEV2ZW50UmV0ZW50aW9uRGF5czogbnVtYmVyO1xuICBkZWZhdWx0RG9yYVJldGVudGlvbkRheXM6IG51bWJlcjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHRoZSByZXBvcnRpbmcgcmV0ZW50aW9uIHN3ZWVwLiAqL1xuLyoqXG4gKiBIb3cgYSB0aW1lLWJ1Y2tldGVkIHJlcG9ydCBzbGljZXMgaXRzIHBlcmlvZHMuIEFic2VudCBtZWFucyBVVEMgKyBNb25kYXksIHdoaWNoXG4gKiBpcyB3aGF0IGV2ZXJ5IHByZS10aW1lem9uZSBjYWxsZXIgZ290IOKAlCBzbyBhbiBvbWl0dGVkIHZhbHVlIGNhbiBuZXZlciBzaWxlbnRseVxuICogY2hhbmdlIGFuIGV4aXN0aW5nIHJlcG9ydCdzIGJvdW5kYXJpZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0T3B0aW9ucyB7XG4gIC8qKiBJQU5BIHRpbWV6b25lIHRoZSBidWNrZXRzIGFyZSBjdXQgaW4gKHZhbGlkYXRlZCBhdCB0aGUgcm91dGUpLiAqL1xuICB0ej86IHN0cmluZztcbiAgLyoqIFdoZXJlIHRoZSB3ZWVrIHN0YXJ0cy4gUG9zdGdyZXMgREFURV9UUlVOQyBpcyBNb25kYXktb25seSwgc28gYHN1bmRheWBcbiAgICogIHNoaWZ0cyB0aGUgYm91bmRhcnkgZXhwbGljaXRseS4gKi9cbiAgd2Vla1N0YXJ0PzogJ21vbmRheScgfCAnc3VuZGF5Jztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRpbmdSZXRlbnRpb25PcHRpb25zIHtcbiAgLyoqIFJvd3MgZGVsZXRlZCBwZXIgc3RhdGVtZW50IChkZWZhdWx0IDEwMDApLiAqL1xuICBiYXRjaFNpemU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbGVhZGVyLWxvY2tlZCBydW4gdGhpcyBzd2VlcCBiZWxvbmdzIHRvLiBDaGVja2VkIEJFVFdFRU4gT1JHUzogYWJvcnRlZFxuICAgKiBtZWFucyB0aGUgbG9jayB3YXMgbG9zdCAoYW5vdGhlciBwb2QgaXMgdGFraW5nIG92ZXIpIG9yIHRoZSBwcm9jZXNzIGlzXG4gICAqIHNodXR0aW5nIGRvd24sIGFuZCB0aGUgcmVtYWluaW5nIG9yZ3MgYXJlIHBpY2tlZCB1cCBuZXh0IHRpY2suIFdpdGhvdXQgaXQgYVxuICAgKiBsb25nIHN3ZWVwIGtlcHQgZGVsZXRpbmcgYWZ0ZXIgYW5vdGhlciBwb2QgaGFkIGFscmVhZHkgdGFrZW4gdGhlIGxvY2suXG4gICAqL1xuICBydW4/OiB7IHNpZ25hbDogQWJvcnRTaWduYWwgfTtcbiAgLyoqIE1heCBiYXRjaGVzIHBlciB0YWJsZSBwZXIgb3JnIHBlciB0aWNrIChkZWZhdWx0IDUwKTsgdGhlIHJlc3QgZGVmZXJzIHRvXG4gICAqICB0aGUgbmV4dCB0aWNrIHNvIGEgaHVnZSBiYWNrbG9nIGNhbid0IGhvbGQgbG9ja3MgdG9vIGxvbmcuICovXG4gIG1heEJhdGNoZXNQZXJUYWJsZT86IG51bWJlcjtcbiAgLyoqIEZpeGVkIFwibm93XCIgZm9yIHRoZSB3aG9sZSBzd2VlcCAoZGVmYXVsdCBgbmV3IERhdGUoKWApLiAqL1xuICBub3c/OiBEYXRlO1xuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgb3JnIHdob3NlIGBkb3JhX3NldHRpbmdzYCByZXRlbnRpb24gZ292ZXJucyBgb3JnSWRgJ3Mgcm93cyDigJQgaXRzXG4gICAqIGFjY291bnQgUk9PVC4gUmV0ZW50aW9uIGlzIGEgYmlsbGluZyBlbnRpdGxlbWVudCBzeW5jZWQgb250byB0aGUgcm9vdCBvbmx5LFxuICAgKiBzbyBhIHRlYW0ncyByb3dzIG11c3QgZm9sbG93IHRoZSByb290J3MgKHB1cmNoYXNlZCkgd2luZG93LCBub3QgdGhlIGVudlxuICAgKiBkZWZhdWx0LiBSZXR1cm4gYG51bGxgIHdoZW4gdGhlIHJvb3QgY2FuJ3QgYmUgcmVzb2x2ZWQ6IHRoYXQgb3JnIGlzIFNLSVBQRURcbiAgICogdGhpcyB0aWNrIChuZXZlciBwdXJnZWQgb24gYSBwb3NzaWJseS1zaG9ydGVyIHdpbmRvdykuIERlZmF1bHQ6IGlkZW50aXR5XG4gICAqIChldmVyeSBvcmcgaXMgaXRzIG93biByb290IOKAlCBhIGZsYXQgZGVwbG95bWVudCkuXG4gICAqL1xuICByZXNvbHZlUmV0ZW50aW9uT3JnSWQ/OiAob3JnSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbn1cblxuLyoqIFBlci1ydW4gcHVyZ2UgdGFsbGllcyAoYWxzbyBsb2dnZWQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRpbmdSZXRlbnRpb25Db3VudHMge1xuICAvKiogT3JncyBzd2VwdCB0aGlzIHJ1bi4gKi9cbiAgb3JnczogbnVtYmVyO1xuICAvKiogU3RhbmRhcmQgYHBpcGVsaW5lX2V2ZW50c2AgKGVudmlyb25tZW50IElTIE5VTEwpIHJvd3MgcHVyZ2VkLiAqL1xuICBzdGFuZGFyZEV2ZW50czogbnVtYmVyO1xuICAvKiogRE9SQS1zb3VyY2UgYHBpcGVsaW5lX2V2ZW50c2AgKGVudmlyb25tZW50IElTIE5PVCBOVUxMKSByb3dzIHB1cmdlZC4gKi9cbiAgZG9yYUV2ZW50czogbnVtYmVyO1xuICAvKiogYGRlcGxveW1lbnRfb3V0Y29tZXNgIHJvd3MgcHVyZ2VkLiAqL1xuICBkZXBsb3ltZW50T3V0Y29tZXM6IG51bWJlcjtcbiAgLyoqIGBpbmNpZGVudHNgIHJvd3MgcHVyZ2VkLiAqL1xuICBpbmNpZGVudHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBET1JBIHBlcmZvcm1hbmNlIGJhbmQuIGBudWxsYCA9IGluc3VmZmljaWVudCBkYXRhIHRvIGNsYXNzaWZ5IChub1xuICogZGVwbG95bWVudHMvZmFpbHVyZXMvbGVhZC10aW1lIHNhbXBsZSBpbiB0aGUgd2luZG93KSwgc28gdGhlIFVJIHNob3dzIGFcbiAqIG5ldXRyYWwgc3RhdGUgcmF0aGVyIHRoYW4gbWlzbGFiZWxpbmcgYW4gZW1wdHkgd2luZG93IGFzIFwibG93XCIuXG4gKi9cbmV4cG9ydCB0eXBlIERvcmFMZXZlbCA9ICdlbGl0ZScgfCAnaGlnaCcgfCAnbWVkaXVtJyB8ICdsb3cnIHwgbnVsbDtcblxuLyoqIE9wdGlvbmFsIHNjb3BpbmcgZm9yIHtAbGluayBSZXBvcnRpbmdTZXJ2aWNlLmdldERvcmFNZXRyaWNzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9yYU9wdGlvbnMge1xuICAvKiogUmVzdHJpY3QgdG8gYSBzaW5nbGUgcGlwZWxpbmUgKHBlci1waXBlbGluZSBET1JBKS4gKi9cbiAgcGlwZWxpbmVJZD86IHN0cmluZztcbiAgLyoqIFJlc3RyaWN0IHRvIGEgc2luZ2xlIGRlcGxveSBlbnZpcm9ubWVudCAoZWxzZSBhbGwgZGVwbG95IGVudmlyb25tZW50cykuICovXG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICAvKipcbiAgICogUGVyLW9yZyBpbmNpZGVudOKGkmRlcGxveSBjb3JyZWxhdGlvbiB3aW5kb3cgb3ZlcnJpZGUgKGhvdXJzKS4gV2hlbiBzZXQgKGFcbiAgICogcG9zaXRpdmUgZmluaXRlIG51bWJlciksIHRoZSBpbmNpZGVudCBjb3JyZWxhdGlvbiB1c2VzIGl0IGluc3RlYWQgb2YgdGhlXG4gICAqIGdsb2JhbCBgRE9SQV9JTkNJREVOVF9XSU5ET1dfSE9VUlNgLiBUaGUgcm91dGUgcmVzb2x2ZXMgdGhpcyBmcm9tIHRoZSBvcmcnc1xuICAgKiBgZG9yYV9zZXR0aW5nc2Agcm93IChzZWUge0BsaW5rIFJlcG9ydGluZ1NlcnZpY2UuZ2V0UmVwb3J0aW5nU2V0dGluZ3N9KSBhbmRcbiAgICogcGFzc2VzIGl0IGluOyB1bnNldCBmYWxscyBiYWNrIHRvIHRoZSBlbnYgZGVmYXVsdC5cbiAgICovXG4gIGluY2lkZW50V2luZG93SG91cnM/OiBudW1iZXI7XG4gIC8qKiBJQU5BIHRpbWV6b25lIGZvciB0aGUgdHJlbmQncyBidWNrZXRzIChzZWUge0BsaW5rIEJ1Y2tldE9wdGlvbnN9KS4gKi9cbiAgdHo/OiBzdHJpbmc7XG4gIC8qKiBXZWVrIHN0YXJ0IGZvciB0aGUgdHJlbmQncyBidWNrZXRzLiAqL1xuICB3ZWVrU3RhcnQ/OiAnbW9uZGF5JyB8ICdzdW5kYXknO1xufVxuXG4vKipcbiAqIFBlci1vcmcgcmVwb3J0aW5nIHNldHRpbmdzIHN1cmZhY2VkIHRvIHRoZSBvcmctYWRtaW4gcGFuZWwuIGBpbmNpZGVudFdpbmRvd0hvdXJzYFxuICogaXMgdGhlIGluY2lkZW504oaSZGVwbG95IGNvcnJlbGF0aW9uIHdpbmRvdzsgYGV2ZW50UmV0ZW50aW9uRGF5c2AgL1xuICogYGRvcmFSZXRlbnRpb25EYXlzYCBhcmUgdGhlIHR3byByZXRlbnRpb24tc3dlZXAgd2luZG93cy4gRWFjaCBvdmVycmlkZVxuICogaXMgYG51bGxgIHdoZW4gdW5zZXQgKHRoZSBwYWlyZWQgYGRlZmF1bHQqYCBmaWVsZCBzaG93cyB0aGUgZW52IGZhbGxiYWNrIGFwcGxpZWQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGluZ1NldHRpbmdzIHtcbiAgLyoqIFRoZSBvcmcncyBzdG9yZWQgY29ycmVsYXRpb24td2luZG93IG92ZXJyaWRlIGluIGhvdXJzLCBvciBgbnVsbGAgd2hlbiB1bnNldC4gKi9cbiAgaW5jaWRlbnRXaW5kb3dIb3VyczogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIFRoZSBnbG9iYWwgZW52IGRlZmF1bHQgYXBwbGllZCB3aGVuIG5vIG92ZXJyaWRlIGlzIHN0b3JlZC4gKi9cbiAgZGVmYXVsdFdpbmRvd0hvdXJzOiBudW1iZXI7XG4gIC8qKiBTdGFuZGFyZC1ldmVudCByZXRlbnRpb24gb3ZlcnJpZGUgaW4gZGF5cywgb3IgYG51bGxgIHdoZW4gdW5zZXQuICovXG4gIGV2ZW50UmV0ZW50aW9uRGF5czogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIERPUkEtc291cmNlIHJldGVudGlvbiBvdmVycmlkZSBpbiBkYXlzLCBvciBgbnVsbGAgd2hlbiB1bnNldC4gKi9cbiAgZG9yYVJldGVudGlvbkRheXM6IG51bWJlciB8IG51bGw7XG4gIC8qKiBHbG9iYWwgc3RhbmRhcmQtZXZlbnQgcmV0ZW50aW9uIGRlZmF1bHQgYXBwbGllZCB3aGVuIHVuc2V0IChkYXlzKS4gKi9cbiAgZGVmYXVsdEV2ZW50UmV0ZW50aW9uRGF5czogbnVtYmVyO1xuICAvKiogR2xvYmFsIERPUkEtc291cmNlIHJldGVudGlvbiBkZWZhdWx0IGFwcGxpZWQgd2hlbiB1bnNldCAoZGF5cykuICovXG4gIGRlZmF1bHREb3JhUmV0ZW50aW9uRGF5czogbnVtYmVyO1xufVxuXG4vKiogQSBwYXJ0aWFsIHJlcG9ydGluZy1zZXR0aW5ncyB3cml0ZSAoNykuIE9ubHkgcHJvdmlkZWQgZmllbGRzIGFyZVxuICogIHVwc2VydGVkOyBvbWl0dGVkIGZpZWxkcyBhcmUgbGVmdCB1bmNoYW5nZWQgKGFuIG9taXR0ZWQgcmV0ZW50aW9uIGZpZWxkIGtlZXBzXG4gKiAgaXRzIHN0b3JlZCBvdmVycmlkZSAvIHRoZSBnbG9iYWwgZGVmYXVsdCkuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGluZ1NldHRpbmdzUGF0Y2gge1xuICBpbmNpZGVudFdpbmRvd0hvdXJzPzogbnVtYmVyO1xuICBldmVudFJldGVudGlvbkRheXM/OiBudW1iZXI7XG4gIGRvcmFSZXRlbnRpb25EYXlzPzogbnVtYmVyO1xufVxuXG4vKiogT25lIHJvdyBvZiB0aGUgb3JnLWFkbWluIGluY2lkZW50cyBsaXN0IChyZWNlbnQgaW5jaWRlbnRzICsgZGVwbG95IGNvcnJlbGF0aW9uKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jaWRlbnRMaXN0SXRlbSB7XG4gIGluY2lkZW50SWQ6IHN0cmluZztcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgc2V2ZXJpdHk6IHN0cmluZztcbiAgb3BlbmVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIHJlc29sdmVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIGNyZWF0ZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRydWUgb25jZSB0aGUgaW5jaWRlbnQgaGFzIGEgYHJlc29sdmVkX2F0YC4gKi9cbiAgcmVzb2x2ZWQ6IGJvb2xlYW47XG4gIC8qKiBUaGUgY29ycmVsYXRlZCBkZXBsb3kgZXhlY3V0aW9uIGlkIChtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSBpbi13aW5kb3cpLCBvciBudWxsLiAqL1xuICBjb3JyZWxhdGVkRXhlY3V0aW9uSWQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBUaGF0IGRlcGxveSdzIGNvbXBsZXRpb24gaW5zdGFudCwgb3IgbnVsbCB3aGVuIHVuY29ycmVsYXRlZC4gKi9cbiAgZGVwbG95Q29tcGxldGVkQXQ6IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBSZXN1bHQgb2YgdGhlIHdpcmluZy10ZXN0IGRyeS1ydW4gY29ycmVsYXRpb24gKHtAbGluayBSZXBvcnRpbmdTZXJ2aWNlLnRlc3RJbmNpZGVudENvcnJlbGF0aW9ufSkuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50VGVzdFJlc3VsdCB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIC8qKiBUaGUgc3ludGhldGljIGluY2lkZW50J3Mgb3BlbmVkQXQgKG5vdywgSVNPKS4gKi9cbiAgb3BlbmVkQXQ6IHN0cmluZztcbiAgLyoqIFRoZSBlZmZlY3RpdmUgY29ycmVsYXRpb24gd2luZG93IHVzZWQuICovXG4gIHdpbmRvd0hvdXJzOiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIGEgcmVjZW50IHN1Y2Nlc3NmdWwgZGVwbG95IHRvIGBlbnZpcm9ubWVudGAgY29ycmVsYXRlZC4gKi9cbiAgY29ycmVsYXRlZDogYm9vbGVhbjtcbiAgLyoqIFRoZSBjb3JyZWxhdGVkIGRlcGxveSBleGVjdXRpb24gaWQsIG9yIG51bGwuICovXG4gIGV4ZWN1dGlvbklkOiBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhhdCBkZXBsb3kncyBjb21wbGV0aW9uIGluc3RhbnQsIG9yIG51bGwuICovXG4gIGRlcGxveUNvbXBsZXRlZEF0OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vLyBET1JBIHBlcmZvcm1hbmNlIGJhbmRzICh0aHJlc2hvbGRzIGZyb20gdGhlIERPUkEvQWNjZWxlcmF0ZSByZXBvcnRzKS4gRWFjaFxuLy8gaGVscGVyIHJldHVybnMgYG51bGxgIHdoZW4gdGhlcmUncyBubyBzYW1wbGUgdG8gY2xhc3NpZnkuXG4vKiogRGVwbG95bWVudCBmcmVxdWVuY3kgYnkgZGVwbG95cy9kYXk6IGVsaXRlIOKJpTEvZGF5LCBoaWdoIOKJpTEvd2VlaywgbWVkaXVtIOKJpTEvbW9udGguICovXG5cbi8qKlxuICogRE9SQSBtZXRyaWNzIG92ZXIgYSBbZnJvbSx0b10gd2luZG93LCBvcmctc2NvcGVkIChzaW5nbGUtb3JnIG9yIHJvbGx1cCBzdWJ0cmVlKS5cbiAqXG4gKiBERVBMT1ktQkFTSVMg4oCUIGV2ZXJ5IG1ldHJpYyBkZXJpdmVzIGZyb20gcmVhbCBERVBMT1ktU1RBR0UgZXhlY3V0aW9ucywgaS5lLlxuICogYHBpcGVsaW5lX2V2ZW50c2Agcm93cyB3aXRoIGBldmVudF90eXBlPSdTVEFHRSdgIGFuZCBhIG5vbi1udWxsIGBlbnZpcm9ubWVudGBcbiAqICh0aGUgZm9yd2FyZGVyIHNldHMgYGVudmlyb25tZW50YCBvbmx5IGZvciB0aGUgc3RhZ2VzIGEgdXNlciBkZWNsYXJlZCBpblxuICogYHBiLmRlcGxveXNgKS4gQSBDSS1vbmx5IGJ1aWxkL3Rlc3QgcGlwZWxpbmUgd2l0aCBubyBkZXBsb3kgc3RhZ2UgcHJvZHVjZXMgTk9cbiAqIERPUkEgZGF0YSDigJQgdGhlcmUgaXMgbm8gcnVuLWJhc2VkIGZhbGxiYWNrLiBUaGUgcGFuZWwgaXMgZW1wdHkgdW50aWwgZGVwbG95ZWRcbiAqIHBpcGVsaW5lcyByZS1zeW50aCB3aXRoIHRoZSBuZXcgZGVwbG95IHRhZ3MgYW5kIHN0YXJ0IGVtaXR0aW5nIGRlcGxveSBldmVudHMuXG4gKlxuICogYHByb2R1Y3Rpb25gIGlzIHRoZSBoZWFkbGluZSBlbnZpcm9ubWVudDsgTVRUUiBpcyBtZWFzdXJlZCBwcm9kdWN0aW9uLW9ubHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9yYU1ldHJpY3Mge1xuICAvKiogVGhlIFtmcm9tLHRvXSB3aW5kb3cgZWNob2VkIGJhY2sgKGRlcGxveSBgY29tcGxldGVkX2F0YCByYW5nZSkuICovXG4gIHdpbmRvdzogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfTtcbiAgLyoqIFRoZSBzY29waW5nIGFwcGxpZWQgKGVjaG9lZCBmb3IgdGhlIFVJKTsgYG51bGxgIHdoZW4gdW5zY29wZWQuICovXG4gIGZpbHRlcnM6IHsgcGlwZWxpbmVJZDogc3RyaW5nIHwgbnVsbDsgZW52aXJvbm1lbnQ6IHN0cmluZyB8IG51bGwgfTtcbiAgLyoqIFRoZSBoZWFkbGluZSBlbnZpcm9ubWVudCBuYW1lIChgcHJvZHVjdGlvbmApLiAqL1xuICBoZWFkbGluZTogc3RyaW5nO1xuICAvKiogUGVyLWVudmlyb25tZW50IERGIC8gQ0ZSIC8gbGVhZCB0aW1lLiBTb3J0ZWQgaGVhZGxpbmUtZmlyc3QsIHRoZW4gQeKGklouICovXG4gIGVudmlyb25tZW50czogRG9yYUVudk1ldHJpY3NbXTtcbiAgLyoqXG4gICAqIE1lYW4gVGltZSBUbyBSZXN0b3JlIOKAlCBQUk9EVUNUSU9OLU9OTFksIGZyb20gYGRlcGxveW1lbnRfb3V0Y29tZXNgLlxuICAgKiBgbWVkaWFuKHJlc3RvcmVkLmF0IOKIkiBkZXBsb3llZC5jb21wbGV0ZWRfYXQpYCBvdmVyIHJlc3RvcmVkIHByb2R1Y3Rpb25cbiAgICogaW5jaWRlbnRzIChkZWx0YXMgY2xhbXBlZCDiiaUwKS4gYGluY2lkZW50c2AgY291bnRzIHByb2R1Y3Rpb24gZGVwbG95cyBtYXJrZWRcbiAgICogZmFpbGVkOyBgcmVzdG9yZWRgIGNvdW50cyB0aG9zZSB0aGF0IHJlY292ZXJlZDsgYG1lZGlhblNlY29uZHNgIGlzIG51bGwgd2hlblxuICAgKiBubyByZXN0b3JlZCBpbmNpZGVudCBoYXMgYSByZXNvbHZhYmxlIGRlcGxveSB0aW1lLlxuICAgKi9cbiAgbWVhblRpbWVUb1Jlc3RvcmU6IHtcbiAgICBpbmNpZGVudHM6IG51bWJlcjtcbiAgICByZXN0b3JlZDogbnVtYmVyO1xuICAgIG1lZGlhblNlY29uZHM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqIDkwdGgvOTV0aCBwZXJjZW50aWxlIHJlY292ZXJ5LCBvdmVyIHRoZSBzYW1lIHNhbXBsZSBhcyB0aGUgbWVkaWFuLiBUaGVcbiAgICAgKiAgbWVkaWFuIGFsb25lIGhpZGVzIHRoZSBsb25nIHRhaWwgdGhhdCBhY3R1YWxseSBkZWZpbmVzIGFuIG91dGFnZSdzIGNvc3Q7XG4gICAgICogIGBudWxsYCB3aGVuIG5vIHJlY292ZXJ5IGdhcCB3YXMgb2JzZXJ2ZWQuICovXG4gICAgcDkwU2Vjb25kczogbnVtYmVyIHwgbnVsbDtcbiAgICBwOTVTZWNvbmRzOiBudW1iZXIgfCBudWxsO1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG4gIC8qKlxuICAgKiBDb3ZlcmFnZSByZWNvbmNpbGlhdGlvbiDigJQgcmVnaXN0ZXJlZCBwaXBlbGluZXMgd2l0aCBubyBvYnNlcnZlZCBkZXBsb3kgaW5cbiAgICogdGhlIHdpbmRvdy4gQSBoaWdoIGB3aXRob3V0RGVwbG95c2AgY291bnQgbWVhbnMgRE9SQSBpcyBibGluZCB0byBtb3N0IG9mIHRoZVxuICAgKiBmbGVldCAocGlwZWxpbmVzIHRoYXQgaGF2ZW4ndCByZS1zeW50aGVkIHdpdGggZGVwbG95IHRhZ3MsIG9yIGRvbid0IGRlcGxveSkuXG4gICAqL1xuICBjb3ZlcmFnZToge1xuICAgIC8qKiBQaXBlbGluZXMgaW4gdGhlIHJlZ2lzdHJ5IChvcmctc2NvcGVkKS4gKi9cbiAgICByZWdpc3RlcmVkOiBudW1iZXI7XG4gICAgLyoqIFJlZ2lzdGVyZWQgcGlwZWxpbmVzIHdpdGgg4omlMSBkZXBsb3ktc3RhZ2UgZXhlY3V0aW9uIGluIHRoZSB3aW5kb3cuICovXG4gICAgZGVwbG95aW5nOiBudW1iZXI7XG4gICAgLyoqIHJlZ2lzdGVyZWQg4oiSIGRlcGxveWluZyAoY2xhbXBlZCDiiaUwKS4gKi9cbiAgICB3aXRob3V0RGVwbG95czogbnVtYmVyO1xuICB9O1xufVxuXG4vKiogUGVyLWVudmlyb25tZW50IERPUkEgbWV0cmljcyAoZGVwbG95bWVudCBmcmVxdWVuY3ksIENGUiwgbGVhZCB0aW1lKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9yYUVudk1ldHJpY3Mge1xuICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICAvKiogRGVwbG95bWVudCBGcmVxdWVuY3kg4oCUIHN1Y2Nlc3NmdWwgZGVwbG95LXN0YWdlIGV4ZWN1dGlvbnMgZm9yIHRoaXMgZW52LiAqL1xuICBkZXBsb3ltZW50RnJlcXVlbmN5OiB7XG4gICAgZGVwbG95bWVudHM6IG51bWJlcjtcbiAgICBwZXJEYXk6IG51bWJlcjtcbiAgICBsZXZlbDogRG9yYUxldmVsO1xuICB9O1xuICAvKipcbiAgICogQ2hhbmdlIEZhaWx1cmUgUmF0ZSDigJQgdHdvLWNsYXNzOlxuICAgKiBgKGRlcGxveVRpbWVGYWlsdXJlcyArIHBvc3REZXBsb3lGYWlsdXJlcykgLyBhdHRlbXB0c2AuXG4gICAqIC0gYGRlcGxveVRpbWVGYWlsdXJlc2Ag4oCUIGRlcGxveSBzdGFnZSBgcmVzdWx0PWZhaWxlZGAgKGZyb20gZXZlbnRzKS5cbiAgICogLSBgcG9zdERlcGxveUZhaWx1cmVzYCDigJQgYSBzdWNjZXNzZnVsIGRlcGxveSBsYXRlciBtYXJrZWQgZmFpbGVkIGluIHByb2RcbiAgICogICAoZnJvbSBgZGVwbG95bWVudF9vdXRjb21lc2ApLlxuICAgKiAtIGBhdHRlbXB0c2Ag4oCUIGFsbCB0ZXJtaW5hbCBkZXBsb3ktc3RhZ2UgYXR0ZW1wdHMgKHN1Y2NlZWRlZCArIGZhaWxlZCkuXG4gICAqL1xuICBjaGFuZ2VGYWlsdXJlUmF0ZToge1xuICAgIHJhdGU6IG51bWJlcjtcbiAgICBkZXBsb3lUaW1lRmFpbHVyZXM6IG51bWJlcjtcbiAgICBwb3N0RGVwbG95RmFpbHVyZXM6IG51bWJlcjtcbiAgICBhdHRlbXB0czogbnVtYmVyO1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG4gIC8qKlxuICAgKiBMZWFkIFRpbWUg4oCUIE1FQVNVUkVEOiBgbWVkaWFuKGRlcGxveV9jb21wbGV0ZWQg4oiSIG9sZGVzdF9jb21taXRfdGltZSlgIG92ZXJcbiAgICogc3VjY2Vzc2Z1bCBkZXBsb3lzIHdpdGggYSByZXNvbHZhYmxlIGNvbW1pdCB0aW1lc3RhbXAgKGRlbHRhcyBjbGFtcGVkIOKJpTApLlxuICAgKiBgbWVkaWFuU2Vjb25kc2AgaXMgYG51bGxgICg9IHVua25vd24pIHdoZW4gbm8gc3VjY2Vzc2Z1bCBkZXBsb3kgaW4gdGhpcyBlbnZcbiAgICogY2FycmllZCBhIGBjb21taXRfdGltZXN0YW1wYC4gVGhlIG9sZCBtZWRpYW4tcnVuLWR1cmF0aW9uIHByb3h5IGlzIHJlbW92ZWQuXG4gICAqXG4gICAqIGBwOTBTZWNvbmRzYC9gcDk1U2Vjb25kc2AgY29tZSBmcm9tIHRoZSBzYW1lIHNhbXBsZS4gVGhlIGxldmVsIGlzIHNjb3JlZCBvZmZcbiAgICogdGhlIE1FRElBTiBvbmx5LCBzbyBhZGRpbmcgdGhlIHRhaWxzIGNhbm5vdCBtb3ZlIGEgdGVhbSdzIERPUkEgYmFuZC5cbiAgICovXG4gIGxlYWRUaW1lOiB7XG4gICAgLyoqIFN1Y2Nlc3NmdWwgZGVwbG95cyB3aXRoIGEgcmVzb2x2YWJsZSBjb21taXQgdGltZSAodGhlIG1lZGlhbiBzYW1wbGUpLiAqL1xuICAgIGRlcGxveW1lbnRzOiBudW1iZXI7XG4gICAgbWVkaWFuU2Vjb25kczogbnVtYmVyIHwgbnVsbDtcbiAgICBwOTBTZWNvbmRzOiBudW1iZXIgfCBudWxsO1xuICAgIHA5NVNlY29uZHM6IG51bWJlciB8IG51bGw7XG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbn1cblxuLyoqIE9uZSBpbnRlcnZhbCBidWNrZXQgb2YgdGhlIERPUkEgdHJlbmQgKGRlcGxveSBmcmVxdWVuY3kgKyBjaGFuZ2UgZmFpbHVyZSkuICovXG5leHBvcnQgaW50ZXJmYWNlIERvcmFUcmVuZFBvaW50IHtcbiAgLyoqIEJ1Y2tldCBzdGFydCAoREFURV9UUlVOQyBvZiB0aGUgZGVwbG95IGBjb21wbGV0ZWRfYXRgKSwgSVNPIHRleHQuICovXG4gIHBlcmlvZDogc3RyaW5nO1xuICAvKiogU3VjY2Vzc2Z1bCBkZXBsb3ktc3RhZ2UgZXhlY3V0aW9ucyBpbiB0aGUgYnVja2V0LiAqL1xuICBkZXBsb3ltZW50czogbnVtYmVyO1xuICAvKiogRmFpbGVkIGRlcGxveS1zdGFnZSBleGVjdXRpb25zIGluIHRoZSBidWNrZXQuICovXG4gIGZhaWxlZDogbnVtYmVyO1xuICAvKiogc3VjY2VlZGVkICsgZmFpbGVkIGluIHRoZSBidWNrZXQgKGRlcGxveSBhdHRlbXB0cykuICovXG4gIHRvdGFsOiBudW1iZXI7XG4gIC8qKiBmYWlsZWQvdG90YWwgYXMgYSBwZXJjZW50ICgwIHdoZW4gdG90YWwgaXMgMCkuIERlcGxveS10aW1lIENGUiBvbmx5LiAqL1xuICBjaGFuZ2VGYWlsdXJlUGN0OiBudW1iZXI7XG59XG5cbi8qKiBQZXItc3RhZ2UgYnVpbGQtaGVhbHRoIG1ldHJpY3MgZm9yIG9uZSBwaXBlbGluZSBvdmVyIGEgd2luZG93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEhlYWx0aFN0YWdlIHtcbiAgc3RhZ2U6IHN0cmluZztcbiAgLyoqIFRlcm1pbmFsIHN0YWdlIHJ1bnMgKHN1Y2NlZWRlZCArIGZhaWxlZCkgaW4gdGhlIHdpbmRvdy4gKi9cbiAgcnVuczogbnVtYmVyO1xuICBzdWNjZXNzZXM6IG51bWJlcjtcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgLyoqIHN1Y2Nlc3NlcyAvIHJ1bnMgYXMgYSBwZXJjZW50ICgwIHdoZW4gcnVucyBpcyAwKS4gKi9cbiAgc3VjY2Vzc1JhdGU6IG51bWJlcjtcbiAgLyoqIER1cmF0aW9uIHBlcmNlbnRpbGVzIG92ZXIgdGhlIHN0YWdlJ3MgdGVybWluYWwgcnVuczsgbnVsbCB3aGVuIG5vIGR1cmF0aW9ucy4gKi9cbiAgcDUwTXM6IG51bWJlciB8IG51bGw7XG4gIHA5ME1zOiBudW1iZXIgfCBudWxsO1xuICBwOTlNczogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBQZXItcGlwZWxpbmUgYnVpbGQtaGVhbHRoIGJyZWFrZG93bi4gU3RhbmRhcmQgcmVwb3J0aW5nIChOT1RcbiAqIGBhZHZhbmNlZF9yZXBvcnRpbmdgLWdhdGVkKSDigJQgcGVyLXN0YWdlIHN1Y2Nlc3MgcmF0ZSArIHRpbWluZyBwZXJjZW50aWxlcywgd2l0aFxuICogdG90YWxzIHN1bW1lZCBhY3Jvc3Mgc3RhZ2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkSGVhbHRoIHtcbiAgc3RhZ2VzOiBCdWlsZEhlYWx0aFN0YWdlW107XG4gIHRvdGFsczogeyBydW5zOiBudW1iZXI7IGZhaWx1cmVzOiBudW1iZXI7IGZhaWx1cmVSYXRlOiBudW1iZXIgfTtcbn1cblxuLyoqIFBvc3QtZGVwbG95IGluY2lkZW50IG1hcmtlciBhY2NlcHRlZCBieSBgUmVwb3J0aW5nU2VydmljZS5yZWNvcmRJbmNpZGVudGAuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50SW5wdXQge1xuICBpbmNpZGVudElkOiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIG9wZW5lZEF0OiBzdHJpbmc7XG4gIHJlc29sdmVkQXQ/OiBzdHJpbmc7XG4gIHNldmVyaXR5OiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgcGVyc2lzdGVkIGluY2lkZW50IHN0YXRlIGFzIGFuIGF1ZGl0IHJvdyByZWNvcmRzIGl0IChzY3J1YmJlZCB2YWx1ZXMsIElTTyBpbnN0YW50cykuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50U3RhdGUge1xuICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICBvcGVuZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgcmVzb2x2ZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgc2V2ZXJpdHk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGBSZXBvcnRpbmdTZXJ2aWNlLnJlY29yZEluY2lkZW50YCBkaWQuIGBjaGFuZ2VkYCBpcyBmYWxzZSBmb3IgYSBzZW5kZXInc1xuICogcmVwZWF0LWludGVydmFsIHJlLXBvc3Qgb2YgYW4gdW5jaGFuZ2VkIGFsZXJ0LCBzbyB0aGUgcm91dGUgcmVjb3JkcyBhbiBhdWRpdFxuICogcm93IG9ubHkgZm9yIGFuIGluY2lkZW50IHRoYXQgaXMgbmV3IG9yIGFjdHVhbGx5IG1vdmVkIChvcGVuZWQsIHJlLW9wZW5lZCxcbiAqIHJlc29sdmVkLCByZS1yYW5rZWQpIOKAlCBhIHdlYmhvb2sgcmUtZmlyaW5nIGV2ZXJ5IGZldyBob3VycyBtdXN0IG5vdCBidXJ5IHRoZVxuICogdHJhaWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jaWRlbnRXcml0ZSB7XG4gIC8qKiBUaGUgc3RvcmVkIChzY3J1YmJlZCkgaW5jaWRlbnQgaWQuICovXG4gIGluY2lkZW50SWQ6IHN0cmluZztcbiAgY3JlYXRlZDogYm9vbGVhbjtcbiAgY2hhbmdlZDogYm9vbGVhbjtcbiAgYmVmb3JlOiBJbmNpZGVudFN0YXRlIHwgbnVsbDtcbiAgYWZ0ZXI6IEluY2lkZW50U3RhdGU7XG59XG5cbi8qKiBXaGF0IGBSZXBvcnRpbmdTZXJ2aWNlLnJlY29yZERlcGxveW1lbnRPdXRjb21lYCByZXBsYWNlZDogdGhlIHByaW9yIG1hcmtlciBvZiB0aGUgc2FtZSBvdXRjb21lLCBpZiBhbnkuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveW1lbnRPdXRjb21lV3JpdGUge1xuICBwcmV2aW91czogeyBhdDogc3RyaW5nIHwgbnVsbDsgZW52aXJvbm1lbnQ6IHN0cmluZyB8IG51bGwgfSB8IG51bGw7XG59XG5cbi8qKiBFdmVudCBwYXlsb2FkIGFjY2VwdGVkIGJ5IGBSZXBvcnRpbmdTZXJ2aWNlLmluZ2VzdEV2ZW50c2AuIE1pcnJvcnMgdGhlIHJvdXRlJ3MgWm9kIHNoYXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RFdmVudCB7XG4gIC8qKiBTdGFibGUgcGlwZWxpbmUgaWQgdGhlIGV2ZW50cyBMYW1iZGEgcmVhZCBmcm9tIHRoZSBgcGIucGlwZWxpbmUtaWRgXG4gICAqICB0YWcgKD0gdGhlIHBsYXRmb3JtIHBpcGVsaW5lSWQpLiBUaGUgcmVnaXN0cnkgam9pbiBrZXkuICovXG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIHwgJ2NvZGVidWlsZCcgfCAncGx1Z2luLWJ1aWxkJztcbiAgZXZlbnRUeXBlOiAnUElQRUxJTkUnIHwgJ1NUQUdFJyB8ICdBQ1RJT04nIHwgJ0JVSUxEJztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiAoQWN0aW9uIGV2ZW50cykuICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgLyoqIFNvdXJjZSBjb21taXQgaWQgb2YgdGhlIGNoYW5nZSBiZWluZyBzaGlwcGVkIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuICovXG4gIGNvbW1pdFNoYT86IHN0cmluZztcbiAgLyoqIFNvdXJjZSByZWYvYnJhbmNoIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuICovXG4gIGNvbW1pdFJlZj86IHN0cmluZztcbiAgLyoqIERlcGxveSB0YXJnZXQgKGUuZy4gXCJwcm9kdWN0aW9uXCIpLiBJdHMgcHJlc2VuY2Ugb24gYSBTVEFHRS9BQ1RJT04gZXZlbnRcbiAgICogIG1hcmtzIGEgcmVhbCBkZXBsb3ltZW50IChkZXJpdmVkIHNlcnZlci1zaWRlIOKAlCB0aGVyZSBpcyBubyBgaXNEZXBsb3lgKS4gKi9cbiAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIC8qKiBPbGRlc3QgdW5zaGlwcGVkIGNvbW1pdCB0aW1lc3RhbXAgKElTTyA4NjAxKSBmb3IgbWVhc3VyZWQgbGVhZCB0aW1lLiAqL1xuICBjb21taXRUaW1lc3RhbXA/OiBzdHJpbmc7XG4gIC8qKiBOdW1iZXIgb2YgY29tbWl0cyBzaGlwcGVkIGluIHRoaXMgY2hhbmdlICjiiaUxKS4gKi9cbiAgY29tbWl0Q291bnQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgRXZlbnRCcmlkZ2UgZXZlbnQgYGlkYCB0aGUgZm9yd2FyZGVyIHJlY2VpdmVkIHRoaXMgc3RhdGUgY2hhbmdlIGFzLlxuICAgKiBBV1MtYXNzaWduZWQgYW5kIHVuaXF1ZSBwZXIgZGVsaXZlcnkgc291cmNlIGV2ZW50LCBzbyBpdCBpcyB0aGUgc3Ryb25nZXN0XG4gICAqIGRlZHVwIGtleSB0aGVyZSBpcyAoYGV2ZW50X3NvdXJjZV9ldmVudF9pZHhgKSBhbmQgdGhlIHRocmVhZCBhbiBhdWRpdCBvclxuICAgKiBET1JBIHJvdyBmb2xsb3dzIGJhY2sgdG8gdGhlIGV4YWN0IEFXUyBldmVudC4gQWJzZW50IGZvciBwbHVnaW4tYnVpbGRcbiAgICogZXZlbnRzLCB3aGljaCBoYXZlIG5vIEV2ZW50QnJpZGdlIG9yaWdpbi5cbiAgICovXG4gIHNvdXJjZUV2ZW50SWQ/OiBzdHJpbmc7XG4gIC8qKiBUaGUgU1FTIG1lc3NhZ2UgaWQgaXQgYXJyaXZlZCBpbiAoZm9sZGVkIGludG8gYGRldGFpbC5zb3VyY2VNZXNzYWdlSWRgOyBub3QgYSBjb2x1bW4pLiAqL1xuICBzb3VyY2VNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIGRldGFpbD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIFBlci1ldmVudCBtZXRyaWMgZGVzY3JpcHRvciBlbWl0dGVkICh2aWEgdGhlIHtAbGluayBSZXBvcnRpbmdTZXJ2aWNlLmluZ2VzdEV2ZW50c31cbiAqIGBvbk1ldHJpY2AgaG9vaykgZm9yIGVhY2ggUkVHSVNURVJFRCB0ZXJtaW5hbCBkZXBsb3kvc3RhZ2UgZXZlbnQsIHNvIHRoZSByb3V0ZVxuICogbGF5ZXIgY2FuIGZhbiB0aGVtIGludG8gUHJvbWV0aGV1cyBjb3VudGVycyB3aXRob3V0IHBpcGVsaW5lLWRhdGEgaW1wb3J0aW5nXG4gKiBhcGktc2VydmVyJ3MgbWV0cmljcyByZWdpc3RyeS4gYHJlc3VsdGAgaXMgdGhlIHRlcm1pbmFsIG91dGNvbWU7IGBlbnZpcm9ubWVudGBcbiAqIGlzIG5vbi1udWxsIG9ubHkgZm9yIGEgZGVwbG95LXN0YWdlIGV2ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlSW5nZXN0TWV0cmljIHtcbiAga2luZDogJ3N0YWdlJztcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBvcmdJZDogc3RyaW5nO1xuICBzdGFnZTogc3RyaW5nO1xuICBlbnZpcm9ubWVudDogc3RyaW5nIHwgbnVsbDtcbiAgcmVzdWx0OiAnc3VjY2VlZGVkJyB8ICdmYWlsZWQnO1xufVxuXG4vKipcbiAqIE9uZSB0ZXJtaW5hbCBDb2RlQnVpbGQgQUNUSU9OJ3MgY29tcHV0ZSBjb25zdW1wdGlvbiAoUGhhc2UgNCwgbWVhc3VyZW1lbnRcbiAqIGhhbGYpLlxuICpcbiAqIGBjcmVkaXRzYCBpcyBOVUxMIHJhdGhlciB0aGFuIDAgd2hlbiB0aGUgYWN0aW9uIGNvdWxkIG5vdCBiZSBtZWFzdXJlZCDigJQgbm9cbiAqIGRlY2xhcmVkIHN0YXJ0IHRpbWUsIG9yIGEgY29tcHV0ZSBzaXplIHRoZSBmb3J3YXJkZXIgY291bGQgbm90IHJlYWQuIFRoZVxuICogZGlzdGluY3Rpb24gaXMgdGhlIHdob2xlIHZhbHVlIG9mIHRoaXMgbWV0cmljOiB6ZXJvIHdvdWxkIG1ha2UgYSBjb3ZlcmFnZSBnYXBcbiAqIGxvb2sgbGlrZSBpZGxlbmVzcywgYW5kIGEgdGllciBsYWRkZXIgcmUtZGVyaXZlZCBhZ2FpbnN0IGFuIHVua25vd25cbiAqIGRlbm9taW5hdG9yIGlzIGEgcmVwcmljaW5nIG5vYm9keSBjYW4gZGVmZW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXB1dGVJbmdlc3RNZXRyaWMge1xuICBraW5kOiAnY29tcHV0ZSc7XG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgb3JnSWQ6IHN0cmluZztcbiAgY29tcHV0ZVR5cGU6IHN0cmluZyB8IG51bGw7XG4gIGR1cmF0aW9uTXM6IG51bWJlciB8IG51bGw7XG4gIGNyZWRpdHM6IG51bWJlciB8IG51bGw7XG59XG5cbi8qKlxuICogT25lIHRlcm1pbmFsIG1hbmFnZWQtdG9vbGNoYWluIHJ1biAoZG9jcy9wbGFucy9ib290c3RyYXAtaW1hZ2UtdmVyc2lvbmluZy5tZFxuICogwqc3KTogYSBgc3ludGhgIG9yIGBzZWxmLW11dGF0aW9uYCBhY3Rpb24gd2hvc2Ugcm93IHdhcyBzdGFtcGVkIHdpdGggdGhlXG4gKiByZWxlYXNlIGZyb20gdGhlIHBsYXRmb3JtJ3MgZGVwbG95ZWQgbWFuaWZlc3QuIEFMRVJUSU5HIE9OTFkg4oCUIHRoZSBjYW5hcnlcbiAqIGdhdGUgYW5kIHRoZSBBZmZlY3RlZCB2aWV3IHJlYWQgdGhlIHJvd3MsIG5ldmVyIHRoaXMgbWV0cmljLlxuICpcbiAqIGBwbGF0Zm9ybURlZmF1bHRSZWxlYXNlYCBpcyB0aGUgZGVmYXVsdCBhdCBpbmdlc3QgdGltZSwgZm9yIHRoZSBhbGVydCdzXG4gKiBiYXNlbGluZSAoYHBpcGVsaW5lX3Rvb2xjaGFpbl9wbGF0Zm9ybV9kZWZhdWx0X3NlZW5fdGltZXN0YW1wX3NlY29uZHNgKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sY2hhaW5Jbmdlc3RNZXRyaWMge1xuICBraW5kOiAndG9vbGNoYWluJztcbiAgdG9vbGNoYWluUmVsZWFzZTogc3RyaW5nO1xuICBhY3Rpb246ICdzeW50aCcgfCAnc2VsZi1tdXRhdGlvbic7XG4gIG91dGNvbWU6ICdzdWNjZWVkZWQnIHwgJ2ZhaWxlZCc7XG4gIHBsYXRmb3JtRGVmYXVsdFJlbGVhc2U6IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBXaGF0IHRoZSBpbmdlc3QgZmFucyBvdXQgdG8gaXRzIGNhbGxlcidzIG1ldHJpYyByZWdpc3RyeS4gRGlzY3JpbWluYXRlZCwgc29cbiAqICBhIG5ldyBraW5kIGNhbm5vdCBiZSBzaWxlbnRseSBjb3VudGVkIGFzIGEgc3RhZ2Ugb3V0Y29tZS4gKi9cbmV4cG9ydCB0eXBlIEluZ2VzdE1ldHJpYyA9IFN0YWdlSW5nZXN0TWV0cmljIHwgQ29tcHV0ZUluZ2VzdE1ldHJpYyB8IFRvb2xjaGFpbkluZ2VzdE1ldHJpYztcblxuLyoqIENvdW50cyArIHRoZSAocG9zc2libHkgdHJ1bmNhdGVkKSBsaXN0IG9mIHVucmVnaXN0ZXJlZCBwaXBlbGluZSBpZHMgdGhlIGNhbGxlciBjYW4gbG9nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RSZXN1bHQge1xuICBpbnNlcnRlZDogbnVtYmVyO1xuICBza2lwcGVkOiBudW1iZXI7XG4gIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEV2ZXJ5IG9yZyB3aXRoIGF0IGxlYXN0IG9uZSByb3cgaW4gdGhpcyBiYXRjaCwgZGVkdXBlZC5cbiAgICpcbiAgICogQWxyZWFkeSBjb21wdXRlZCBmb3IgcG9zdC1jb21taXQgY2FjaGUgaW52YWxpZGF0aW9uOyBzdXJmYWNlZCBiZWNhdXNlIHRoZVxuICAgKiBpbmdlc3Qgcm91dGUgbmVlZHMgdGhlIHNhbWUgc2V0IHRvIHB1c2ggaXRzIGxpdmUgU1NFIGZyYW1lLiBUaGUgc3RhZ2UtbWV0cmljXG4gICAqIGhvb2sgY2FuJ3QgZHJpdmUgdGhhdCBmYW4tb3V0OiBpdCBvbmx5IGZpcmVzIGZvciBTVEFHRSBldmVudHMsIHNvIGEgYmF0Y2ggb2ZcbiAgICogUElQRUxJTkUgb3IgQlVJTEQgZXZlbnRzIHdvdWxkIGxhbmQgcm93cyBhbmQgcHVzaCBubyBmcmFtZSBhdCBhbGwuXG4gICAqL1xuICBhZmZlY3RlZE9yZ3M6IHN0cmluZ1tdO1xuICAvKipcbiAgICogRXZlbnRzIGRyb3BwZWQgYmVjYXVzZSB0aGUgcGlwZWxpbmUgdGhleSBuYW1lIGJlbG9uZ3MgdG8gYW4gb3JnIHRoZSBjYWxsZXJcbiAgICogbWF5IG5vdCB3cml0ZSBmb3IuIFN1cmZhY2VkIHNvIHRoZSByb3V0ZSBjYW4gbG9nIGFuZCBjb3VudCB0aGVtOiBhIG5vbi16ZXJvXG4gICAqIHZhbHVlIGlzIGVpdGhlciBhIG1pc3JvdXRlZCBwcm9kdWNlciBvciBhbiBhdHRlbXB0IHRvIGluamVjdCBldmVudHMgaW50b1xuICAgKiBhbm90aGVyIHRlbmFudCdzIHJlcG9ydHMsIGFuZCBib3RoIG5lZWQgdG8gYmUgdmlzaWJsZS5cbiAgICovXG4gIGRyb3BwZWRGb3JlaWduT3JnOiBudW1iZXI7XG4gIC8qKlxuICAgKiBFdmVudHMgZHJvcHBlZCBiZWNhdXNlIHRoZWlyIHRpbWVzdGFtcHMgYXJlIGltcG9zc2libGUg4oCUIGRhdGVkIGluIHRoZSBmdXR1cmUsXG4gICAqIG9yIGNvbXBsZXRpbmcgYmVmb3JlIHRoZXkgc3RhcnRlZC4gUmVqZWN0ZWQgaGVyZSByYXRoZXIgdGhhbiBjbGFtcGVkIGxhdGVyOlxuICAgKiBhIGRlcGxveSB3aG9zZSBkdXJhdGlvbiBvciBsZWFkIHRpbWUgaXMgbmVnYXRpdmUgc2lsZW50bHkgc2tld3MgZGVwbG95bWVudFxuICAgKiBmcmVxdWVuY3ksIGNoYW5nZS1mYWlsdXJlIHJhdGUgYW5kIGxlYWQgdGltZSBmb3IgdGhlIHdob2xlIG9yZywgYW5kIGEgY2xhbXBcbiAgICogdG8gMCBtYWtlcyBhIGJhZCBjbG9jayBsb29rIGxpa2UgYW4gaW5zdGFudCBkZXBsb3kuXG4gICAqL1xuICBkcm9wcGVkSW52YWxpZFRpbWU6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIHBpcGVsaW5lIGlkcyB3aG9zZSBldmVudHMgd2VyZSBkcm9wcGVkIGFzIEZPUkVJR04tT1JHIOKAlCB0aGVcbiAgICogdGVuYW5jeSByZWZ1c2FsIHRoZSByb3V0ZSBhdWRpdHMgYXMgYSBmYWlsdXJlLiBJZHMgb25seSAobmV2ZXIgdGhlIG9yZyB0aGV5XG4gICAqIHJlc29sdmVkIHRvOiB0aGF0IHdvdWxkIHRlbGwgYSBwcm9iZXIgd2hpY2ggdGVuYW50IG93bnMgdGhlIHBpcGVsaW5lKS5cbiAgICovXG4gIGZvcmVpZ25QaXBlbGluZUlkczogc3RyaW5nW107XG4gIC8qKiBEaXN0aW5jdCBleGVjdXRpb24gaWRzIG9mIHRoZSByb3dzIHRoYXQgYWN0dWFsbHkgbGFuZGVkICh0aGUgYXVkaXQncyBjb3JyZWxhdGlvbiBzZXQpLiAqL1xuICBpbnNlcnRlZEV4ZWN1dGlvbklkczogc3RyaW5nW107XG4gIC8qKiBEaXN0aW5jdCBwaXBlbGluZSBpZHMgb2YgdGhlIHJvd3MgdGhhdCBhY3R1YWxseSBsYW5kZWQuICovXG4gIGluc2VydGVkUGlwZWxpbmVJZHM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFdobyBpcyB3cml0aW5nLCBmb3IgdGhlIGluZ2VzdCB0ZW5hbmN5IGNoZWNrLlxuICpcbiAqIGAvcmVwb3J0cy9ldmVudHNgIHJlc29sdmVzIGFuIGV2ZW50J3Mgb3JnIGZyb20gdGhlIHBpcGVsaW5lIHJlZ2lzdHJ5LCBzb1xuICogd2l0aG91dCB0aGlzIGEgdG9rZW4gaG9sZGluZyBgcmVwb3J0aW5nOmluZ2VzdGAgY291bGQgcG9zdCBldmVudHMgZm9yIEFOWVxuICogcGlwZWxpbmUgaWQgYW5kIGhhdmUgdGhlbSBhdHRyaWJ1dGVkIHRvIHRoYXQgcGlwZWxpbmUncyBvcmcg4oCUIG9uZSBvcmdcbiAqIGluamVjdGluZyByb3dzIGludG8gYW5vdGhlcidzIHJlcG9ydHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0Q2FsbGVyIHtcbiAgLyoqXG4gICAqIE9yZyBpZHMgdGhpcyBjYWxsZXIgbWF5IHdyaXRlIGV2ZW50cyBmb3I6IGl0cyBvd24sIHBsdXMgZGVzY2VuZGFudCB0ZWFtcy5cbiAgICogUmVzb2x2ZWQgYnkgdGhlIHJvdXRlLiBBbiBldmVudCB3aG9zZSBwaXBlbGluZSBiZWxvbmdzIHRvIGFueXRoaW5nIGVsc2UgaXNcbiAgICogZHJvcHBlZC5cbiAgICovXG4gIGFsbG93ZWRPcmdJZHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogQSB2ZXJpZmllZCBJTlRFUk5BTCBzZXJ2aWNlIHByaW5jaXBhbCAodGhlIHBsdWdpbiBzZXJ2aWNlIHBvc3RzIHBsdWdpbi1idWlsZFxuICAgKiBldmVudHMgZm9yIGV2ZXJ5IHRlbmFudCkuIFN1Y2ggY2FsbGVycyBhcmUgZXhlbXB0OiB0aGV5IGhvbGQgYSBzaWduZWRcbiAgICogc2VydmljZSBrZXkgbm8gZXh0ZXJuYWwgY2xpZW50IGNhbiBtaW50LCBhbmQgdGhleSBsZWdpdGltYXRlbHkgd3JpdGVcbiAgICogY3Jvc3MtdGVuYW50LiBOZXZlciBzZXQgdGhpcyBmcm9tIGFueXRoaW5nIGEgcmVxdWVzdCBib2R5IGNhbiBpbmZsdWVuY2UuXG4gICAqL1xuICBjcm9zc1RlbmFudD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgYWNjZXNzIGtleSAoc2VydmljZS1hY2NvdW50IC8gUEFUIGtleSBpZCkgdGhlIGluZ2VzdCB0b2tlbiB3YXMgZXhjaGFuZ2VkXG4gICAqIGZyb20sIHN0YW1wZWQgb24gZXZlcnkgcm93IGFzIGBpbmdlc3Rfa2V5X2lkYCBzbyBhIGZvcmdlZCBvciBtaXNyb3V0ZWQgcm93XG4gICAqIG5hbWVzIHRoZSBjcmVkZW50aWFsIHRoYXQgd3JvdGUgaXQuIEEga2V5IElELCBuZXZlciB0aGUgc2VjcmV0LlxuICAgKi9cbiAga2V5SWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT25lIG9yZydzIGluZ2VzdGlvbi1oZWFsdGggcm93IGFzIFJFQUQgYmFjayBieSB0aGUgUmVwb3J0cyBVSS4gVGhlXG4gKiBBV1MgZXZlbnRzIExhbWJkYSB3cml0ZXMgaXQ7IHRoaXMgaXMgdGhlIHNoYXBlIHRoYXQgbGV0cyB0aGUgVUkgdGVsbFxuICogXCJpbmdlc3Rpb24gaXMgaGVhbHRoeSwgdGhlcmUgd2VyZSBzaW1wbHkgbm8gZGVwbG95cyBpbiB0aGUgcmFuZ2VcIiBhcGFydCBmcm9tXG4gKiBcIndlIGhhdmVuJ3QgaGVhcmQgZnJvbSB0aGUgaW5nZXN0IHBpcGVsaW5lIHNpbmNlIFhcIi5cbiAqXG4gKiBgbnVsbGAgZnJvbSB7QGxpbmsgUmVwb3J0aW5nU2VydmljZS5nZXRJbmdlc3RIZWFsdGh9IG1lYW5zIHRoZSBkZXBsb3ltZW50IGhhc1xuICogTkVWRVIgcmVwb3J0ZWQg4oCUIG5vdCBcInN0YWxlXCIuIFRoZSB0d28gbXVzdCBub3QgYmUgY29uZmxhdGVkOiBhIGZyZXNoIGluc3RhbGxcbiAqIChvciBvbmUgd2hvc2UgZm9yd2FyZGVyIHdhcyBuZXZlciB3aXJlZCB1cCkgaGFzIG5vIGhlYXJ0YmVhdCBhdCBhbGwsIGFuZFxuICogY2FsbGluZyB0aGF0IFwic3RhbGVcIiB3b3VsZCBpbnZlbnQgYSByZWdyZXNzaW9uIHRoYXQgbmV2ZXIgaGFwcGVuZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0SGVhbHRoU3RhdHVzIHtcbiAgLyoqIFdoZW4gdGhlIGZvcndhcmRlciBsYXN0IHBvc3RlZCBhIGhlYXJ0YmVhdCAoaXRzIG93biBjbG9jaywgSVNPIDg2MDEpLiAqL1xuICB1cGRhdGVkQXQ6IHN0cmluZztcbiAgLyoqIFRpbWVzdGFtcCBvZiB0aGUgbmV3ZXN0IGV2ZW50IGl0IGhhZCBmb3J3YXJkZWQsIG9yIG51bGwgaWYgaXQgaGFzIHNlZW4gbm9uZS4gKi9cbiAgbGFzdEV2ZW50QXQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBDdW11bGF0aXZlIGV2ZW50cyBmb3J3YXJkZWQsIG9yIG51bGwgd2hlbiB0aGUgZm9yd2FyZGVyIGRvZXNuJ3QgcmVwb3J0IGl0LiAqL1xuICBmb3J3YXJkZWQ6IG51bWJlciB8IG51bGw7XG4gIC8qKiBDdW11bGF0aXZlIGV2ZW50cyBEUk9QUEVEIChub24temVybyDih5IgZGF0YSBsb3NzIHVwc3RyZWFtIG9mIHRoZSByZXBvcnRzKS4gKi9cbiAgZHJvcHBlZDogbnVtYmVyIHwgbnVsbDtcbn1cblxuXG4vKipcbiAqIFJlYWQtb25seSByZXBvcnRpbmcgc2VydmljZSBmb3IgcGlwZWxpbmUgZXhlY3V0aW9uIGFuZCBwbHVnaW4gaW52ZW50b3J5IGFnZ3JlZ2F0aW9ucy5cbiAqIERvZXMgbm90IGV4dGVuZCBDcnVkU2VydmljZSDigJQgcmVwb3J0cyBhcmUgYWdncmVnYXRlIHF1ZXJpZXMsIG5vdCBlbnRpdHkgQ1JVRC5cbiAqXG4gKiBBbGwgcXVlcmllcyBhcmUgY2FjaGVkIGluLW1lbW9yeSB0byBhdm9pZCByZXBlYXRlZCBleHBlbnNpdmUgU1FMIGFnZ3JlZ2F0aW9uczpcbiAqIC0gSW52ZW50b3J5IHF1ZXJpZXMgKHBsdWdpbiBzdW1tYXJ5L2Rpc3RyaWJ1dGlvbi92ZXJzaW9ucyk6IDUgbWluIFRUTFxuICogLSBUaW1lc2VyaWVzIHF1ZXJpZXMgKGV4ZWN1dGlvbi9idWlsZCBtZXRyaWNzIHdpdGggZGF0ZSByYW5nZXMpOiAyIG1pbiBUVExcbiAqL1xuXG4vKipcbiAqIEludGVybmFsIHJvdyBzaGFwZXMgZm9yIHRoZSBET1JBIHF1ZXJpZXMuIEV4cG9ydGVkIGJlY2F1c2UgLi9kb3JhLnRzIGNvbnN1bWVzXG4gKiB0aGVtOyBub3QgcGFydCBvZiB0aGUgcGFja2FnZSdzIHB1YmxpYyBzdXJmYWNlIChyZXBvcnRpbmctc2VydmljZS50c1xuICogcmUtZXhwb3J0cyB0aGlzIG1vZHVsZSB3aG9sZXNhbGUsIHdoaWNoIGlzIGEgZGVsaWJlcmF0ZSBzaW1wbGlmaWNhdGlvbiDigJQgdGhlc2VcbiAqIGRlc2NyaWJlIHF1ZXJ5IHJlc3VsdHMsIG5vdCBBUEkgY29udHJhY3RzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBsb3lSb3cge1xuICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICBzdGF0dXM6ICdTVUNDRUVERUQnIHwgJ0ZBSUxFRCcgfCBzdHJpbmc7XG4gIC8qKiBEZXBsb3kgZXhlY3V0aW9uIGlkIOKAlCB0aGUgYXR0cmlidXRpb24ga2V5IGZvciBkZWR1cCBhZ2FpbnN0IG91dGNvbWVzL2luY2lkZW50cy4gKi9cbiAgZXhlY3V0aW9uX2lkOiBzdHJpbmcgfCBudWxsO1xuICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gIGNvbW1pdF90czogc3RyaW5nIHwgbnVsbDtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGRlcGxveSBjb21wbGV0ZWQgaW5zaWRlIFtmcm9tLHRvXS4gQWJzZW50ICh1bmRlZmluZWQpIGluIHVuaXRcbiAgICogZml4dHVyZXMg4oeSIHRyZWF0ZWQgYXMgaW4td2luZG93LiBgdGAvYGZgIHRvbGVyYXRlZCAocGcgYm9vbGVhbiB0ZXh0IGZvcm0pLlxuICAgKi9cbiAgaW5fd2luZG93PzogYm9vbGVhbiB8IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBSYXcgcG9zdC1kZXBsb3kgb3V0Y29tZSBtYXJrZXIgcm93IChmcm9tIGBkZXBsb3ltZW50X291dGNvbWVzYCwgaW4td2luZG93KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3V0Y29tZVJvdyB7XG4gIGVudmlyb25tZW50OiBzdHJpbmcgfCBudWxsO1xuICBvdXRjb21lOiAnZmFpbGVkJyB8ICdyZXN0b3JlZCcgfCBzdHJpbmc7XG4gIC8qKiBFeGVjdXRpb24gdGhlIHVzZXIgbWFya2VkIOKAlCBkZWR1cCBrZXkgYWdhaW5zdCBpbmNpZGVudC1jb3JyZWxhdGVkIGRlcGxveXMuICovXG4gIGV4ZWN1dGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIFByb2R1Y3Rpb24gcmVzdG9yZWQtaW5jaWRlbnQgcGFpcjogcmVjb3ZlcnkgdGltZSArIHRoZSBkZXBsb3kncyBjb21wbGV0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdHRyUGFpclJvdyB7XG4gIHJlc3RvcmVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICBkZXBsb3llZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIEV4ZWN1dGlvbiBpZCDigJQgbGV0cyBpbmNpZGVudCBwcmVjZWRlbmNlIG92ZXJyaWRlIHRoZSBtYW51YWwgb3V0Y29tZSBwZXIgZGVwbG95LiAqL1xuICBleGVjdXRpb25faWQ6IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICogUmF3IGluY2lkZW50IHJvdyAoZnJvbSBgaW5jaWRlbnRzYCwgb3BlbmVkIGluLXdpbmRvdykuIENvcnJlbGF0ZWQgaW4gSlMgdG8gdGhlXG4gKiBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSB0byBgZW52aXJvbm1lbnRgIHdpdGhpbiBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSU1xuICog4oaSIGFuIGF1dG9tYXRlZCBwb3N0LWRlcGxveSBmYWlsdXJlIChDRlIpICsgcmVhbCByZWNvdmVyeSB0aW1lIChNVFRSKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNpZGVudFJvdyB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIG9wZW5lZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgcmVzb2x2ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBDb3ZlcmFnZSBjb3VudHM6IHJlZ2lzdGVyZWQgcGlwZWxpbmVzIHZzIHRob3NlIHRoYXQgYWN0dWFsbHkgZGVwbG95ZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIENvdmVyYWdlUm93IHtcbiAgcmVnaXN0ZXJlZDogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgZGVwbG95aW5nOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xufVxuIl19
|
|
@@ -1,27 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Which pipelines still REFERENCE a plugin version or image — the one rule every
|
|
3
|
-
* removal path asks before it deletes anything: an org plugin delete (forced or
|
|
4
|
-
* not), a bulk delete, a tombstone purge (manual or the retention sweep), the
|
|
5
|
-
* image registry's age GC, the listing image GC.
|
|
6
|
-
*
|
|
7
|
-
* THE RULE: a version (or its image) that any pipeline references cannot be
|
|
8
|
-
* deleted until no pipeline does — whatever its vulnerability state. A
|
|
9
|
-
* vulnerable image is the WORST thing to delete out from under a pipeline: the
|
|
10
|
-
* next run fails to pull, and the owners learn about the CVE from an outage.
|
|
11
|
-
* Vulnerability consequences are graded warnings and notifications, never removal.
|
|
12
|
-
*
|
|
13
|
-
* A reference is any of:
|
|
14
|
-
* - `declared` — a LIVE pipeline's config resolves to it (`pipeline_plugin_resolution`);
|
|
15
|
-
* - `deployed` — a pipeline's last deploy recorded it (`pipeline_step_manifests`),
|
|
16
|
-
* INCLUDING a soft-deleted pipeline: its CodePipeline still runs the image;
|
|
17
|
-
* - `exposure` — an open DEPLOYED exposure still names it (the same "still runs
|
|
18
|
-
* it" fact, kept when a manifest is gone).
|
|
19
|
-
*
|
|
20
|
-
* Matched by image digest when the version has one (a team running its parent's
|
|
21
|
-
* plugin, or another org's install, pins the same digest), else by name +
|
|
22
|
-
* version within the owner org and its teams.
|
|
23
|
-
*/
|
|
24
1
|
import { type SQL } from 'drizzle-orm';
|
|
2
|
+
import { withTenantTx } from '../database/tenancy.js';
|
|
25
3
|
/** A version / image whose references are wanted. */
|
|
26
4
|
export interface VersionReferenceTarget {
|
|
27
5
|
pluginName: string;
|
|
@@ -59,7 +37,7 @@ export declare function versionReferencedPredicate(cols: {
|
|
|
59
37
|
* names other orgs' pipelines; callers show the OWNER only counts and its own
|
|
60
38
|
* org's pipelines, and notify each referencing org about its own.
|
|
61
39
|
*/
|
|
62
|
-
export declare function findVersionReferences(target: VersionReferenceTarget): Promise<VersionReference[]>;
|
|
40
|
+
export declare function findVersionReferences(target: VersionReferenceTarget, run?: <T>(fn: (tx: Parameters<Parameters<typeof withTenantTx>[0]>[0]) => Promise<T>) => Promise<T>): Promise<VersionReference[]>;
|
|
63
41
|
/** Distinct pipelines among `refs` (a pipeline both declared and deployed counts once). */
|
|
64
42
|
export declare function distinctPipelines(refs: readonly VersionReference[]): Array<{
|
|
65
43
|
pipelineId: string;
|