@workflow/core 5.0.0-beta.29 → 5.0.0-beta.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/global.d.ts +20 -0
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +1 -1
- package/dist/runtime/constants.d.ts +54 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +62 -1
- package/dist/runtime/helpers.d.ts +11 -3
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +21 -2
- package/dist/runtime/runs.d.ts +25 -1
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +6 -4
- package/dist/runtime/start.d.ts +28 -0
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +13 -3
- package/dist/runtime/step-executor.d.ts +13 -0
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +37 -5
- package/dist/runtime/step-latency.d.ts +6 -0
- package/dist/runtime/step-latency.d.ts.map +1 -1
- package/dist/runtime/step-latency.js +22 -2
- package/dist/runtime/step-ownership.d.ts +72 -0
- package/dist/runtime/step-ownership.d.ts.map +1 -0
- package/dist/runtime/step-ownership.js +114 -0
- package/dist/runtime/step-single-flight.d.ts +12 -0
- package/dist/runtime/step-single-flight.d.ts.map +1 -0
- package/dist/runtime/step-single-flight.js +69 -0
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +253 -51
- package/dist/serialization-format.d.ts +1 -0
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +17 -52
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +41 -2
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +30 -5
- package/dist/telemetry/semantic-conventions.d.ts +16 -0
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +13 -1
- package/dist/telemetry.d.ts +8 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +25 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/package.json +4 -4
package/dist/runtime/start.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EntityConflictError, WorkflowRuntimeError } from '@workflow/errors';
|
|
2
2
|
import { workflowDisplayName } from '@workflow/utils/parse-name';
|
|
3
|
-
import { isLegacySpecVersion, SPEC_VERSION_SUPPORTS_ATTRIBUTES, SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT, SPEC_VERSION_SUPPORTS_COMPRESSION, } from '@workflow/world';
|
|
3
|
+
import { isLegacySpecVersion, SPEC_VERSION_SUPPORTS_ATTRIBUTES, SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT, SPEC_VERSION_SUPPORTS_COMPRESSION, workflowRunIdSchema, } from '@workflow/world';
|
|
4
4
|
import { monotonicFactory } from 'ulid';
|
|
5
5
|
import { normalizeAttributeChanges } from '../attribute-changes.js';
|
|
6
6
|
import { getRunCapabilities } from '../capabilities.js';
|
|
@@ -121,6 +121,7 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
121
121
|
const probe = await healthCheck(world, 'workflow', {
|
|
122
122
|
deploymentId,
|
|
123
123
|
timeout: CROSS_DEPLOYMENT_CAPABILITY_PROBE_TIMEOUT_MS,
|
|
124
|
+
namespace: opts.namespace,
|
|
124
125
|
}).catch(() => undefined);
|
|
125
126
|
const capabilities = getRunCapabilities(probe?.workflowCoreVersion);
|
|
126
127
|
framedByteStreams = capabilities.framedByteStreams;
|
|
@@ -167,6 +168,12 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
167
168
|
: {}),
|
|
168
169
|
}
|
|
169
170
|
: {};
|
|
171
|
+
// `replayedFromRunId` is a foreign key to the source run; reject anything
|
|
172
|
+
// that isn't a real run ID so the lineage link can't point at garbage.
|
|
173
|
+
if (opts.replayedFromRunId !== undefined &&
|
|
174
|
+
!workflowRunIdSchema.safeParse(opts.replayedFromRunId).success) {
|
|
175
|
+
throw new WorkflowRuntimeError(`replayedFromRunId must be a run ID (wrun_<ulid>); received ${JSON.stringify(String(opts.replayedFromRunId).slice(0, 64))}.`);
|
|
176
|
+
}
|
|
170
177
|
// Resolve encryption key for the new run. The runId has already been
|
|
171
178
|
// generated above (client-generated ULID) and will be used for both
|
|
172
179
|
// key derivation and the run_created event. The World implementation
|
|
@@ -192,6 +199,9 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
192
199
|
traceCarrier,
|
|
193
200
|
workflowCoreVersion,
|
|
194
201
|
features: { encryption: !!encryptionKey },
|
|
202
|
+
...(opts.replayedFromRunId
|
|
203
|
+
? { replayedFromRunId: opts.replayedFromRunId }
|
|
204
|
+
: {}),
|
|
195
205
|
};
|
|
196
206
|
// Call events.create (run_created) and queue in parallel.
|
|
197
207
|
// If events.create fails with 429/5xx, the run was still accepted
|
|
@@ -208,7 +218,7 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
208
218
|
...attributeSeed,
|
|
209
219
|
},
|
|
210
220
|
}, { v1Compat }),
|
|
211
|
-
world.queue(getWorkflowQueueName(workflowName), {
|
|
221
|
+
world.queue(getWorkflowQueueName(workflowName, opts.namespace), {
|
|
212
222
|
runId,
|
|
213
223
|
traceCarrier,
|
|
214
224
|
...(specVersion >= SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT
|
|
@@ -288,4 +298,4 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
288
298
|
});
|
|
289
299
|
});
|
|
290
300
|
}
|
|
291
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVqRSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGdDQUFnQyxFQUNoQywwQ0FBMEMsRUFDMUMsaUNBQWlDLEdBQ2xDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdDLE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsbUJBQW1CLEdBQ3BCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLE9BQU8sSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFD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Zmxvd1J1bnRpbWVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgd29ya2Zsb3dEaXNwbGF5TmFtZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dJbnZva2VQYXlsb2FkLCBXb3JsZCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBpc0xlZ2FjeVNwZWNWZXJzaW9uLFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQVRUUklCVVRFUyxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JULFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBub3JtYWxpemVBdHRyaWJ1dGVDaGFuZ2VzIH0gZnJvbSAnLi4vYXR0cmlidXRlLWNoYW5nZXMuanMnO1xuaW1wb3J0IHsgZ2V0UnVuQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi4vY2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IGlzUmV0cnlhYmxlV29ybGRFcnJvciB9IGZyb20gJy4uL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IGltcG9ydEtleSB9IGZyb20gJy4uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uL3NjaGVtYXMuanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMsXG4gIFNlcmlhbGl6YXRpb25Gb3JtYXQsXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVUcmFjZUNhcnJpZXIsIHRyYWNlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IHZlcnNpb24gYXMgd29ya2Zsb3dDb3JlVmVyc2lvbiB9IGZyb20gJy4uL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9nZXQtd29ybGQtbGF6eS5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1F1ZXVlTmFtZSwgaGVhbHRoQ2hlY2sgfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgUnVuIH0gZnJvbSAnLi9ydW4uanMnO1xuaW1wb3J0IHsgc2FmZVdhaXRVbnRpbCwgd2FpdGVkVW50aWwgfSBmcm9tICcuL3dhaXQtdW50aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0V29ybGRTdXBwb3J0c1J1bnRpbWVQcm90b2NvbCB9IGZyb20gJy4vd29ybGQtY29tcGF0aWJpbGl0eS5qcyc7XG5cbi8qKlxuICogVGltZW91dCBmb3IgdGhlIGNyb3NzLWRlcGxveW1lbnQgY2FwYWJpbGl0eSBwcm9iZSBkb25lIGJlZm9yZVxuICogZGVoeWRyYXRpbmcgd29ya2Zsb3cgYXJndW1lbnRzLiBLZXB0IHRpZ2h0IG9uIHB1cnBvc2U6IHRoZSBwcm9iZSBpc1xuICogYW4gb3B0aW1pemF0aW9uIChpdCBsZXRzIHRoZSBjYWxsZXIgZW1pdCB0aGUgZnJhbWVkIGJ5dGUtc3RyZWFtIHdpcmVcbiAqIGZvcm1hdCB3aGVuIHRoZSB0YXJnZXQgc3VwcG9ydHMgaXQpLCBhbmQgdGhlIGZhbGxiYWNrIG9uIHRpbWVvdXQgaXNcbiAqIHRoZSBsZWdhY3kgcmF3IGZvcm1hdCB3aGljaCBhbHdheXMgd29ya3MuIExvbmcgZGVsYXlzIGhlcmUgd291bGQganVzdFxuICogbWFrZSBgc3RhcnQoeyBkZXBsb3ltZW50SWQ6IC4uLiB9KWAgc2xvd2VyIGZvciB1c2VycyB3aG9zZSB0YXJnZXRcbiAqIGRlcGxveW1lbnRzIGRvbid0IHJlY29nbml6ZSB0aGUgaGVhbHRoIGNoZWNrIGF0IGFsbC5cbiAqL1xuY29uc3QgQ1JPU1NfREVQTE9ZTUVOVF9DQVBBQklMSVRZX1BST0JFX1RJTUVPVVRfTVMgPSAyXzAwMDtcblxuLyoqIFVMSUQgZ2VuZXJhdG9yIGZvciBjbGllbnQtc2lkZSBydW5JZCBnZW5lcmF0aW9uICovXG5jb25zdCB1bGlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vLyBgZGVwbG95bWVudElkOiAnbGF0ZXN0J2AgaXMgYSBuby1vcCBpbiBXb3JsZHMgd2l0aG91dCBhdG9taWMgZGVwbG95bWVudHMuXG4vLyBUaGUgd2FybmluZyB0aGF0IGV4cGxhaW5zIHRoaXMgb25seSBuZWVkcyB0byBmaXJlIG9uY2UgcGVyIHByb2Nlc3M6IGFcbi8vIHdvcmtmbG93IHRoYXQgaGFyZGNvZGVzICdsYXRlc3QnIGZvciBpdHMgVmVyY2VsIGRlcGxveW1lbnQgd291bGQgb3RoZXJ3aXNlXG4vLyBsb2cgaXQgb24gZXZlcnkgbG9jYWwvUG9zdGdyZXMgcnVuLCBmbG9vZGluZyB0aWdodCBkZXYgbG9vcHMuXG5sZXQgaGFzV2FybmVkTGF0ZXN0Tm9PcCA9IGZhbHNlO1xuXG4vKipcbiAqIFJlc2V0IHRoZSBgZGVwbG95bWVudElkOiAnbGF0ZXN0J2Agbm8tb3Agd2Fybi1vbmNlIGd1YXJkLiBUZXN0LW9ubHkg4oCUXG4gKiBleHBvcnRlZCBzbyB1bml0IHRlc3RzIGNhbiBleGVyY2lzZSB0aGUgd2FybiBwYXRoIGFjcm9zcyBgc3RhcnQoKWAgY2FsbHMuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfcmVzZXRMYXRlc3ROb09wV2FybkZvclRlc3RzKCk6IHZvaWQge1xuICBoYXNXYXJuZWRMYXRlc3ROb09wID0gZmFsc2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRPcHRpb25zQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgd29ybGQgdG8gdXNlIGZvciB0aGUgd29ya2Zsb3cgcnVuIGNyZWF0aW9uLFxuICAgKiBieSBkZWZhdWx0IHRoZSB3b3JsZCBpcyBpbmZlcnJlZCBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAqL1xuICB3b3JsZD86IFdvcmxkO1xuXG4gIC8qKlxuICAgKiBUaGUgc3BlYyB2ZXJzaW9uIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1bi4gRGVmYXVsdHMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLlxuICAgKi9cbiAgc3BlY1ZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFBsYWludGV4dCBhdHRyaWJ1dGVzIHRvIHNlZWQgb24gdGhlIHJ1biBhcyBpdCBpcyBjcmVhdGVkLlxuICAgKlxuICAgKiBBdmFpbGFibGUgZm9yIG5hdGl2ZS1hdHRyaWJ1dGVzIHJ1bnMgKHNwZWMgdmVyc2lvbiA0IGFuZCBsYXRlcikuXG4gICAqL1xuICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogUGVybWl0IHJlc2VydmVkIGAkYC1wcmVmaXhlZCBrZXlzIGluIGBhdHRyaWJ1dGVzYC4gVGhlIGAkYCBuYW1lc3BhY2VcbiAgICogaXMgcmVzZXJ2ZWQgZm9yIGZyYW1ld29yay9saWJyYXJ5IGNvZGUgYnVpbHQgb24gdG9wIG9mIHRoZSB3b3JrZmxvd1xuICAgKiBTREsgKHRlbGVtZXRyeSwgYWdlbnQgbWV0YWRhdGEsIHBsYXRmb3JtLWVtaXR0ZWQgdGFncywgZXRjLik7IHVzZXJcbiAgICogY29kZSBNVVNUIE5PVCB3cml0ZSBrZXlzIGluIGl0LCBhbmQgdmFsaWRhdGlvbiByZWplY3RzIHRoZW0gc29cbiAgICogYWNjaWRlbnRhbCBjb2xsaXNpb25zIHdpdGggdG9vbGluZy1vd25lZCBrZXlzIGNhbid0IHNsaXAgdGhyb3VnaC5cbiAgICpcbiAgICogT25seSBmbGlwIHRoaXMgdG8gYHRydWVgIGlmIHlvdXIgY2FsbGVyIGlzIGl0c2VsZiBhIGZyYW1ld29yayBvclxuICAgKiBsaWJyYXJ5IHRoYXQgb3ducyBhIGAkYC1wcmVmaXhlZCBzdWItbmFtZXNwYWNlIGFuZCBrbm93cyB0aGVcbiAgICogY29udmVudGlvbnMgb2YgYW55IG90aGVyIHRvb2xzIHdyaXRpbmcgaW50byBpdC4gU2FtZSBzZW1hbnRpY3MgYXNcbiAgICogdGhlIGBleHBlcmltZW50YWxfc2V0QXR0cmlidXRlc2Agb3B0aW9uIG9mIHRoZSBzYW1lIG5hbWUuXG4gICAqL1xuICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZCBleHRlbmRzIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIGRlcGxveW1lbnQgSUQgdG8gdXNlIGZvciB0aGUgd29ya2Zsb3cgcnVuLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGlzIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICogd2hlbiBkZXBsb3lpbmcgdG8gVmVyY2VsLlxuICAgKlxuICAgKiBTZXQgdG8gYCdsYXRlc3QnYCB0byBhdXRvbWF0aWNhbGx5IHJlc29sdmUgdGhlIG1vc3QgcmVjZW50IGRlcGxveW1lbnRcbiAgICogZm9yIHRoZSBjdXJyZW50IGVudmlyb25tZW50IChzYW1lIHByb2R1Y3Rpb24gdGFyZ2V0IG9yIGdpdCBicmFuY2gpLlxuICAgKiBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBpbiB3b3JsZHMgd2l0aCBhdG9taWMsIGltbXV0YWJsZSBkZXBsb3ltZW50c1xuICAgKiAoY3VycmVudGx5IFZlcmNlbCkuIEluIG90aGVyIHdvcmxkcyAobG9jYWwgZGV2LCBQb3N0Z3JlcykgdGhlcmUgaXMgbm9cbiAgICogbm90aW9uIG9mIG11bHRpcGxlIGRlcGxveW1lbnRzIHRvIHJlc29sdmUgYmV0d2Vlbiwgc28gYCdsYXRlc3QnYCBoYXMgbm9cbiAgICogZWZmZWN0IOKAlCBhIHdhcm5pbmcgaXMgbG9nZ2VkIGFuZCB0aGUgcnVuIHRhcmdldHMgdGhlIGN1cnJlbnQgZGVwbG95bWVudC5cbiAgICpcbiAgICogKipOb3RlOioqIFdoZW4gYGRlcGxveW1lbnRJZGAgaXMgcHJvdmlkZWQsIHRoZSBhcmd1bWVudCBhbmQgcmV0dXJuIHR5cGVzIGJlY29tZSBgdW5rbm93bmBcbiAgICogc2luY2UgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoZSB0eXBlcyB3aWxsIGJlIGNvbnNpc3RlbnQgYWNyb3NzIGRlcGxveW1lbnRzLlxuICAgKi9cbiAgZGVwbG95bWVudElkOiAnbGF0ZXN0JyB8IChzdHJpbmcgJiB7fSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZCBleHRlbmRzIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICBkZXBsb3ltZW50SWQ/OiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgYSB3b3JrZmxvdyBydW4uXG4gKi9cbmV4cG9ydCB0eXBlIFN0YXJ0T3B0aW9ucyA9XG4gIHwgU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZFxuICB8IFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWQ7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBpbXBvcnRlZCB3b3JrZmxvdyBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dGdW5jdGlvbjxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4gPSAoXG4gIC4uLmFyZ3M6IFRBcmdzXG4pID0+IFByb21pc2U8VFJlc3VsdD47XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgZ2VuZXJhdGVkIG1ldGFkYXRhIG9mIGEgd29ya2Zsb3cgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93TWV0YWRhdGEgPSB7IHdvcmtmbG93SWQ6IHN0cmluZyB9O1xuXG4vKipcbiAqIFN0YXJ0cyBhIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gd29ya2Zsb3cgLSBUaGUgaW1wb3J0ZWQgd29ya2Zsb3cgZnVuY3Rpb24gdG8gc3RhcnQuXG4gKiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgd29ya2Zsb3cgKG9wdGlvbmFsKS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSB3b3JrZmxvdyBydW4gKG9wdGlvbmFsKS5cbiAqIEByZXR1cm5zIFRoZSB1bmlxdWUgcnVuIElEIGZvciB0aGUgbmV3bHkgc3RhcnRlZCB3b3JrZmxvdyBpbnZvY2F0aW9uLlxuICovXG4vLyBPdmVybG9hZHMgd2l0aCBkZXBsb3ltZW50SWQgLSBhcmdzIGFuZCByZXR1cm4gdHlwZSBiZWNvbWUgdW5rbm93blxuLy8gVXNlcyBnZW5lcmljcyBzbyB0eXBlZCB3b3JrZmxvd3MgYXJlIGFzc2lnbmFibGUgKGF2b2lkcyBjb250cmF2YXJpYW5jZSBpc3N1ZXMpLFxuLy8gYnV0IHRoZSByZXR1cm4gdHlwZSBhbmQgYXJncyBhcmUgc3RpbGwgdW5rbm93biBzaW5jZSB0aGUgZGVwbG95ZWQgdmVyc2lvbiBtYXkgZGlmZmVyLlxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248VEFyZ3MsIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgYXJnczogdW5rbm93bltdLFxuICBvcHRpb25zOiBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjx1bmtub3duPj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248W10sIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgb3B0aW9uczogU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48dW5rbm93bj4+O1xuXG4vLyBPdmVybG9hZHMgd2l0aG91dCBkZXBsb3ltZW50SWQgLSBwcmVzZXJ2ZSB0eXBlIGluZmVyZW5jZVxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248VEFyZ3MsIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgYXJnczogVEFyZ3MsXG4gIG9wdGlvbnM/OiBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjxUUmVzdWx0Pj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248W10sIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgb3B0aW9ucz86IFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPFRSZXN1bHQ+PjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0PFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248VEFyZ3MsIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgYXJnc09yT3B0aW9ucz86IFRBcmdzIHwgU3RhcnRPcHRpb25zLFxuICBvcHRpb25zPzogU3RhcnRPcHRpb25zXG4pIHtcbiAgJ3VzZSBzdGVwJztcbiAgcmV0dXJuIGF3YWl0IHdhaXRlZFVudGlsKCgpID0+IHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoaXMgZmllbGQgaXMgYWRkZWQgYnkgb3VyIGNsaWVudCB0cmFuc2Zvcm1cbiAgICBjb25zdCB3b3JrZmxvd05hbWUgPSB3b3JrZmxvdz8ud29ya2Zsb3dJZDtcblxuICAgIGlmICghd29ya2Zsb3dOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgIGAnc3RhcnQnIHJlY2VpdmVkIGFuIGludmFsaWQgd29ya2Zsb3cgZnVuY3Rpb24uIEVuc3VyZSB0aGUgV29ya2Zsb3cgU0RLIGlzIGNvbmZpZ3VyZWQgY29ycmVjdGx5IGFuZCB0aGUgZnVuY3Rpb24gaW5jbHVkZXMgYSAndXNlIHdvcmtmbG93JyBkaXJlY3RpdmUuYCxcbiAgICAgICAgeyBzbHVnOiAnc3RhcnQtaW52YWxpZC13b3JrZmxvdy1mdW5jdGlvbicgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFuTmFtZSA9IGB3b3JrZmxvdy5zdGFydCAke3dvcmtmbG93RGlzcGxheU5hbWUod29ya2Zsb3dOYW1lKX1gO1xuICAgIHJldHVybiB0cmFjZShzcGFuTmFtZSwgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd09wZXJhdGlvbignc3RhcnQnKSxcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgYXJnczogU2VyaWFsaXphYmxlW10gPSBbXTtcbiAgICAgIGxldCBvcHRzOiBTdGFydE9wdGlvbnMgPSBvcHRpb25zID8/IHt9O1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnc09yT3B0aW9ucykpIHtcbiAgICAgICAgYXJncyA9IGFyZ3NPck9wdGlvbnMgYXMgU2VyaWFsaXphYmxlW107XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzT3JPcHRpb25zID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvcHRzID0gYXJnc09yT3B0aW9ucztcbiAgICAgIH1cblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0FyZ3VtZW50c0NvdW50KGFyZ3MubGVuZ3RoKSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB3b3JsZCA9IG9wdHMud29ybGQgPz8gKGF3YWl0IGdldFdvcmxkTGF6eSgpKTtcbiAgICAgIGFzc2VydFdvcmxkU3VwcG9ydHNSdW50aW1lUHJvdG9jb2wod29ybGQpO1xuICAgICAgY29uc3QgY3VycmVudERlcGxveW1lbnRJZCA9IGF3YWl0IHdvcmxkLmdldERlcGxveW1lbnRJZCgpO1xuICAgICAgbGV0IGRlcGxveW1lbnRJZCA9IG9wdHMuZGVwbG95bWVudElkID8/IGN1cnJlbnREZXBsb3ltZW50SWQ7XG5cbiAgICAgIC8vIFdoZW4gJ2xhdGVzdCcgaXMgcmVxdWVzdGVkLCByZXNvbHZlIHRoZSBhY3R1YWwgbGF0ZXN0IGRlcGxveW1lbnQgSURcbiAgICAgIC8vIGZvciB0aGUgY3VycmVudCBkZXBsb3ltZW50J3MgZW52aXJvbm1lbnQgKHNhbWUgcHJvZHVjdGlvbiB0YXJnZXQgb3JcbiAgICAgIC8vIHNhbWUgZ2l0IGJyYW5jaCBmb3IgcHJldmlldyBkZXBsb3ltZW50cykuXG4gICAgICAvL1xuICAgICAgLy8gUmVzb2x2aW5nICdsYXRlc3QnIG9ubHkgbWVhbnMgc29tZXRoaW5nIGluIHdvcmxkcyB3aXRoIGF0b21pYyxcbiAgICAgIC8vIGltbXV0YWJsZSBkZXBsb3ltZW50cyAoZS5nLiBWZXJjZWwpLCB3aGljaCBpbXBsZW1lbnRcbiAgICAgIC8vIHJlc29sdmVMYXRlc3REZXBsb3ltZW50SWQoKS4gV29ybGRzIHdpdGhvdXQgdGhhdCBjb25jZXB0IChsb2NhbCBkZXYsXG4gICAgICAvLyBzZWxmLWhvc3RlZCBQb3N0Z3JlcykgaGF2ZSBub3RoaW5nIHRvIHJlc29sdmUgYmV0d2Vlbiwgc28gcmF0aGVyIHRoYW5cbiAgICAgIC8vIGZhaWwgYSBydW4gdGhhdCB3b3JrcyBmaW5lIG9uIFZlcmNlbCwgd2Ugd2FybiBhbmQgZmFsbCBiYWNrIHRvIHRoZVxuICAgICAgLy8gY3VycmVudCBkZXBsb3ltZW50IOKAlCBtYWtpbmcgJ2xhdGVzdCcgYW4gZWZmZWN0aXZlIG5vLW9wIHRoZXJlLlxuICAgICAgaWYgKGRlcGxveW1lbnRJZCA9PT0gJ2xhdGVzdCcpIHtcbiAgICAgICAgaWYgKHdvcmxkLnJlc29sdmVMYXRlc3REZXBsb3ltZW50SWQpIHtcbiAgICAgICAgICBkZXBsb3ltZW50SWQgPSBhd2FpdCB3b3JsZC5yZXNvbHZlTGF0ZXN0RGVwbG95bWVudElkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2FybiBvbmNlIHBlciBwcm9jZXNzIOKAlCBzZWUgaGFzV2FybmVkTGF0ZXN0Tm9PcCBhYm92ZS5cbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZExhdGVzdE5vT3ApIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZExhdGVzdE5vT3AgPSB0cnVlO1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBcImRlcGxveW1lbnRJZDogJ2xhdGVzdCcgaGFzIG5vIGVmZmVjdCBpbiB0aGlzIHdvcmxkIGFuZCB3YXMgaWdub3JlZC4gXCIgK1xuICAgICAgICAgICAgICAgICdJdCBpcyBvbmx5IHN1cHBvcnRlZCBieSB3b3JsZHMgd2l0aCBhdG9taWMgZGVwbG95bWVudHMsIHN1Y2ggYXMgVmVyY2VsLiAnICtcbiAgICAgICAgICAgICAgICAnVGhlIHJ1biB3aWxsIHRhcmdldCB0aGUgY3VycmVudCBkZXBsb3ltZW50LicsXG4gICAgICAgICAgICAgIHsgY3VycmVudERlcGxveW1lbnRJZCB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZXBsb3ltZW50SWQgPSBjdXJyZW50RGVwbG95bWVudElkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIERlY2lkZSB3aGV0aGVyIHRvIHdyaXRlIGJ5dGUgc3RyZWFtcyBpbiB0aGUgZnJhbWVkIHdpcmUgZm9ybWF0LlxuICAgICAgLy8gRm9yIHNhbWUtZGVwbG95bWVudCBzdGFydHMgKHRoZSBjb21tb24gY2FzZSkgd2Uga25vdyB0aGUgdGFyZ2V0IGlzXG4gICAgICAvLyBydW5uaW5nIHRoaXMgc2FtZSBTREsgdmVyc2lvbiwgc28gZnJhbWluZyBpcyBzYWZlLiBGb3IgY3Jvc3MtXG4gICAgICAvLyBkZXBsb3ltZW50IHN0YXJ0cyAoZXhwbGljaXQgZGVwbG95bWVudElkIG9yICdsYXRlc3QnIHRoYXQgcmVzb2x2ZXNcbiAgICAgIC8vIHRvIGEgZGlmZmVyZW50IGRlcGxveW1lbnQpIHdlIHByb2JlIHRoZSB0YXJnZXQgdmlhIGhlYWx0aENoZWNrIHRvXG4gICAgICAvLyBsZWFybiBpdHMgd29ya2Zsb3ctY29yZSB2ZXJzaW9uLCB0aGVuIGRlcml2ZSB0aGUgY2FwYWJpbGl0eS4gVGhlXG4gICAgICAvLyBwcm9iZSBoYXMgYSB0aWdodCB0aW1lb3V0IOKAlCBvbiBtaXNzL2ZhaWx1cmUgd2UgZmFsbCBiYWNrIHRvIHRoZVxuICAgICAgLy8gbGVnYWN5IHJhdyBieXRlIGZvcm1hdCwgd2hpY2ggaXMgdW5pdmVyc2FsbHkgcmVhZGFibGUuXG4gICAgICAvL1xuICAgICAgLy8gV29ybGRzIHRoYXQgZG9uJ3QgZXhwb3NlIHRoZSBgc3RyZWFtc2AgQVBJIChlLmcuIG1pbmltYWwgdGVzdFxuICAgICAgLy8gbW9ja3MpIGNhbid0IHNlcnZpY2UgaGVhbHRoIGNoZWNrcywgc28gd2Ugc2tpcCB0aGUgcHJvYmUgZm9yIHRoZW0uXG4gICAgICBsZXQgZnJhbWVkQnl0ZVN0cmVhbXM6IGJvb2xlYW47XG4gICAgICBsZXQgdGFyZ2V0U3VwcG9ydHNDb21wcmVzc2lvbjogYm9vbGVhbjtcbiAgICAgIGlmIChkZXBsb3ltZW50SWQgPT09IGN1cnJlbnREZXBsb3ltZW50SWQpIHtcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMgPSB0cnVlO1xuICAgICAgICB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdvcmxkLnN0cmVhbXM/LmdldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyA9IGZhbHNlO1xuICAgICAgICB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwcm9iZSA9IGF3YWl0IGhlYWx0aENoZWNrKHdvcmxkLCAnd29ya2Zsb3cnLCB7XG4gICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgIHRpbWVvdXQ6IENST1NTX0RFUExPWU1FTlRfQ0FQQUJJTElUWV9QUk9CRV9USU1FT1VUX01TLFxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSBnZXRSdW5DYXBhYmlsaXRpZXMocHJvYmU/LndvcmtmbG93Q29yZVZlcnNpb24pO1xuICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyA9IGNhcGFiaWxpdGllcy5mcmFtZWRCeXRlU3RyZWFtcztcbiAgICAgICAgdGFyZ2V0U3VwcG9ydHNDb21wcmVzc2lvbiA9IGNhcGFiaWxpdGllcy5zdXBwb3J0ZWRGb3JtYXRzLmhhcyhcbiAgICAgICAgICBTZXJpYWxpemF0aW9uRm9ybWF0LkdaSVBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcblxuICAgICAgLy8gR2VuZXJhdGUgcnVuSWQgY2xpZW50LXNpZGUgc28gd2UgaGF2ZSBpdCBiZWZvcmUgc2VyaWFsaXphdGlvblxuICAgICAgLy8gKHJlcXVpcmVkIGZvciBmdXR1cmUgRTJFIGVuY3J5cHRpb24gd2hlcmUgcnVuSWQgaXMgcGFydCBvZiB0aGUgZW5jcnlwdGlvbiBjb250ZXh0KVxuICAgICAgY29uc3QgcnVuSWQgPSBgd3J1bl8ke3VsaWQoKX1gO1xuXG4gICAgICAvLyBTZXJpYWxpemUgY3VycmVudCB0cmFjZSBjb250ZXh0IHRvIHByb3BhZ2F0ZSBhY3Jvc3MgcXVldWUgYm91bmRhcnlcbiAgICAgIGNvbnN0IHRyYWNlQ2FycmllciA9IGF3YWl0IHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpO1xuXG4gICAgICAvLyBEZWZhdWx0IG5ldyBydW5zIHRvIHRoZSBjb25maWd1cmVkIHdvcmxkJ3Mgc3BlYyB2ZXJzaW9uLiBUaGUgd29ybGRcbiAgICAgIC8vIGl0c2VsZiBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgYWdhaW5zdCB0aGlzIHJ1bnRpbWUncyBzcGVjIHZlcnNpb24uXG4gICAgICBjb25zdCBzcGVjVmVyc2lvbiA9IG9wdHMuc3BlY1ZlcnNpb24gPz8gd29ybGQuc3BlY1ZlcnNpb247XG4gICAgICBjb25zdCB2MUNvbXBhdCA9IGlzTGVnYWN5U3BlY1ZlcnNpb24oc3BlY1ZlcnNpb24pO1xuICAgICAgY29uc3QgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPSBvcHRzLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID09PSB0cnVlO1xuICAgICAgbGV0IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAob3B0cy5hdHRyaWJ1dGVzICYmIE9iamVjdC5rZXlzKG9wdHMuYXR0cmlidXRlcykubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoc3BlY1ZlcnNpb24gPCBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQVRUUklCVVRFUykge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICdJbml0aWFsIHdvcmtmbG93IGF0dHJpYnV0ZXMgcmVxdWlyZSBhIFdvcmxkIHRoYXQgc3VwcG9ydHMgc3BlYyB2ZXJzaW9uIDQgb3IgbGF0ZXIuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYG5vcm1hbGl6ZUF0dHJpYnV0ZUNoYW5nZXNgIHRyZWF0cyBgdW5kZWZpbmVkYCBhcyBcInJlbW92ZSB0aGlzXG4gICAgICAgIC8vIGtleVwiLCB3aGljaCBpcyBtZWFuaW5nbGVzcyBhdCBjcmVhdGlvbiB0aW1lIOKAlCByZWplY3QgaXQgdXAgZnJvbnRcbiAgICAgICAgLy8gc28gSlMgY2FsbGVycyBnZXQgYSBjbGVhciBlcnJvciBpbnN0ZWFkIG9mIGEgZG93bnN0cmVhbSBzY2hlbWFcbiAgICAgICAgLy8gZmFpbHVyZSAodGhlIHR5cGVzIGFscmVhZHkgZm9yYmlkIG5vbi1zdHJpbmcgdmFsdWVzKS5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3B0cy5hdHRyaWJ1dGVzKSkge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgIGBJbml0aWFsIHdvcmtmbG93IGF0dHJpYnV0ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9IG11c3QgYmUgYSBzdHJpbmcgdmFsdWUuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IG5vcm1hbGl6ZUF0dHJpYnV0ZUNoYW5nZXMob3B0cy5hdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMsXG4gICAgICAgIH0pO1xuICAgICAgICBhdHRyaWJ1dGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgIGNoYW5nZXMubWFwKCh7IGtleSwgdmFsdWUgfSkgPT4gW2tleSwgdmFsdWUgYXMgc3RyaW5nXSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIFNlZWQgcGF5bG9hZCBzaGFyZWQgYnkgcnVuX2NyZWF0ZWQgYW5kIHRoZSByZXNpbGllbnQtc3RhcnQgcXVldWVcbiAgICAgIC8vIGlucHV0LiBUaGUgZmxhZyByaWRlcyBhbG9uZyBzbyBzZXJ2ZXItc2lkZSB2YWxpZGF0aW9uIG1hdGNoZXMgdGhlXG4gICAgICAvLyBjbGllbnQtc2lkZSBjaGVjayBhYm92ZSBvbiBib3RoIHBhdGhzLlxuICAgICAgY29uc3QgYXR0cmlidXRlU2VlZCA9IGF0dHJpYnV0ZXNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLFxuICAgICAgICAgICAgLi4uKGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gICAgICAgICAgICAgID8geyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczogdHJ1ZSBhcyBjb25zdCB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fTtcblxuICAgICAgLy8gUmVzb2x2ZSBlbmNyeXB0aW9uIGtleSBmb3IgdGhlIG5ldyBydW4uIFRoZSBydW5JZCBoYXMgYWxyZWFkeSBiZWVuXG4gICAgICAvLyBnZW5lcmF0ZWQgYWJvdmUgKGNsaWVudC1nZW5lcmF0ZWQgVUxJRCkgYW5kIHdpbGwgYmUgdXNlZCBmb3IgYm90aFxuICAgICAgLy8ga2V5IGRlcml2YXRpb24gYW5kIHRoZSBydW5fY3JlYXRlZCBldmVudC4gVGhlIFdvcmxkIGltcGxlbWVudGF0aW9uXG4gICAgICAvLyB1c2VzIHRoZSBydW5JZCBmb3IgcGVyLXJ1biBIS0RGIGtleSBkZXJpdmF0aW9uLiBXZSBwYXNzIHRoZSByZXNvbHZlZFxuICAgICAgLy8gZGVwbG95bWVudElkIChub3QganVzdCB0aGUgcmF3IG9wdHMpIHNvIHRoZSBXb3JsZCBjYW4gdXNlIGl0IGZvclxuICAgICAgLy8ga2V5IHJlc29sdXRpb24gZXZlbiB3aGVuIGRlcGxveW1lbnRJZCB3YXMgaW5mZXJyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnRcbiAgICAgIC8vIHJhdGhlciB0aGFuIGV4cGxpY2l0bHkgcHJvdmlkZWQgaW4gb3B0cyAoZS5nLiwgaW4gZTJlIHRlc3QgcnVubmVycykuXG4gICAgICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuSWQsIHtcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gcmF3S2V5ID8gYXdhaXQgaW1wb3J0S2V5KHJhd0tleSkgOiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIENyZWF0ZSBydW4gdmlhIHJ1bl9jcmVhdGVkIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgIC8vIFBhc3MgY2xpZW50LWdlbmVyYXRlZCBydW5JZCAtIHNlcnZlciB3aWxsIGFjY2VwdCBhbmQgdXNlIGl0XG4gICAgICAvLyBDb21wcmVzcyB3b3JrZmxvdyBhcmd1bWVudHMgb25seSB3aGVuIHRoZSBydW4gaXRzZWxmIGlzIG1hcmtlZCBhc1xuICAgICAgLy8gcG9zc2libHkgY29udGFpbmluZyBjb21wcmVzc2VkIHBheWxvYWRzIChzcGVjVmVyc2lvbiA+PSA1KSBBTkQgdGhlXG4gICAgICAvLyB0YXJnZXQgZGVwbG95bWVudCBjYW4gZGVjb2RlIHRoZW0gKHNhbWUtZGVwbG95bWVudCwgb3IgcHJvYmVkXG4gICAgICAvLyBjYXBhYmlsaXR5IGZvciBjcm9zcy1kZXBsb3ltZW50IHN0YXJ0cykuXG4gICAgICBjb25zdCBjb21wcmVzc2lvbiA9XG4gICAgICAgIHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb24gJiZcbiAgICAgICAgc3BlY1ZlcnNpb24gPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OO1xuICAgICAgY29uc3Qgd29ya2Zsb3dBcmd1bWVudHMgPSBhd2FpdCBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgICAgICAgYXJncyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIG9wcyxcbiAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgdjFDb21wYXQsXG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICBjb21wcmVzc2lvblxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IHtcbiAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICB3b3JrZmxvd0NvcmVWZXJzaW9uLFxuICAgICAgICBmZWF0dXJlczogeyBlbmNyeXB0aW9uOiAhIWVuY3J5cHRpb25LZXkgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhbGwgZXZlbnRzLmNyZWF0ZSAocnVuX2NyZWF0ZWQpIGFuZCBxdWV1ZSBpbiBwYXJhbGxlbC5cbiAgICAgIC8vIElmIGV2ZW50cy5jcmVhdGUgZmFpbHMgd2l0aCA0MjkvNXh4LCB0aGUgcnVuIHdhcyBzdGlsbCBhY2NlcHRlZFxuICAgICAgLy8gdmlhIHRoZSBxdWV1ZSBhbmQgY3JlYXRpb24gd2lsbCBiZSByZS10cmllZCBhc3luYyBieSB0aGUgcnVudGltZS5cbiAgICAgIGNvbnN0IFtydW5DcmVhdGVkUmVzdWx0LCBxdWV1ZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jcmVhdGVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHdvcmtmbG93QXJndW1lbnRzLFxuICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAuLi5hdHRyaWJ1dGVTZWVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgdjFDb21wYXQgfVxuICAgICAgICApLFxuICAgICAgICB3b3JsZC5xdWV1ZShcbiAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgLi4uKHNwZWNWZXJzaW9uID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVFxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIHJ1bklucHV0OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiB3b3JrZmxvd0FyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAuLi5hdHRyaWJ1dGVTZWVkLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH0gc2F0aXNmaWVzIFdvcmtmbG93SW52b2tlUGF5bG9hZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbixcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICBdKTtcblxuICAgICAgLy8gUXVldWUgZmFpbHVyZSBpcyBhbHdheXMgZmF0YWwg4oCUIHRoZSBydW4gd2FzIG5vdCBlbnF1ZXVlZFxuICAgICAgaWYgKHF1ZXVlUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICB0aHJvdyBxdWV1ZVJlc3VsdC5yZWFzb247XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBldmVudHMuY3JlYXRlIHJlc3VsdFxuICAgICAgbGV0IHJlc2lsaWVudFN0YXJ0ID0gZmFsc2U7XG4gICAgICBpZiAocnVuQ3JlYXRlZFJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgY29uc3QgZXJyID0gcnVuQ3JlYXRlZFJlc3VsdC5yZWFzb247XG4gICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAvLyA0MDk6IFRoZSBydW4gYWxyZWFkeSBleGlzdHMuIFRoaXMgY2FuIGhhcHBlbiBpbiBleHRyZW1lIGNhc2VzIHdoZXJlXG4gICAgICAgICAgLy8gdGhlIHJ1biBjcmVhdGlvbiBjYWxsIGdldHMgYSBjb2xkIHN0YXJ0IG9yIG90aGVyIHNsb3dkb3duLCBhbmQgdGhlIHF1ZXVlXG4gICAgICAgICAgLy8gKyBydW5fc3RhcnRlZCBjYWxsIGNvbXBsZXRlcyBmYXN0ZXIuIFdlIGV4cGVjdCB0aGlzIHRvIGJlIDw9MSUgb2YgY2FzZXMuXG4gICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBjYW4gc2FmZWx5IHJldHVybi5cbiAgICAgICAgfSBlbHNlIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgIC8vIDQyOSAoVGhyb3R0bGVFcnJvciksIDV4eCwgYW5kIHRyYW5zaWVudCB0cmFuc3BvcnQgZmFpbHVyZXNcbiAgICAgICAgICAvLyAoVFJBTlNQT1JUL1RJTUVPVVQpIGFyZSByZXRyeWFibGUg4oCUIHRoZSBydW4gd2FzIGFjY2VwdGVkIHZpYSB0aGVcbiAgICAgICAgICAvLyBxdWV1ZSBhbmQgY3JlYXRpb24gd2lsbCBiZSByZS10cmllZCBieSB0aGUgcnVudGltZSB3aGVuIGl0IGNhbGxzXG4gICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQuXG4gICAgICAgICAgcmVzaWxpZW50U3RhcnQgPSB0cnVlO1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICdSdW4gY3JlYXRpb24gZXZlbnQgZmFpbGVkLCBidXQgdGhlIHJ1biB3YXMgYWNjZXB0ZWQgdmlhIHRoZSBxdWV1ZS4gJyArXG4gICAgICAgICAgICAgICdUaGUgcnVuX2NyZWF0ZWQgZXZlbnQgd2lsbCBiZSByZS10cmllZCBhc3luYyBieSB0aGUgcnVudGltZS4nLFxuICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgZXJyb3I6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcnVuQ3JlYXRlZFJlc3VsdC52YWx1ZTtcbiAgICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIHJ1biB3YXMgY3JlYXRlZFxuICAgICAgICBpZiAoIXJlc3VsdC5ydW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBcIk1pc3NpbmcgJ3J1bicgaW4gc2VydmVyIHJlc3BvbnNlIGZvciAncnVuX2NyZWF0ZWQnIGV2ZW50XCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmVyaWZ5IHNlcnZlciBhY2NlcHRlZCBvdXIgcnVuSWRcbiAgICAgICAgaWYgKCF2MUNvbXBhdCAmJiByZXN1bHQucnVuLnJ1bklkICE9PSBydW5JZCkge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBTZXJ2ZXIgcmV0dXJuZWQgZGlmZmVyZW50IHJ1bklkIHRoYW4gcmVxdWVzdGVkOiBleHBlY3RlZCAke3J1bklkfSwgZ290ICR7cmVzdWx0LnJ1bi5ydW5JZH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGVzZSBhcmd1bWVudC1zdHJlYW0gb3BzIGFyZSBmbHVzaGVkIGluIHRoZSBiYWNrZ3JvdW5kOyB0aGUgcHJvbWlzZVxuICAgICAgLy8gaGFuZGVkIHRvIHdhaXRVbnRpbCBtdXN0IG5ldmVyIHJlamVjdCAoYW4gdW5jb25zdW1lZCB3YWl0VW50aWxcbiAgICAgIC8vIHJlamVjdGlvbiBjcmFzaGVzIHRoZSBwcm9jZXNzIGFzIHVuaGFuZGxlZFJlamVjdGlvbiksIHNvIHVuZXhwZWN0ZWRcbiAgICAgIC8vIGZhaWx1cmVzIGFyZSBsb2dnZWQgaW5zdGVhZC5cbiAgICAgIHNhZmVXYWl0VW50aWwoUHJvbWlzZS5hbGwob3BzKSwgKGVycikgPT4ge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgJ0JhY2tncm91bmQgZmx1c2ggb2Ygd29ya2Zsb3cgYXJndW1lbnQgc3RyZWFtcyBmYWlsZWQnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKHJ1bklkKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLkRlcGxveW1lbnRJZChkZXBsb3ltZW50SWQpLFxuICAgICAgICAuLi4ocnVuQ3JlYXRlZFJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmXG4gICAgICAgIHJ1bkNyZWF0ZWRSZXN1bHQudmFsdWUucnVuXG4gICAgICAgICAgPyBBdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMocnVuQ3JlYXRlZFJlc3VsdC52YWx1ZS5ydW4uc3RhdHVzKVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBuZXcgUnVuPFRSZXN1bHQ+KHJ1bklkLCB7IHJlc2lsaWVudFN0YXJ0IH0pO1xuICAgIH0pO1xuICB9KTtcbn1cbiJdfQ==
|
|
301
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVqRSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGdDQUFnQyxFQUNoQywwQ0FBMEMsRUFDMUMsaUNBQWlDLEVBQ2pDLG1CQUFtQixHQUNwQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3QyxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLG1CQUFtQixHQUNwQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLElBQUksbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDakUsT0FBTyxFQUFFLEdBQUcsRUFBRSxN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O1lBRUgsSUFBSSxFQUFFLGFBQWEsQ0FBQztnQkFDbEIsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztnQkFDakMsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztnQkFDdkMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxXQUFXO29CQUMzQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsR0FBRztvQkFDeEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztvQkFDaEUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNSLENBQUMsQ0FBQztZQUVILE9BQU8sSUFBSSxHQUFHLENBQVUsS0FBSyxFQUFFLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eUNvbmZsaWN0RXJyb3IsIFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyB3b3JrZmxvd0Rpc3BsYXlOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0ludm9rZVBheWxvYWQsIFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19BVFRSSUJVVEVTLFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ0JPUl9RVUVVRV9UUkFOU1BPUlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgd29ya2Zsb3dSdW5JZFNjaGVtYSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IG5vcm1hbGl6ZUF0dHJpYnV0ZUNoYW5nZXMgfSBmcm9tICcuLi9hdHRyaWJ1dGUtY2hhbmdlcy5qcyc7XG5pbXBvcnQgeyBnZXRSdW5DYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9jYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgaXNSZXRyeWFibGVXb3JsZEVycm9yIH0gZnJvbSAnLi4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgaW1wb3J0S2V5IH0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vc2NoZW1hcy5qcyc7XG5pbXBvcnQge1xuICBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyxcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IHNlcmlhbGl6ZVRyYWNlQ2FycmllciwgdHJhY2UgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgdmVyc2lvbiBhcyB3b3JrZmxvd0NvcmVWZXJzaW9uIH0gZnJvbSAnLi4vdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZExhenkgfSBmcm9tICcuL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93UXVldWVOYW1lLCBoZWFsdGhDaGVjayB9IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBSdW4gfSBmcm9tICcuL3J1bi5qcyc7XG5pbXBvcnQgeyBzYWZlV2FpdFVudGlsLCB3YWl0ZWRVbnRpbCB9IGZyb20gJy4vd2FpdC11bnRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnRXb3JsZFN1cHBvcnRzUnVudGltZVByb3RvY29sIH0gZnJvbSAnLi93b3JsZC1jb21wYXRpYmlsaXR5LmpzJztcblxuLyoqXG4gKiBUaW1lb3V0IGZvciB0aGUgY3Jvc3MtZGVwbG95bWVudCBjYXBhYmlsaXR5IHByb2JlIGRvbmUgYmVmb3JlXG4gKiBkZWh5ZHJhdGluZyB3b3JrZmxvdyBhcmd1bWVudHMuIEtlcHQgdGlnaHQgb24gcHVycG9zZTogdGhlIHByb2JlIGlzXG4gKiBhbiBvcHRpbWl6YXRpb24gKGl0IGxldHMgdGhlIGNhbGxlciBlbWl0IHRoZSBmcmFtZWQgYnl0ZS1zdHJlYW0gd2lyZVxuICogZm9ybWF0IHdoZW4gdGhlIHRhcmdldCBzdXBwb3J0cyBpdCksIGFuZCB0aGUgZmFsbGJhY2sgb24gdGltZW91dCBpc1xuICogdGhlIGxlZ2FjeSByYXcgZm9ybWF0IHdoaWNoIGFsd2F5cyB3b3Jrcy4gTG9uZyBkZWxheXMgaGVyZSB3b3VsZCBqdXN0XG4gKiBtYWtlIGBzdGFydCh7IGRlcGxveW1lbnRJZDogLi4uIH0pYCBzbG93ZXIgZm9yIHVzZXJzIHdob3NlIHRhcmdldFxuICogZGVwbG95bWVudHMgZG9uJ3QgcmVjb2duaXplIHRoZSBoZWFsdGggY2hlY2sgYXQgYWxsLlxuICovXG5jb25zdCBDUk9TU19ERVBMT1lNRU5UX0NBUEFCSUxJVFlfUFJPQkVfVElNRU9VVF9NUyA9IDJfMDAwO1xuXG4vKiogVUxJRCBnZW5lcmF0b3IgZm9yIGNsaWVudC1zaWRlIHJ1bklkIGdlbmVyYXRpb24gKi9cbmNvbnN0IHVsaWQgPSBtb25vdG9uaWNGYWN0b3J5KCk7XG5cbi8vIGBkZXBsb3ltZW50SWQ6ICdsYXRlc3QnYCBpcyBhIG5vLW9wIGluIFdvcmxkcyB3aXRob3V0IGF0b21pYyBkZXBsb3ltZW50cy5cbi8vIFRoZSB3YXJuaW5nIHRoYXQgZXhwbGFpbnMgdGhpcyBvbmx5IG5lZWRzIHRvIGZpcmUgb25jZSBwZXIgcHJvY2VzczogYVxuLy8gd29ya2Zsb3cgdGhhdCBoYXJkY29kZXMgJ2xhdGVzdCcgZm9yIGl0cyBWZXJjZWwgZGVwbG95bWVudCB3b3VsZCBvdGhlcndpc2Vcbi8vIGxvZyBpdCBvbiBldmVyeSBsb2NhbC9Qb3N0Z3JlcyBydW4sIGZsb29kaW5nIHRpZ2h0IGRldiBsb29wcy5cbmxldCBoYXNXYXJuZWRMYXRlc3ROb09wID0gZmFsc2U7XG5cbi8qKlxuICogUmVzZXQgdGhlIGBkZXBsb3ltZW50SWQ6ICdsYXRlc3QnYCBuby1vcCB3YXJuLW9uY2UgZ3VhcmQuIFRlc3Qtb25seSDigJRcbiAqIGV4cG9ydGVkIHNvIHVuaXQgdGVzdHMgY2FuIGV4ZXJjaXNlIHRoZSB3YXJuIHBhdGggYWNyb3NzIGBzdGFydCgpYCBjYWxscy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldExhdGVzdE5vT3BXYXJuRm9yVGVzdHMoKTogdm9pZCB7XG4gIGhhc1dhcm5lZExhdGVzdE5vT3AgPSBmYWxzZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFydE9wdGlvbnNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JsZCB0byB1c2UgZm9yIHRoZSB3b3JrZmxvdyBydW4gY3JlYXRpb24sXG4gICAqIGJ5IGRlZmF1bHQgdGhlIHdvcmxkIGlzIGluZmVycmVkIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICovXG4gIHdvcmxkPzogV29ybGQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzcGVjIHZlcnNpb24gdG8gdXNlIGZvciB0aGUgd29ya2Zsb3cgcnVuLiBEZWZhdWx0cyB0byB0aGUgbGF0ZXN0IHZlcnNpb24uXG4gICAqL1xuICBzcGVjVmVyc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogUGxhaW50ZXh0IGF0dHJpYnV0ZXMgdG8gc2VlZCBvbiB0aGUgcnVuIGFzIGl0IGlzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEF2YWlsYWJsZSBmb3IgbmF0aXZlLWF0dHJpYnV0ZXMgcnVucyAoc3BlYyB2ZXJzaW9uIDQgYW5kIGxhdGVyKS5cbiAgICovXG4gIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBQZXJtaXQgcmVzZXJ2ZWQgYCRgLXByZWZpeGVkIGtleXMgaW4gYGF0dHJpYnV0ZXNgLiBUaGUgYCRgIG5hbWVzcGFjZVxuICAgKiBpcyByZXNlcnZlZCBmb3IgZnJhbWV3b3JrL2xpYnJhcnkgY29kZSBidWlsdCBvbiB0b3Agb2YgdGhlIHdvcmtmbG93XG4gICAqIFNESyAodGVsZW1ldHJ5LCBhZ2VudCBtZXRhZGF0YSwgcGxhdGZvcm0tZW1pdHRlZCB0YWdzLCBldGMuKTsgdXNlclxuICAgKiBjb2RlIE1VU1QgTk9UIHdyaXRlIGtleXMgaW4gaXQsIGFuZCB2YWxpZGF0aW9uIHJlamVjdHMgdGhlbSBzb1xuICAgKiBhY2NpZGVudGFsIGNvbGxpc2lvbnMgd2l0aCB0b29saW5nLW93bmVkIGtleXMgY2FuJ3Qgc2xpcCB0aHJvdWdoLlxuICAgKlxuICAgKiBPbmx5IGZsaXAgdGhpcyB0byBgdHJ1ZWAgaWYgeW91ciBjYWxsZXIgaXMgaXRzZWxmIGEgZnJhbWV3b3JrIG9yXG4gICAqIGxpYnJhcnkgdGhhdCBvd25zIGEgYCRgLXByZWZpeGVkIHN1Yi1uYW1lc3BhY2UgYW5kIGtub3dzIHRoZVxuICAgKiBjb252ZW50aW9ucyBvZiBhbnkgb3RoZXIgdG9vbHMgd3JpdGluZyBpbnRvIGl0LiBTYW1lIHNlbWFudGljcyBhc1xuICAgKiB0aGUgYGV4cGVyaW1lbnRhbF9zZXRBdHRyaWJ1dGVzYCBvcHRpb24gb2YgdGhlIHNhbWUgbmFtZS5cbiAgICovXG4gIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIElEIG9mIGFuIGV4aXN0aW5nIHJ1biB0aGlzIHJ1biBpcyBiZWluZyByZXBsYXllZCBmcm9tLCBpZiBhbnkuXG4gICAqXG4gICAqIFJlY29yZGVkIG9uIHRoZSBuZXcgcnVuJ3MgYGV4ZWN1dGlvbkNvbnRleHRgIGFzIGByZXBsYXllZEZyb21SdW5JZGAgc29cbiAgICogdG9vbGluZyAoZS5nLiB0aGUgZGFzaGJvYXJkIHJ1bnMgbGlzdCkgY2FuIHNob3cgdGhhdCBhIHJ1biBvcmlnaW5hdGVkIGFzXG4gICAqIGEgcmVwbGF5IGFuZCBsaW5rIGJhY2sgdG8gaXRzIHNvdXJjZS4gU2V0IGF1dG9tYXRpY2FsbHkgYnlcbiAgICoge0BsaW5rIHJlY3JlYXRlUnVuRnJvbUV4aXN0aW5nfTsgdGhlcmUncyB1c3VhbGx5IG5vIHJlYXNvbiB0byBwYXNzIGl0XG4gICAqIGRpcmVjdGx5LlxuICAgKlxuICAgKiBNdXN0IGJlIGEgcnVuIElEOiBgd3J1bl9gIGZvbGxvd2VkIGJ5IGEgMjYtY2hhciBVTElELiBJdCdzIGEgZm9yZWlnbiBrZXlcbiAgICogdG8gdGhlIHNvdXJjZSBydW4sIHNvIGBzdGFydCgpYCB2YWxpZGF0ZXMgdGhlIGV4YWN0IHNoYXBlIGFuZCByZWplY3RzXG4gICAqIGFueXRoaW5nIGVsc2UgcmF0aGVyIHRoYW4gcGVyc2lzdCBhIGxpbmVhZ2UgbGluayB0aGF0IHBvaW50cyBhdCBnYXJiYWdlLlxuICAgKi9cbiAgcmVwbGF5ZWRGcm9tUnVuSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBRdWV1ZSBuYW1lc3BhY2Ugb2YgdGhlIHRhcmdldCBkZXBsb3ltZW50LiBTY29wZXMgdGhlIHdvcmtmbG93IHF1ZXVlXG4gICAqIHRvcGljIHRvIGBfX3tuYW1lc3BhY2V9X3drZl93b3JrZmxvd18qYCAoZS5nLiBgJ2V2ZSdgKSBpbnN0ZWFkIG9mIHRoZVxuICAgKiBkZWZhdWx0IGBfX3drZl93b3JrZmxvd18qYCwgYW5kIGlzIGFsc28gdXNlZCBmb3IgdGhlIGNyb3NzLWRlcGxveW1lbnRcbiAgICogY2FwYWJpbGl0eSBwcm9iZS4gRmFsbHMgYmFjayB0byBgV09SS0ZMT1dfUVVFVUVfTkFNRVNQQUNFYCBpbiB0aGVcbiAgICogY2FsbGluZyBwcm9jZXNzLlxuICAgKlxuICAgKiBXaXRoaW4gYSBkZXBsb3ltZW50IHRoZSBlbnYgZmFsbGJhY2sgaXMgY29ycmVjdC4gQ3Jvc3MtY29udGV4dCBjYWxsZXJzXG4gICAqIChlLmcuIHRoZSBvYnNlcnZhYmlsaXR5IGRhc2hib2FyZCByZXBsYXlpbmcgYSBydW4pIG11c3QgcGFzcyB0aGVcbiAgICogVEFSR0VUIGRlcGxveW1lbnQncyBuYW1lc3BhY2UgZXhwbGljaXRseTogdGhlIGVudiBmYWxsYmFjayByZXNvbHZlcyBpblxuICAgKiB0aGUgY2FsbGVyJ3MgcHJvY2VzcywgYW5kIGEgcnVuIGVucXVldWVkIHRvIGEgdG9waWMgdGhlIHRhcmdldCBoYXMgbm9cbiAgICogY29uc3VtZXIgZm9yIGlzIG5ldmVyIHBpY2tlZCB1cC5cbiAgICovXG4gIG5hbWVzcGFjZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkIGV4dGVuZHMgU3RhcnRPcHRpb25zQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgZGVwbG95bWVudCBJRCB0byB1c2UgZm9yIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoaXMgaXMgYXV0b21hdGljYWxseSBpbmZlcnJlZCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKiB3aGVuIGRlcGxveWluZyB0byBWZXJjZWwuXG4gICAqXG4gICAqIFNldCB0byBgJ2xhdGVzdCdgIHRvIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZSB0aGUgbW9zdCByZWNlbnQgZGVwbG95bWVudFxuICAgKiBmb3IgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgKHNhbWUgcHJvZHVjdGlvbiB0YXJnZXQgb3IgZ2l0IGJyYW5jaCkuXG4gICAqIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGluIHdvcmxkcyB3aXRoIGF0b21pYywgaW1tdXRhYmxlIGRlcGxveW1lbnRzXG4gICAqIChjdXJyZW50bHkgVmVyY2VsKS4gSW4gb3RoZXIgd29ybGRzIChsb2NhbCBkZXYsIFBvc3RncmVzKSB0aGVyZSBpcyBub1xuICAgKiBub3Rpb24gb2YgbXVsdGlwbGUgZGVwbG95bWVudHMgdG8gcmVzb2x2ZSBiZXR3ZWVuLCBzbyBgJ2xhdGVzdCdgIGhhcyBub1xuICAgKiBlZmZlY3Qg4oCUIGEgd2FybmluZyBpcyBsb2dnZWQgYW5kIHRoZSBydW4gdGFyZ2V0cyB0aGUgY3VycmVudCBkZXBsb3ltZW50LlxuICAgKlxuICAgKiAqKk5vdGU6KiogV2hlbiBgZGVwbG95bWVudElkYCBpcyBwcm92aWRlZCwgdGhlIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMgYmVjb21lIGB1bmtub3duYFxuICAgKiBzaW5jZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhlIHR5cGVzIHdpbGwgYmUgY29uc2lzdGVudCBhY3Jvc3MgZGVwbG95bWVudHMuXG4gICAqL1xuICBkZXBsb3ltZW50SWQ6ICdsYXRlc3QnIHwgKHN0cmluZyAmIHt9KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkIGV4dGVuZHMgU3RhcnRPcHRpb25zQmFzZSB7XG4gIGRlcGxveW1lbnRJZD86IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyBhIHdvcmtmbG93IHJ1bi5cbiAqL1xuZXhwb3J0IHR5cGUgU3RhcnRPcHRpb25zID1cbiAgfCBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkXG4gIHwgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZDtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGltcG9ydGVkIHdvcmtmbG93IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PiA9IChcbiAgLi4uYXJnczogVEFyZ3NcbikgPT4gUHJvbWlzZTxUUmVzdWx0PjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBnZW5lcmF0ZWQgbWV0YWRhdGEgb2YgYSB3b3JrZmxvdyBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dNZXRhZGF0YSA9IHsgd29ya2Zsb3dJZDogc3RyaW5nIH07XG5cbi8qKlxuICogU3RhcnRzIGEgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEBwYXJhbSB3b3JrZmxvdyAtIFRoZSBpbXBvcnRlZCB3b3JrZmxvdyBmdW5jdGlvbiB0byBzdGFydC5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB3b3JrZmxvdyAob3B0aW9uYWwpLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHdvcmtmbG93IHJ1biAob3B0aW9uYWwpLlxuICogQHJldHVybnMgVGhlIHVuaXF1ZSBydW4gSUQgZm9yIHRoZSBuZXdseSBzdGFydGVkIHdvcmtmbG93IGludm9jYXRpb24uXG4gKi9cbi8vIE92ZXJsb2FkcyB3aXRoIGRlcGxveW1lbnRJZCAtIGFyZ3MgYW5kIHJldHVybiB0eXBlIGJlY29tZSB1bmtub3duXG4vLyBVc2VzIGdlbmVyaWNzIHNvIHR5cGVkIHdvcmtmbG93cyBhcmUgYXNzaWduYWJsZSAoYXZvaWRzIGNvbnRyYXZhcmlhbmNlIGlzc3VlcyksXG4vLyBidXQgdGhlIHJldHVybiB0eXBlIGFuZCBhcmdzIGFyZSBzdGlsbCB1bmtub3duIHNpbmNlIHRoZSBkZXBsb3llZCB2ZXJzaW9uIG1heSBkaWZmZXIuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzOiB1bmtub3duW10sXG4gIG9wdGlvbnM6IFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPHVua25vd24+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxbXSwgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBvcHRpb25zOiBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjx1bmtub3duPj47XG5cbi8vIE92ZXJsb2FkcyB3aXRob3V0IGRlcGxveW1lbnRJZCAtIHByZXNlcnZlIHR5cGUgaW5mZXJlbmNlXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzOiBUQXJncyxcbiAgb3B0aW9ucz86IFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPFRSZXN1bHQ+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxbXSwgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBvcHRpb25zPzogU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48VFJlc3VsdD4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzT3JPcHRpb25zPzogVEFyZ3MgfCBTdGFydE9wdGlvbnMsXG4gIG9wdGlvbnM/OiBTdGFydE9wdGlvbnNcbikge1xuICAndXNlIHN0ZXAnO1xuICByZXR1cm4gYXdhaXQgd2FpdGVkVW50aWwoKCkgPT4ge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdGhpcyBmaWVsZCBpcyBhZGRlZCBieSBvdXIgY2xpZW50IHRyYW5zZm9ybVxuICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IHdvcmtmbG93Py53b3JrZmxvd0lkO1xuXG4gICAgaWYgKCF3b3JrZmxvd05hbWUpIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgYCdzdGFydCcgcmVjZWl2ZWQgYW4gaW52YWxpZCB3b3JrZmxvdyBmdW5jdGlvbi4gRW5zdXJlIHRoZSBXb3JrZmxvdyBTREsgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkgYW5kIHRoZSBmdW5jdGlvbiBpbmNsdWRlcyBhICd1c2Ugd29ya2Zsb3cnIGRpcmVjdGl2ZS5gLFxuICAgICAgICB7IHNsdWc6ICdzdGFydC1pbnZhbGlkLXdvcmtmbG93LWZ1bmN0aW9uJyB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNwYW5OYW1lID0gYHdvcmtmbG93LnN0YXJ0ICR7d29ya2Zsb3dEaXNwbGF5TmFtZSh3b3JrZmxvd05hbWUpfWA7XG4gICAgcmV0dXJuIHRyYWNlKHNwYW5OYW1lLCBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93T3BlcmF0aW9uKCdzdGFydCcpLFxuICAgICAgfSk7XG5cbiAgICAgIGxldCBhcmdzOiBTZXJpYWxpemFibGVbXSA9IFtdO1xuICAgICAgbGV0IG9wdHM6IFN0YXJ0T3B0aW9ucyA9IG9wdGlvbnMgPz8ge307XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzT3JPcHRpb25zKSkge1xuICAgICAgICBhcmdzID0gYXJnc09yT3B0aW9ucyBhcyBTZXJpYWxpemFibGVbXTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3NPck9wdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdHMgPSBhcmdzT3JPcHRpb25zO1xuICAgICAgfVxuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93QXJndW1lbnRzQ291bnQoYXJncy5sZW5ndGgpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHdvcmxkID0gb3B0cy53b3JsZCA/PyAoYXdhaXQgZ2V0V29ybGRMYXp5KCkpO1xuICAgICAgYXNzZXJ0V29ybGRTdXBwb3J0c1J1bnRpbWVQcm90b2NvbCh3b3JsZCk7XG4gICAgICBjb25zdCBjdXJyZW50RGVwbG95bWVudElkID0gYXdhaXQgd29ybGQuZ2V0RGVwbG95bWVudElkKCk7XG4gICAgICBsZXQgZGVwbG95bWVudElkID0gb3B0cy5kZXBsb3ltZW50SWQgPz8gY3VycmVudERlcGxveW1lbnRJZDtcblxuICAgICAgLy8gV2hlbiAnbGF0ZXN0JyBpcyByZXF1ZXN0ZWQsIHJlc29sdmUgdGhlIGFjdHVhbCBsYXRlc3QgZGVwbG95bWVudCBJRFxuICAgICAgLy8gZm9yIHRoZSBjdXJyZW50IGRlcGxveW1lbnQncyBlbnZpcm9ubWVudCAoc2FtZSBwcm9kdWN0aW9uIHRhcmdldCBvclxuICAgICAgLy8gc2FtZSBnaXQgYnJhbmNoIGZvciBwcmV2aWV3IGRlcGxveW1lbnRzKS5cbiAgICAgIC8vXG4gICAgICAvLyBSZXNvbHZpbmcgJ2xhdGVzdCcgb25seSBtZWFucyBzb21ldGhpbmcgaW4gd29ybGRzIHdpdGggYXRvbWljLFxuICAgICAgLy8gaW1tdXRhYmxlIGRlcGxveW1lbnRzIChlLmcuIFZlcmNlbCksIHdoaWNoIGltcGxlbWVudFxuICAgICAgLy8gcmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCgpLiBXb3JsZHMgd2l0aG91dCB0aGF0IGNvbmNlcHQgKGxvY2FsIGRldixcbiAgICAgIC8vIHNlbGYtaG9zdGVkIFBvc3RncmVzKSBoYXZlIG5vdGhpbmcgdG8gcmVzb2x2ZSBiZXR3ZWVuLCBzbyByYXRoZXIgdGhhblxuICAgICAgLy8gZmFpbCBhIHJ1biB0aGF0IHdvcmtzIGZpbmUgb24gVmVyY2VsLCB3ZSB3YXJuIGFuZCBmYWxsIGJhY2sgdG8gdGhlXG4gICAgICAvLyBjdXJyZW50IGRlcGxveW1lbnQg4oCUIG1ha2luZyAnbGF0ZXN0JyBhbiBlZmZlY3RpdmUgbm8tb3AgdGhlcmUuXG4gICAgICBpZiAoZGVwbG95bWVudElkID09PSAnbGF0ZXN0Jykge1xuICAgICAgICBpZiAod29ybGQucmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCkge1xuICAgICAgICAgIGRlcGxveW1lbnRJZCA9IGF3YWl0IHdvcmxkLnJlc29sdmVMYXRlc3REZXBsb3ltZW50SWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXYXJuIG9uY2UgcGVyIHByb2Nlc3Mg4oCUIHNlZSBoYXNXYXJuZWRMYXRlc3ROb09wIGFib3ZlLlxuICAgICAgICAgIGlmICghaGFzV2FybmVkTGF0ZXN0Tm9PcCkge1xuICAgICAgICAgICAgaGFzV2FybmVkTGF0ZXN0Tm9PcCA9IHRydWU7XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIFwiZGVwbG95bWVudElkOiAnbGF0ZXN0JyBoYXMgbm8gZWZmZWN0IGluIHRoaXMgd29ybGQgYW5kIHdhcyBpZ25vcmVkLiBcIiArXG4gICAgICAgICAgICAgICAgJ0l0IGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHdvcmxkcyB3aXRoIGF0b21pYyBkZXBsb3ltZW50cywgc3VjaCBhcyBWZXJjZWwuICcgK1xuICAgICAgICAgICAgICAgICdUaGUgcnVuIHdpbGwgdGFyZ2V0IHRoZSBjdXJyZW50IGRlcGxveW1lbnQuJyxcbiAgICAgICAgICAgICAgeyBjdXJyZW50RGVwbG95bWVudElkIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlcGxveW1lbnRJZCA9IGN1cnJlbnREZXBsb3ltZW50SWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGVjaWRlIHdoZXRoZXIgdG8gd3JpdGUgYnl0ZSBzdHJlYW1zIGluIHRoZSBmcmFtZWQgd2lyZSBmb3JtYXQuXG4gICAgICAvLyBGb3Igc2FtZS1kZXBsb3ltZW50IHN0YXJ0cyAodGhlIGNvbW1vbiBjYXNlKSB3ZSBrbm93IHRoZSB0YXJnZXQgaXNcbiAgICAgIC8vIHJ1bm5pbmcgdGhpcyBzYW1lIFNESyB2ZXJzaW9uLCBzbyBmcmFtaW5nIGlzIHNhZmUuIEZvciBjcm9zcy1cbiAgICAgIC8vIGRlcGxveW1lbnQgc3RhcnRzIChleHBsaWNpdCBkZXBsb3ltZW50SWQgb3IgJ2xhdGVzdCcgdGhhdCByZXNvbHZlc1xuICAgICAgLy8gdG8gYSBkaWZmZXJlbnQgZGVwbG95bWVudCkgd2UgcHJvYmUgdGhlIHRhcmdldCB2aWEgaGVhbHRoQ2hlY2sgdG9cbiAgICAgIC8vIGxlYXJuIGl0cyB3b3JrZmxvdy1jb3JlIHZlcnNpb24sIHRoZW4gZGVyaXZlIHRoZSBjYXBhYmlsaXR5LiBUaGVcbiAgICAgIC8vIHByb2JlIGhhcyBhIHRpZ2h0IHRpbWVvdXQg4oCUIG9uIG1pc3MvZmFpbHVyZSB3ZSBmYWxsIGJhY2sgdG8gdGhlXG4gICAgICAvLyBsZWdhY3kgcmF3IGJ5dGUgZm9ybWF0LCB3aGljaCBpcyB1bml2ZXJzYWxseSByZWFkYWJsZS5cbiAgICAgIC8vXG4gICAgICAvLyBXb3JsZHMgdGhhdCBkb24ndCBleHBvc2UgdGhlIGBzdHJlYW1zYCBBUEkgKGUuZy4gbWluaW1hbCB0ZXN0XG4gICAgICAvLyBtb2NrcykgY2FuJ3Qgc2VydmljZSBoZWFsdGggY2hlY2tzLCBzbyB3ZSBza2lwIHRoZSBwcm9iZSBmb3IgdGhlbS5cbiAgICAgIGxldCBmcmFtZWRCeXRlU3RyZWFtczogYm9vbGVhbjtcbiAgICAgIGxldCB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uOiBib29sZWFuO1xuICAgICAgaWYgKGRlcGxveW1lbnRJZCA9PT0gY3VycmVudERlcGxveW1lbnRJZCkge1xuICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyA9IHRydWU7XG4gICAgICAgIHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb24gPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygd29ybGQuc3RyZWFtcz8uZ2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2U7XG4gICAgICAgIHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb24gPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHByb2JlID0gYXdhaXQgaGVhbHRoQ2hlY2sod29ybGQsICd3b3JrZmxvdycsIHtcbiAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgdGltZW91dDogQ1JPU1NfREVQTE9ZTUVOVF9DQVBBQklMSVRZX1BST0JFX1RJTUVPVVRfTVMsXG4gICAgICAgICAgbmFtZXNwYWNlOiBvcHRzLm5hbWVzcGFjZSxcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gZ2V0UnVuQ2FwYWJpbGl0aWVzKHByb2JlPy53b3JrZmxvd0NvcmVWZXJzaW9uKTtcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBjYXBhYmlsaXRpZXMuZnJhbWVkQnl0ZVN0cmVhbXM7XG4gICAgICAgIHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb24gPSBjYXBhYmlsaXRpZXMuc3VwcG9ydGVkRm9ybWF0cy5oYXMoXG4gICAgICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5HWklQXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgICAgIC8vIEdlbmVyYXRlIHJ1bklkIGNsaWVudC1zaWRlIHNvIHdlIGhhdmUgaXQgYmVmb3JlIHNlcmlhbGl6YXRpb25cbiAgICAgIC8vIChyZXF1aXJlZCBmb3IgZnV0dXJlIEUyRSBlbmNyeXB0aW9uIHdoZXJlIHJ1bklkIGlzIHBhcnQgb2YgdGhlIGVuY3J5cHRpb24gY29udGV4dClcbiAgICAgIGNvbnN0IHJ1bklkID0gYHdydW5fJHt1bGlkKCl9YDtcblxuICAgICAgLy8gU2VyaWFsaXplIGN1cnJlbnQgdHJhY2UgY29udGV4dCB0byBwcm9wYWdhdGUgYWNyb3NzIHF1ZXVlIGJvdW5kYXJ5XG4gICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKTtcblxuICAgICAgLy8gRGVmYXVsdCBuZXcgcnVucyB0byB0aGUgY29uZmlndXJlZCB3b3JsZCdzIHNwZWMgdmVyc2lvbi4gVGhlIHdvcmxkXG4gICAgICAvLyBpdHNlbGYgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGFnYWluc3QgdGhpcyBydW50aW1lJ3Mgc3BlYyB2ZXJzaW9uLlxuICAgICAgY29uc3Qgc3BlY1ZlcnNpb24gPSBvcHRzLnNwZWNWZXJzaW9uID8/IHdvcmxkLnNwZWNWZXJzaW9uO1xuICAgICAgY29uc3QgdjFDb21wYXQgPSBpc0xlZ2FjeVNwZWNWZXJzaW9uKHNwZWNWZXJzaW9uKTtcbiAgICAgIGNvbnN0IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID0gb3B0cy5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZTtcbiAgICAgIGxldCBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKG9wdHMuYXR0cmlidXRlcyAmJiBPYmplY3Qua2V5cyhvcHRzLmF0dHJpYnV0ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHNwZWNWZXJzaW9uIDwgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0FUVFJJQlVURVMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAnSW5pdGlhbCB3b3JrZmxvdyBhdHRyaWJ1dGVzIHJlcXVpcmUgYSBXb3JsZCB0aGF0IHN1cHBvcnRzIHNwZWMgdmVyc2lvbiA0IG9yIGxhdGVyLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIGBub3JtYWxpemVBdHRyaWJ1dGVDaGFuZ2VzYCB0cmVhdHMgYHVuZGVmaW5lZGAgYXMgXCJyZW1vdmUgdGhpc1xuICAgICAgICAvLyBrZXlcIiwgd2hpY2ggaXMgbWVhbmluZ2xlc3MgYXQgY3JlYXRpb24gdGltZSDigJQgcmVqZWN0IGl0IHVwIGZyb250XG4gICAgICAgIC8vIHNvIEpTIGNhbGxlcnMgZ2V0IGEgY2xlYXIgZXJyb3IgaW5zdGVhZCBvZiBhIGRvd25zdHJlYW0gc2NoZW1hXG4gICAgICAgIC8vIGZhaWx1cmUgKHRoZSB0eXBlcyBhbHJlYWR5IGZvcmJpZCBub24tc3RyaW5nIHZhbHVlcykuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9wdHMuYXR0cmlidXRlcykpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICBgSW5pdGlhbCB3b3JrZmxvdyBhdHRyaWJ1dGUgJHtKU09OLnN0cmluZ2lmeShrZXkpfSBtdXN0IGJlIGEgc3RyaW5nIHZhbHVlLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSBub3JtYWxpemVBdHRyaWJ1dGVDaGFuZ2VzKG9wdHMuYXR0cmlidXRlcywge1xuICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgICB9KTtcbiAgICAgICAgYXR0cmlidXRlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBjaGFuZ2VzLm1hcCgoeyBrZXksIHZhbHVlIH0pID0+IFtrZXksIHZhbHVlIGFzIHN0cmluZ10pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBTZWVkIHBheWxvYWQgc2hhcmVkIGJ5IHJ1bl9jcmVhdGVkIGFuZCB0aGUgcmVzaWxpZW50LXN0YXJ0IHF1ZXVlXG4gICAgICAvLyBpbnB1dC4gVGhlIGZsYWcgcmlkZXMgYWxvbmcgc28gc2VydmVyLXNpZGUgdmFsaWRhdGlvbiBtYXRjaGVzIHRoZVxuICAgICAgLy8gY2xpZW50LXNpZGUgY2hlY2sgYWJvdmUgb24gYm90aCBwYXRocy5cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVNlZWQgPSBhdHRyaWJ1dGVzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgYXR0cmlidXRlcyxcbiAgICAgICAgICAgIC4uLihhbGxvd1Jlc2VydmVkQXR0cmlidXRlc1xuICAgICAgICAgICAgICA/IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgYXMgY29uc3QgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge307XG5cbiAgICAgIC8vIGByZXBsYXllZEZyb21SdW5JZGAgaXMgYSBmb3JlaWduIGtleSB0byB0aGUgc291cmNlIHJ1bjsgcmVqZWN0IGFueXRoaW5nXG4gICAgICAvLyB0aGF0IGlzbid0IGEgcmVhbCBydW4gSUQgc28gdGhlIGxpbmVhZ2UgbGluayBjYW4ndCBwb2ludCBhdCBnYXJiYWdlLlxuICAgICAgaWYgKFxuICAgICAgICBvcHRzLnJlcGxheWVkRnJvbVJ1bklkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIXdvcmtmbG93UnVuSWRTY2hlbWEuc2FmZVBhcnNlKG9wdHMucmVwbGF5ZWRGcm9tUnVuSWQpLnN1Y2Nlc3NcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgYHJlcGxheWVkRnJvbVJ1bklkIG11c3QgYmUgYSBydW4gSUQgKHdydW5fPHVsaWQ+KTsgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIFN0cmluZyhvcHRzLnJlcGxheWVkRnJvbVJ1bklkKS5zbGljZSgwLCA2NClcbiAgICAgICAgICApfS5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc29sdmUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoZSBuZXcgcnVuLiBUaGUgcnVuSWQgaGFzIGFscmVhZHkgYmVlblxuICAgICAgLy8gZ2VuZXJhdGVkIGFib3ZlIChjbGllbnQtZ2VuZXJhdGVkIFVMSUQpIGFuZCB3aWxsIGJlIHVzZWQgZm9yIGJvdGhcbiAgICAgIC8vIGtleSBkZXJpdmF0aW9uIGFuZCB0aGUgcnVuX2NyZWF0ZWQgZXZlbnQuIFRoZSBXb3JsZCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gdXNlcyB0aGUgcnVuSWQgZm9yIHBlci1ydW4gSEtERiBrZXkgZGVyaXZhdGlvbi4gV2UgcGFzcyB0aGUgcmVzb2x2ZWRcbiAgICAgIC8vIGRlcGxveW1lbnRJZCAobm90IGp1c3QgdGhlIHJhdyBvcHRzKSBzbyB0aGUgV29ybGQgY2FuIHVzZSBpdCBmb3JcbiAgICAgIC8vIGtleSByZXNvbHV0aW9uIGV2ZW4gd2hlbiBkZXBsb3ltZW50SWQgd2FzIGluZmVycmVkIGZyb20gdGhlIGVudmlyb25tZW50XG4gICAgICAvLyByYXRoZXIgdGhhbiBleHBsaWNpdGx5IHByb3ZpZGVkIGluIG9wdHMgKGUuZy4sIGluIGUyZSB0ZXN0IHJ1bm5lcnMpLlxuICAgICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bklkLCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xuXG4gICAgICAvLyBDcmVhdGUgcnVuIHZpYSBydW5fY3JlYXRlZCBldmVudCAoZXZlbnQtc291cmNlZCBhcmNoaXRlY3R1cmUpXG4gICAgICAvLyBQYXNzIGNsaWVudC1nZW5lcmF0ZWQgcnVuSWQgLSBzZXJ2ZXIgd2lsbCBhY2NlcHQgYW5kIHVzZSBpdFxuICAgICAgLy8gQ29tcHJlc3Mgd29ya2Zsb3cgYXJndW1lbnRzIG9ubHkgd2hlbiB0aGUgcnVuIGl0c2VsZiBpcyBtYXJrZWQgYXNcbiAgICAgIC8vIHBvc3NpYmx5IGNvbnRhaW5pbmcgY29tcHJlc3NlZCBwYXlsb2FkcyAoc3BlY1ZlcnNpb24gPj0gNSkgQU5EIHRoZVxuICAgICAgLy8gdGFyZ2V0IGRlcGxveW1lbnQgY2FuIGRlY29kZSB0aGVtIChzYW1lLWRlcGxveW1lbnQsIG9yIHByb2JlZFxuICAgICAgLy8gY2FwYWJpbGl0eSBmb3IgY3Jvc3MtZGVwbG95bWVudCBzdGFydHMpLlxuICAgICAgY29uc3QgY29tcHJlc3Npb24gPVxuICAgICAgICB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uICYmXG4gICAgICAgIHNwZWNWZXJzaW9uID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTjtcbiAgICAgIGNvbnN0IHdvcmtmbG93QXJndW1lbnRzID0gYXdhaXQgZGVoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMoXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICBvcHMsXG4gICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgIHYxQ29tcGF0LFxuICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgY29tcHJlc3Npb25cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSB7XG4gICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgd29ya2Zsb3dDb3JlVmVyc2lvbixcbiAgICAgICAgZmVhdHVyZXM6IHsgZW5jcnlwdGlvbjogISFlbmNyeXB0aW9uS2V5IH0sXG4gICAgICAgIC4uLihvcHRzLnJlcGxheWVkRnJvbVJ1bklkXG4gICAgICAgICAgPyB7IHJlcGxheWVkRnJvbVJ1bklkOiBvcHRzLnJlcGxheWVkRnJvbVJ1bklkIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhbGwgZXZlbnRzLmNyZWF0ZSAocnVuX2NyZWF0ZWQpIGFuZCBxdWV1ZSBpbiBwYXJhbGxlbC5cbiAgICAgIC8vIElmIGV2ZW50cy5jcmVhdGUgZmFpbHMgd2l0aCA0MjkvNXh4LCB0aGUgcnVuIHdhcyBzdGlsbCBhY2NlcHRlZFxuICAgICAgLy8gdmlhIHRoZSBxdWV1ZSBhbmQgY3JlYXRpb24gd2lsbCBiZSByZS10cmllZCBhc3luYyBieSB0aGUgcnVudGltZS5cbiAgICAgIGNvbnN0IFtydW5DcmVhdGVkUmVzdWx0LCBxdWV1ZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jcmVhdGVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHdvcmtmbG93QXJndW1lbnRzLFxuICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAuLi5hdHRyaWJ1dGVTZWVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgdjFDb21wYXQgfVxuICAgICAgICApLFxuICAgICAgICB3b3JsZC5xdWV1ZShcbiAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG9wdHMubmFtZXNwYWNlKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgIC4uLihzcGVjVmVyc2lvbiA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ0JPUl9RVUVVRV9UUkFOU1BPUlRcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBydW5JbnB1dDoge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dDogd29ya2Zsb3dBcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgLi4uYXR0cmlidXRlU2VlZCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9IHNhdGlzZmllcyBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgXSk7XG5cbiAgICAgIC8vIFF1ZXVlIGZhaWx1cmUgaXMgYWx3YXlzIGZhdGFsIOKAlCB0aGUgcnVuIHdhcyBub3QgZW5xdWV1ZWRcbiAgICAgIGlmIChxdWV1ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgdGhyb3cgcXVldWVSZXN1bHQucmVhc29uO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgZXZlbnRzLmNyZWF0ZSByZXN1bHRcbiAgICAgIGxldCByZXNpbGllbnRTdGFydCA9IGZhbHNlO1xuICAgICAgaWYgKHJ1bkNyZWF0ZWRSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IHJ1bkNyZWF0ZWRSZXN1bHQucmVhc29uO1xuICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgLy8gNDA5OiBUaGUgcnVuIGFscmVhZHkgZXhpc3RzLiBUaGlzIGNhbiBoYXBwZW4gaW4gZXh0cmVtZSBjYXNlcyB3aGVyZVxuICAgICAgICAgIC8vIHRoZSBydW4gY3JlYXRpb24gY2FsbCBnZXRzIGEgY29sZCBzdGFydCBvciBvdGhlciBzbG93ZG93biwgYW5kIHRoZSBxdWV1ZVxuICAgICAgICAgIC8vICsgcnVuX3N0YXJ0ZWQgY2FsbCBjb21wbGV0ZXMgZmFzdGVyLiBXZSBleHBlY3QgdGhpcyB0byBiZSA8PTElIG9mIGNhc2VzLlxuICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgY2FuIHNhZmVseSByZXR1cm4uXG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZXRyeWFibGVXb3JsZEVycm9yKGVycikpIHtcbiAgICAgICAgICAvLyA0MjkgKFRocm90dGxlRXJyb3IpLCA1eHgsIGFuZCB0cmFuc2llbnQgdHJhbnNwb3J0IGZhaWx1cmVzXG4gICAgICAgICAgLy8gKFRSQU5TUE9SVC9USU1FT1VUKSBhcmUgcmV0cnlhYmxlIOKAlCB0aGUgcnVuIHdhcyBhY2NlcHRlZCB2aWEgdGhlXG4gICAgICAgICAgLy8gcXVldWUgYW5kIGNyZWF0aW9uIHdpbGwgYmUgcmUtdHJpZWQgYnkgdGhlIHJ1bnRpbWUgd2hlbiBpdCBjYWxsc1xuICAgICAgICAgIC8vIHJ1bl9zdGFydGVkLlxuICAgICAgICAgIHJlc2lsaWVudFN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAnUnVuIGNyZWF0aW9uIGV2ZW50IGZhaWxlZCwgYnV0IHRoZSBydW4gd2FzIGFjY2VwdGVkIHZpYSB0aGUgcXVldWUuICcgK1xuICAgICAgICAgICAgICAnVGhlIHJ1bl9jcmVhdGVkIGV2ZW50IHdpbGwgYmUgcmUtdHJpZWQgYXN5bmMgYnkgdGhlIHJ1bnRpbWUuJyxcbiAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIGVycm9yOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJ1bkNyZWF0ZWRSZXN1bHQudmFsdWU7XG4gICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBydW4gd2FzIGNyZWF0ZWRcbiAgICAgICAgaWYgKCFyZXN1bHQucnVuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgXCJNaXNzaW5nICdydW4nIGluIHNlcnZlciByZXNwb25zZSBmb3IgJ3J1bl9jcmVhdGVkJyBldmVudFwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZlcmlmeSBzZXJ2ZXIgYWNjZXB0ZWQgb3VyIHJ1bklkXG4gICAgICAgIGlmICghdjFDb21wYXQgJiYgcmVzdWx0LnJ1bi5ydW5JZCAhPT0gcnVuSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgU2VydmVyIHJldHVybmVkIGRpZmZlcmVudCBydW5JZCB0aGFuIHJlcXVlc3RlZDogZXhwZWN0ZWQgJHtydW5JZH0sIGdvdCAke3Jlc3VsdC5ydW4ucnVuSWR9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlc2UgYXJndW1lbnQtc3RyZWFtIG9wcyBhcmUgZmx1c2hlZCBpbiB0aGUgYmFja2dyb3VuZDsgdGhlIHByb21pc2VcbiAgICAgIC8vIGhhbmRlZCB0byB3YWl0VW50aWwgbXVzdCBuZXZlciByZWplY3QgKGFuIHVuY29uc3VtZWQgd2FpdFVudGlsXG4gICAgICAvLyByZWplY3Rpb24gY3Jhc2hlcyB0aGUgcHJvY2VzcyBhcyB1bmhhbmRsZWRSZWplY3Rpb24pLCBzbyB1bmV4cGVjdGVkXG4gICAgICAvLyBmYWlsdXJlcyBhcmUgbG9nZ2VkIGluc3RlYWQuXG4gICAgICBzYWZlV2FpdFVudGlsKFByb21pc2UuYWxsKG9wcyksIChlcnIpID0+IHtcbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdCYWNrZ3JvdW5kIGZsdXNoIG9mIHdvcmtmbG93IGFyZ3VtZW50IHN0cmVhbXMgZmFpbGVkJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChydW5JZCksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5EZXBsb3ltZW50SWQoZGVwbG95bWVudElkKSxcbiAgICAgICAgLi4uKHJ1bkNyZWF0ZWRSZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJlxuICAgICAgICBydW5DcmVhdGVkUmVzdWx0LnZhbHVlLnJ1blxuICAgICAgICAgID8gQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKHJ1bkNyZWF0ZWRSZXN1bHQudmFsdWUucnVuLnN0YXR1cylcbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IFJ1bjxUUmVzdWx0PihydW5JZCwgeyByZXNpbGllbnRTdGFydCB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXX0=
|
|
@@ -29,6 +29,19 @@ export interface StepExecutorParams {
|
|
|
29
29
|
* carries no payload (the legacy contract).
|
|
30
30
|
*/
|
|
31
31
|
lazyStepInput?: SerializedData;
|
|
32
|
+
/**
|
|
33
|
+
* Inline step ownership: the queue message ID of the invocation this
|
|
34
|
+
* executeStep call runs in (from the queue handler's meta). When set, the
|
|
35
|
+
* `step_started` this call sends is stamped with it — on the lazy paths
|
|
36
|
+
* (where `lazyStepInput` is present) and on the owned-recovery bare start
|
|
37
|
+
* (where it is not; the re-stamp keeps a recovered step readable as owned
|
|
38
|
+
* by this message, since ownership derives from the LATEST start). Wake
|
|
39
|
+
* replays that observe an actively-owned step suppress the immediate
|
|
40
|
+
* requeue and enqueue a delayed backstop instead. Omitted on the
|
|
41
|
+
* background-step path, whose bare start intentionally clears ownership
|
|
42
|
+
* (the step is queue-owned from that point).
|
|
43
|
+
*/
|
|
44
|
+
ownerMessageId?: string;
|
|
32
45
|
/**
|
|
33
46
|
* Inline-delta optimization (opt-in). When provided, the cursor of the
|
|
34
47
|
* event log as observed by the caller *before* this step's events were
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-executor.d.ts","sourceRoot":"","sources":["../../src/runtime/step-executor.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAQ,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAK1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AA0BlD,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAC;AA0B3B,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,KAAK,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,cAAc,CAAC;IAC/B;;;;;;;;OAQG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,mBAAmB,CAAC;CACvC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC,GACD;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,mBAAmB,CAAC,
|
|
1
|
+
{"version":3,"file":"step-executor.d.ts","sourceRoot":"","sources":["../../src/runtime/step-executor.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAQ,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAK1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AA0BlD,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAC;AA0B3B,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,KAAK,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,cAAc,CAAC;IAC/B;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;OAQG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,mBAAmB,CAAC;CACvC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC,GACD;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,mBAAmB,CAAC,CAy6B9B"}
|