@dbx-tools/appkit-mastra 0.9.120 → 0.9.122
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/README.md +22 -14
- package/index.ts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/src/agents.d.ts +7 -3
- package/lib/src/agents.js +11 -6
- package/lib/src/config.d.ts +1 -1
- package/lib/src/config.js +2 -2
- package/lib/src/mlflow.js +5 -6
- package/lib/src/plugin.js +16 -4
- package/lib/src/remote-skills.d.ts +8 -9
- package/lib/src/remote-skills.js +43 -10
- package/lib/src/telemetry.js +3 -4
- package/lib/src/workspaces.d.ts +7 -5
- package/lib/src/workspaces.js +69 -11
- package/package.json +20 -17
- package/src/agents.ts +26 -9
- package/src/config.ts +2 -2
- package/src/mlflow.ts +4 -4
- package/src/plugin.ts +15 -3
- package/src/remote-skills.ts +53 -13
- package/src/telemetry.ts +2 -3
- package/src/workspaces.ts +80 -11
package/lib/src/agents.js
CHANGED
|
@@ -22,8 +22,9 @@ import { Agent } from "@mastra/core/agent";
|
|
|
22
22
|
import { createEventedAgent } from "@mastra/core/agent/durable";
|
|
23
23
|
import { SkillSearchProcessor, ToolCallFilter } from "@mastra/core/processors";
|
|
24
24
|
import { MASTRA_RESOURCE_ID_KEY } from "@mastra/core/request-context";
|
|
25
|
+
import { resolveAgentSkills } from "@mastra/core/skills";
|
|
25
26
|
import { createCodeMode, createTool } from "@mastra/core/tools";
|
|
26
|
-
import { createWorkspaceTools } from "@mastra/core/workspace";
|
|
27
|
+
import { createSkillTools, createWorkspaceTools } from "@mastra/core/workspace";
|
|
27
28
|
import { QuickJsCodeModeTransport } from "@mastra/quickjs";
|
|
28
29
|
import { buildRenderDataTool } from "./chart.js";
|
|
29
30
|
import { buildGenieToolkitProvider, resolveGenieSpaces } from "./genie.js";
|
|
@@ -371,7 +372,7 @@ function defaultAgentDescription(name) {
|
|
|
371
372
|
* resolved registry; this is a wiring bug, not a runtime condition.
|
|
372
373
|
*/
|
|
373
374
|
export async function buildAgents(opts) {
|
|
374
|
-
const { config, context, memoryBuilder, log, extraSkillMounts } = opts;
|
|
375
|
+
const { config, context, memoryBuilder, log, extraSkillMounts, standardSkills = [], excludedWorkspaceSkillNames = [], } = opts;
|
|
375
376
|
const definitions = resolveDefinitions(config);
|
|
376
377
|
const ids = Object.keys(definitions);
|
|
377
378
|
const defaultAgentId = config.defaultAgent ?? ids[0] ?? FALLBACK_AGENT_ID;
|
|
@@ -381,13 +382,15 @@ export async function buildAgents(opts) {
|
|
|
381
382
|
// offloading text condensing to the fast / small chat tier. The
|
|
382
383
|
// user can shadow either by including a same-named tool in their own
|
|
383
384
|
// `config.tools` or per-agent `tools`. Merge order is
|
|
384
|
-
// `system -> user-ambient -> per-agent`, last write wins.
|
|
385
|
+
// `system -> standard skills -> user-ambient -> per-agent`, last write wins.
|
|
385
386
|
const systemTools = {
|
|
386
387
|
render_data: buildRenderDataTool(config),
|
|
387
388
|
summarize: buildSummarizeTool(config),
|
|
388
389
|
};
|
|
390
|
+
const standardSkillTools = standardSkills.length > 0 ? createSkillTools(resolveAgentSkills([...standardSkills])) : {};
|
|
389
391
|
const ambientTools = {
|
|
390
392
|
...systemTools,
|
|
393
|
+
...standardSkillTools,
|
|
391
394
|
...(config.tools ?? {}),
|
|
392
395
|
};
|
|
393
396
|
const style = resolveStyleInstructions(config);
|
|
@@ -419,6 +422,7 @@ export async function buildAgents(opts) {
|
|
|
419
422
|
isDefaultWorkspace(workspace))) {
|
|
420
423
|
workspace = databricksWorkspace({
|
|
421
424
|
extraSkillMounts,
|
|
425
|
+
excludeSkillNames: excludedWorkspaceSkillNames,
|
|
422
426
|
fallbackToTmp: config.workspaceFallbackToTmp,
|
|
423
427
|
...(config.workspaceTools !== undefined ? { tools: config.workspaceTools } : {}),
|
|
424
428
|
pluginContext: context,
|
|
@@ -427,7 +431,7 @@ export async function buildAgents(opts) {
|
|
|
427
431
|
markDefaultWorkspace(workspace);
|
|
428
432
|
}
|
|
429
433
|
else if (workspace) {
|
|
430
|
-
workspace = bindDatabricksWorkspaceContext(workspace, context);
|
|
434
|
+
workspace = bindDatabricksWorkspaceContext(workspace, context, excludedWorkspaceSkillNames);
|
|
431
435
|
}
|
|
432
436
|
const gated = approvalGatedToolIds(tools);
|
|
433
437
|
if (gated.length > 0)
|
|
@@ -838,12 +842,13 @@ function toolkitEntryToMastraTool(entry, plugin) {
|
|
|
838
842
|
...(typeof model === "string" ? { model } : {}),
|
|
839
843
|
...(writer && toolCallId
|
|
840
844
|
? {
|
|
841
|
-
writeProgress: async (event) => {
|
|
845
|
+
writeProgress: async (event, options) => {
|
|
842
846
|
const parsed = ToolProgressEventSchema.parse(event);
|
|
843
847
|
await writer
|
|
844
848
|
.custom({
|
|
845
849
|
type: TOOL_PROGRESS_PART_TYPE,
|
|
846
850
|
data: { toolCallId, event: parsed },
|
|
851
|
+
...(options?.transient ? { transient: true } : {}),
|
|
847
852
|
})
|
|
848
853
|
.catch(() => undefined);
|
|
849
854
|
},
|
|
@@ -853,4 +858,4 @@ function toolkitEntryToMastraTool(entry, plugin) {
|
|
|
853
858
|
},
|
|
854
859
|
});
|
|
855
860
|
}
|
|
856
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVF4RCxPQUFPLEVBQWtCLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQU9qRyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRS9FLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBR3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzRSxPQUFPLEVBQUUsc0JBQXNCLEVBQXNCLE1BQU0sYUFBYSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEUsT0FBTyxFQUFFLHlCQUF5QixFQUFF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LENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pELEdBQUcsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDL0MsR0FBRyxDQUFDLE1BQU0sSUFBSSxVQUFVO29CQUN0QixDQUFDLENBQUM7d0JBQ0UsYUFBYSxFQUFFLEtBQUssRUFBRSxLQUFjLEVBQUUsRUFBRTs0QkFDdEMsTUFBTSxNQUFNLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUNwRCxNQUFNLE1BQU07aUNBQ1QsTUFBTSxDQUFDO2dDQUNOLElBQUksRUFBRSx1QkFBdUI7Z0NBQzdCLElBQUksRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFOzZCQUNwQyxDQUFDO2lDQUNELEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDNUIsQ0FBQztxQkFDRjtvQkFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ1IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFnZW50IHJlZ2lzdHJhdGlvbiBmb3IgdGhlIE1hc3RyYSBBcHBLaXQgcGx1Z2luLlxuICpcbiAqIE1pcnJvcnMgdGhlIHNoYXBlIG9mIHRoZSBBcHBLaXQgYGFnZW50c2AgcGx1Z2luIChgY29uZmlnLmFnZW50c2AgbWFwXG4gKiBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9ufSwgZHVhbC1mb3JtIGB0b29sc2AgYWNjZXB0aW5nIGEgcGxhaW5cbiAqIHJlY29yZCBvciBhIGAocGx1Z2lucykgPT4gdG9vbHNgIGNhbGxiYWNrKS4gUmVzb2x2ZXMgZWFjaCBkZWZpbml0aW9uXG4gKiBpbnRvIGEgTWFzdHJhIGBBZ2VudGAgaW5zdGFuY2UgZHVyaW5nIHBsdWdpbiBzZXR1cDsgdXNlci1zdXBwbGllZFxuICogdG9vbCBjYWxsYmFja3MgYXJlIGludm9rZWQgZXhhY3RseSBvbmNlIHdpdGggYSB0eXBlZFxuICoge0BsaW5rIE1hc3RyYVBsdWdpbnN9IG1hcCBidWlsdCBmcm9tIHJlZ2lzdGVyZWQgc2libGluZyBwbHVnaW5zLlxuICpcbiAqIFdoZW4gbm8gYWdlbnRzIGFyZSByZWdpc3RlcmVkIHRoZSBwbHVnaW4gZmFsbHMgYmFjayB0byBhIHNpbmdsZVxuICogYnVpbHQtaW4gYW5hbHlzdCBzbyB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZ1xuICogc3RyZWFtYWJsZSBhZ2VudCBmb3IgZGVtb3MuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHtcbiAgQWdlbnRUb29sRGVmaW5pdGlvbixcbiAgUGx1Z2luVG9vbGtpdFByb3ZpZGVyLFxuICBUb29sa2l0RW50cnksXG4gIFRvb2xraXRPcHRpb25zIGFzIEFwcEtpdFRvb2xraXRPcHRpb25zLFxuICBUb29sUHJvdmlkZXIsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuaW1wb3J0IHsgcGx1Z2luUmVnaXN0cnksIHRvb2xraXRFbnRyaWVzIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQvdG9vbC1wcm92aWRlclwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IFRPT0xfUFJPR1JFU1NfUEFSVF9UWVBFLCBUb29sUHJvZ3Jlc3NFdmVudFNjaGVtYSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmEvd2lyZVwiO1xuaW1wb3J0IHR5cGUge1xuICBBZ2VudENvbmZpZyxcbiAgQWdlbnRFeGVjdXRpb25PcHRpb25zLFxuICBBZ2VudEluc3RydWN0aW9ucyxcbiAgVG9vbHNJbnB1dCxcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgeyBjcmVhdGVFdmVudGVkQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50L2R1cmFibGVcIjtcbmltcG9ydCB7IFNraWxsU2VhcmNoUHJvY2Vzc29yLCBUb29sQ2FsbEZpbHRlciB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcHJvY2Vzc29yc1wiO1xuaW1wb3J0IHR5cGUgeyBPdXRwdXRQcm9jZXNzb3IgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Byb2Nlc3NvcnNcIjtcbmltcG9ydCB7IE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IENvZGVNb2RlVHJhbnNwb3J0LCBUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHsgY3JlYXRlQ29kZU1vZGUsIGNyZWF0ZVRvb2wgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvd29ya3NwYWNlXCI7XG5pbXBvcnQgeyBjcmVhdGVXb3Jrc3BhY2VUb29scyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvd29ya3NwYWNlXCI7XG5pbXBvcnQgdHlwZSB7IFBnVmVjdG9yQ29uZmlnLCBQb3N0Z3Jlc1N0b3JlQ29uZmlnIH0gZnJvbSBcIkBtYXN0cmEvcGdcIjtcbmltcG9ydCB7IFF1aWNrSnNDb2RlTW9kZVRyYW5zcG9ydCB9IGZyb20gXCJAbWFzdHJhL3F1aWNranNcIjtcblxuaW1wb3J0IHsgYnVpbGRSZW5kZXJEYXRhVG9vbCB9IGZyb20gXCIuL2NoYXJ0LnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1hc3RyYVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgYnVpbGRHZW5pZVRvb2xraXRQcm92aWRlciwgcmVzb2x2ZUdlbmllU3BhY2VzIH0gZnJvbSBcIi4vZ2VuaWUudHNcIjtcbmltcG9ydCB7IHdpdGhSZXF1ZXN0TWVtb3J5U2NvcGUsIHR5cGUgTWVtb3J5QnVpbGRlciB9IGZyb20gXCIuL21lbW9yeS50c1wiO1xuaW1wb3J0IHsgYnVpbGRNb2RlbCwgUkVTUE9OU0VTX1BST1ZJREVSX09QVElPTlMgfSBmcm9tIFwiLi9tb2RlbC50c1wiO1xuaW1wb3J0IHsgc3RyaXBTdGFsZUNoYXJ0c1Byb2Nlc3NvciB9IGZyb20gXCIuL3Byb2Nlc3NvcnMudHNcIjtcbmltcG9ydCB7IE1BU1RSQV9SRVNPTFZFRF9NT0RFTF9LRVkgfSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5pbXBvcnQgeyBUWVBPR1JBUEhZX1JVTEUgfSBmcm9tIFwiLi9zdHlsZS50c1wiO1xuaW1wb3J0IHsgYnVpbGRTdW1tYXJpemVUb29sIH0gZnJvbSBcIi4vc3VtbWFyaXplLnRzXCI7XG5pbXBvcnQge1xuICBiaW5kRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gIGRhdGFicmlja3NXb3Jrc3BhY2UsXG4gIHR5cGUgRGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnMsXG59IGZyb20gXCIuL3dvcmtzcGFjZXMudHNcIjtcblxuY29uc3QgY29kZU1vZGVMb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL2NvZGUtbW9kZVwiKTtcbmxldCByZXNvbHZlZENvZGVNb2RlVHJhbnNwb3J0OiBQcm9taXNlPENvZGVNb2RlVHJhbnNwb3J0PiB8IHVuZGVmaW5lZDtcblxuLyoqIFJldHVybiB3aGV0aGVyIHRoaXMgYm9vdCBlbnZpcm9ubWVudCBtYXRjaGVzIGlzb2xhdGVkLXZtJ3Mgc3VwcG9ydGVkIGFwcCBzaGFwZS4gKi9cbmZ1bmN0aW9uIHN1cHBvcnRzSXNvbGF0ZWRWbVRyYW5zcG9ydCgpOiBib29sZWFuIHtcbiAgaWYgKHByb2Nlc3MudmVyc2lvbnMuYnVuIHx8IHByb2Nlc3MucmVsZWFzZS5uYW1lICE9PSBcIm5vZGVcIiB8fCBwcm9jZXNzLnBsYXRmb3JtICE9PSBcImxpbnV4XCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qgbm9kZU1ham9yID0gTnVtYmVyLnBhcnNlSW50KHByb2Nlc3MudmVyc2lvbnMubm9kZS5zcGxpdChcIi5cIilbMF0gPz8gXCJcIiwgMTApO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShub2RlTWFqb3IpIHx8IG5vZGVNYWpvciA8IDIwIHx8IG5vZGVNYWpvciA+PSAyNSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBub2RlT3B0aW9ucyA9IHByb2Nlc3MuZW52Lk5PREVfT1BUSU9OUz8uc3BsaXQoL1xccysvKSA/PyBbXTtcbiAgcmV0dXJuIFsuLi5wcm9jZXNzLmV4ZWNBcmd2LCAuLi5ub2RlT3B0aW9uc10uaW5jbHVkZXMoXCItLW5vLW5vZGUtc25hcHNob3RcIik7XG59XG5cbi8qKlxuICogVG9vbCByZWNvcmQgYWNjZXB0ZWQgYnkgZXZlcnkgTWFzdHJhIGBBZ2VudC50b29sc2AgZmllbGQgYW5kIGJ5IHRoZVxuICogYHRvb2xzKHBsdWdpbnMpYCBjYWxsYmFjayBvbiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9ufS5cbiAqXG4gKiBBbGlhcyBvZiBNYXN0cmEncyBgVG9vbHNJbnB1dGAsIHNvIGl0IGFscmVhZHkgYWNjZXB0czpcbiAqXG4gKiAtIE1hc3RyYSB0b29scyBidWlsdCB3aXRoIHtAbGluayBjcmVhdGVUb29sfSAob3IgYG5ldyBUb29sKC4uLilgKVxuICogLSBNYXN0cmEgdG9vbHMgYnVpbHQgd2l0aCB0aGUgQXBwS2l0LXNoYXBlZCB7QGxpbmsgdG9vbH0gd3JhcHBlclxuICogICBiZWxvd1xuICogLSBWZXJjZWwgQUkgU0RLIHRvb2xzIChgdG9vbCh7IC4uLiB9KWAgZnJvbSBgYWlgKVxuICogLSBQcm92aWRlci1kZWZpbmVkIHRvb2xzIChlLmcuIGBvcGVuYWkudG9vbHMud2ViU2VhcmNoKC4uLilgKVxuICpcbiAqIEV4aXN0aW5nIHRvb2wgbGlicmFyaWVzIGRyb3AgaW4gYXMtaXMgLSBub3RoaW5nIGluIHRoaXMgcGFja2FnZVxuICogZm9yY2VzIGEgcmVidWlsZC5cbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhVG9vbHMgPSBUb29sc0lucHV0O1xuXG4vKiogUmUtZXhwb3J0IG9mIE1hc3RyYSdzIG5hdGl2ZSBgY3JlYXRlVG9vbGAgZm9yIGZ1bGwtZmVhdHVyZSBhY2Nlc3MuICovXG5leHBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuXG4vKipcbiAqIEFwcEtpdC1zaGFwZWQgdG9vbCBmYWN0b3J5LiBMZXRzIHVzZXJzIG1peC1hbmQtbWF0Y2ggdG9vbHMgYWNyb3NzXG4gKiBBcHBLaXQncyBgYWdlbnRzYCBwbHVnaW4gYW5kIGBtYXN0cmFgIHdpdGggYSBzaW5nbGUgaW1wb3J0OlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyB0b29sIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICogaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbiAqXG4gKiBnZXRfd2VhdGhlcjogdG9vbCh7XG4gKiAgIGRlc2NyaXB0aW9uOiBcIldlYXRoZXJcIixcbiAqICAgc2NoZW1hOiB6Lm9iamVjdCh7IGNpdHk6IHouc3RyaW5nKCkgfSksXG4gKiAgIGV4ZWN1dGU6IGFzeW5jICh7IGNpdHkgfSkgPT4gYFN1bm55IGluICR7Y2l0eX1gLFxuICogfSksXG4gKiBgYGBcbiAqXG4gKiBNYXBzIG9udG8gTWFzdHJhJ3MgYGNyZWF0ZVRvb2xgOlxuICpcbiAqIC0gYGRlc2NyaXB0aW9uYCAtPiBgZGVzY3JpcHRpb25gIChyZXF1aXJlZClcbiAqIC0gYHNjaGVtYWAgLT4gYGlucHV0U2NoZW1hYCAob3B0aW9uYWwpXG4gKiAtIGBleGVjdXRlKGlucHV0KWAgLT4gYGV4ZWN1dGUoaW5wdXQsIGN0eClgIC0gTWFzdHJhIGFscmVhZHkgY2FsbHNcbiAqICAgdGhlIGZpcnN0IGFyZyB3aXRoIHRoZSBwYXJzZWQgaW5wdXRzLCBzbyB0aGUgYm9keSBzaGFwZSBpc1xuICogICBpZGVudGljYWwuIFRoZSBNYXN0cmEgYGNvbnRleHRgIGFyZyBpcyBmb3J3YXJkZWQgYXMgdGhlIHNlY29uZFxuICogICBwYXJhbWV0ZXIgd2hlbiB0aGUgY2FsbGVyIGRlY2xhcmVzIGl0LlxuICogLSBgaWRgOiBvcHRpb25hbC4gRGVmYXVsdHMgdG8gYSBzdGFibGUgaWRlbnRpZmllciBkZXJpdmVkIGZyb21cbiAqICAgYGRlc2NyaXB0aW9uYCAoc2x1Z2lmaWVkLCB3aXRoIGEgc2hvcnQgaGFzaCBzdWZmaXggZm9yXG4gKiAgIHVuaXF1ZW5lc3MpLiBQYXNzIGFuIGV4cGxpY2l0IGBpZGAgd2hlbiB5b3UgbmVlZCBhIHN0YWJsZSBzdHJpbmdcbiAqICAgZm9yIHRyYWNpbmcgb3IgTUNQIGV4cG9zdXJlLlxuICpcbiAqIFJlYWNoIGZvciB7QGxpbmsgY3JlYXRlVG9vbH0gd2hlbiB5b3UgbmVlZCBNYXN0cmEtb25seSBmaWVsZHNcbiAqIChgb3V0cHV0U2NoZW1hYCwgYHN1c3BlbmRTY2hlbWFgLCBgcmVxdWlyZUFwcHJvdmFsYCwgYG1jcGAsIGV0Yy4pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9vbChvcHRzOiBBcHBLaXRUb29sT3B0aW9ucyk6IFRvb2wge1xuICBjb25zdCBpZCA9IG9wdHMuaWQgPz8gZGVyaXZlVG9vbElkKG9wdHMuZGVzY3JpcHRpb24pO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQsXG4gICAgZGVzY3JpcHRpb246IG9wdHMuZGVzY3JpcHRpb24sXG4gICAgLi4uKG9wdHMuc2NoZW1hID8geyBpbnB1dFNjaGVtYTogb3B0cy5zY2hlbWEgYXMgbmV2ZXIgfSA6IHt9KSxcbiAgICBleGVjdXRlOiBvcHRzLmV4ZWN1dGUgYXMgbmV2ZXIsXG4gIH0pO1xufVxuXG4vKipcbiAqIElucHV0IHNoYXBlIGZvciB0aGUgQXBwS2l0LXN0eWxlIHtAbGluayB0b29sfSBmYWN0b3J5LiBBIHRyaW1tZWRcbiAqIHN1YnNldCBvZiBNYXN0cmEncyBgY3JlYXRlVG9vbGAgb3B0aW9ucyB0aGF0IG1pcnJvcnMgdGhlXG4gKiBgQGRhdGFicmlja3MvYXBwa2l0L2JldGFgIGB0b29sKHsgZGVzY3JpcHRpb24sIHNjaGVtYSwgZXhlY3V0ZSB9KWBcbiAqIHNpZ25hdHVyZS5cbiAqXG4gKiBHZW5lcmljcyBhcmUgaW50ZW50aW9uYWxseSBhYnNlbnQgLSBpbmZlcmVuY2UgZmxvd3MgdGhyb3VnaCB0aGVcbiAqIGNhbGxlcidzIGBzY2hlbWFgICh0eXBpY2FsbHkgYSBab2Qgb2JqZWN0KSwgYW5kIHRoZSBgZXhlY3V0ZWAgYm9keVxuICogZGVzdHJ1Y3R1cmVzIG5hdHVyYWxseSBmcm9tIHRoYXQuIFJlYWNoIGZvciB7QGxpbmsgY3JlYXRlVG9vbH0gd2hlblxuICogeW91IG5lZWQgdGhlIGZ1bGx5LXR5cGVkIGlucHV0L291dHB1dCBzY2hlbWFzIHdpcmVkIGV4cGxpY2l0bHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwS2l0VG9vbE9wdGlvbnMge1xuICAvKiogT3B0aW9uYWwgc3RhYmxlIGlkZW50aWZpZXI7IGF1dG8tZGVyaXZlZCBmcm9tIGBkZXNjcmlwdGlvbmAgd2hlbiBvbWl0dGVkLiAqL1xuICBpZD86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIHNob3duIHRvIHRoZSBtb2RlbC4gUmVxdWlyZWQuICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBpbnB1dCBzY2hlbWEgKGFueSBTdGFuZGFyZCBTY2hlbWEgaW5zdGFuY2UsIGUuZy4gWm9kKS5cbiAgICogTWFwcyB0byBNYXN0cmEncyBgaW5wdXRTY2hlbWFgOyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgbW9kZWxcbiAgICogdmVyYmF0aW0uXG4gICAqL1xuICBzY2hlbWE/OiB1bmtub3duO1xuICAvKipcbiAgICogRXhlY3V0ZSBib2R5LiBGaXJzdCBhcmcgaXMgdGhlIHBhcnNlZCBpbnB1dCAodHlwZWQgb2ZmIGBzY2hlbWFgXG4gICAqIHdoZW4gc3VwcGxpZWQpLCBzZWNvbmQgYXJnIGlzIHRoZSBmdWxsIE1hc3RyYSBleGVjdXRpb24gY29udGV4dFxuICAgKiAocmVxdWVzdCBjb250ZXh0LCBhYm9ydCBzaWduYWwsIG1hc3RyYSBpbnN0YW5jZSkgaWYgeW91IG5lZWQgaXQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBleGVjdXRlOiAoaW5wdXQ6IGFueSwgY29udGV4dD86IHVua25vd24pID0+IHVua25vd247XG59XG5cbi8qKlxuICogQnVpbGQgYSBkZXRlcm1pbmlzdGljIE1hc3RyYSB0b29sIGlkIGZyb20gYSBkZXNjcmlwdGlvbi5cbiAqIERlbGVnYXRlcyB0byB7QGxpbmsgc3RyaW5nLnRvVW5pcXVlU2x1Z306IHNsdWcgKyBhbHdheXMtb25cbiAqIDYtY2hhciBGTlYtMWEgYmFzZS0zMiBzdWZmaXggc28gdHdvIHRvb2xzIHdpdGggdGhlIHNhbWUgbGVhZGluZ1xuICogd29yZHMgZG9uJ3QgY29sbGlkZSBpbiB0cmFjZXMuIFN0YWJsZSBhY3Jvc3MgcnVucy5cbiAqL1xuZnVuY3Rpb24gZGVyaXZlVG9vbElkKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyaW5nVXRpbHMudG9VbmlxdWVTbHVnKGRlc2NyaXB0aW9uLCB7IGZhbGxiYWNrUHJlZml4OiBcInRvb2xcIiB9KTtcbn1cblxuLyoqXG4gKiBJZGVudGl0eSBoZWxwZXIgdGhhdCBicmFuZHMgYSBkZWZpbml0aW9uIGFzIGEgTWFzdHJhIGFnZW50LiBNaXJyb3JzXG4gKiBBcHBLaXQncyBgY3JlYXRlQWdlbnQoZGVmKWAgc28gdGhlIHJlZ2lzdHJhdGlvbiBzaGFwZSBtYXRjaGVzOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBzdXBwb3J0ID0gY3JlYXRlQWdlbnQoe1xuICogICBpbnN0cnVjdGlvbnM6IFwiLi4uXCIsXG4gKiAgIG1vZGVsOiBcImRhdGFicmlja3MtY2xhdWRlLXNvbm5ldC00LTZcIixcbiAqICAgdG9vbHMocGx1Z2lucykgeyByZXR1cm4geyAuLi4gfTsgfSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQWRkcyB0aGUgcGFja2FnZSdzIGRlZmF1bHQgd29ya3NwYWNlIHdoZW4gdGhlIGRlZmluaXRpb24gb21pdHMgb25lLiBUaGF0XG4gKiB3b3Jrc3BhY2UgY2FycmllcyBEYXRhYnJpY2tzIHNraWxsIG1vdW50cyB3aGlsZSBjb21tYW5kIGV4ZWN1dGlvbiBzdGF5c1xuICogZGlzYWJsZWQgdW50aWwgYSBzYW5kYm94IGlzIHNlbGVjdGVkIGV4cGxpY2l0bHkuIEFuIGV4cGxpY2l0IHdvcmtzcGFjZVxuICogcmVtYWlucyB0aGUgY2FsbGVyJ3MgY29tcGxldGUgb3ZlcnJpZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBZ2VudDxcbiAgVFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duID0gdW5rbm93bixcbiAgVERlZmluaXRpb24gZXh0ZW5kcyBNYXN0cmFBZ2VudERlZmluaXRpb248VFJlcXVlc3RDb250ZXh0PiA9XG4gICAgTWFzdHJhQWdlbnREZWZpbml0aW9uPFRSZXF1ZXN0Q29udGV4dD4sXG4+KGRlZjogVERlZmluaXRpb24pOiBURGVmaW5pdGlvbiB7XG4gIGlmIChkZWYud29ya3NwYWNlKSByZXR1cm4geyAuLi5kZWYgfTtcbiAgY29uc3Qgd29ya3NwYWNlID0gZGF0YWJyaWNrc1dvcmtzcGFjZSgpO1xuICBtYXJrRGVmYXVsdFdvcmtzcGFjZSh3b3Jrc3BhY2UpO1xuICByZXR1cm4geyAuLi5kZWYsIHdvcmtzcGFjZSB9O1xufVxuXG4vKipcbiAqIEJyYW5kIGZvciBhIHtAbGluayBXb3Jrc3BhY2V9IHRoYXQgYGNyZWF0ZUFnZW50YCBidWlsdCB3aXRoIG5vIGNhbGxlclxuICogb3B0aW9ucywgc28ge0BsaW5rIGJ1aWxkQWdlbnRzfSBtYXkgcmVidWlsZCBpdCB3aXRoIHN0YXJ0dXAtcHJvdmlzaW9uZWRcbiAqIGBleHRyYVNraWxsTW91bnRzYCAoYSBjYWxsZXItc3VwcGxpZWQgd29ya3NwYWNlIGlzIG5ldmVyIHRvdWNoZWQpLlxuICovXG5jb25zdCBkZWZhdWx0V29ya3NwYWNlcyA9IG5ldyBXZWFrU2V0PFdvcmtzcGFjZT4oKTtcblxuLyoqIEJyYW5kIGB3b3Jrc3BhY2VgIGFzIHRoZSBhdXRvLWNyZWF0ZWQgZGVmYXVsdC4gKi9cbmZ1bmN0aW9uIG1hcmtEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZTogV29ya3NwYWNlKTogdm9pZCB7XG4gIGRlZmF1bHRXb3Jrc3BhY2VzLmFkZCh3b3Jrc3BhY2UpO1xufVxuXG4vKiogV2hldGhlciBgd29ya3NwYWNlYCB3YXMgYXV0by1jcmVhdGVkIGJ5IHtAbGluayBjcmVhdGVBZ2VudH0uICovXG5mdW5jdGlvbiBpc0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlOiBXb3Jrc3BhY2UgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHdvcmtzcGFjZSAhPT0gdW5kZWZpbmVkICYmIGRlZmF1bHRXb3Jrc3BhY2VzLmhhcyh3b3Jrc3BhY2UpO1xufVxuXG4vKipcbiAqIEZpbHRlciAvIHJlbmFtZSBvcHRpb25zIGFjY2VwdGVkIGJ5IGV2ZXJ5IHBsdWdpbidzIGAudG9vbGtpdCgpYFxuICogbWV0aG9kLCBkaXJlY3RseSBzb3VyY2VkIGZyb20gQXBwS2l0J3MgcHVibGljIGJldGEgY29udHJhY3QuXG4gKi9cbmV4cG9ydCB0eXBlIFRvb2xraXRPcHRpb25zID0gQXBwS2l0VG9vbGtpdE9wdGlvbnM7XG5cbi8qKlxuICogVG9vbGtpdCBwcm92aWRlciBzaGFwZSBldmVyeSBlbnRyeSBpbiB0aGUge0BsaW5rIE1hc3RyYVBsdWdpbnN9IG1hcFxuICogZXhwb3Nlcy4gSWRlbnRpY2FsIHRvIEFwcEtpdCdzIGBQbHVnaW5Ub29sa2l0UHJvdmlkZXJgIC0gYW55IEFwcEtpdFxuICogcGx1Z2luIHRoYXQgaW1wbGVtZW50cyB0aGUgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYGdldEFnZW50VG9vbHNgICsgYGV4ZWN1dGVBZ2VudFRvb2xgICsgYHRvb2xraXRgKSBpcyByZWFjaGFibGVcbiAqIHRocm91Z2ggdGhpcyBzdXJmYWNlIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHtcbiAgLyoqXG4gICAqIFJldHVybnMgYSBNYXN0cmEtc2hhcGVkIHRvb2xzIHJlY29yZCBhZGFwdGVkIGZyb20gdGhlIHBsdWdpbidzXG4gICAqIGFnZW50IHRvb2xzLiBFYWNoIHRvb2wgZGlzcGF0Y2hlcyBiYWNrIHRocm91Z2ggdGhlIHBsdWdpbidzXG4gICAqIGBleGVjdXRlQWdlbnRUb29sYCBzbyBPQk8gYXV0aCBhbmQgdGVsZW1ldHJ5IHNwYW5zIHN0YXkgaW50YWN0LlxuICAgKi9cbiAgdG9vbGtpdChvcHRzPzogVG9vbGtpdE9wdGlvbnMpOiBNYXN0cmFUb29scyB8IFByb21pc2U8TWFzdHJhVG9vbHM+O1xufVxuXG4vKipcbiAqIFBsdWdpbiBtYXAgaGFuZGVkIHRvIHRoZSBmdW5jdGlvbiBmb3JtIG9mXG4gKiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9uLnRvb2xzfS4gTWlycm9ycyBBcHBLaXQncyBgUGx1Z2luc2BcbiAqIHR5cGUgZXhhY3RseTogYSBzdHJpbmcta2V5ZWQgcmVjb3JkIHdoZXJlIGV2ZXJ5IHZhbHVlIGV4cG9zZXNcbiAqIGAudG9vbGtpdChvcHRzKWAuXG4gKlxuICogSW1wbGVtZW50ZWQgYXMgYSBydW50aW1lIFByb3h5IHRoYXQgYXV0by1kaXNjb3ZlcnMgYW55IHJlZ2lzdGVyZWRcbiAqIEFwcEtpdCBwbHVnaW4gaW1wbGVtZW50aW5nIHRoZSBzdGFuZGFyZCBgVG9vbFByb3ZpZGVyYCBpbnRlcmZhY2VcbiAqIChgYW5hbHl0aWNzYCwgYGZpbGVzYCwgYGxha2ViYXNlYCwgYGdlbmllYCwgcGx1cyBhbnkgdGhpcmQtcGFydHlcbiAqIHBsdWdpbiB0aGF0IGRvZXMgdGhlIHNhbWUpLiBVbmtub3duIG5hbWVzIHJlc29sdmUgdG8gYHVuZGVmaW5lZGBcbiAqIGF0IHJ1bnRpbWUsIHNvIGd1YXJkIHdpdGggYD8uYCBhbmQgYD8/IHt9YCB3aGVuIHNwcmVhZGluZyBmcm9tIGFcbiAqIHBsdWdpbiB0aGF0IG1heSBub3QgYmUgcmVnaXN0ZXJlZCBpbiBldmVyeSBlbnZpcm9ubWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiLFxuICogICBhc3luYyB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgcmV0dXJuIHtcbiAqICAgICAgIC4uLihhd2FpdCBwbHVnaW5zLmFuYWx5dGljcy50b29sa2l0KCkpLFxuICogICAgICAgLi4uKGF3YWl0IHBsdWdpbnMuZmlsZXMudG9vbGtpdCh7IG9ubHk6IFtcInVwbG9hZHMucmVhZFwiXSB9KSksXG4gKiAgICAgICBnZXRfd2VhdGhlcjogdG9vbCh7XG4gKiAgICAgICAgIGRlc2NyaXB0aW9uOiBcIldlYXRoZXJcIixcbiAqICAgICAgICAgc2NoZW1hOiB6Lm9iamVjdCh7IGNpdHk6IHouc3RyaW5nKCkgfSksXG4gKiAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IGNpdHkgfSkgPT4gYFN1bm55IGluICR7Y2l0eX1gLFxuICogICAgICAgfSksXG4gKiAgICAgfTtcbiAqICAgfSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVBsdWdpbnMgPSBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXI+O1xuXG4vKiogRnVuY3Rpb24gZm9ybSBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9uLnRvb2xzfS4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVRvb2xzRm4gPSAocGx1Z2luczogTWFzdHJhUGx1Z2lucykgPT4gTWFzdHJhVG9vbHMgfCBQcm9taXNlPE1hc3RyYVRvb2xzPjtcblxuLyoqIEZ1bmN0aW9uIGZvcm0gb2Yge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi53b3Jrc3BhY2V9OyBgdW5kZWZpbmVkYCBkaXNhYmxlcyBpdCBmb3IgdGhpcyBhZ2VudC4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYUFnZW50V29ya3NwYWNlUmVzb2x2ZXIgPSAoKSA9PiBXb3Jrc3BhY2UgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBjb2RlLWRlZmluZWQgTWFzdHJhIGFnZW50LiBNaXJyb3JzIHRoZSBzaGFwZSBBcHBLaXQncyBgYWdlbnRzYFxuICogcGx1Z2luIHVzZXMgZm9yIGBBZ2VudERlZmluaXRpb25gLiBUaGUgcmVnaXN0cnkga2V5IHVuZGVyXG4gKiBgY29uZmlnLmFnZW50c2AgaXMgdGhlIGBhZ2VudElkYCB0aGUgY2xpZW50IHN0cmVhbXMgYWdhaW5zdDsgYG5hbWVgXG4gKiBpcyBwdXJlbHkgaW5mb3JtYXRpb25hbCAoZGVmYXVsdHMgdG8gdGhlIGtleSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhQWdlbnREZWZpbml0aW9uPFxuICBUUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd24gPSB1bmtub3duLFxuPiB7XG4gIC8qKiBEaXNwbGF5IG5hbWUgdXNlZCBhcyBgQWdlbnQubmFtZWAuIERlZmF1bHRzIHRvIHRoZSByZWdpc3RyeSBrZXkuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBsb25nLWZvcm0gZGVzY3JpcHRpb247IHN1cmZhY2VkIGFzIGBBZ2VudC5kZXNjcmlwdGlvbmAuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogU3RhdGljIG9yIHJlcXVlc3QtY29udGV4dC1hd2FyZSBzeXN0ZW0gaW5zdHJ1Y3Rpb25zLiAqL1xuICBpbnN0cnVjdGlvbnM6IEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wiaW5zdHJ1Y3Rpb25zXCJdO1xuICAvKiogTmF0aXZlIE1hc3RyYSBzY2hlbWEgdGhhdCB2YWxpZGF0ZXMgYW5kIHR5cGVzIGFwcGxpY2F0aW9uIHJlcXVlc3QgY29udGV4dC4gKi9cbiAgcmVxdWVzdENvbnRleHRTY2hlbWE/OiBBZ2VudENvbmZpZzxcbiAgICBzdHJpbmcsXG4gICAgVG9vbHNJbnB1dCxcbiAgICB1bmRlZmluZWQsXG4gICAgVFJlcXVlc3RDb250ZXh0XG4gID5bXCJyZXF1ZXN0Q29udGV4dFNjaGVtYVwiXTtcbiAgLyoqXG4gICAqIE1hc3RyYS1uYXRpdmUgcGVyLWNhbGwgYXBwcm92YWwgZ2F0ZSBmb3IgdGhpcyBhZ2VudCdzIHRvb2xzLiBTdXBwb3J0cyBhblxuICAgKiBhc3luYyBDbGFzc2lmaWVyLWJhY2tlZCBmdW5jdGlvbjsgdG9vbC1sZXZlbCBhcHByb3ZhbCByZW1haW5zIGF1dGhvcml0YXRpdmUuXG4gICAqL1xuICByZXF1aXJlVG9vbEFwcHJvdmFsPzogQWdlbnRFeGVjdXRpb25PcHRpb25zW1wicmVxdWlyZVRvb2xBcHByb3ZhbFwiXTtcbiAgLyoqXG4gICAqIFBlci1hZ2VudCBtb2RlbCBvdmVycmlkZS5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IGZhbGxzIGJhY2sgdG8gdGhlIHdvcmtzcGFjZVxuICAgKiAgIGAvc2VydmluZy1lbmRwb2ludHNgIHJlc29sdmVyIHRoYXQge0BsaW5rIGJ1aWxkTW9kZWx9IGNvbmZpZ3VyZXNcbiAgICogICBmcm9tIHRoZSBwZXItcmVxdWVzdCBgV29ya3NwYWNlQ2xpZW50YC5cbiAgICogLSBgc3RyaW5nYDogc2hvcnRoYW5kIGZvciBcInVzZSB0aGUgZGVmYXVsdCByZXNvbHZlciBidXQgc3dhcCB0aGVcbiAgICogICBgbW9kZWxJZGBcIiAoZS5nLiBgXCJkYXRhYnJpY2tzLW1ldGEtbGxhbWEtMy0zLTcwYi1pbnN0cnVjdFwiYCkuXG4gICAqIC0gQW55IG90aGVyIE1hc3RyYSBgRHluYW1pY0FyZ3VtZW50PE1hc3RyYU1vZGVsQ29uZmlnPmA6IHBhc3NlZFxuICAgKiAgIHN0cmFpZ2h0IHRocm91Z2ggdG8gYEFnZW50Lm1vZGVsYC4gVXNlIHRoaXMgd2hlbiB5b3UgbmVlZCBmdWxsXG4gICAqICAgY29udHJvbCBvdmVyIGF1dGggb3IgcHJvdmlkZXJJZC5cbiAgICovXG4gIG1vZGVsPzogQWdlbnRDb25maWc8c3RyaW5nLCBUb29sc0lucHV0LCB1bmRlZmluZWQsIFRSZXF1ZXN0Q29udGV4dD5bXCJtb2RlbFwiXSB8IHN0cmluZztcbiAgLyoqXG4gICAqIFBlci1hZ2VudCB0b29sIHJlY29yZC4gRWl0aGVyIGEgcGxhaW4gbWFwIG9yIGEgY2FsbGJhY2sgdGhhdFxuICAgKiByZWNlaXZlcyB0aGUgdHlwZWQge0BsaW5rIE1hc3RyYVBsdWdpbnN9IHNpYmxpbmctcGx1Z2luIGluZGV4IGFuZFxuICAgKiByZXR1cm5zIGEgbWFwLiBUaGUgY2FsbGJhY2sgcnVucyBleGFjdGx5IG9uY2UgYXQgYWdlbnQgc2V0dXA7IHRoZVxuICAgKiByZXN1bHQgaXMgY2FjaGVkIGZvciB0aGUgYWdlbnQncyBsaWZldGltZS5cbiAgICovXG4gIHRvb2xzPzogTWFzdHJhVG9vbHMgfCBNYXN0cmFUb29sc0ZuO1xuICAvKipcbiAgICogUGVyLWFnZW50IHNlbWFudGljIHJlY2FsbCAoUGdWZWN0b3IpIG92ZXJyaWRlLiBDYXNjYWRlcyBmcm9tXG4gICAqIGBjb25maWcubWVtb3J5YDsgdGhlIGFnZW50IHZhbHVlIHdpbnMgd2hlbiBzZXQuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBpbmhlcml0IGBjb25maWcubWVtb3J5YC4gV2hlbiB0aGF0J3NcbiAgICogICBlbmFibGVkLCB0aGUgYWdlbnQgKipzaGFyZXMgdGhlIHBsdWdpbi1sZXZlbCBzaW5nbGV0b24gYFBnVmVjdG9yYFxuICAgKiAgIGluc3RhbmNlKiogKGNyb3NzLWFnZW50IHNlbWFudGljIHJlY2FsbCBhY3Jvc3MgdGhlIHNhbWUgaW5kZXgpLlxuICAgKiAtIGBmYWxzZWA6IGRpc2FibGUgc2VtYW50aWMgcmVjYWxsIGZvciB0aGlzIGFnZW50IG9ubHkuXG4gICAqIC0gYHRydWVgOiBlbmFibGUgdXNpbmcgdGhlIHNoYXJlZCBzaW5nbGV0b24gKHNhbWUgYXMgZGVmYXVsdCB3aGVuXG4gICAqICAgcGx1Z2luIG1lbW9yeSBpcyBlbmFibGVkOyB1c2VmdWwgdG8gb3B0IGluIHdoZW4gcGx1Z2luIGRpc2FibGVkKS5cbiAgICogLSB7QGxpbmsgTWFzdHJhTWVtb3J5Q29uZmlnfSBvYmplY3Q6IGRlZGljYXRlZCBgUGdWZWN0b3JgIGZvciB0aGlzXG4gICAqICAgYWdlbnQgKHByaXZhdGUgcmVjYWxsIGluZGV4KS4gQnlwYXNzZXMgdGhlIHNoYXJlZCBzaW5nbGV0b24uXG4gICAqL1xuICBtZW1vcnk/OiBib29sZWFuIHwgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGU7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgdGhyZWFkL21lc3NhZ2Ugc3RvcmFnZSAoYFBvc3RncmVzU3RvcmVgKSBvdmVycmlkZS5cbiAgICogQ2FzY2FkZXMgZnJvbSBgY29uZmlnLnN0b3JhZ2VgOyB0aGUgYWdlbnQgdmFsdWUgd2lucyB3aGVuIHNldC5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IGluaGVyaXQgYGNvbmZpZy5zdG9yYWdlYC4gV2hlbiB0aGF0J3NcbiAgICogICBlbmFibGVkLCB0aGUgYWdlbnQgZ2V0cyBpdHMgKipvd24gcGVyLWFnZW50IGBQb3N0Z3Jlc1N0b3JlYCoqXG4gICAqICAga2V5ZWQgYnkge0BsaW5rIGFnZW50U3RvcmFnZVNjaGVtYU5hbWV9IHNvIHRocmVhZHMgYW5kXG4gICAqICAgbWVzc2FnZXMgc3RheSBpc29sYXRlZCBiZXR3ZWVuIGFnZW50cyBpbiB0aGUgc2FtZSBkYXRhYmFzZS5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIHN0b3JhZ2UgZm9yIHRoaXMgYWdlbnQgb25seSAocHVyZWx5IGluLW1lbW9yeSkuXG4gICAqIC0gYHRydWVgOiBlbmFibGUgd2l0aCB0aGUgcGVyLWFnZW50IGRlZmF1bHQgc2NoZW1hLlxuICAgKiAtIHtAbGluayBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGV9IG9iamVjdDogZGVkaWNhdGVkXG4gICAqICAgYFBvc3RncmVzU3RvcmVgIGNvbmZpZyAoY3VzdG9tIHNjaGVtYSwgY29ubmVjdGlvbiwgZXRjLikuXG4gICAqL1xuICBzdG9yYWdlPzogYm9vbGVhbiB8IE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZTtcbiAgLyoqXG4gICAqIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfSBmb3IgdGhpcyBhZ2VudCAoZmlsZXN5c3RlbSwgc2FuZGJveCwgb3Igb3RoZXJcbiAgICogcHJvdmlkZXJzKS4gQXNzaXN0YW50IHNraWxscyBmcm9tIERhdGFicmlja3Mgd29ya3NwYWNlIHBhdGhzIGFyZSB3aXJlZFxuICAgKiB2aWEge0BsaW5rIGRhdGFicmlja3NXb3Jrc3BhY2V9LlxuICAgKi9cbiAgd29ya3NwYWNlPzogV29ya3NwYWNlIHwgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlcjtcbn1cblxuLyoqIFR5cGUtZXJhc2VkIHJlZ2lzdHJ5IG1lbWJlcjsgZWFjaCBkZWZpbml0aW9uIHJldGFpbnMgdHlwaW5nIGF0IGBjcmVhdGVBZ2VudGAuICovXG5leHBvcnQgdHlwZSBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24gPSBNYXN0cmFBZ2VudERlZmluaXRpb248YW55PjtcblxuLyoqXG4gKiBEaXN0cmlidXRpdmUgYE9taXRgIHNvIHVuaW9ucyBpbiBgUG9zdGdyZXNTdG9yZUNvbmZpZ2AgL1xuICogYFBnVmVjdG9yQ29uZmlnYCBrZWVwIHRoZWlyIGRpc2NyaW1pbmFudHMgYWZ0ZXIgdGhlIG92ZXJyaWRlIHR5cGVzXG4gKiBzdHJpcCBgaWRgLiBUaGUgYnVpbHQtaW4gYE9taXRgIGNvbGxhcHNlcyB1bmlvbnMgdG8gb25lIHNoYXBlIHdpdGhcbiAqIGNvbW1vbiBmaWVsZHMgb25seSwgd2hpY2ggbG9zZXMgdGhlIGNvbm5lY3Rpb24tc3R5bGUgZGlzY3JpbWluYW50cy5cbiAqL1xudHlwZSBEaXN0cmlidXRpdmVPbWl0PFQsIEsgZXh0ZW5kcyBrZXlvZiBuZXZlcj4gPSBUIGV4dGVuZHMgdW5rbm93biA/IE9taXQ8VCwgSz4gOiBuZXZlcjtcblxuLyoqXG4gKiBgUG9zdGdyZXNTdG9yZUNvbmZpZ2AgbWludXMgYGlkYCAtIHBlci1hZ2VudCBvdmVycmlkZXMgYWNjZXB0IGFueVxuICogTWFzdHJhLXN1cHBvcnRlZCBzdG9yYWdlIHNoYXBlLiBgaWRgIGlzIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5XG4gKiBmcm9tIHRoZSBhZ2VudCByZWdpc3RyeSBrZXkgc28gdHJhY2VzIHN0YXkgc3RhYmxlLlxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGUgPSBEaXN0cmlidXRpdmVPbWl0PFBvc3RncmVzU3RvcmVDb25maWcsIFwiaWRcIj4gJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBgUGdWZWN0b3JDb25maWdgIG1pbnVzIGBpZGAgLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFjY2VwdCBhbnlcbiAqIE1hc3RyYS1zdXBwb3J0ZWQgdmVjdG9yIHNoYXBlLiBgaWRgIGlzIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5XG4gKiBmcm9tIHRoZSBhZ2VudCByZWdpc3RyeSBrZXkuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlID0gRGlzdHJpYnV0aXZlT21pdDxQZ1ZlY3RvckNvbmZpZywgXCJpZFwiPiAmIHtcbiAgaWQ/OiBzdHJpbmc7XG59O1xuXG4vKiogSG93IGFuIGFnZW50J3MgdW5waW5uZWQgbW9kZWwgaXMgcmVzb2x2ZWQuICovXG5leHBvcnQgdHlwZSBBZ2VudERlZmF1bHRNb2RlbCA9XG4gIHsga2luZDogXCJhdXRvXCIgfSB8IHsga2luZDogXCJjb25maWd1cmVkXCI7IG1vZGVsOiBzdHJpbmcgfSB8IHsga2luZDogXCJkeW5hbWljXCIgfTtcblxuLyoqIE91dHB1dCBvZiB7QGxpbmsgYnVpbGRBZ2VudHN9OiByZXNvbHZlZCBhZ2VudHMgcGx1cyB0aGUgZGVmYXVsdCBpZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbHRBZ2VudHMge1xuICBhZ2VudHM6IFJlY29yZDxzdHJpbmcsIEFnZW50PjtcbiAgZGVmYXVsdEFnZW50SWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIERlZmF1bHQgbW9kZWwgaW50ZW50IHBlciBhZ2VudCBpZC4gQW4gdW5jb25maWd1cmVkIGFnZW50IGlzIGBcImF1dG9cImAgYW5kXG4gICAqIHJlc29sdmVzIHRoZSBoaWdoZXN0LXJhbmtlZCBsaXZlIGVuZHBvaW50OyBhIHN0cmluZyBpcyBgXCJjb25maWd1cmVkXCJgOyBhXG4gICAqIGN1c3RvbSBmdW5jdGlvbiBpcyBgXCJkeW5hbWljXCJgLiBDb25zdW1lZCBieSB0aGUgcGx1Z2luJ3NcbiAgICogYEdFVCAvZGVmYXVsdC1tb2RlbGAgcm91dGUuXG4gICAqL1xuICBkZWZhdWx0TW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudERlZmF1bHRNb2RlbD47XG4gIC8qKlxuICAgKiBBbWJpZW50IHRvb2xzIHNoYXJlZCBhY3Jvc3MgZXZlcnkgYWdlbnQgKHRoZSBidWlsdC1pbiBzeXN0ZW0gdG9vbHNcbiAgICogc3ByZWFkIHdpdGggYGNvbmZpZy50b29sc2ApLiBTdXJmYWNlZCBzbyB0aGUgb3B0aW9uYWwgTUNQIHNlcnZlclxuICAgKiBjYW4gcmUtZXhwb3NlIHRoZW0gd2hlbiB7QGxpbmsgTWFzdHJhTWNwQ29uZmlnLnRvb2xzfSBpcyBlbmFibGVkLlxuICAgKi9cbiAgYW1iaWVudFRvb2xzOiBNYXN0cmFUb29scztcbn1cblxuLyoqIEZhbGxiYWNrIGFnZW50IGlkIHVzZWQgd2hlbiBgY29uZmlnLmFnZW50c2AgaXMgb21pdHRlZCBlbnRpcmVseS4gKi9cbmV4cG9ydCBjb25zdCBGQUxMQkFDS19BR0VOVF9JRCA9IFwiZGVmYXVsdFwiO1xuXG4vKipcbiAqIERlZmF1bHQgcGVyLXR1cm4gc3RlcCBjZWlsaW5nIGFwcGxpZWQgdG8gZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudFxuICogd2hlbiB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLmFnZW50TWF4U3RlcHN9IGlzIHVuc2V0LiBTaXplZCB0b1xuICogZml0IGEgZGVjb21wb3NlZCBHZW5pZSB0dXJuIChncm91bmRpbmcgKyBzZXZlcmFsIGBhc2tfZ2VuaWVgXG4gKiBjYWxscyArIGBwcmVwYXJlX2NoYXJ0YCBwZXIgZGF0YXNldCArIHRoZSBmaW5hbC10ZXh0IHJlcGx5KSB3aXRoXG4gKiBoZWFkcm9vbSBmb3IgdGhlIG1vZGVsIHRvIGNoYWluIGEgY291cGxlIG9mIGZvbGxvdy11cHMgYmVmb3JlXG4gKiBhbnN3ZXJpbmcgLSB3ZWxsIGFib3ZlIE1hc3RyYSdzIG93biBgYWdlbnQuZ2VuZXJhdGVgIGRlZmF1bHQgb2ZcbiAqIDUsIHdoaWNoIHdvdWxkIGN1dCBtdWx0aS1zdGVwIG9yY2hlc3RyYXRpb24gb2ZmIG1pZC1sb29wLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMgPSAyNTtcblxuY29uc3QgRVZFTlRFRF9DT05TVFJVQ1RPUl9NT0RFTCA9IHtcbiAgc3BlY2lmaWNhdGlvblZlcnNpb246IFwidjNcIixcbiAgcHJvdmlkZXI6IFwiZGJ4LXRvb2xzXCIsXG4gIG1vZGVsSWQ6IFwiZGVmZXJyZWRcIixcbiAgc3VwcG9ydGVkVXJsczoge30sXG4gIGFzeW5jIGRvR2VuZXJhdGUoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGVmZXJyZWQgZXZlbnRlZCBjb25zdHJ1Y3RvciBtb2RlbCBtdXN0IG5vdCBleGVjdXRlXCIpO1xuICB9LFxuICBhc3luYyBkb1N0cmVhbSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWZlcnJlZCBldmVudGVkIGNvbnN0cnVjdG9yIG1vZGVsIG11c3Qgbm90IGV4ZWN1dGVcIik7XG4gIH0sXG59IGFzIG5ldmVyO1xuXG4vKipcbiAqIGBFdmVudGVkQWdlbnRgIGRlbGVnYXRlcyBtb2RlbCByZXNvbHV0aW9uIHRvIHRoZSB3cmFwcGVkIGFnZW50IGF0IGV4ZWN1dGlvblxuICogdGltZSwgYnV0IGl0cyBjb25zdHJ1Y3RvciBhbHNvIHByb2JlcyBhbiB1bnR5cGVkIGBfX21vZGVsYCBzbG90IGFuZCBvdGhlcndpc2VcbiAqIGNhbGxzIGBnZXRNb2RlbCgpYCB3aXRoIGFuIGVtcHR5IHJlcXVlc3QgY29udGV4dC4gVGVtcG9yYXJpbHkgZmlsbGluZyB0aGF0XG4gKiBwcm9iZSBhdm9pZHMgYW4gZWFnZXIgc2VydmljZS1wcmluY2lwYWwgbG9va3VwIHdoaWxlIHByZXNlcnZpbmcgdGhlIHdyYXBwZWRcbiAqIGFnZW50J3MgcmVxdWVzdC1zY29wZWQgbW9kZWwgcmVzb2x2ZXIgZm9yIHJlYWwgdHVybnMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhY2tncm91bmRBZ2VudChhZ2VudDogQWdlbnQsIG1heFN0ZXBzOiBudW1iZXIpOiBBZ2VudCB7XG4gIGNvbnN0IG1vZGVsU2xvdCA9IFwiX19tb2RlbFwiO1xuICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhZ2VudCwgbW9kZWxTbG90KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFnZW50LCBtb2RlbFNsb3QsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IEVWRU5URURfQ09OU1RSVUNUT1JfTU9ERUwsXG4gIH0pO1xuICB0cnkge1xuICAgIHJldHVybiBjcmVhdGVFdmVudGVkQWdlbnQoeyBhZ2VudCwgbWF4U3RlcHMgfSkgYXMgdW5rbm93biBhcyBBZ2VudDtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoZGVzY3JpcHRvcikgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFnZW50LCBtb2RlbFNsb3QsIGRlc2NyaXB0b3IpO1xuICAgIGVsc2UgZGVsZXRlIChhZ2VudCBhcyBBZ2VudCAmIHsgX19tb2RlbD86IHVua25vd24gfSkuX19tb2RlbDtcbiAgfVxufVxuXG5jb25zdCBGQUxMQkFDS19BR0VOVF9JTlNUUlVDVElPTlMgPSBgWW91IGFyZSBhIGRhdGEgYW5hbHlzdC4gVGhlIHVzZXIgd2lsbCBhc2sgcXVlc3Rpb25zIGFib3V0XG5idXNpbmVzcyBtZXRyaWNzIGFuZCBtYXkgc2hhcmUgcGVyc29uYWwgcHJlZmVyZW5jZXMgeW91IHNob3VsZCByZW1lbWJlciBhY3Jvc3MgdHVybnMuXG5cblJ1bGVzOlxuXG4xLiBRdW90ZSBudW1iZXJzIGV4YWN0bHkuIE5ldmVyIGludmVudCBkYXRhLlxuMi4gV2hlbiB0aGUgdXNlciBzdGF0ZXMgYSBwcmVmZXJlbmNlIG9yIGR1cmFibGUgZmFjdCBhYm91dCB0aGVtc2VsdmVzXG4gICAoXCJJJ20gaW4gRVUgc28gdXNlIEVVUlwiLCBcImFsd2F5cyBzaG93IG1lIHRoZSBTUUxcIiksIGFja25vd2xlZGdlIHRoYXRcbiAgIHlvdSB3aWxsIHJlbWVtYmVyIGl0LlxuMy4gSWYgeW91IGRvbid0IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGFuc3dlciwgYXNrIGEgY2xhcmlmeWluZ1xuICAgcXVlc3Rpb24gaW5zdGVhZCBvZiBndWVzc2luZy5gO1xuXG4vKiogVG9vbC1jYWxsIGd1aWRhbmNlIGFwcGVuZGVkIHRvIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnQuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9UT09MX1dPUktGTE9XX0lOU1RSVUNUSU9OUyA9IFtcbiAgXCJUb29sIHdvcmtmbG93OlwiLFxuICBcIldoZW4gdGhlIGFjdGl2ZSBtb2RlbCBzdXBwb3J0cyBpdCwgY2FsbCBtdWx0aXBsZSB0b29scyBpbiB0aGUgc2FtZSB0dXJuIHdoZW4gdGhlaXIgaW5wdXRzIGFyZSBpbmRlcGVuZGVudCwgaW5jbHVkaW5nIG11bHRpcGxlIGNhbGxzIHRvIHRoZSBzYW1lIHRvb2wuXCIsXG4gIFwiS2VlcCBjYWxscyBzZXF1ZW50aWFsIHdoZW4gYSBsYXRlciBpbnB1dCBkZXBlbmRzIG9uIGFuIGVhcmxpZXIgcmVzdWx0IG9yIHdoZW4gY2FsbHMgbXV0YXRlIHRoZSBzYW1lIHJlc291cmNlLlwiLFxuXS5qb2luKFwiXFxuXCIpO1xuXG4vKiogSHlicmlkIHJvdXRpbmcgZ3VpZGFuY2UgYXBwZW5kZWQgYWZ0ZXIgTWFzdHJhJ3MgZ2VuZXJhdGVkIENvZGUgTW9kZSBjb250cmFjdC4gKi9cbmV4cG9ydCBjb25zdCBDT0RFX01PREVfUk9VVElOR19JTlNUUlVDVElPTlMgPSBbXG4gIFwiVG9vbCByb3V0aW5nOlwiLFxuICBcIlRoZSBDb2RlIE1vZGUgY29udHJhY3QgYWJvdmUgZXhwbGFpbnMgaG93IHRvIHVzZSBleGVjdXRlX3R5cGVzY3JpcHQgd2hlbiBzZWxlY3RlZDsgaXQgZG9lcyBub3QgcmVxdWlyZSB1c2luZyBDb2RlIE1vZGUgZm9yIGV2ZXJ5IHRvb2wgY2FsbC5cIixcbiAgXCJDYWxsIGEgZGlyZWN0bHkgZXhwb3NlZCB0b29sIGRpcmVjdGx5IHdoZW4gb25lIG9yZGluYXJ5IGNhbGwgaXMgc3VmZmljaWVudC5cIixcbiAgXCJDYWxsIGluZGVwZW5kZW50IHRvb2xzIGRpcmVjdGx5IGluIHBhcmFsbGVsIHdoZW4gdGhlaXIgcmVzdWx0cyBkbyBub3QgcmVxdWlyZSBjb2RlLXNpZGUgdHJhbnNmb3JtYXRpb24uXCIsXG4gIFwiS2VlcCBkZXBlbmRlbnQgY2FsbHMgYXMgZGlyZWN0IHNlcXVlbnRpYWwgdG9vbCBjYWxscyB3aGVuIGNvZGUtc2lkZSB0cmFuc2Zvcm1hdGlvbiBpcyB1bm5lY2Vzc2FyeS5cIixcbiAgXCJVc2UgZXhlY3V0ZV90eXBlc2NyaXB0IHdoZW4gdGhlIHVzZXIgZXhwbGljaXRseSByZXF1ZXN0cyBDb2RlIE1vZGUgb3Igd2hlbiBjb2RlIGlzIHVzZWZ1bCBmb3IgbG9vcHMsIGZpbHRlcmluZywgam9pbnMsIHJhbmRvbSBzZWxlY3Rpb24sIGFnZ3JlZ2F0aW9uLCBhcml0aG1ldGljLCBkeW5hbWljIGZhbi1vdXQsIG9yIGtlZXBpbmcgc3Vic3RhbnRpYWwgaW50ZXJtZWRpYXRlIHJlc3VsdHMgb3V0IG9mIG1vZGVsIGNvbnRleHQuXCIsXG4gIFwiRG8gbm90IHdyYXAgYSBzaW5nbGUgb3JkaW5hcnkgdG9vbCBjYWxsIGluIGV4ZWN1dGVfdHlwZXNjcmlwdC5cIixcbl0uam9pbihcIlxcblwiKTtcblxuLyoqXG4gKiBTdHlsZSBndWFyZHJhaWxzIGFwcGVuZGVkIHRvIGV2ZXJ5IGFnZW50J3MgYGluc3RydWN0aW9uc2AgdG8gY3VyYlxuICogY29tbW9uIExMTS1pc21zIChlbSBkYXNoZXMsIGVtb2ppcywgc3ljb3BoYW50aWMgb3BlbmVycywgZXhjZXNzaXZlXG4gKiBoZWRnaW5nLCB0aHJvd2F3YXkgY2xvc2VycykuIEFwcGVuZGVkIHJhdGhlciB0aGFuIHByZXBlbmRlZCBzbyB0aGVcbiAqIGFnZW50J3Mgcm9sZS9jb250ZXh0IGNvbWVzIGZpcnN0OyB0aGUgbW9kZWwncyByZWNlbmN5IGJpYXMgdGhlblxuICogaGVscHMgdGhlIHN0eWxlIHJ1bGVzIGRvbWluYXRlIHRoZSByZXNwb25zZSBzdXJmYWNlLlxuICpcbiAqIE92ZXJyaWRlIGdsb2JhbGx5IHZpYSB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zfVxuICogKHBhc3MgYGZhbHNlYCB0byBkaXNhYmxlIGVudGlyZWx5LCBvciBhIHN0cmluZyB0byByZXBsYWNlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RZTEVfSU5TVFJVQ1RJT05TID0gW1xuICBcIk91dHB1dCBzdHlsZTpcIixcbiAgXCJcIixcbiAgXCJVc2UgbWFya2Rvd24gZm9ybWF0dGluZywgaW5jbHVkaW5nIGhlYWRpbmdzLCBsaXN0cywgYW5kIGNvZGUgYmxvY2tzLlwiLFxuICBcIkF2b2lkIGxpc3RzIGFuZCBoZWFkZXJzIGZvciBzaG9ydCByZXBsaWVzLlwiLFxuICBcIlBsYWluIHByb3NlLlwiLFxuICBUWVBPR1JBUEhZX1JVTEUsXG4gIFwiU2tpcCBvcGVuZXJzIGxpa2UgJ0dyZWF0IHF1ZXN0aW9uJywgJ0Fic29sdXRlbHknLCBhbmQgJ0knZCBiZSBoYXBweSB0byBoZWxwJy5cIixcbiAgXCJTa2lwIGNsb3NlcnMgbGlrZSAnTGV0IG1lIGtub3cgaWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucycuXCIsXG4gIFwiU2tpcCBzZWxmLWRpc2NsYWltZXJzIGxpa2UgJ0kgc2hvdWxkIG1lbnRpb24nIGFuZCAnSXQncyBpbXBvcnRhbnQgdG8gbm90ZScuXCIsXG4gIFwiQW5zd2VyIGRpcmVjdGx5LlwiLFxuICBcIkRvIG5vdCBpbmNsdWRlIGEgcHJlYW1ibGUgYmVmb3JlIHRoZSBhY3R1YWwgYW5zd2VyLlwiLFxuICBcIlVzZSBsaXN0cyBhbmQgaGVhZGVycyBvbmx5IHdoZW4gdGhleSBjbGFyaWZ5IGEgbXVsdGktcGFydCBhbnN3ZXIuXCIsXG5dLmpvaW4oXCJcXG5cIik7XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgc3R5bGUgYmxvY2sgdG8gYXBwZW5kIHRvIGV2ZXJ5IGFnZW50J3MgaW5zdHJ1Y3Rpb25zLlxuICogUmV0dXJucyBgbnVsbGAgd2hlbiB0aGUgY2FsbGVyIG9wdGVkIG91dCAoYHN0eWxlSW5zdHJ1Y3Rpb25zOiBmYWxzZWApLlxuICovXG5mdW5jdGlvbiByZXNvbHZlU3R5bGVJbnN0cnVjdGlvbnMoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKGNvbmZpZy5zdHlsZUluc3RydWN0aW9ucyA9PT0gZmFsc2UpIHJldHVybiBudWxsO1xuICBpZiAodHlwZW9mIGNvbmZpZy5zdHlsZUluc3RydWN0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBjb25maWcuc3R5bGVJbnN0cnVjdGlvbnM7XG4gIH1cblxuICByZXR1cm4gREVGQVVMVF9TVFlMRV9JTlNUUlVDVElPTlM7XG59XG5cbi8qKiBBcHBlbmQgc2hhcmVkIHdvcmtmbG93IGFuZCBzdHlsZSBibG9ja3Mgd2l0aG91dCBuYXJyb3dpbmcgTWFzdHJhJ3MgaW5zdHJ1Y3Rpb24gc2hhcGVzLiAqL1xuZnVuY3Rpb24gYXBwZW5kRGVmYXVsdEluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBBZ2VudEluc3RydWN0aW9ucyxcbiAgc3R5bGU6IHN0cmluZyB8IG51bGwsXG4pOiBBZ2VudEluc3RydWN0aW9ucyB7XG4gIGNvbnN0IHN1ZmZpeCA9IHN0eWxlXG4gICAgPyBgJHtERUZBVUxUX1RPT0xfV09SS0ZMT1dfSU5TVFJVQ1RJT05TfVxcblxcbiR7c3R5bGV9YFxuICAgIDogREVGQVVMVF9UT09MX1dPUktGTE9XX0lOU1RSVUNUSU9OUztcbiAgaWYgKHR5cGVvZiBpbnN0cnVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gYCR7aW5zdHJ1Y3Rpb25zLnRyaW1FbmQoKX1cXG5cXG4ke3N1ZmZpeH1gO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGluc3RydWN0aW9ucykpIHtcbiAgICBpZiAoaW5zdHJ1Y3Rpb25zLmV2ZXJ5KChpbnN0cnVjdGlvbikgPT4gdHlwZW9mIGluc3RydWN0aW9uID09PSBcInN0cmluZ1wiKSkge1xuICAgICAgcmV0dXJuIFsuLi5pbnN0cnVjdGlvbnMsIHN1ZmZpeF0gYXMgQWdlbnRJbnN0cnVjdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBbLi4uaW5zdHJ1Y3Rpb25zLCB7IHJvbGU6IFwic3lzdGVtXCIsIGNvbnRlbnQ6IHN1ZmZpeCB9XSBhcyBBZ2VudEluc3RydWN0aW9ucztcbiAgfVxuICByZXR1cm4gW2luc3RydWN0aW9ucywgeyByb2xlOiBcInN5c3RlbVwiLCBjb250ZW50OiBzdWZmaXggfV0gYXMgQWdlbnRJbnN0cnVjdGlvbnM7XG59XG5cbi8qKlxuICogQ29tcG9zZSBzdGF0aWMgb3IgcmVxdWVzdC1jb250ZXh0LWF3YXJlIGluc3RydWN0aW9ucyB3aXRoIHNoYXJlZCB3b3JrZmxvd1xuICogYW5kIHN0eWxlIGd1aWRhbmNlIHdoaWxlIHByZXNlcnZpbmcgTWFzdHJhJ3MgbmF0aXZlIGdlbmVyaWMgaW5mZXJlbmNlLlxuICovXG5mdW5jdGlvbiBjb21wb3NlSW5zdHJ1Y3Rpb25zPFRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93bj4oXG4gIGFnZW50SW5zdHJ1Y3Rpb25zOiBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcImluc3RydWN0aW9uc1wiXSxcbiAgc3R5bGU6IHN0cmluZyB8IG51bGwsXG4gIHJlc29sdmVDb2RlTW9kZT86IENvZGVNb2RlUmVzb2x2ZXI8VFJlcXVlc3RDb250ZXh0Pixcbik6IEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wiaW5zdHJ1Y3Rpb25zXCJdIHtcbiAgY29uc3QgYXBwZW5kID0gKGluc3RydWN0aW9uczogQWdlbnRJbnN0cnVjdGlvbnMsIGNvZGVNb2RlSW5zdHJ1Y3Rpb25zPzogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgY29tcG9zZWQgPSBhcHBlbmREZWZhdWx0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucywgc3R5bGUpO1xuICAgIHJldHVybiBjb2RlTW9kZUluc3RydWN0aW9uc1xuICAgICAgPyBhcHBlbmRJbnN0cnVjdGlvbkJsb2NrKFxuICAgICAgICAgIGNvbXBvc2VkLFxuICAgICAgICAgIGAke2NvZGVNb2RlSW5zdHJ1Y3Rpb25zfVxcblxcbiR7Q09ERV9NT0RFX1JPVVRJTkdfSU5TVFJVQ1RJT05TfWAsXG4gICAgICAgIClcbiAgICAgIDogY29tcG9zZWQ7XG4gIH07XG4gIGlmICh0eXBlb2YgYWdlbnRJbnN0cnVjdGlvbnMgIT09IFwiZnVuY3Rpb25cIiAmJiAhcmVzb2x2ZUNvZGVNb2RlKSB7XG4gICAgcmV0dXJuIGFwcGVuZChhZ2VudEluc3RydWN0aW9ucykgYXMgQWdlbnRDb25maWc8XG4gICAgICBzdHJpbmcsXG4gICAgICBUb29sc0lucHV0LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgVFJlcXVlc3RDb250ZXh0XG4gICAgPltcImluc3RydWN0aW9uc1wiXTtcbiAgfVxuICByZXR1cm4gKGFzeW5jIChhcmdzKSA9PiB7XG4gICAgY29uc3QgW2luc3RydWN0aW9ucywgY29kZU1vZGVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdHlwZW9mIGFnZW50SW5zdHJ1Y3Rpb25zID09PSBcImZ1bmN0aW9uXCIgPyBhZ2VudEluc3RydWN0aW9ucyhhcmdzKSA6IGFnZW50SW5zdHJ1Y3Rpb25zLFxuICAgICAgcmVzb2x2ZUNvZGVNb2RlPy4oYXJncyksXG4gICAgXSk7XG4gICAgcmV0dXJuIGFwcGVuZChpbnN0cnVjdGlvbnMsIGNvZGVNb2RlPy5pbnN0cnVjdGlvbnMpO1xuICB9KSBhcyBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcImluc3RydWN0aW9uc1wiXTtcbn1cblxuLyoqIEFwcGVuZCBvbmUgc3lzdGVtIGluc3RydWN0aW9uIGJsb2NrIHdoaWxlIHByZXNlcnZpbmcgTWFzdHJhJ3MgYWNjZXB0ZWQgc2hhcGVzLiAqL1xuZnVuY3Rpb24gYXBwZW5kSW5zdHJ1Y3Rpb25CbG9jayhpbnN0cnVjdGlvbnM6IEFnZW50SW5zdHJ1Y3Rpb25zLCBibG9jazogc3RyaW5nKTogQWdlbnRJbnN0cnVjdGlvbnMge1xuICBpZiAodHlwZW9mIGluc3RydWN0aW9ucyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGAke2luc3RydWN0aW9ucy50cmltRW5kKCl9XFxuXFxuJHtibG9ja31gO1xuICBpZiAoQXJyYXkuaXNBcnJheShpbnN0cnVjdGlvbnMpKSB7XG4gICAgaWYgKGluc3RydWN0aW9ucy5ldmVyeSgoaW5zdHJ1Y3Rpb24pID0+IHR5cGVvZiBpbnN0cnVjdGlvbiA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgIHJldHVybiBbLi4uaW5zdHJ1Y3Rpb25zLCBibG9ja10gYXMgQWdlbnRJbnN0cnVjdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBbLi4uaW5zdHJ1Y3Rpb25zLCB7IHJvbGU6IFwic3lzdGVtXCIsIGNvbnRlbnQ6IGJsb2NrIH1dIGFzIEFnZW50SW5zdHJ1Y3Rpb25zO1xuICB9XG4gIHJldHVybiBbaW5zdHJ1Y3Rpb25zLCB7IHJvbGU6IFwic3lzdGVtXCIsIGNvbnRlbnQ6IGJsb2NrIH1dIGFzIEFnZW50SW5zdHJ1Y3Rpb25zO1xufVxuXG4vKiogUmVzb2x2ZSBvbmUgbmF0aXZlIENvZGUgTW9kZSB0cmFuc3BvcnQgZHVyaW5nIHBsdWdpbiBzdGFydHVwLiAqL1xuZnVuY3Rpb24gY29kZU1vZGVUcmFuc3BvcnQoKTogUHJvbWlzZTxDb2RlTW9kZVRyYW5zcG9ydD4ge1xuICByZXNvbHZlZENvZGVNb2RlVHJhbnNwb3J0ID8/PSAoYXN5bmMgKCkgPT4ge1xuICAgIGlmICghc3VwcG9ydHNJc29sYXRlZFZtVHJhbnNwb3J0KCkpIHtcbiAgICAgIGNvZGVNb2RlTG9nZ2VyLmluZm8oXCJ0cmFuc3BvcnQgc2VsZWN0ZWRcIiwgeyBwcm92aWRlcjogXCJxdWlja2pzXCIgfSk7XG4gICAgICByZXR1cm4gbmV3IFF1aWNrSnNDb2RlTW9kZVRyYW5zcG9ydCgpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBJc29sYXRlZFZtQ29kZU1vZGVUcmFuc3BvcnQgfSA9IGF3YWl0IGltcG9ydChcIkBtYXN0cmEvaXNvbGF0ZWQtdm1cIik7XG4gICAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgSXNvbGF0ZWRWbUNvZGVNb2RlVHJhbnNwb3J0KCk7XG4gICAgICBjb2RlTW9kZUxvZ2dlci5pbmZvKFwidHJhbnNwb3J0IHNlbGVjdGVkXCIsIHsgcHJvdmlkZXI6IFwiaXNvbGF0ZWQtdm1cIiB9KTtcbiAgICAgIHJldHVybiB0cmFuc3BvcnQ7XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICBjb2RlTW9kZUxvZ2dlci53YXJuKFwiaXNvbGF0ZWQtdm0gdW5hdmFpbGFibGU7IHVzaW5nIFF1aWNrSlNcIiwge1xuICAgICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGNhdWdodCksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgUXVpY2tKc0NvZGVNb2RlVHJhbnNwb3J0KCk7XG4gICAgfVxuICB9KSgpO1xuICByZXR1cm4gcmVzb2x2ZWRDb2RlTW9kZVRyYW5zcG9ydDtcbn1cblxudHlwZSBDb2RlTW9kZVJlc29sdmVyPFRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93biA9IHVua25vd24+ID0gKFxuICBhcmdzOiBQYXJhbWV0ZXJzPFxuICAgIEV4Y2x1ZGU8XG4gICAgICBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcImluc3RydWN0aW9uc1wiXSxcbiAgICAgIEFnZW50SW5zdHJ1Y3Rpb25zXG4gICAgPlxuICA+WzBdLFxuKSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvZGVNb2RlPiB8IHVuZGVmaW5lZD47XG5cbi8qKiBCdWlsZCByZXF1ZXN0LXNjb3BlZCBuYXRpdmUgQ29kZSBNb2RlIG92ZXIgYWxsIGV4ZWN1dGFibGUgY29udGV4dCB0b29scy4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ29kZU1vZGU8VFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duPihcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHRvb2xzOiBNYXN0cmFUb29scyxcbiAgd29ya3NwYWNlOiBXb3Jrc3BhY2UgfCB1bmRlZmluZWQsXG4gIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dDxUUmVxdWVzdENvbnRleHQ+LFxuKTogUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb2RlTW9kZT4gfCB1bmRlZmluZWQ+IHtcbiAgaWYgKGNvbmZpZy5jb2RlTW9kZSA9PT0gZmFsc2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHdvcmtzcGFjZVRvb2xzID0gd29ya3NwYWNlXG4gICAgPyBhd2FpdCBjcmVhdGVXb3Jrc3BhY2VUb29scyh3b3Jrc3BhY2UsIHsgcmVxdWVzdENvbnRleHQsIHdvcmtzcGFjZSB9KVxuICAgIDoge307XG4gIGNvbnN0IGNvbnRleHRUb29scyA9IHsgLi4udG9vbHMsIC4uLndvcmtzcGFjZVRvb2xzIH07XG4gIGNvbnN0IGV4ZWN1dGFibGVUb29scyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhjb250ZXh0VG9vbHMpLmZpbHRlcihcbiAgICAgIChbLCB0b29sXSkgPT5cbiAgICAgICAgdHlwZW9mIHRvb2wgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgdG9vbCAhPT0gbnVsbCAmJlxuICAgICAgICBcImV4ZWN1dGVcIiBpbiB0b29sICYmXG4gICAgICAgIHR5cGVvZiB0b29sLmV4ZWN1dGUgPT09IFwiZnVuY3Rpb25cIixcbiAgICApLFxuICApIGFzIFRvb2xzSW5wdXQ7XG4gIGlmIChPYmplY3Qua2V5cyhleGVjdXRhYmxlVG9vbHMpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgb3B0aW9ucyA9IHR5cGVvZiBjb25maWcuY29kZU1vZGUgPT09IFwib2JqZWN0XCIgPyBjb25maWcuY29kZU1vZGUgOiB7fTtcbiAgY29uc3QgY29kZU1vZGUgPSBjcmVhdGVDb2RlTW9kZShcbiAgICB7IHRvb2xzOiBleGVjdXRhYmxlVG9vbHMsIC4uLm9wdGlvbnMgfSxcbiAgICBhd2FpdCBjb2RlTW9kZVRyYW5zcG9ydCgpLFxuICApO1xuICBpZiAoIShcIm1hc3RyYV93b3Jrc3BhY2VfcmVhZF9maWxlXCIgaW4gd29ya3NwYWNlVG9vbHMpKSByZXR1cm4gY29kZU1vZGU7XG4gIHJldHVybiB7XG4gICAgLi4uY29kZU1vZGUsXG4gICAgaW5zdHJ1Y3Rpb25zOiBgJHtjb2RlTW9kZS5pbnN0cnVjdGlvbnN9XFxuXFxuV29ya3NwYWNlIGZpbGUgY29udGVudCBub3RlOlxcblRleHQgcmV0dXJuZWQgYnkgZXh0ZXJuYWxfbWFzdHJhX3dvcmtzcGFjZV9yZWFkX2ZpbGUgc3RhcnRzIHdpdGggb25lIG1ldGFkYXRhIGxpbmUgY29udGFpbmluZyB0aGUgcGF0aCBhbmQgc2l6ZS4gRXhjbHVkZSB0aGF0IGZpcnN0IGxpbmUgYmVmb3JlIGNhbGN1bGF0aW5nIGNvbnRlbnQgY2hhcmFjdGVyIGNvdW50cywgaGFzaGVzLCBvciBvdGhlciBjb250ZW50LW9ubHkgdmFsdWVzLmAsXG4gIH07XG59XG5cbi8qKiBSZXNvbHZlIENvZGUgTW9kZSBsYXppbHkgc28gd29ya3NwYWNlIGFuZCBkeW5hbWljIHRvb2wgcG9saWN5IGZvbGxvdyBlYWNoIHJlcXVlc3QuICovXG5mdW5jdGlvbiBjb2RlTW9kZVJlc29sdmVyPFRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93bj4oXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICB0b29sczogTWFzdHJhVG9vbHMsXG4gIHdvcmtzcGFjZTogV29ya3NwYWNlIHwgdW5kZWZpbmVkLFxuKTogQ29kZU1vZGVSZXNvbHZlcjxUUmVxdWVzdENvbnRleHQ+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5jb2RlTW9kZSA9PT0gZmFsc2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiBidWlsZENvZGVNb2RlKGNvbmZpZywgdG9vbHMsIHdvcmtzcGFjZSwgcmVxdWVzdENvbnRleHQpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlZCBkZXNjcmlwdGlvbiBmb3IgYW4gYWdlbnQgd2hvc2UgZGVmaW5pdGlvbiBvbWl0cyBvbmUuIEtlcHRcbiAqIGdlbmVyaWMgKHRoZSBhZ2VudCdzIG93biBuYW1lIGlzIHRoZSBvbmx5IHJlbGlhYmxlIHNpZ25hbCBhdCBidWlsZFxuICogdGltZSkgc28gaXQgcmVhZHMgc2Vuc2libHkgYXMgdGhlIGBhc2tfPGlkPmAgTUNQIHRvb2wncyBkZXNjcmlwdGlvblxuICogYW5kIGluIGFnZW50IG1ldGFkYXRhLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0QWdlbnREZXNjcmlwdGlvbihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYENvbnZlcnNhdGlvbmFsIEFJIGFnZW50IFwiJHtuYW1lfVwiLmA7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBldmVyeSBlbnRyeSBpbiBgY29uZmlnLmFnZW50c2AgaW50byBhIE1hc3RyYSBgQWdlbnRgXG4gKiBpbnN0YW5jZS4gV2hlbiBgY29uZmlnLmFnZW50c2AgaXMgb21pdHRlZCB0aGUgcGx1Z2luIHJlZ2lzdGVycyBhXG4gKiBzaW5nbGUgYnVpbHQtaW4gYGRlZmF1bHRgIGFuYWx5c3Qgc28gdGhlIGJhcmUgYG1hc3RyYSgpYCBjYWxsIHN0aWxsXG4gKiB5aWVsZHMgYSB3b3JraW5nIGFnZW50LlxuICpcbiAqIFBlci1hZ2VudCB0b29sIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBvbmNlIHdpdGggYSB0eXBlZFxuICoge0BsaW5rIE1hc3RyYVBsdWdpbnN9IGluZGV4IGJ1aWx0IGZyb20gcmVnaXN0ZXJlZCBzaWJsaW5nIHBsdWdpbnNcbiAqIChjdXJyZW50bHkgYGdlbmllYDsgZXh0ZW5kIGBNYXN0cmFQbHVnaW5zYCB0byBzdXJmYWNlIG1vcmUpLlxuICpcbiAqIEB0aHJvd3Mgd2hlbiBgY29uZmlnLmRlZmF1bHRBZ2VudGAgaXMgc2V0IHRvIGFuIGlkIHRoYXQgaXNuJ3QgaW4gdGhlXG4gKiAgIHJlc29sdmVkIHJlZ2lzdHJ5OyB0aGlzIGlzIGEgd2lyaW5nIGJ1Zywgbm90IGEgcnVudGltZSBjb25kaXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEFnZW50cyhvcHRzOiB7XG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xuICBjb250ZXh0OiBwbHVnaW5SZWdpc3RyeS5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZDtcbiAgbWVtb3J5QnVpbGRlcj86IE1lbW9yeUJ1aWxkZXI7XG4gIGxvZzogbG9nLkxvZ2dlcjtcbiAgLyoqXG4gICAqIExvY2FsIHNraWxsIHNjYW4gcGF0aHMgKHJlbW90ZSBza2lsbHMgcHJvdmlzaW9uZWQgdG8gYSB0ZW1wIGRpciBhdFxuICAgKiBzdGFydHVwKSBmb2xkZWQgaW50byBldmVyeSBhZ2VudCB0aGF0IHVzZXMgdGhlIGF1dG8tY3JlYXRlZCBkZWZhdWx0XG4gICAqIHdvcmtzcGFjZS5cbiAgICovXG4gIGV4dHJhU2tpbGxNb3VudHM/OiBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9uc1tcImV4dHJhU2tpbGxNb3VudHNcIl07XG59KTogUHJvbWlzZTxCdWlsdEFnZW50cz4ge1xuICBjb25zdCB7IGNvbmZpZywgY29udGV4dCwgbWVtb3J5QnVpbGRlciwgbG9nLCBleHRyYVNraWxsTW91bnRzIH0gPSBvcHRzO1xuICBjb25zdCBkZWZpbml0aW9ucyA9IHJlc29sdmVEZWZpbml0aW9ucyhjb25maWcpO1xuICBjb25zdCBpZHMgPSBPYmplY3Qua2V5cyhkZWZpbml0aW9ucyk7XG4gIGNvbnN0IGRlZmF1bHRBZ2VudElkID0gY29uZmlnLmRlZmF1bHRBZ2VudCA/PyBpZHNbMF0gPz8gRkFMTEJBQ0tfQUdFTlRfSUQ7XG5cbiAgY29uc3QgcGx1Z2lucyA9IGJ1aWxkUGx1Z2luc01hcChjb25maWcsIGNvbnRleHQpO1xuICAvLyBTeXN0ZW0tZGVmYXVsdCBhbWJpZW50IHRvb2xzIGV2ZXJ5IGFnZW50IGdldHMgb3V0IG9mIHRoZSBib3g6XG4gIC8vIGByZW5kZXJfZGF0YWAgZm9yIGlubGluZSB2aXN1YWxpemF0aW9ucyBhbmQgYHN1bW1hcml6ZWAgZm9yXG4gIC8vIG9mZmxvYWRpbmcgdGV4dCBjb25kZW5zaW5nIHRvIHRoZSBmYXN0IC8gc21hbGwgY2hhdCB0aWVyLiBUaGVcbiAgLy8gdXNlciBjYW4gc2hhZG93IGVpdGhlciBieSBpbmNsdWRpbmcgYSBzYW1lLW5hbWVkIHRvb2wgaW4gdGhlaXIgb3duXG4gIC8vIGBjb25maWcudG9vbHNgIG9yIHBlci1hZ2VudCBgdG9vbHNgLiBNZXJnZSBvcmRlciBpc1xuICAvLyBgc3lzdGVtIC0+IHVzZXItYW1iaWVudCAtPiBwZXItYWdlbnRgLCBsYXN0IHdyaXRlIHdpbnMuXG4gIGNvbnN0IHN5c3RlbVRvb2xzOiBNYXN0cmFUb29scyA9IHtcbiAgICByZW5kZXJfZGF0YTogYnVpbGRSZW5kZXJEYXRhVG9vbChjb25maWcpLFxuICAgIHN1bW1hcml6ZTogYnVpbGRTdW1tYXJpemVUb29sKGNvbmZpZyksXG4gIH07XG4gIGNvbnN0IGFtYmllbnRUb29scyA9IHtcbiAgICAuLi5zeXN0ZW1Ub29scyxcbiAgICAuLi4oY29uZmlnLnRvb2xzID8/IHt9KSxcbiAgfTtcbiAgY29uc3Qgc3R5bGUgPSByZXNvbHZlU3R5bGVJbnN0cnVjdGlvbnMoY29uZmlnKTtcbiAgLy8gRGVmYXVsdC1vbiBwcm90ZWN0aW9uIGFnYWluc3QgdGhlIG1vZGVsIGNvcHlpbmcgdHVybi1zY29wZWRcbiAgLy8gY2hhcnRJZHMgZnJvbSBwcmlvciBhc3Npc3RhbnQgdG9vbCByZXN1bHRzIGludG8gdGhlIG5ld1xuICAvLyB0dXJuJ3MgYFtjaGFydDo8aWQ+XWAgbWFya2Vycy4gT3B0IG91dCBwZXItcGx1Z2luIHZpYVxuICAvLyBgY29uZmlnLnN0cmlwU3RhbGVDaGFydHM6IGZhbHNlYC5cbiAgY29uc3QgaW5wdXRQcm9jZXNzb3JzID0gW1xuICAgIC8vIGByZW5kZXJfZGF0YWAgY2FuIGNhcnJ5IGh1bmRyZWRzIG9mIGlubGluZSByb3dzLiBLZWVwIHRoZSBjb21wbGV0ZSBjYWxsXG4gICAgLy8gaW4gTWVtb3J5IGFuZCB0aGUgVUkgdHJhbnNjcmlwdCwgYnV0IHVzZSBNYXN0cmEncyBuYXRpdmUgcHJvbXB0LXN0YWdlXG4gICAgLy8gZmlsdGVyIHRvIG9taXQgcHJpb3IgY2FsbHMvcmVzdWx0cyBmcm9tIGxhdGVyIG1vZGVsIHJlcXVlc3RzLiBDdXJyZW50XG4gICAgLy8gdHVybiBjYWxscyByZW1haW4gYXZhaWxhYmxlIHRvIHRoZSBhZ2VudCBsb29wLlxuICAgIG5ldyBUb29sQ2FsbEZpbHRlcih7IGV4Y2x1ZGU6IFtcInJlbmRlcl9kYXRhXCJdIH0pLFxuICAgIC4uLihjb25maWcuc3RyaXBTdGFsZUNoYXJ0cyA9PT0gZmFsc2UgPyBbXSA6IFtzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yXSksXG4gIF07XG4gIGNvbnN0IGFnZW50czogUmVjb3JkPHN0cmluZywgQWdlbnQ+ID0ge307XG4gIGNvbnN0IGRlZmF1bHRNb2RlbHM6IFJlY29yZDxzdHJpbmcsIEFnZW50RGVmYXVsdE1vZGVsPiA9IHt9O1xuICBjb25zdCBhcHByb3ZhbEdhdGVkQnlBZ2VudDogQXJyYXk8eyBhZ2VudElkOiBzdHJpbmc7IHRvb2xJZHM6IHN0cmluZ1tdIH0+ID0gW107XG5cbiAgZm9yIChjb25zdCBbaWQsIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoZGVmaW5pdGlvbnMpKSB7XG4gICAgY29uc3QgdXNlclRvb2xzID0gYXdhaXQgcmVzb2x2ZVVzZXJUb29scyhkZWYudG9vbHMsIHBsdWdpbnMpO1xuICAgIGNvbnN0IHRvb2xzID0geyAuLi5hbWJpZW50VG9vbHMsIC4uLnVzZXJUb29scyB9O1xuICAgIGxldCB3b3Jrc3BhY2UgPSByZXNvbHZlQWdlbnRXb3Jrc3BhY2UoZGVmLndvcmtzcGFjZSk7XG4gICAgaWYgKFxuICAgICAgKGRlZi53b3Jrc3BhY2UgPT09IHVuZGVmaW5lZCAmJiAhd29ya3NwYWNlKSB8fFxuICAgICAgKChleHRyYVNraWxsTW91bnRzPy5sZW5ndGggfHxcbiAgICAgICAgY29uZmlnLnNhbmRib3ggIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBjb25maWcud29ya3NwYWNlRmFsbGJhY2tUb1RtcCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIGNvbmZpZy53b3Jrc3BhY2VUb29scyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIGNvbnRleHQgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgaXNEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZSkpXG4gICAgKSB7XG4gICAgICB3b3Jrc3BhY2UgPSBkYXRhYnJpY2tzV29ya3NwYWNlKHtcbiAgICAgICAgZXh0cmFTa2lsbE1vdW50cyxcbiAgICAgICAgZmFsbGJhY2tUb1RtcDogY29uZmlnLndvcmtzcGFjZUZhbGxiYWNrVG9UbXAsXG4gICAgICAgIC4uLihjb25maWcud29ya3NwYWNlVG9vbHMgIT09IHVuZGVmaW5lZCA/IHsgdG9vbHM6IGNvbmZpZy53b3Jrc3BhY2VUb29scyB9IDoge30pLFxuICAgICAgICBwbHVnaW5Db250ZXh0OiBjb250ZXh0LFxuICAgICAgICBzYW5kYm94OiBjb25maWcuc2FuZGJveCxcbiAgICAgIH0pO1xuICAgICAgbWFya0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlKTtcbiAgICB9IGVsc2UgaWYgKHdvcmtzcGFjZSkge1xuICAgICAgd29ya3NwYWNlID0gYmluZERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0KHdvcmtzcGFjZSwgY29udGV4dCk7XG4gICAgfVxuICAgIGNvbnN0IGdhdGVkID0gYXBwcm92YWxHYXRlZFRvb2xJZHModG9vbHMpO1xuICAgIGlmIChnYXRlZC5sZW5ndGggPiAwKSBhcHByb3ZhbEdhdGVkQnlBZ2VudC5wdXNoKHsgYWdlbnRJZDogaWQsIHRvb2xJZHM6IGdhdGVkIH0pO1xuICAgIGNvbnN0IG1lbW9yeSA9IG1lbW9yeUJ1aWxkZXI/LmZvckFnZW50KGlkLCBkZWYpO1xuICAgIGNvbnN0IHJlc29sdmVDb2RlTW9kZSA9IGNvZGVNb2RlUmVzb2x2ZXIoY29uZmlnLCB0b29scywgd29ya3NwYWNlKTtcbiAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudCh7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6IGRlZi5uYW1lID8/IGlkLFxuICAgICAgLy8gQWx3YXlzIGNhcnJ5IGEgbm9uLWVtcHR5IGRlc2NyaXB0aW9uOiBpdCdzIHN1cmZhY2VkIHRvIE1DUFxuICAgICAgLy8gY2xpZW50cyAod2hpY2ggcmVqZWN0IGEgZGVzY3JpcHRpb24tbGVzcyBhZ2VudCkgYW5kIGluIGFnZW50XG4gICAgICAvLyBtZXRhZGF0YS4gRmFsbCBiYWNrIHRvIGEgZ2VuZXJhdGVkIG9uZSB3aGVuIHRoZSBkZWZpbml0aW9uXG4gICAgICAvLyBvbWl0cyBpdC5cbiAgICAgIGRlc2NyaXB0aW9uOiBkZWYuZGVzY3JpcHRpb24/LnRyaW0oKSB8fCBkZWZhdWx0QWdlbnREZXNjcmlwdGlvbihkZWYubmFtZSA/PyBpZCksXG4gICAgICBpbnN0cnVjdGlvbnM6IGNvbXBvc2VJbnN0cnVjdGlvbnMoZGVmLmluc3RydWN0aW9ucywgc3R5bGUsIHJlc29sdmVDb2RlTW9kZSksXG4gICAgICAuLi4oZGVmLnJlcXVlc3RDb250ZXh0U2NoZW1hID8geyByZXF1ZXN0Q29udGV4dFNjaGVtYTogZGVmLnJlcXVlc3RDb250ZXh0U2NoZW1hIH0gOiB7fSksXG4gICAgICBtb2RlbDogcmVzb2x2ZU1vZGVsKGNvbmZpZywgZGVmLm1vZGVsKSxcbiAgICAgIGRlZmF1bHRPcHRpb25zOiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PlxuICAgICAgICB3aXRoUmVxdWVzdE1lbW9yeVNjb3BlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1heFN0ZXBzOiBjb25maWcuYWdlbnRNYXhTdGVwcyA/PyBERUZBVUxUX0FHRU5UX01BWF9TVEVQUyxcbiAgICAgICAgICAgIHByb3ZpZGVyT3B0aW9uczogUkVTUE9OU0VTX1BST1ZJREVSX09QVElPTlMsXG4gICAgICAgICAgICAuLi4oZGVmLnJlcXVpcmVUb29sQXBwcm92YWwgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IHsgcmVxdWlyZVRvb2xBcHByb3ZhbDogZGVmLnJlcXVpcmVUb29sQXBwcm92YWwgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lbW9yeSA/IHJlcXVlc3RDb250ZXh0IDogdW5kZWZpbmVkLFxuICAgICAgICApLFxuICAgICAgdG9vbHM6IHJlc29sdmVDb2RlTW9kZVxuICAgICAgICA/IGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb2RlTW9kZSA9IGF3YWl0IHJlc29sdmVDb2RlTW9kZShhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiBjb2RlTW9kZSA/IHsgLi4udG9vbHMsIFtjb2RlTW9kZS50b29sLmlkXTogY29kZU1vZGUudG9vbCB9IDogdG9vbHM7XG4gICAgICAgICAgfVxuICAgICAgICA6IHRvb2xzLFxuICAgICAgLi4uKG1lbW9yeSA/IHsgbWVtb3J5IH0gOiB7fSksXG4gICAgICAuLi4od29ya3NwYWNlID8geyB3b3Jrc3BhY2UgfSA6IHt9KSxcbiAgICAgIGlucHV0UHJvY2Vzc29yczogWy4uLmlucHV0UHJvY2Vzc29ycywgLi4ud29ya3NwYWNlU2tpbGxJbnB1dFByb2Nlc3NvcnMod29ya3NwYWNlLCBjb25maWcpXSxcbiAgICAgIG91dHB1dFByb2Nlc3NvcnM6IFt0b29sRXJyb3JMb2dnaW5nUHJvY2Vzc29yKGxvZyldLFxuICAgIH0pO1xuICAgIGFnZW50c1tpZF0gPVxuICAgICAgY29uZmlnLmJhY2tncm91bmRUdXJucyA9PT0gZmFsc2VcbiAgICAgICAgPyBhZ2VudFxuICAgICAgICA6IGNyZWF0ZUJhY2tncm91bmRBZ2VudChhZ2VudCwgY29uZmlnLmFnZW50TWF4U3RlcHMgPz8gREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMpO1xuICAgIC8vIFN1cmZhY2UgdGhlIGVmZmVjdGl2ZSBkZWZhdWx0IG1vZGVsIHBlciBhZ2VudCBzbyBvcGVyYXRvcnMgY2FuXG4gICAgLy8gc2VlIGF0IGEgZ2xhbmNlIHdoaWNoIGVuZHBvaW50IGVhY2ggYWdlbnQgcG9pbnRzIGF0IHdpdGhvdXRcbiAgICAvLyBoYXZpbmcgdG8gZmlyZSBhIHJlcXVlc3QgYW5kIGluc3BlY3QgYSB0cmFjZS4gVGhlIHZhbHVlIGlzIHRoZVxuICAgIC8vICpzdGF0aWMqIGRlZmF1bHQ7IHBlci1yZXF1ZXN0IG92ZXJyaWRlcyAoaGVhZGVyIC8gcXVlcnkgL1xuICAgIC8vIGJvZHkpIGFuZCB0aGUgd29ya3NwYWNlLWNhdGFsb2d1ZSBmdXp6eSBtYXRjaCBzdGlsbCBhcHBseSBhdFxuICAgIC8vIGNhbGwgdGltZS5cbiAgICBjb25zdCBkZWZhdWx0TW9kZWwgPSBkZXNjcmliZUFnZW50RGVmYXVsdE1vZGVsKGNvbmZpZywgZGVmKTtcbiAgICBkZWZhdWx0TW9kZWxzW2lkXSA9IGRlZmF1bHRNb2RlbDtcbiAgICBsb2cuaW5mbyhcImFnZW50IHJlZ2lzdGVyZWRcIiwge1xuICAgICAgaWQsXG4gICAgICBuYW1lOiBkZWYubmFtZSA/PyBpZCxcbiAgICAgIGRlZmF1bHRNb2RlbDpcbiAgICAgICAgZGVmYXVsdE1vZGVsLmtpbmQgPT09IFwiY29uZmlndXJlZFwiID8gZGVmYXVsdE1vZGVsLm1vZGVsIDogYDwke2RlZmF1bHRNb2RlbC5raW5kfT5gLFxuICAgICAgdG9vbHM6IFsuLi5PYmplY3Qua2V5cyh0b29scyksIC4uLihyZXNvbHZlQ29kZU1vZGUgPyBbXCI8ZHluYW1pYy1jb2RlLW1vZGU+XCJdIDogW10pXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmICghYWdlbnRzW2RlZmF1bHRBZ2VudElkXSkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYG1hc3RyYSBkZWZhdWx0QWdlbnQgXCIke2RlZmF1bHRBZ2VudElkfVwiYCxcbiAgICAgIGBSZWdpc3RlcmVkIGFnZW50czogJHtpZHMuam9pbihcIiwgXCIpIHx8IFwibm9uZVwifS5gLFxuICAgICk7XG4gIH1cblxuICBhc3NlcnRBcHByb3ZhbEdhdGVkVG9vbHNIYXZlU3RvcmFnZShhcHByb3ZhbEdhdGVkQnlBZ2VudCwgbWVtb3J5QnVpbGRlcik7XG5cbiAgbG9nLmluZm8oXCJhZ2VudHMgcmVhZHlcIiwgeyBpZHMsIGRlZmF1bHRBZ2VudElkIH0pO1xuICByZXR1cm4geyBhZ2VudHMsIGRlZmF1bHRBZ2VudElkLCBkZWZhdWx0TW9kZWxzLCBhbWJpZW50VG9vbHMgfTtcbn1cblxuLyoqIExvZyBmYWlsZWQgdG9vbCBjYWxscyB3aXRob3V0IGNoYW5naW5nIHRoZSBjaHVua3MgcmV0dXJuZWQgdG8gdGhlIGNsaWVudC4gKi9cbmZ1bmN0aW9uIHRvb2xFcnJvckxvZ2dpbmdQcm9jZXNzb3IobG9nZ2VyOiBsb2cuTG9nZ2VyKTogT3V0cHV0UHJvY2Vzc29yIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogXCJ0b29sLWVycm9yLWxvZ2dlclwiLFxuICAgIGFzeW5jIHByb2Nlc3NPdXRwdXRTdHJlYW0oeyBwYXJ0IH0pIHtcbiAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwidG9vbC1lcnJvclwiKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gZXJyb3JVdGlscy50b0Vycm9yKHBhcnQucGF5bG9hZC5lcnJvcik7XG4gICAgICAgIGxvZ2dlci5lcnJvcihcInRvb2wgZXhlY3V0aW9uIGZhaWxlZFwiLCB7XG4gICAgICAgICAgdG9vbE5hbWU6IHBhcnQucGF5bG9hZC50b29sTmFtZSxcbiAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnBheWxvYWQudG9vbENhbGxJZCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFydDtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB3b3Jrc3BhY2VTa2lsbElucHV0UHJvY2Vzc29ycyhcbiAgd29ya3NwYWNlOiBXb3Jrc3BhY2UgfCB1bmRlZmluZWQsXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuKTogU2tpbGxTZWFyY2hQcm9jZXNzb3JbXSB7XG4gIGlmICghd29ya3NwYWNlIHx8IGNvbmZpZy53b3Jrc3BhY2VTa2lsbHMgPT09IGZhbHNlKSByZXR1cm4gW107XG4gIGNvbnN0IG9wdGlvbnMgPSB0eXBlb2YgY29uZmlnLndvcmtzcGFjZVNraWxscyA9PT0gXCJvYmplY3RcIiA/IGNvbmZpZy53b3Jrc3BhY2VTa2lsbHMgOiB1bmRlZmluZWQ7XG4gIGlmICghd29ya3NwYWNlLnNraWxscykgcmV0dXJuIFtdO1xuICByZXR1cm4gW1xuICAgIG5ldyBTa2lsbFNlYXJjaFByb2Nlc3Nvcih7XG4gICAgICB3b3Jrc3BhY2UsXG4gICAgICBzZWFyY2g6IHtcbiAgICAgICAgdG9wSzogb3B0aW9ucz8udG9wSyA/PyA1LFxuICAgICAgICBtaW5TY29yZTogb3B0aW9ucz8ubWluU2NvcmUgPz8gMC4xLFxuICAgICAgfSxcbiAgICAgIC4uLihvcHRpb25zPy50dGxNcyAhPT0gdW5kZWZpbmVkID8geyB0dGw6IG9wdGlvbnMudHRsTXMgfSA6IHt9KSxcbiAgICAgIGJsb2NraW5nUmVmcmVzaDogZmFsc2UsXG4gICAgfSksXG4gIF07XG59XG5cbi8qKlxuICogVG9vbCBpZHMgb24gYHRvb2xzYCB0aGF0IGFyZSBhcHByb3ZhbC1nYXRlZCAoYHJlcXVpcmVBcHByb3ZhbDogdHJ1ZWApLlxuICogS2V5cyBhcmUgdXNlZCBhcyBhIGZhbGxiYWNrIHdoZW4gYSB0b29sIG9taXRzIGFuIGV4cGxpY2l0IGBpZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHByb3ZhbEdhdGVkVG9vbElkcyh0b29sczogTWFzdHJhVG9vbHMpOiBzdHJpbmdbXSB7XG4gIGlmICghdG9vbHMgfHwgdHlwZW9mIHRvb2xzICE9PSBcIm9iamVjdFwiKSByZXR1cm4gW107XG4gIHJldHVybiBbXG4gICAgLi4ub2JqZWN0XG4gICAgICAuc2VxdWVuY2UoT2JqZWN0LmVudHJpZXModG9vbHMpKVxuICAgICAgLmZpbHRlcigoWywgdG9vbF0pID0+IGlzQXBwcm92YWxHYXRlZFRvb2wodG9vbCkpXG4gICAgICAubWFwKChba2V5LCB0b29sXSkgPT4gcmVzb2x2ZVRvb2xJZCh0b29sLCBrZXkpKSxcbiAgXTtcbn1cblxuLyoqIFRydWUgd2hlbiBhIE1hc3RyYSAvIEFJIFNESyB0b29sIHBhdXNlcyBmb3IgaHVtYW4gYXBwcm92YWwgYmVmb3JlIGV4ZWN1dGUuICovXG5mdW5jdGlvbiBpc0FwcHJvdmFsR2F0ZWRUb29sKHRvb2w6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCF0b29sIHx8IHR5cGVvZiB0b29sICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAodG9vbCBhcyB7IHJlcXVpcmVBcHByb3ZhbD86IGJvb2xlYW4gfSkucmVxdWlyZUFwcHJvdmFsID09PSB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVG9vbElkKHRvb2w6IHVua25vd24sIGZhbGxiYWNrS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodG9vbCAmJiB0eXBlb2YgdG9vbCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgKHRvb2wgYXMgeyBpZD86IHN0cmluZyB9KS5pZCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiAodG9vbCBhcyB7IGlkOiBzdHJpbmcgfSkuaWQ7XG4gIH1cbiAgcmV0dXJuIGZhbGxiYWNrS2V5O1xufVxuXG4vKipcbiAqIEFwcHJvdmFsLWdhdGVkIHRvb2xzIHN1c3BlbmQgdGhlIGFnZW50IGxvb3AgdW50aWwgYSBodW1hbiBhcHByb3Zlcy5cbiAqIE1hc3RyYSBwZXJzaXN0cyB0aG9zZSBzdXNwZW5kZWQgcnVucyBpbiBNYXN0cmEtaW5zdGFuY2UtbGV2ZWwgc3RvcmFnZVxuICogKGBtZW1vcnlCdWlsZGVyLmluc3RhbmNlU3RvcmFnZSgpYCksIG5vdCBwZXItYWdlbnQgbWVtb3J5IC0gc28gYm9vdFxuICogbXVzdCBmYWlsIGZhc3Qgd2hlbiBzdWNoIGEgdG9vbCBpcyByZWdpc3RlcmVkIHdpdGhvdXQgc3RvcmFnZS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0QXBwcm92YWxHYXRlZFRvb2xzSGF2ZVN0b3JhZ2UoXG4gIGdhdGVkOiBBcnJheTx7IGFnZW50SWQ6IHN0cmluZzsgdG9vbElkczogc3RyaW5nW10gfT4sXG4gIG1lbW9yeUJ1aWxkZXI6IE1lbW9yeUJ1aWxkZXIgfCB1bmRlZmluZWQsXG4pOiB2b2lkIHtcbiAgaWYgKGdhdGVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICBpZiAobWVtb3J5QnVpbGRlcj8uaW5zdGFuY2VTdG9yYWdlKCkpIHJldHVybjtcblxuICBjb25zdCBkZXRhaWwgPSBnYXRlZFxuICAgIC5tYXAoKHsgYWdlbnRJZCwgdG9vbElkcyB9KSA9PiBgJHthZ2VudElkfTogJHt0b29sSWRzLmpvaW4oXCIsIFwiKX1gKVxuICAgIC5qb2luKFwiOyBcIik7XG4gIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgXCJtYXN0cmE6IGFwcHJvdmFsLWdhdGVkIHRvb2xzIHJlcXVpcmUgcGx1Z2luIHN0b3JhZ2UgKFBvc3RncmVzU3RvcmUpIHRvIHBlcnNpc3Qgc3VzcGVuZGVkIHJ1bnMuIFwiICtcbiAgICAgIGBBZmZlY3RlZCBhZ2VudHMvdG9vbHM6ICR7ZGV0YWlsfS4gYCArXG4gICAgICBcIlJlZ2lzdGVyIGxha2ViYXNlKCkgYmVmb3JlIG1hc3RyYSgpIHNvIHN0b3JhZ2UgYXV0by1lbmFibGVzLCBvciBwYXNzIHN0b3JhZ2U6IHRydWUgZXhwbGljaXRseS5cIixcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXNjcmliZSBob3cgYW4gYWdlbnQgcmVzb2x2ZXMgaXRzIHVucGlubmVkIG1vZGVsOlxuICpcbiAqICAgMS4gUGVyLWFnZW50IGBkZWYubW9kZWxgIChzdHJpbmcgc3VnYXIgaXMgY29uZmlndXJlZDsgYSBmdW5jdGlvbiBpc1xuICogICAgICBkeW5hbWljKS5cbiAqICAgMi4gUGx1Z2luLWxldmVsIGBjb25maWcuZGVmYXVsdE1vZGVsYCAoc2FtZSBydWxlcykuXG4gKiAgIDMuIGBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRWAgZW52IHZhci5cbiAqICAgNC4gQXV0b21hdGljIGxpdmUtY2F0YWxvZ3VlIHJhbmtpbmcgd2hlbiBub25lIGlzIHNldC5cbiAqXG4gKiBVc2VkIGZvciB0aGUgc3RhcnR1cCBgYWdlbnQgcmVnaXN0ZXJlZGAgbG9nIHNvIG9wZXJhdG9ycyBjYW4gc2VlXG4gKiBgZGVmYXVsdE1vZGVsRmFsbGJhY2tzYCByZW1haW5zIGFuIG9wZXJhdG9yLXBpbm5lZCBjYW5kaWRhdGUgbGlzdCBpbnNpZGUgdGhlXG4gKiBhdXRvbWF0aWMgbGl2ZSBsb29rdXA7IGl0IGlzIG5vdCBhZHZlcnRpc2VkIGFzIGEgbW9kZWwgdW50aWwgYXZhaWxhYmlsaXR5IGlzXG4gKiBjaGVja2VkLlxuICovXG5mdW5jdGlvbiBkZXNjcmliZUFnZW50RGVmYXVsdE1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgZGVmOiBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24sXG4pOiBBZ2VudERlZmF1bHRNb2RlbCB7XG4gIGNvbnN0IGVmZmVjdGl2ZSA9IGRlZi5tb2RlbCA/PyBjb25maWcuZGVmYXVsdE1vZGVsO1xuICBpZiAodHlwZW9mIGVmZmVjdGl2ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHsga2luZDogXCJjb25maWd1cmVkXCIsIG1vZGVsOiBlZmZlY3RpdmUgfTtcbiAgaWYgKGVmZmVjdGl2ZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4geyBraW5kOiBcImR5bmFtaWNcIiB9O1xuICBjb25zdCBlbnZpcm9ubWVudCA9IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FO1xuICByZXR1cm4gZW52aXJvbm1lbnQgPyB7IGtpbmQ6IFwiY29uZmlndXJlZFwiLCBtb2RlbDogZW52aXJvbm1lbnQgfSA6IHsga2luZDogXCJhdXRvXCIgfTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYGNvbmZpZy5hZ2VudHNgIGludG8gYSBgUmVjb3JkPGlkLCBkZWZpbml0aW9uPmAuIEFjY2VwdHNcbiAqIGFueSBvZiB0aGUgdGhyZWUgc2hhcGVzIGRvY3VtZW50ZWQgb25cbiAqIHtAbGluayBNYXN0cmFQbHVnaW5Db25maWcuYWdlbnRzfTpcbiAqXG4gKiAtIFJlY29yZCAtIHJldHVybmVkIGFzLWlzIHdoZW4gbm9uLWVtcHR5LlxuICogLSBTaW5nbGUgZGVmaW5pdGlvbiAoZGV0ZWN0ZWQgdmlhIHRoZSByZXF1aXJlZCBgaW5zdHJ1Y3Rpb25zYFxuICogICBmaWVsZCkgLSBrZXllZCBieSBgc2x1Z2lmeShkZWYubmFtZSlgIG9yIGBGQUxMQkFDS19BR0VOVF9JRGAuXG4gKiAtIEFycmF5IC0ga2V5ZWQgYnkgYHNsdWdpZnkoZGVmLm5hbWUpYCBvciBgYWdlbnRfJHtpfWA7IGR1cGxpY2F0ZVxuICogICBzbHVncyBmYWlsIGxvdWRseSBzbyB1c2VycyBrbm93IHRvIHNldCBleHBsaWNpdCBuYW1lcy5cbiAqXG4gKiBPbWl0dGVkIG9yIGVtcHR5IGlucHV0cyBmYWxsIGJhY2sgdG8gYSBzaW5nbGUgYnVpbHQtaW4gYW5hbHlzdCBzb1xuICogdGhlIGJhcmUgYG1hc3RyYSgpYCBjYWxsIHN0aWxsIG1vdW50cyBhIHdvcmtpbmcgY2hhdCByb3V0ZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZURlZmluaXRpb25zKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogUmVjb3JkPHN0cmluZywgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uPiB7XG4gIGNvbnN0IGlucHV0ID0gY29uZmlnLmFnZW50cztcbiAgaWYgKCFpbnB1dCkgcmV0dXJuIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsbGJhY2tEZWZpbml0aW9ucygpO1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uPiA9IHt9O1xuICAgIGlucHV0LmZvckVhY2goKGRlZiwgaSkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZGVyaXZlQWdlbnRLZXkoZGVmLCBpKTtcbiAgICAgIGlmIChvdXRba2V5XSkge1xuICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgICAgICAgIGBtYXN0cmE6IGR1cGxpY2F0ZSBhZ2VudCBpZCBcIiR7a2V5fVwiIGRlcml2ZWQgZnJvbSBuYW1lIFwiJHtkZWYubmFtZSA/PyBcIlwifVwiOyBgICtcbiAgICAgICAgICAgIGBzZXQgdW5pcXVlIFxcYG5hbWVcXGBzIG9uIGVhY2ggZGVmaW5pdGlvbmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBvdXRba2V5XSA9IGRlZjtcbiAgICB9KTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLy8gU2luZ2xlLWRlZmluaXRpb24gc2hvcnRoYW5kOiBhbiBhZ2VudCBvd25zIHRoZSByZXF1aXJlZCBgaW5zdHJ1Y3Rpb25zYFxuICAvLyBmaWVsZCAoc3RhdGljIG9yIGR5bmFtaWMpOyBhIHJlY29yZC1vZi1hZ2VudHMgbmV2ZXIgb3ducyBpdCBkaXJlY3RseS5cbiAgaWYgKFwiaW5zdHJ1Y3Rpb25zXCIgaW4gaW5wdXQpIHtcbiAgICBjb25zdCBkZWYgPSBpbnB1dCBhcyBBbnlNYXN0cmFBZ2VudERlZmluaXRpb247XG4gICAgY29uc3Qga2V5ID0gZGVyaXZlQWdlbnRLZXkoZGVmKTtcbiAgICByZXR1cm4geyBba2V5XTogZGVmIH07XG4gIH1cblxuICBjb25zdCByZWNvcmQgPSBpbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+O1xuICBpZiAoT2JqZWN0LmtleXMocmVjb3JkKS5sZW5ndGggPT09IDApIHJldHVybiBmYWxsYmFja0RlZmluaXRpb25zKCk7XG4gIHJldHVybiByZWNvcmQ7XG59XG5cbi8qKiBEZXJpdmUgYSByZWdpc3RyeSBpZCBmcm9tIGEgZGVmaW5pdGlvbidzIGBuYW1lYCwgd2l0aCBhIGZhbGxiYWNrLiAqL1xuZnVuY3Rpb24gZGVyaXZlQWdlbnRLZXkoZGVmOiBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24sIGluZGV4PzogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGRlZi5uYW1lKSB7XG4gICAgY29uc3Qgc2x1ZyA9IHN0cmluZ1V0aWxzLnRvSWRlbnRpZmllcihkZWYubmFtZSk7XG4gICAgaWYgKHNsdWcpIHJldHVybiBzbHVnO1xuICB9XG4gIHJldHVybiBpbmRleCA9PT0gdW5kZWZpbmVkID8gRkFMTEJBQ0tfQUdFTlRfSUQgOiBgYWdlbnRfJHtpbmRleH1gO1xufVxuXG4vKiogQnVpbHQtaW4gZmFsbGJhY2sgcmVnaXN0cnkgdXNlZCB3aGVuIGBhZ2VudHNgIGlzIG9taXR0ZWQgLyBlbXB0eS4gKi9cbmZ1bmN0aW9uIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTogUmVjb3JkPHN0cmluZywgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uPiB7XG4gIHJldHVybiB7XG4gICAgW0ZBTExCQUNLX0FHRU5UX0lEXToge1xuICAgICAgbmFtZTogXCJEZWZhdWx0IEFnZW50XCIsXG4gICAgICBpbnN0cnVjdGlvbnM6IEZBTExCQUNLX0FHRU5UX0lOU1RSVUNUSU9OUyxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIGVmZmVjdGl2ZSBtb2RlbCBzcGVjIGZvciBhbiBhZ2VudC4gRmFsbGJhY2sgbGFkZGVyLCBpblxuICogb3JkZXI6XG4gKlxuICogICAxLiBQZXItYWdlbnQgYGRlZi5tb2RlbGAgKHN0cmluZyBzdWdhciBvciBgRHluYW1pY0FyZ3VtZW50YCkuXG4gKiAgIDIuIFBsdWdpbi1sZXZlbCBgY29uZmlnLmRlZmF1bHRNb2RlbGAgKHN0cmluZyBzdWdhciBvclxuICogICAgICBgRHluYW1pY0FyZ3VtZW50YCkgLSBtaXJyb3JzIEFwcEtpdCdzIGBhZ2VudHMoeyBkZWZhdWx0TW9kZWwgfSlgLlxuICogICAzLiBUaGUgYXV0by1yZXNvbHZlciB0aGF0IG1pbnRzIHVzZXItc2NvcGVkIHRva2VucyBhZ2FpbnN0XG4gKiAgICAgIGAvc2VydmluZy1lbmRwb2ludHNgIHZpYSB7QGxpbmsgYnVpbGRNb2RlbH0uXG4gKlxuICogU3RyaW5nIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBgbW9kZWxJZGAgc3VnYXIgYW5kIHRocmVhZGVkIHRocm91Z2hcbiAqIGBidWlsZE1vZGVsYCdzIG92ZXJyaWRlIGhvb2sgc28gdGhlIHJ1bnRpbWUgZnV6enkgbWF0Y2hlciBhbmQgdGhlXG4gKiBwZXItcmVxdWVzdCBgWC1NYXN0cmEtTW9kZWxgIG92ZXJyaWRlIGxheWVyIG9uIHRvcCBvZiB0aGUgc3RhdGljXG4gKiBjaG9pY2UuIE5vbi1zdHJpbmcgYER5bmFtaWNBcmd1bWVudGBzIGFyZSBwYXNzZWQgdGhyb3VnaCB2ZXJiYXRpbTtcbiAqIGNhbGxlcnMgdGhhdCBuZWVkIGZ1bGwgY29udHJvbCBvdmVyIGBwcm92aWRlcklkYCAvIGBoZWFkZXJzYCAvXG4gKiBgbW9kZWxJZGAgYnlwYXNzIHRoZSByZXNvbHZlciBwaXBlbGluZSBlbnRpcmVseS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgb3ZlcnJpZGU6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbltcIm1vZGVsXCJdLFxuKTogQWdlbnRDb25maWdbXCJtb2RlbFwiXSB7XG4gIGNvbnN0IGVmZmVjdGl2ZSA9IG92ZXJyaWRlID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmIChlZmZlY3RpdmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQpO1xuICB9XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgbW9kZWxJZCA9IGVmZmVjdGl2ZTtcbiAgICByZXR1cm4gKHsgcmVxdWVzdENvbnRleHQgfSkgPT4gYnVpbGRNb2RlbChjb25maWcsIHJlcXVlc3RDb250ZXh0LCB7IG1vZGVsSWQgfSk7XG4gIH1cbiAgcmV0dXJuIGVmZmVjdGl2ZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIG9ubHkgdGhlIHRvb2xzIGV4cGxpY2l0bHkgc3VwcGxpZWQgYnkgb25lIGFnZW50IGRlZmluaXRpb24uXG4gKiBDYWxsYmFjayBlcnJvcnMgcHJvcGFnYXRlIHZlcmJhdGltIHNvIHRoZSBvcmlnaW5hbCBzdGFjayBzdXJ2aXZlcyAtIHRoZVxuICogY2FsbGVyIGFscmVhZHkga25vd3Mgd2hpY2ggYWdlbnQgd2FzIHJlZ2lzdGVyaW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlVXNlclRvb2xzKFxuICBkZWZUb29sczogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1widG9vbHNcIl0sXG4gIHBsdWdpbnM6IE1hc3RyYVBsdWdpbnMsXG4pOiBQcm9taXNlPE1hc3RyYVRvb2xzPiB7XG4gIGlmICghZGVmVG9vbHMpIHJldHVybiB7fTtcbiAgcmV0dXJuIHR5cGVvZiBkZWZUb29scyA9PT0gXCJmdW5jdGlvblwiID8gZGVmVG9vbHMocGx1Z2lucykgOiBkZWZUb29scztcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFnZW50V29ya3NwYWNlKFxuICB3b3Jrc3BhY2U6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbltcIndvcmtzcGFjZVwiXSxcbik6IFdvcmtzcGFjZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghd29ya3NwYWNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIHdvcmtzcGFjZSA9PT0gXCJmdW5jdGlvblwiID8gd29ya3NwYWNlKCkgOiB3b3Jrc3BhY2U7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHtAbGluayBNYXN0cmFQbHVnaW5zfSBydW50aW1lIHByb3h5IGhhbmRlZCB0b1xuICogYHRvb2xzKHBsdWdpbnMpYCBjYWxsYmFja3MuXG4gKlxuICogSW1wbGVtZW50ZWQgYXMgYSBgUHJveHlgIG92ZXIgdGhlIEFwcEtpdCBwbHVnaW4gY29udGV4dCBzb1xuICogYHBsdWdpbnMuPG5hbWU+YCByZXNvbHZlcyBhdCBmaXJzdCBhY2Nlc3MuIEFueSBzaWJsaW5nIHBsdWdpbiB0aGF0XG4gKiBpbXBsZW1lbnRzIEFwcEtpdCdzIHN0YW5kYXJkIGBUb29sUHJvdmlkZXJgIGludGVyZmFjZVxuICogKGB0b29sa2l0KG9wdHM/KWAgKyBgZXhlY3V0ZUFnZW50VG9vbChuYW1lLCBhcmdzLCBzaWduYWw/LCBjb250ZXh0PylgKSBpc1xuICogYXV0by1hZGFwdGVkIGludG8gTWFzdHJhIHRvb2xzLiBVbmtub3duIG5hbWVzIHJldHVybiBgdW5kZWZpbmVkYCxcbiAqIG1hdGNoaW5nIEFwcEtpdCdzIGBQbHVnaW5zYCBzZW1hbnRpY3Mgc28gYHBsdWdpbnMuZm9vPy50b29sa2l0KClgXG4gKiByZW1haW5zIHNhZmUgaW4gZW52aXJvbm1lbnRzIHdoZXJlIGBmb29gIGlzbid0IHJlZ2lzdGVyZWQuXG4gKlxuICogYGdlbmllYCBpcyBzcGVjaWFsLWNhc2VkIHRvIHN3YXAgdGhlIGdlbmVyaWMgQXBwS2l0IHRvb2xraXQgKHdoaWNoXG4gKiBydW5zIGBleGVjdXRlQWdlbnRUb29sYCBhbmQgb25seSBlbWl0cyBhIHNpbmdsZSBmaW5hbCBgdG9vbC1yZXN1bHRgXG4gKiBjaHVuayBwZXIgY2FsbCkgZm9yIHRoZSBzdHJlYW1pbmctYXdhcmUgdG9vbHMgYnVpbHQgYnlcbiAqIHtAbGluayBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyfS4gVGhlIHN0cmVhbWluZyB2YXJpYW50IGZvcndhcmRzIGVhY2hcbiAqIEdlbmllIHdpcmUgZXZlbnQgKHN0YXR1cywgU1FMLCByb3cgY291bnRzLCBlcnJvcnMpIG91dCB0aHJvdWdoIHRoZVxuICogTWFzdHJhIGBjdHgud3JpdGVyYCwgc28gdGhlIFVJIGdldHMgYHRvb2wtb3V0cHV0YCBjaHVua3MgaW4gcmVhbFxuICogdGltZSBpbnN0ZWFkIG9mIHN0YXJpbmcgYXQgYSBzcGlubmVyIGZvciB0aGUgZnVsbCBHZW5pZSByb3VuZC10cmlwLlxuICovXG5mdW5jdGlvbiBidWlsZFBsdWdpbnNNYXAoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBjb250ZXh0OiBwbHVnaW5SZWdpc3RyeS5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbik6IE1hc3RyYVBsdWdpbnMge1xuICBjb25zdCBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIgfCBudWxsPigpO1xuICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIE1hc3RyYVBsdWdpbnMsIHtcbiAgICBnZXQoX3RhcmdldCwgcHJvcE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcE5hbWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FjaGUuaGFzKHByb3BOYW1lKSkgcmV0dXJuIGNhY2hlLmdldChwcm9wTmFtZSkgPz8gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcHJvdmlkZXIgPSByZXNvbHZlUHJvdmlkZXIoY29uZmlnLCBjb250ZXh0LCBwcm9wTmFtZSk7XG4gICAgICBjYWNoZS5zZXQocHJvcE5hbWUsIHByb3ZpZGVyKTtcbiAgICAgIHJldHVybiBwcm92aWRlciA/PyB1bmRlZmluZWQ7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUGljayB0aGUgcmlnaHQge0BsaW5rIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcn0gZm9yIGEgc2libGluZ1xuICogcGx1Z2luIGxvb2t1cC4gUmV0dXJucyB0aGUgR2VuaWUgYWdlbnQtYmFja2VkIGFkYXB0ZXIgd2hlblxuICogdGhlIGNhbGxlciBhc2tzIGZvciBgZ2VuaWVgIEFORCBhdCBsZWFzdCBvbmUgc3BhY2UgaXMgcmVhY2hhYmxlXG4gKiB2aWEge0BsaW5rIHJlc29sdmVHZW5pZVNwYWNlc30gKHRoZSBleHBsaWNpdFxuICogYGNvbmZpZy5nZW5pZVNwYWNlc2AsIHRoZSByZWdpc3RlcmVkIEFwcEtpdCBgZ2VuaWUoKWAgcGx1Z2luJ3NcbiAqIGBzcGFjZXNgIGNvbmZpZywgb3IgdGhlIGBEQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEYCBlbnYgdmFyKS5cbiAqIEZhbGxzIGJhY2sgdG8gdGhlIGdlbmVyaWMgQXBwS2l0IGBUb29sUHJvdmlkZXJgIGFkYXB0ZXIgZm9yXG4gKiBldmVyeSBvdGhlciBwbHVnaW4gbmFtZS4gYGNvbmZpZ2AgaXMgdGhyZWFkZWQgdGhyb3VnaCBzbyB0aGVcbiAqIEdlbmllIGFnZW50IGluaGVyaXRzIHRoZSBzYW1lIG1vZGVsIHJlc29sdmVyIC8gZmFsbGJhY2tcbiAqIGxhZGRlciB0aGUgY2FsbGluZyBhZ2VudHMgdXNlLlxuICpcbiAqIFRoZSBHZW5pZSB0b29scyB0YWxrIHRvIEdlbmllIGRpcmVjdGx5IHRocm91Z2ggYEBkYngtdG9vbHMvZ2VuaWVgXG4gKiAoYGdlbmllRXZlbnRDaGF0YCkgYW5kIHRoZSB3b3Jrc3BhY2UgYHN0YXRlbWVudEV4ZWN1dGlvbi5nZXRTdGF0ZW1lbnRgXG4gKiBBUEk7IEFwcEtpdCdzIHN0b2NrIGBnZW5pZWAgcGx1Z2luIGNvbnRyaWJ1dGVzIG9ubHkgaXRzIHJlc291cmNlXG4gKiBtYW5pZmVzdCBhbmQgYHNwYWNlc2AgY29uZmlnLCBzbyBhbiBgYXBwLnlhbWxgIHJlc291cmNlIGJpbmRpbmcgYW5kIGFcbiAqIGBnZW5pZSh7IHNwYWNlcyB9KWAgcmVjb3JkIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBoZXJlIGFzIHRoZXkgZG8gdGhlcmUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVQcm92aWRlcihcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IHBsdWdpblJlZ2lzdHJ5LlBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkLFxuICBwcm9wTmFtZTogc3RyaW5nLFxuKTogTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHwgbnVsbCB7XG4gIGlmIChwcm9wTmFtZSA9PT0gXCJnZW5pZVwiKSB7XG4gICAgY29uc3Qgc3BhY2VzID0gcmVzb2x2ZUdlbmllU3BhY2VzKGNvbmZpZywgY29udGV4dCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNwYWNlcykubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYnVpbGRHZW5pZVRvb2xraXRQcm92aWRlcih7XG4gICAgICBzcGFjZXMsXG4gICAgICBjb25maWcsXG4gICAgfSkgYXMgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyO1xuICB9XG4gIGNvbnN0IHBsdWdpbiA9IGNvbnRleHQ/LmdldFBsdWdpbnMoKS5nZXQocHJvcE5hbWUpO1xuICByZXR1cm4gYWRhcHRQbHVnaW5Ub29sa2l0KHBsdWdpbiwgcHJvcE5hbWUpO1xufVxuXG50eXBlIENvbnRleHR1YWxUb29sUHJvdmlkZXIgPSBQYXJ0aWFsPFBpY2s8VG9vbFByb3ZpZGVyLCBcImdldEFnZW50VG9vbHNcIj4+ICYge1xuICB0b29sa2l0PzogKFxuICAgIG9wdHM/OiBUb29sa2l0T3B0aW9ucyxcbiAgKSA9PlxuICAgIHwgUmV0dXJuVHlwZTxQbHVnaW5Ub29sa2l0UHJvdmlkZXJbXCJ0b29sa2l0XCJdPlxuICAgIHwgUHJvbWlzZTxSZXR1cm5UeXBlPFBsdWdpblRvb2xraXRQcm92aWRlcltcInRvb2xraXRcIl0+PjtcbiAgZXhlY3V0ZUFnZW50VG9vbD86IChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgYXJnczogdW5rbm93bixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICBjb250ZXh0PzogQWdlbnRUb29sRXhlY3V0aW9uQ29udGV4dCxcbiAgKSA9PiBQcm9taXNlPHVua25vd24+O1xufTtcblxuLyoqXG4gKiBBZGFwdCBhbiBBcHBLaXQgYFRvb2xQcm92aWRlcmAgcGx1Z2luIGluc3RhbmNlIGludG8gYVxuICoge0BsaW5rIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcn0uIFJldHVybnMgYG51bGxgIGZvciBhbnkgcGx1Z2luXG4gKiB0aGF0IGRvZXNuJ3QgaW1wbGVtZW50IGBleGVjdXRlQWdlbnRUb29sYCBwbHVzIGVpdGhlciBBcHBLaXQncyBuYXRpdmVcbiAqIGB0b29sa2l0YCBvciBgZ2V0QWdlbnRUb29sc2Agc3VyZmFjZS5cbiAqL1xuZnVuY3Rpb24gYWRhcHRQbHVnaW5Ub29sa2l0KFxuICBwbHVnaW46IHVua25vd24sXG4gIHBsdWdpbk5hbWU6IHN0cmluZyxcbik6IE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB8IG51bGwge1xuICBpZiAoIXBsdWdpbiB8fCB0eXBlb2YgcGx1Z2luICE9PSBcIm9iamVjdFwiKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcCA9IHBsdWdpbiBhcyBDb250ZXh0dWFsVG9vbFByb3ZpZGVyO1xuICBpZiAoXG4gICAgdHlwZW9mIHAuZXhlY3V0ZUFnZW50VG9vbCAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgKHR5cGVvZiBwLnRvb2xraXQgIT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgcC5nZXRBZ2VudFRvb2xzICE9PSBcImZ1bmN0aW9uXCIpXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB7XG4gICAgdG9vbGtpdChvcHRzPzogVG9vbGtpdE9wdGlvbnMpOiBNYXN0cmFUb29scyB8IFByb21pc2U8TWFzdHJhVG9vbHM+IHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPVxuICAgICAgICB0eXBlb2YgcC50b29sa2l0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHAudG9vbGtpdChvcHRzKVxuICAgICAgICAgIDogdG9vbGtpdEVudHJpZXNGcm9tRGVmaW5pdGlvbnMocGx1Z2luTmFtZSwgcC5nZXRBZ2VudFRvb2xzISgpLCBvcHRzKTtcbiAgICAgIGlmIChpc1Byb21pc2VMaWtlKGVudHJpZXMpKSB7XG4gICAgICAgIHJldHVybiBlbnRyaWVzLnRoZW4oKHJlc29sdmVkKSA9PiB0b29sa2l0RW50cmllc1RvTWFzdHJhVG9vbHMocmVzb2x2ZWQsIHApKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0b29sa2l0RW50cmllc1RvTWFzdHJhVG9vbHMoZW50cmllcywgcCk7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdG9vbGtpdEVudHJpZXNGcm9tRGVmaW5pdGlvbnMoXG4gIHBsdWdpbk5hbWU6IHN0cmluZyxcbiAgZGVmaW5pdGlvbnM6IEFnZW50VG9vbERlZmluaXRpb25bXSxcbiAgb3B0aW9uczogVG9vbGtpdE9wdGlvbnMgPSB7fSxcbik6IFJlY29yZDxzdHJpbmcsIFRvb2xraXRFbnRyeT4ge1xuICByZXR1cm4gdG9vbGtpdEVudHJpZXMuZW50cmllcyhwbHVnaW5OYW1lLCBkZWZpbml0aW9ucywgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZUxpa2U8VD4odmFsdWU6IFQgfCBQcm9taXNlPFQ+KTogdmFsdWUgaXMgUHJvbWlzZTxUPiB7XG4gIHJldHVybiB0eXBlb2YgKHZhbHVlIGFzIHsgdGhlbj86IHVua25vd24gfSk/LnRoZW4gPT09IFwiZnVuY3Rpb25cIjtcbn1cblxuZnVuY3Rpb24gdG9vbGtpdEVudHJpZXNUb01hc3RyYVRvb2xzKFxuICBlbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBUb29sa2l0RW50cnk+LFxuICBwbHVnaW46IENvbnRleHR1YWxUb29sUHJvdmlkZXIsXG4pOiBNYXN0cmFUb29scyB7XG4gIGNvbnN0IHRvb2xzOiBNYXN0cmFUb29scyA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzKSkge1xuICAgIHRvb2xzW2tleV0gPSB0b29sa2l0RW50cnlUb01hc3RyYVRvb2woZW50cnksIHBsdWdpbik7XG4gIH1cbiAgcmV0dXJuIHRvb2xzO1xufVxuXG4vKipcbiAqIFdyYXAgYSBzaW5nbGUge0BsaW5rIEFwcEtpdFRvb2xraXRFbnRyeX0gYXMgYSBNYXN0cmEgdG9vbCB3aG9zZVxuICogYGV4ZWN1dGVgIGRpc3BhdGNoZXMgYmFjayB0aHJvdWdoIGBwbHVnaW4uZXhlY3V0ZUFnZW50VG9vbCguLi4pYCBzb1xuICogQXBwS2l0J3MgT0JPIGF1dGggKGBhc1VzZXJgKSwgdGVsZW1ldHJ5IHNwYW5zLCBhbmQgdGhlIE1hc3RyYSBtZW1vcnkgcmVzb3VyY2VcbiAqIGlkIHN0YXkgaW50YWN0LiBKU09OIFNjaGVtYSBwYXJhbWV0ZXJzIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQgLSBNYXN0cmEnc1xuICogYFB1YmxpY1NjaGVtYWAgYWNjZXB0cyBgSlNPTlNjaGVtYTdgIGRpcmVjdGx5IHZpYSBgQG1hc3RyYS9zY2hlbWEtY29tcGF0YC5cbiAqL1xuZnVuY3Rpb24gdG9vbGtpdEVudHJ5VG9NYXN0cmFUb29sKGVudHJ5OiBUb29sa2l0RW50cnksIHBsdWdpbjogQ29udGV4dHVhbFRvb2xQcm92aWRlcik6IFRvb2wge1xuICBjb25zdCBhbm5vdGF0aW9ucyA9IGVudHJ5LmFubm90YXRpb25zID8/IGVudHJ5LmRlZi5hbm5vdGF0aW9ucztcbiAgY29uc3QgZWZmZWN0ID0gYW5ub3RhdGlvbnM/LmVmZmVjdDtcbiAgY29uc3QgcmVxdWlyZXNBcHByb3ZhbCA9IGVmZmVjdCA9PT0gXCJkZXN0cnVjdGl2ZVwiIHx8IGFubm90YXRpb25zPy5kZXN0cnVjdGl2ZSA9PT0gdHJ1ZTtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiBgJHtlbnRyeS5wbHVnaW5OYW1lfV9fJHtlbnRyeS5sb2NhbE5hbWV9YCxcbiAgICBkZXNjcmlwdGlvbjogZW50cnkuZGVmLmRlc2NyaXB0aW9uLFxuICAgIC4uLihlbnRyeS5kZWYucGFyYW1ldGVycyA/IHsgaW5wdXRTY2hlbWE6IGVudHJ5LmRlZi5wYXJhbWV0ZXJzIGFzIG5ldmVyIH0gOiB7fSksXG4gICAgLi4uKHJlcXVpcmVzQXBwcm92YWwgPyB7IHJlcXVpcmVBcHByb3ZhbDogdHJ1ZSB9IDoge30pLFxuICAgIC4uLihhbm5vdGF0aW9uc1xuICAgICAgPyB7XG4gICAgICAgICAgbWNwOiB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgICAgICByZWFkT25seUhpbnQ6IGVmZmVjdCA9PT0gXCJyZWFkXCIgfHwgYW5ub3RhdGlvbnMucmVhZE9ubHkgPT09IHRydWUsXG4gICAgICAgICAgICAgIGRlc3RydWN0aXZlSGludDogZWZmZWN0ID09PSBcImRlc3RydWN0aXZlXCIgfHwgYW5ub3RhdGlvbnMuZGVzdHJ1Y3RpdmUgPT09IHRydWUsXG4gICAgICAgICAgICAgIGlkZW1wb3RlbnRIaW50OiBhbm5vdGF0aW9ucy5pZGVtcG90ZW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbiA9IGNvbnRleHQgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBhZ2VudD86IHsgdG9vbENhbGxJZD86IHN0cmluZyB9O1xuICAgICAgICAgICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0PzogeyBnZXQoa2V5OiBzdHJpbmcpOiB1bmtub3duIH07XG4gICAgICAgICAgICB3cml0ZXI/OiB7XG4gICAgICAgICAgICAgIGN1c3RvbShwYXJ0OiB7IHR5cGU6IHN0cmluZzsgZGF0YTogdW5rbm93biB9KTogUHJvbWlzZTx2b2lkPjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJlc291cmNlSWQgPSBleGVjdXRpb24/LnJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSk7XG4gICAgICBjb25zdCBtb2RlbCA9IGV4ZWN1dGlvbj8ucmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfUkVTT0xWRURfTU9ERUxfS0VZKTtcbiAgICAgIGNvbnN0IHRvb2xDYWxsSWQgPSBleGVjdXRpb24/LmFnZW50Py50b29sQ2FsbElkO1xuICAgICAgY29uc3Qgd3JpdGVyID0gZXhlY3V0aW9uPy53cml0ZXI7XG4gICAgICByZXR1cm4gcGx1Z2luLmV4ZWN1dGVBZ2VudFRvb2whKGVudHJ5LmxvY2FsTmFtZSwgaW5wdXQsIGV4ZWN1dGlvbj8uYWJvcnRTaWduYWwsIHtcbiAgICAgICAgLi4uKHR5cGVvZiByZXNvdXJjZUlkID09PSBcInN0cmluZ1wiID8geyByZXNvdXJjZUlkIH0gOiB7fSksXG4gICAgICAgIC4uLih0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIgPyB7IG1vZGVsIH0gOiB7fSksXG4gICAgICAgIC4uLih3cml0ZXIgJiYgdG9vbENhbGxJZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICB3cml0ZVByb2dyZXNzOiBhc3luYyAoZXZlbnQ6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBUb29sUHJvZ3Jlc3NFdmVudFNjaGVtYS5wYXJzZShldmVudCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgd3JpdGVyXG4gICAgICAgICAgICAgICAgICAuY3VzdG9tKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogVE9PTF9QUk9HUkVTU19QQVJUX1RZUEUsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHsgdG9vbENhbGxJZCwgZXZlbnQ6IHBhcnNlZCB9LFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
|
|
861
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVF4RCxPQUFPLEVBQWtCLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQU9qRyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRS9FLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxrQkFBa0IsRUFBb0IsTUFBTSxxQkFBcUIsQ0FBQztBQUUzRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWhGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVqRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFzQixNQUFNLGFBQWEsQ0FBQztBQUN6RSxPQUFPLEVBQUUsVUFBVSxF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Q0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFnZW50IHJlZ2lzdHJhdGlvbiBmb3IgdGhlIE1hc3RyYSBBcHBLaXQgcGx1Z2luLlxuICpcbiAqIE1pcnJvcnMgdGhlIHNoYXBlIG9mIHRoZSBBcHBLaXQgYGFnZW50c2AgcGx1Z2luIChgY29uZmlnLmFnZW50c2AgbWFwXG4gKiBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9ufSwgZHVhbC1mb3JtIGB0b29sc2AgYWNjZXB0aW5nIGEgcGxhaW5cbiAqIHJlY29yZCBvciBhIGAocGx1Z2lucykgPT4gdG9vbHNgIGNhbGxiYWNrKS4gUmVzb2x2ZXMgZWFjaCBkZWZpbml0aW9uXG4gKiBpbnRvIGEgTWFzdHJhIGBBZ2VudGAgaW5zdGFuY2UgZHVyaW5nIHBsdWdpbiBzZXR1cDsgdXNlci1zdXBwbGllZFxuICogdG9vbCBjYWxsYmFja3MgYXJlIGludm9rZWQgZXhhY3RseSBvbmNlIHdpdGggYSB0eXBlZFxuICoge0BsaW5rIE1hc3RyYVBsdWdpbnN9IG1hcCBidWlsdCBmcm9tIHJlZ2lzdGVyZWQgc2libGluZyBwbHVnaW5zLlxuICpcbiAqIFdoZW4gbm8gYWdlbnRzIGFyZSByZWdpc3RlcmVkIHRoZSBwbHVnaW4gZmFsbHMgYmFjayB0byBhIHNpbmdsZVxuICogYnVpbHQtaW4gYW5hbHlzdCBzbyB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZ1xuICogc3RyZWFtYWJsZSBhZ2VudCBmb3IgZGVtb3MuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHtcbiAgQWdlbnRUb29sRGVmaW5pdGlvbixcbiAgUGx1Z2luVG9vbGtpdFByb3ZpZGVyLFxuICBUb29sa2l0RW50cnksXG4gIFRvb2xraXRPcHRpb25zIGFzIEFwcEtpdFRvb2xraXRPcHRpb25zLFxuICBUb29sUHJvdmlkZXIsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuaW1wb3J0IHsgcGx1Z2luUmVnaXN0cnksIHRvb2xraXRFbnRyaWVzIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQvdG9vbC1wcm92aWRlclwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IFRPT0xfUFJPR1JFU1NfUEFSVF9UWVBFLCBUb29sUHJvZ3Jlc3NFdmVudFNjaGVtYSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmEvd2lyZVwiO1xuaW1wb3J0IHR5cGUge1xuICBBZ2VudENvbmZpZyxcbiAgQWdlbnRFeGVjdXRpb25PcHRpb25zLFxuICBBZ2VudEluc3RydWN0aW9ucyxcbiAgVG9vbHNJbnB1dCxcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgeyBjcmVhdGVFdmVudGVkQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50L2R1cmFibGVcIjtcbmltcG9ydCB7IFNraWxsU2VhcmNoUHJvY2Vzc29yLCBUb29sQ2FsbEZpbHRlciB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcHJvY2Vzc29yc1wiO1xuaW1wb3J0IHR5cGUgeyBPdXRwdXRQcm9jZXNzb3IgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Byb2Nlc3NvcnNcIjtcbmltcG9ydCB7IE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyByZXNvbHZlQWdlbnRTa2lsbHMsIHR5cGUgSW5saW5lU2tpbGwgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3NraWxsc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2RlTW9kZVRyYW5zcG9ydCwgVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUNvZGVNb2RlLCBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2UgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHsgY3JlYXRlU2tpbGxUb29scywgY3JlYXRlV29ya3NwYWNlVG9vbHMgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHR5cGUgeyBQZ1ZlY3RvckNvbmZpZywgUG9zdGdyZXNTdG9yZUNvbmZpZyB9IGZyb20gXCJAbWFzdHJhL3BnXCI7XG5pbXBvcnQgeyBRdWlja0pzQ29kZU1vZGVUcmFuc3BvcnQgfSBmcm9tIFwiQG1hc3RyYS9xdWlja2pzXCI7XG5cbmltcG9ydCB7IGJ1aWxkUmVuZGVyRGF0YVRvb2wgfSBmcm9tIFwiLi9jaGFydC50c1wiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIsIHJlc29sdmVHZW5pZVNwYWNlcyB9IGZyb20gXCIuL2dlbmllLnRzXCI7XG5pbXBvcnQgeyB3aXRoUmVxdWVzdE1lbW9yeVNjb3BlLCB0eXBlIE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9tZW1vcnkudHNcIjtcbmltcG9ydCB7IGJ1aWxkTW9kZWwsIFJFU1BPTlNFU19QUk9WSURFUl9PUFRJT05TIH0gZnJvbSBcIi4vbW9kZWwudHNcIjtcbmltcG9ydCB7IHN0cmlwU3RhbGVDaGFydHNQcm9jZXNzb3IgfSBmcm9tIFwiLi9wcm9jZXNzb3JzLnRzXCI7XG5pbXBvcnQgeyBNQVNUUkFfUkVTT0xWRURfTU9ERUxfS0VZIH0gZnJvbSBcIi4vc2VydmluZy50c1wiO1xuaW1wb3J0IHsgVFlQT0dSQVBIWV9SVUxFIH0gZnJvbSBcIi4vc3R5bGUudHNcIjtcbmltcG9ydCB7IGJ1aWxkU3VtbWFyaXplVG9vbCB9IGZyb20gXCIuL3N1bW1hcml6ZS50c1wiO1xuaW1wb3J0IHtcbiAgYmluZERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuICBkYXRhYnJpY2tzV29ya3NwYWNlLFxuICB0eXBlIERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zLFxufSBmcm9tIFwiLi93b3Jrc3BhY2VzLnRzXCI7XG5cbmNvbnN0IGNvZGVNb2RlTG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9jb2RlLW1vZGVcIik7XG5sZXQgcmVzb2x2ZWRDb2RlTW9kZVRyYW5zcG9ydDogUHJvbWlzZTxDb2RlTW9kZVRyYW5zcG9ydD4gfCB1bmRlZmluZWQ7XG5cbi8qKiBSZXR1cm4gd2hldGhlciB0aGlzIGJvb3QgZW52aXJvbm1lbnQgbWF0Y2hlcyBpc29sYXRlZC12bSdzIHN1cHBvcnRlZCBhcHAgc2hhcGUuICovXG5mdW5jdGlvbiBzdXBwb3J0c0lzb2xhdGVkVm1UcmFuc3BvcnQoKTogYm9vbGVhbiB7XG4gIGlmIChwcm9jZXNzLnZlcnNpb25zLmJ1biB8fCBwcm9jZXNzLnJlbGVhc2UubmFtZSAhPT0gXCJub2RlXCIgfHwgcHJvY2Vzcy5wbGF0Zm9ybSAhPT0gXCJsaW51eFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IG5vZGVNYWpvciA9IE51bWJlci5wYXJzZUludChwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoXCIuXCIpWzBdID8/IFwiXCIsIDEwKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobm9kZU1ham9yKSB8fCBub2RlTWFqb3IgPCAyMCB8fCBub2RlTWFqb3IgPj0gMjUpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgbm9kZU9wdGlvbnMgPSBwcm9jZXNzLmVudi5OT0RFX09QVElPTlM/LnNwbGl0KC9cXHMrLykgPz8gW107XG4gIHJldHVybiBbLi4ucHJvY2Vzcy5leGVjQXJndiwgLi4ubm9kZU9wdGlvbnNdLmluY2x1ZGVzKFwiLS1uby1ub2RlLXNuYXBzaG90XCIpO1xufVxuXG4vKipcbiAqIFRvb2wgcmVjb3JkIGFjY2VwdGVkIGJ5IGV2ZXJ5IE1hc3RyYSBgQWdlbnQudG9vbHNgIGZpZWxkIGFuZCBieSB0aGVcbiAqIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2sgb24ge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbn0uXG4gKlxuICogQWxpYXMgb2YgTWFzdHJhJ3MgYFRvb2xzSW5wdXRgLCBzbyBpdCBhbHJlYWR5IGFjY2VwdHM6XG4gKlxuICogLSBNYXN0cmEgdG9vbHMgYnVpbHQgd2l0aCB7QGxpbmsgY3JlYXRlVG9vbH0gKG9yIGBuZXcgVG9vbCguLi4pYClcbiAqIC0gTWFzdHJhIHRvb2xzIGJ1aWx0IHdpdGggdGhlIEFwcEtpdC1zaGFwZWQge0BsaW5rIHRvb2x9IHdyYXBwZXJcbiAqICAgYmVsb3dcbiAqIC0gVmVyY2VsIEFJIFNESyB0b29scyAoYHRvb2woeyAuLi4gfSlgIGZyb20gYGFpYClcbiAqIC0gUHJvdmlkZXItZGVmaW5lZCB0b29scyAoZS5nLiBgb3BlbmFpLnRvb2xzLndlYlNlYXJjaCguLi4pYClcbiAqXG4gKiBFeGlzdGluZyB0b29sIGxpYnJhcmllcyBkcm9wIGluIGFzLWlzIC0gbm90aGluZyBpbiB0aGlzIHBhY2thZ2VcbiAqIGZvcmNlcyBhIHJlYnVpbGQuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVRvb2xzID0gVG9vbHNJbnB1dDtcblxuLyoqIFJlLWV4cG9ydCBvZiBNYXN0cmEncyBuYXRpdmUgYGNyZWF0ZVRvb2xgIGZvciBmdWxsLWZlYXR1cmUgYWNjZXNzLiAqL1xuZXhwb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcblxuLyoqXG4gKiBBcHBLaXQtc2hhcGVkIHRvb2wgZmFjdG9yeS4gTGV0cyB1c2VycyBtaXgtYW5kLW1hdGNoIHRvb2xzIGFjcm9zc1xuICogQXBwS2l0J3MgYGFnZW50c2AgcGx1Z2luIGFuZCBgbWFzdHJhYCB3aXRoIGEgc2luZ2xlIGltcG9ydDpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgdG9vbCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqIGltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG4gKlxuICogZ2V0X3dlYXRoZXI6IHRvb2woe1xuICogICBkZXNjcmlwdGlvbjogXCJXZWF0aGVyXCIsXG4gKiAgIHNjaGVtYTogei5vYmplY3QoeyBjaXR5OiB6LnN0cmluZygpIH0pLFxuICogICBleGVjdXRlOiBhc3luYyAoeyBjaXR5IH0pID0+IGBTdW5ueSBpbiAke2NpdHl9YCxcbiAqIH0pLFxuICogYGBgXG4gKlxuICogTWFwcyBvbnRvIE1hc3RyYSdzIGBjcmVhdGVUb29sYDpcbiAqXG4gKiAtIGBkZXNjcmlwdGlvbmAgLT4gYGRlc2NyaXB0aW9uYCAocmVxdWlyZWQpXG4gKiAtIGBzY2hlbWFgIC0+IGBpbnB1dFNjaGVtYWAgKG9wdGlvbmFsKVxuICogLSBgZXhlY3V0ZShpbnB1dClgIC0+IGBleGVjdXRlKGlucHV0LCBjdHgpYCAtIE1hc3RyYSBhbHJlYWR5IGNhbGxzXG4gKiAgIHRoZSBmaXJzdCBhcmcgd2l0aCB0aGUgcGFyc2VkIGlucHV0cywgc28gdGhlIGJvZHkgc2hhcGUgaXNcbiAqICAgaWRlbnRpY2FsLiBUaGUgTWFzdHJhIGBjb250ZXh0YCBhcmcgaXMgZm9yd2FyZGVkIGFzIHRoZSBzZWNvbmRcbiAqICAgcGFyYW1ldGVyIHdoZW4gdGhlIGNhbGxlciBkZWNsYXJlcyBpdC5cbiAqIC0gYGlkYDogb3B0aW9uYWwuIERlZmF1bHRzIHRvIGEgc3RhYmxlIGlkZW50aWZpZXIgZGVyaXZlZCBmcm9tXG4gKiAgIGBkZXNjcmlwdGlvbmAgKHNsdWdpZmllZCwgd2l0aCBhIHNob3J0IGhhc2ggc3VmZml4IGZvclxuICogICB1bmlxdWVuZXNzKS4gUGFzcyBhbiBleHBsaWNpdCBgaWRgIHdoZW4geW91IG5lZWQgYSBzdGFibGUgc3RyaW5nXG4gKiAgIGZvciB0cmFjaW5nIG9yIE1DUCBleHBvc3VyZS5cbiAqXG4gKiBSZWFjaCBmb3Ige0BsaW5rIGNyZWF0ZVRvb2x9IHdoZW4geW91IG5lZWQgTWFzdHJhLW9ubHkgZmllbGRzXG4gKiAoYG91dHB1dFNjaGVtYWAsIGBzdXNwZW5kU2NoZW1hYCwgYHJlcXVpcmVBcHByb3ZhbGAsIGBtY3BgLCBldGMuKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvb2wob3B0czogQXBwS2l0VG9vbE9wdGlvbnMpOiBUb29sIHtcbiAgY29uc3QgaWQgPSBvcHRzLmlkID8/IGRlcml2ZVRvb2xJZChvcHRzLmRlc2NyaXB0aW9uKTtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkLFxuICAgIGRlc2NyaXB0aW9uOiBvcHRzLmRlc2NyaXB0aW9uLFxuICAgIC4uLihvcHRzLnNjaGVtYSA/IHsgaW5wdXRTY2hlbWE6IG9wdHMuc2NoZW1hIGFzIG5ldmVyIH0gOiB7fSksXG4gICAgZXhlY3V0ZTogb3B0cy5leGVjdXRlIGFzIG5ldmVyLFxuICB9KTtcbn1cblxuLyoqXG4gKiBJbnB1dCBzaGFwZSBmb3IgdGhlIEFwcEtpdC1zdHlsZSB7QGxpbmsgdG9vbH0gZmFjdG9yeS4gQSB0cmltbWVkXG4gKiBzdWJzZXQgb2YgTWFzdHJhJ3MgYGNyZWF0ZVRvb2xgIG9wdGlvbnMgdGhhdCBtaXJyb3JzIHRoZVxuICogYEBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhYCBgdG9vbCh7IGRlc2NyaXB0aW9uLCBzY2hlbWEsIGV4ZWN1dGUgfSlgXG4gKiBzaWduYXR1cmUuXG4gKlxuICogR2VuZXJpY3MgYXJlIGludGVudGlvbmFsbHkgYWJzZW50IC0gaW5mZXJlbmNlIGZsb3dzIHRocm91Z2ggdGhlXG4gKiBjYWxsZXIncyBgc2NoZW1hYCAodHlwaWNhbGx5IGEgWm9kIG9iamVjdCksIGFuZCB0aGUgYGV4ZWN1dGVgIGJvZHlcbiAqIGRlc3RydWN0dXJlcyBuYXR1cmFsbHkgZnJvbSB0aGF0LiBSZWFjaCBmb3Ige0BsaW5rIGNyZWF0ZVRvb2x9IHdoZW5cbiAqIHlvdSBuZWVkIHRoZSBmdWxseS10eXBlZCBpbnB1dC9vdXRwdXQgc2NoZW1hcyB3aXJlZCBleHBsaWNpdGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcEtpdFRvb2xPcHRpb25zIHtcbiAgLyoqIE9wdGlvbmFsIHN0YWJsZSBpZGVudGlmaWVyOyBhdXRvLWRlcml2ZWQgZnJvbSBgZGVzY3JpcHRpb25gIHdoZW4gb21pdHRlZC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzaG93biB0byB0aGUgbW9kZWwuIFJlcXVpcmVkLiAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgaW5wdXQgc2NoZW1hIChhbnkgU3RhbmRhcmQgU2NoZW1hIGluc3RhbmNlLCBlLmcuIFpvZCkuXG4gICAqIE1hcHMgdG8gTWFzdHJhJ3MgYGlucHV0U2NoZW1hYDsgcGFzc2VkIHRocm91Z2ggdG8gdGhlIG1vZGVsXG4gICAqIHZlcmJhdGltLlxuICAgKi9cbiAgc2NoZW1hPzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEV4ZWN1dGUgYm9keS4gRmlyc3QgYXJnIGlzIHRoZSBwYXJzZWQgaW5wdXQgKHR5cGVkIG9mZiBgc2NoZW1hYFxuICAgKiB3aGVuIHN1cHBsaWVkKSwgc2Vjb25kIGFyZyBpcyB0aGUgZnVsbCBNYXN0cmEgZXhlY3V0aW9uIGNvbnRleHRcbiAgICogKHJlcXVlc3QgY29udGV4dCwgYWJvcnQgc2lnbmFsLCBtYXN0cmEgaW5zdGFuY2UpIGlmIHlvdSBuZWVkIGl0LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZXhlY3V0ZTogKGlucHV0OiBhbnksIGNvbnRleHQ/OiB1bmtub3duKSA9PiB1bmtub3duO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgZGV0ZXJtaW5pc3RpYyBNYXN0cmEgdG9vbCBpZCBmcm9tIGEgZGVzY3JpcHRpb24uXG4gKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIHN0cmluZy50b1VuaXF1ZVNsdWd9OiBzbHVnICsgYWx3YXlzLW9uXG4gKiA2LWNoYXIgRk5WLTFhIGJhc2UtMzIgc3VmZml4IHNvIHR3byB0b29scyB3aXRoIHRoZSBzYW1lIGxlYWRpbmdcbiAqIHdvcmRzIGRvbid0IGNvbGxpZGUgaW4gdHJhY2VzLiBTdGFibGUgYWNyb3NzIHJ1bnMuXG4gKi9cbmZ1bmN0aW9uIGRlcml2ZVRvb2xJZChkZXNjcmlwdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRvVW5pcXVlU2x1ZyhkZXNjcmlwdGlvbiwgeyBmYWxsYmFja1ByZWZpeDogXCJ0b29sXCIgfSk7XG59XG5cbi8qKlxuICogSWRlbnRpdHkgaGVscGVyIHRoYXQgYnJhbmRzIGEgZGVmaW5pdGlvbiBhcyBhIE1hc3RyYSBhZ2VudC4gTWlycm9yc1xuICogQXBwS2l0J3MgYGNyZWF0ZUFnZW50KGRlZilgIHNvIHRoZSByZWdpc3RyYXRpb24gc2hhcGUgbWF0Y2hlczpcbiAqXG4gKiBgYGB0c1xuICogY29uc3Qgc3VwcG9ydCA9IGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiLFxuICogICBtb2RlbDogXCJkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02XCIsXG4gKiAgIHRvb2xzKHBsdWdpbnMpIHsgcmV0dXJuIHsgLi4uIH07IH0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEFkZHMgdGhlIHBhY2thZ2UncyBkZWZhdWx0IHdvcmtzcGFjZSB3aGVuIHRoZSBkZWZpbml0aW9uIG9taXRzIG9uZS4gVGhhdFxuICogd29ya3NwYWNlIGNhcnJpZXMgRGF0YWJyaWNrcyBza2lsbCBtb3VudHMgd2hpbGUgY29tbWFuZCBleGVjdXRpb24gc3RheXNcbiAqIGRpc2FibGVkIHVudGlsIGEgc2FuZGJveCBpcyBzZWxlY3RlZCBleHBsaWNpdGx5LiBBbiBleHBsaWNpdCB3b3Jrc3BhY2VcbiAqIHJlbWFpbnMgdGhlIGNhbGxlcidzIGNvbXBsZXRlIG92ZXJyaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWdlbnQ8XG4gIFRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93biA9IHVua25vd24sXG4gIFREZWZpbml0aW9uIGV4dGVuZHMgTWFzdHJhQWdlbnREZWZpbml0aW9uPFRSZXF1ZXN0Q29udGV4dD4gPVxuICAgIE1hc3RyYUFnZW50RGVmaW5pdGlvbjxUUmVxdWVzdENvbnRleHQ+LFxuPihkZWY6IFREZWZpbml0aW9uKTogVERlZmluaXRpb24ge1xuICBpZiAoZGVmLndvcmtzcGFjZSkgcmV0dXJuIHsgLi4uZGVmIH07XG4gIGNvbnN0IHdvcmtzcGFjZSA9IGRhdGFicmlja3NXb3Jrc3BhY2UoKTtcbiAgbWFya0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlKTtcbiAgcmV0dXJuIHsgLi4uZGVmLCB3b3Jrc3BhY2UgfTtcbn1cblxuLyoqXG4gKiBCcmFuZCBmb3IgYSB7QGxpbmsgV29ya3NwYWNlfSB0aGF0IGBjcmVhdGVBZ2VudGAgYnVpbHQgd2l0aCBubyBjYWxsZXJcbiAqIG9wdGlvbnMsIHNvIHtAbGluayBidWlsZEFnZW50c30gbWF5IHJlYnVpbGQgaXQgd2l0aCBzdGFydHVwLXByb3Zpc2lvbmVkXG4gKiBgZXh0cmFTa2lsbE1vdW50c2AgKGEgY2FsbGVyLXN1cHBsaWVkIHdvcmtzcGFjZSBpcyBuZXZlciB0b3VjaGVkKS5cbiAqL1xuY29uc3QgZGVmYXVsdFdvcmtzcGFjZXMgPSBuZXcgV2Vha1NldDxXb3Jrc3BhY2U+KCk7XG5cbi8qKiBCcmFuZCBgd29ya3NwYWNlYCBhcyB0aGUgYXV0by1jcmVhdGVkIGRlZmF1bHQuICovXG5mdW5jdGlvbiBtYXJrRGVmYXVsdFdvcmtzcGFjZSh3b3Jrc3BhY2U6IFdvcmtzcGFjZSk6IHZvaWQge1xuICBkZWZhdWx0V29ya3NwYWNlcy5hZGQod29ya3NwYWNlKTtcbn1cblxuLyoqIFdoZXRoZXIgYHdvcmtzcGFjZWAgd2FzIGF1dG8tY3JlYXRlZCBieSB7QGxpbmsgY3JlYXRlQWdlbnR9LiAqL1xuZnVuY3Rpb24gaXNEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZTogV29ya3NwYWNlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiB3b3Jrc3BhY2UgIT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0V29ya3NwYWNlcy5oYXMod29ya3NwYWNlKTtcbn1cblxuLyoqXG4gKiBGaWx0ZXIgLyByZW5hbWUgb3B0aW9ucyBhY2NlcHRlZCBieSBldmVyeSBwbHVnaW4ncyBgLnRvb2xraXQoKWBcbiAqIG1ldGhvZCwgZGlyZWN0bHkgc291cmNlZCBmcm9tIEFwcEtpdCdzIHB1YmxpYyBiZXRhIGNvbnRyYWN0LlxuICovXG5leHBvcnQgdHlwZSBUb29sa2l0T3B0aW9ucyA9IEFwcEtpdFRvb2xraXRPcHRpb25zO1xuXG4vKipcbiAqIFRvb2xraXQgcHJvdmlkZXIgc2hhcGUgZXZlcnkgZW50cnkgaW4gdGhlIHtAbGluayBNYXN0cmFQbHVnaW5zfSBtYXBcbiAqIGV4cG9zZXMuIElkZW50aWNhbCB0byBBcHBLaXQncyBgUGx1Z2luVG9vbGtpdFByb3ZpZGVyYCAtIGFueSBBcHBLaXRcbiAqIHBsdWdpbiB0aGF0IGltcGxlbWVudHMgdGhlIHN0YW5kYXJkIGBUb29sUHJvdmlkZXJgIGludGVyZmFjZVxuICogKGBnZXRBZ2VudFRvb2xzYCArIGBleGVjdXRlQWdlbnRUb29sYCArIGB0b29sa2l0YCkgaXMgcmVhY2hhYmxlXG4gKiB0aHJvdWdoIHRoaXMgc3VyZmFjZSBhdXRvbWF0aWNhbGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgTWFzdHJhLXNoYXBlZCB0b29scyByZWNvcmQgYWRhcHRlZCBmcm9tIHRoZSBwbHVnaW4nc1xuICAgKiBhZ2VudCB0b29scy4gRWFjaCB0b29sIGRpc3BhdGNoZXMgYmFjayB0aHJvdWdoIHRoZSBwbHVnaW4nc1xuICAgKiBgZXhlY3V0ZUFnZW50VG9vbGAgc28gT0JPIGF1dGggYW5kIHRlbGVtZXRyeSBzcGFucyBzdGF5IGludGFjdC5cbiAgICovXG4gIHRvb2xraXQob3B0cz86IFRvb2xraXRPcHRpb25zKTogTWFzdHJhVG9vbHMgfCBQcm9taXNlPE1hc3RyYVRvb2xzPjtcbn1cblxuLyoqXG4gKiBQbHVnaW4gbWFwIGhhbmRlZCB0byB0aGUgZnVuY3Rpb24gZm9ybSBvZlxuICoge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi50b29sc30uIE1pcnJvcnMgQXBwS2l0J3MgYFBsdWdpbnNgXG4gKiB0eXBlIGV4YWN0bHk6IGEgc3RyaW5nLWtleWVkIHJlY29yZCB3aGVyZSBldmVyeSB2YWx1ZSBleHBvc2VzXG4gKiBgLnRvb2xraXQob3B0cylgLlxuICpcbiAqIEltcGxlbWVudGVkIGFzIGEgcnVudGltZSBQcm94eSB0aGF0IGF1dG8tZGlzY292ZXJzIGFueSByZWdpc3RlcmVkXG4gKiBBcHBLaXQgcGx1Z2luIGltcGxlbWVudGluZyB0aGUgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYGFuYWx5dGljc2AsIGBmaWxlc2AsIGBsYWtlYmFzZWAsIGBnZW5pZWAsIHBsdXMgYW55IHRoaXJkLXBhcnR5XG4gKiBwbHVnaW4gdGhhdCBkb2VzIHRoZSBzYW1lKS4gVW5rbm93biBuYW1lcyByZXNvbHZlIHRvIGB1bmRlZmluZWRgXG4gKiBhdCBydW50aW1lLCBzbyBndWFyZCB3aXRoIGA/LmAgYW5kIGA/PyB7fWAgd2hlbiBzcHJlYWRpbmcgZnJvbSBhXG4gKiBwbHVnaW4gdGhhdCBtYXkgbm90IGJlIHJlZ2lzdGVyZWQgaW4gZXZlcnkgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCIuLi5cIixcbiAqICAgYXN5bmMgdG9vbHMocGx1Z2lucykge1xuICogICAgIHJldHVybiB7XG4gKiAgICAgICAuLi4oYXdhaXQgcGx1Z2lucy5hbmFseXRpY3MudG9vbGtpdCgpKSxcbiAqICAgICAgIC4uLihhd2FpdCBwbHVnaW5zLmZpbGVzLnRvb2xraXQoeyBvbmx5OiBbXCJ1cGxvYWRzLnJlYWRcIl0gfSkpLFxuICogICAgICAgZ2V0X3dlYXRoZXI6IHRvb2woe1xuICogICAgICAgICBkZXNjcmlwdGlvbjogXCJXZWF0aGVyXCIsXG4gKiAgICAgICAgIHNjaGVtYTogei5vYmplY3QoeyBjaXR5OiB6LnN0cmluZygpIH0pLFxuICogICAgICAgICBleGVjdXRlOiBhc3luYyAoeyBjaXR5IH0pID0+IGBTdW5ueSBpbiAke2NpdHl9YCxcbiAqICAgICAgIH0pLFxuICogICAgIH07XG4gKiAgIH0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFQbHVnaW5zID0gUmVjb3JkPHN0cmluZywgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyPjtcblxuLyoqIEZ1bmN0aW9uIGZvcm0gb2Yge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi50b29sc30uICovXG5leHBvcnQgdHlwZSBNYXN0cmFUb29sc0ZuID0gKHBsdWdpbnM6IE1hc3RyYVBsdWdpbnMpID0+IE1hc3RyYVRvb2xzIHwgUHJvbWlzZTxNYXN0cmFUb29scz47XG5cbi8qKiBGdW5jdGlvbiBmb3JtIG9mIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb24ud29ya3NwYWNlfTsgYHVuZGVmaW5lZGAgZGlzYWJsZXMgaXQgZm9yIHRoaXMgYWdlbnQuICovXG5leHBvcnQgdHlwZSBNYXN0cmFBZ2VudFdvcmtzcGFjZVJlc29sdmVyID0gKCkgPT4gV29ya3NwYWNlIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgY29kZS1kZWZpbmVkIE1hc3RyYSBhZ2VudC4gTWlycm9ycyB0aGUgc2hhcGUgQXBwS2l0J3MgYGFnZW50c2BcbiAqIHBsdWdpbiB1c2VzIGZvciBgQWdlbnREZWZpbml0aW9uYC4gVGhlIHJlZ2lzdHJ5IGtleSB1bmRlclxuICogYGNvbmZpZy5hZ2VudHNgIGlzIHRoZSBgYWdlbnRJZGAgdGhlIGNsaWVudCBzdHJlYW1zIGFnYWluc3Q7IGBuYW1lYFxuICogaXMgcHVyZWx5IGluZm9ybWF0aW9uYWwgKGRlZmF1bHRzIHRvIHRoZSBrZXkpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYUFnZW50RGVmaW5pdGlvbjxcbiAgVFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duID0gdW5rbm93bixcbj4ge1xuICAvKiogRGlzcGxheSBuYW1lIHVzZWQgYXMgYEFnZW50Lm5hbWVgLiBEZWZhdWx0cyB0byB0aGUgcmVnaXN0cnkga2V5LiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgbG9uZy1mb3JtIGRlc2NyaXB0aW9uOyBzdXJmYWNlZCBhcyBgQWdlbnQuZGVzY3JpcHRpb25gLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN0YXRpYyBvciByZXF1ZXN0LWNvbnRleHQtYXdhcmUgc3lzdGVtIGluc3RydWN0aW9ucy4gKi9cbiAgaW5zdHJ1Y3Rpb25zOiBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcImluc3RydWN0aW9uc1wiXTtcbiAgLyoqIE5hdGl2ZSBNYXN0cmEgc2NoZW1hIHRoYXQgdmFsaWRhdGVzIGFuZCB0eXBlcyBhcHBsaWNhdGlvbiByZXF1ZXN0IGNvbnRleHQuICovXG4gIHJlcXVlc3RDb250ZXh0U2NoZW1hPzogQWdlbnRDb25maWc8XG4gICAgc3RyaW5nLFxuICAgIFRvb2xzSW5wdXQsXG4gICAgdW5kZWZpbmVkLFxuICAgIFRSZXF1ZXN0Q29udGV4dFxuICA+W1wicmVxdWVzdENvbnRleHRTY2hlbWFcIl07XG4gIC8qKlxuICAgKiBNYXN0cmEtbmF0aXZlIHBlci1jYWxsIGFwcHJvdmFsIGdhdGUgZm9yIHRoaXMgYWdlbnQncyB0b29scy4gU3VwcG9ydHMgYW5cbiAgICogYXN5bmMgQ2xhc3NpZmllci1iYWNrZWQgZnVuY3Rpb247IHRvb2wtbGV2ZWwgYXBwcm92YWwgcmVtYWlucyBhdXRob3JpdGF0aXZlLlxuICAgKi9cbiAgcmVxdWlyZVRvb2xBcHByb3ZhbD86IEFnZW50RXhlY3V0aW9uT3B0aW9uc1tcInJlcXVpcmVUb29sQXBwcm92YWxcIl07XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgbW9kZWwgb3ZlcnJpZGUuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBmYWxscyBiYWNrIHRvIHRoZSB3b3Jrc3BhY2VcbiAgICogICBgL3NlcnZpbmctZW5kcG9pbnRzYCByZXNvbHZlciB0aGF0IHtAbGluayBidWlsZE1vZGVsfSBjb25maWd1cmVzXG4gICAqICAgZnJvbSB0aGUgcGVyLXJlcXVlc3QgYFdvcmtzcGFjZUNsaWVudGAuXG4gICAqIC0gYHN0cmluZ2A6IHNob3J0aGFuZCBmb3IgXCJ1c2UgdGhlIGRlZmF1bHQgcmVzb2x2ZXIgYnV0IHN3YXAgdGhlXG4gICAqICAgYG1vZGVsSWRgXCIgKGUuZy4gYFwiZGF0YWJyaWNrcy1tZXRhLWxsYW1hLTMtMy03MGItaW5zdHJ1Y3RcImApLlxuICAgKiAtIEFueSBvdGhlciBNYXN0cmEgYER5bmFtaWNBcmd1bWVudDxNYXN0cmFNb2RlbENvbmZpZz5gOiBwYXNzZWRcbiAgICogICBzdHJhaWdodCB0aHJvdWdoIHRvIGBBZ2VudC5tb2RlbGAuIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgZnVsbFxuICAgKiAgIGNvbnRyb2wgb3ZlciBhdXRoIG9yIHByb3ZpZGVySWQuXG4gICAqL1xuICBtb2RlbD86IEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wibW9kZWxcIl0gfCBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgdG9vbCByZWNvcmQuIEVpdGhlciBhIHBsYWluIG1hcCBvciBhIGNhbGxiYWNrIHRoYXRcbiAgICogcmVjZWl2ZXMgdGhlIHR5cGVkIHtAbGluayBNYXN0cmFQbHVnaW5zfSBzaWJsaW5nLXBsdWdpbiBpbmRleCBhbmRcbiAgICogcmV0dXJucyBhIG1hcC4gVGhlIGNhbGxiYWNrIHJ1bnMgZXhhY3RseSBvbmNlIGF0IGFnZW50IHNldHVwOyB0aGVcbiAgICogcmVzdWx0IGlzIGNhY2hlZCBmb3IgdGhlIGFnZW50J3MgbGlmZXRpbWUuXG4gICAqL1xuICB0b29scz86IE1hc3RyYVRvb2xzIHwgTWFzdHJhVG9vbHNGbjtcbiAgLyoqXG4gICAqIFBlci1hZ2VudCBzZW1hbnRpYyByZWNhbGwgKFBnVmVjdG9yKSBvdmVycmlkZS4gQ2FzY2FkZXMgZnJvbVxuICAgKiBgY29uZmlnLm1lbW9yeWA7IHRoZSBhZ2VudCB2YWx1ZSB3aW5zIHdoZW4gc2V0LlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogaW5oZXJpdCBgY29uZmlnLm1lbW9yeWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50ICoqc2hhcmVzIHRoZSBwbHVnaW4tbGV2ZWwgc2luZ2xldG9uIGBQZ1ZlY3RvcmBcbiAgICogICBpbnN0YW5jZSoqIChjcm9zcy1hZ2VudCBzZW1hbnRpYyByZWNhbGwgYWNyb3NzIHRoZSBzYW1lIGluZGV4KS5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIHNlbWFudGljIHJlY2FsbCBmb3IgdGhpcyBhZ2VudCBvbmx5LlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHVzaW5nIHRoZSBzaGFyZWQgc2luZ2xldG9uIChzYW1lIGFzIGRlZmF1bHQgd2hlblxuICAgKiAgIHBsdWdpbiBtZW1vcnkgaXMgZW5hYmxlZDsgdXNlZnVsIHRvIG9wdCBpbiB3aGVuIHBsdWdpbiBkaXNhYmxlZCkuXG4gICAqIC0ge0BsaW5rIE1hc3RyYU1lbW9yeUNvbmZpZ30gb2JqZWN0OiBkZWRpY2F0ZWQgYFBnVmVjdG9yYCBmb3IgdGhpc1xuICAgKiAgIGFnZW50IChwcml2YXRlIHJlY2FsbCBpbmRleCkuIEJ5cGFzc2VzIHRoZSBzaGFyZWQgc2luZ2xldG9uLlxuICAgKi9cbiAgbWVtb3J5PzogYm9vbGVhbiB8IE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlO1xuICAvKipcbiAgICogUGVyLWFnZW50IHRocmVhZC9tZXNzYWdlIHN0b3JhZ2UgKGBQb3N0Z3Jlc1N0b3JlYCkgb3ZlcnJpZGUuXG4gICAqIENhc2NhZGVzIGZyb20gYGNvbmZpZy5zdG9yYWdlYDsgdGhlIGFnZW50IHZhbHVlIHdpbnMgd2hlbiBzZXQuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBpbmhlcml0IGBjb25maWcuc3RvcmFnZWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50IGdldHMgaXRzICoqb3duIHBlci1hZ2VudCBgUG9zdGdyZXNTdG9yZWAqKlxuICAgKiAgIGtleWVkIGJ5IHtAbGluayBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lfSBzbyB0aHJlYWRzIGFuZFxuICAgKiAgIG1lc3NhZ2VzIHN0YXkgaXNvbGF0ZWQgYmV0d2VlbiBhZ2VudHMgaW4gdGhlIHNhbWUgZGF0YWJhc2UuXG4gICAqIC0gYGZhbHNlYDogZGlzYWJsZSBzdG9yYWdlIGZvciB0aGlzIGFnZW50IG9ubHkgKHB1cmVseSBpbi1tZW1vcnkpLlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHdpdGggdGhlIHBlci1hZ2VudCBkZWZhdWx0IHNjaGVtYS5cbiAgICogLSB7QGxpbmsgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlfSBvYmplY3Q6IGRlZGljYXRlZFxuICAgKiAgIGBQb3N0Z3Jlc1N0b3JlYCBjb25maWcgKGN1c3RvbSBzY2hlbWEsIGNvbm5lY3Rpb24sIGV0Yy4pLlxuICAgKi9cbiAgc3RvcmFnZT86IGJvb2xlYW4gfCBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGU7XG4gIC8qKlxuICAgKiBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0gZm9yIHRoaXMgYWdlbnQgKGZpbGVzeXN0ZW0sIHNhbmRib3gsIG9yIG90aGVyXG4gICAqIHByb3ZpZGVycykuIEFzc2lzdGFudCBza2lsbHMgZnJvbSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBwYXRocyBhcmUgd2lyZWRcbiAgICogdmlhIHtAbGluayBkYXRhYnJpY2tzV29ya3NwYWNlfS5cbiAgICovXG4gIHdvcmtzcGFjZT86IFdvcmtzcGFjZSB8IE1hc3RyYUFnZW50V29ya3NwYWNlUmVzb2x2ZXI7XG59XG5cbi8qKiBUeXBlLWVyYXNlZCByZWdpc3RyeSBtZW1iZXI7IGVhY2ggZGVmaW5pdGlvbiByZXRhaW5zIHR5cGluZyBhdCBgY3JlYXRlQWdlbnRgLiAqL1xuZXhwb3J0IHR5cGUgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uID0gTWFzdHJhQWdlbnREZWZpbml0aW9uPGFueT47XG5cbi8qKlxuICogRGlzdHJpYnV0aXZlIGBPbWl0YCBzbyB1bmlvbnMgaW4gYFBvc3RncmVzU3RvcmVDb25maWdgIC9cbiAqIGBQZ1ZlY3RvckNvbmZpZ2Aga2VlcCB0aGVpciBkaXNjcmltaW5hbnRzIGFmdGVyIHRoZSBvdmVycmlkZSB0eXBlc1xuICogc3RyaXAgYGlkYC4gVGhlIGJ1aWx0LWluIGBPbWl0YCBjb2xsYXBzZXMgdW5pb25zIHRvIG9uZSBzaGFwZSB3aXRoXG4gKiBjb21tb24gZmllbGRzIG9ubHksIHdoaWNoIGxvc2VzIHRoZSBjb25uZWN0aW9uLXN0eWxlIGRpc2NyaW1pbmFudHMuXG4gKi9cbnR5cGUgRGlzdHJpYnV0aXZlT21pdDxULCBLIGV4dGVuZHMga2V5b2YgbmV2ZXI+ID0gVCBleHRlbmRzIHVua25vd24gPyBPbWl0PFQsIEs+IDogbmV2ZXI7XG5cbi8qKlxuICogYFBvc3RncmVzU3RvcmVDb25maWdgIG1pbnVzIGBpZGAgLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFjY2VwdCBhbnlcbiAqIE1hc3RyYS1zdXBwb3J0ZWQgc3RvcmFnZSBzaGFwZS4gYGlkYCBpcyBmaWxsZWQgaW4gYXV0b21hdGljYWxseVxuICogZnJvbSB0aGUgYWdlbnQgcmVnaXN0cnkga2V5IHNvIHRyYWNlcyBzdGF5IHN0YWJsZS5cbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlID0gRGlzdHJpYnV0aXZlT21pdDxQb3N0Z3Jlc1N0b3JlQ29uZmlnLCBcImlkXCI+ICYge1xuICBpZD86IHN0cmluZztcbn07XG5cbi8qKlxuICogYFBnVmVjdG9yQ29uZmlnYCBtaW51cyBgaWRgIC0gcGVyLWFnZW50IG92ZXJyaWRlcyBhY2NlcHQgYW55XG4gKiBNYXN0cmEtc3VwcG9ydGVkIHZlY3RvciBzaGFwZS4gYGlkYCBpcyBmaWxsZWQgaW4gYXV0b21hdGljYWxseVxuICogZnJvbSB0aGUgYWdlbnQgcmVnaXN0cnkga2V5LlxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZSA9IERpc3RyaWJ1dGl2ZU9taXQ8UGdWZWN0b3JDb25maWcsIFwiaWRcIj4gJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqIEhvdyBhbiBhZ2VudCdzIHVucGlubmVkIG1vZGVsIGlzIHJlc29sdmVkLiAqL1xuZXhwb3J0IHR5cGUgQWdlbnREZWZhdWx0TW9kZWwgPVxuICB7IGtpbmQ6IFwiYXV0b1wiIH0gfCB7IGtpbmQ6IFwiY29uZmlndXJlZFwiOyBtb2RlbDogc3RyaW5nIH0gfCB7IGtpbmQ6IFwiZHluYW1pY1wiIH07XG5cbi8qKiBPdXRwdXQgb2Yge0BsaW5rIGJ1aWxkQWdlbnRzfTogcmVzb2x2ZWQgYWdlbnRzIHBsdXMgdGhlIGRlZmF1bHQgaWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWx0QWdlbnRzIHtcbiAgYWdlbnRzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudD47XG4gIGRlZmF1bHRBZ2VudElkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEZWZhdWx0IG1vZGVsIGludGVudCBwZXIgYWdlbnQgaWQuIEFuIHVuY29uZmlndXJlZCBhZ2VudCBpcyBgXCJhdXRvXCJgIGFuZFxuICAgKiByZXNvbHZlcyB0aGUgaGlnaGVzdC1yYW5rZWQgbGl2ZSBlbmRwb2ludDsgYSBzdHJpbmcgaXMgYFwiY29uZmlndXJlZFwiYDsgYVxuICAgKiBjdXN0b20gZnVuY3Rpb24gaXMgYFwiZHluYW1pY1wiYC4gQ29uc3VtZWQgYnkgdGhlIHBsdWdpbidzXG4gICAqIGBHRVQgL2RlZmF1bHQtbW9kZWxgIHJvdXRlLlxuICAgKi9cbiAgZGVmYXVsdE1vZGVsczogUmVjb3JkPHN0cmluZywgQWdlbnREZWZhdWx0TW9kZWw+O1xuICAvKipcbiAgICogQW1iaWVudCB0b29scyBzaGFyZWQgYWNyb3NzIGV2ZXJ5IGFnZW50ICh0aGUgYnVpbHQtaW4gc3lzdGVtIHRvb2xzXG4gICAqIHNwcmVhZCB3aXRoIGBjb25maWcudG9vbHNgKS4gU3VyZmFjZWQgc28gdGhlIG9wdGlvbmFsIE1DUCBzZXJ2ZXJcbiAgICogY2FuIHJlLWV4cG9zZSB0aGVtIHdoZW4ge0BsaW5rIE1hc3RyYU1jcENvbmZpZy50b29sc30gaXMgZW5hYmxlZC5cbiAgICovXG4gIGFtYmllbnRUb29sczogTWFzdHJhVG9vbHM7XG59XG5cbi8qKiBGYWxsYmFjayBhZ2VudCBpZCB1c2VkIHdoZW4gYGNvbmZpZy5hZ2VudHNgIGlzIG9taXR0ZWQgZW50aXJlbHkuICovXG5leHBvcnQgY29uc3QgRkFMTEJBQ0tfQUdFTlRfSUQgPSBcImRlZmF1bHRcIjtcblxuLyoqXG4gKiBEZWZhdWx0IHBlci10dXJuIHN0ZXAgY2VpbGluZyBhcHBsaWVkIHRvIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnRcbiAqIHdoZW4ge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudE1heFN0ZXBzfSBpcyB1bnNldC4gU2l6ZWQgdG9cbiAqIGZpdCBhIGRlY29tcG9zZWQgR2VuaWUgdHVybiAoZ3JvdW5kaW5nICsgc2V2ZXJhbCBgYXNrX2dlbmllYFxuICogY2FsbHMgKyBgcHJlcGFyZV9jaGFydGAgcGVyIGRhdGFzZXQgKyB0aGUgZmluYWwtdGV4dCByZXBseSkgd2l0aFxuICogaGVhZHJvb20gZm9yIHRoZSBtb2RlbCB0byBjaGFpbiBhIGNvdXBsZSBvZiBmb2xsb3ctdXBzIGJlZm9yZVxuICogYW5zd2VyaW5nIC0gd2VsbCBhYm92ZSBNYXN0cmEncyBvd24gYGFnZW50LmdlbmVyYXRlYCBkZWZhdWx0IG9mXG4gKiA1LCB3aGljaCB3b3VsZCBjdXQgbXVsdGktc3RlcCBvcmNoZXN0cmF0aW9uIG9mZiBtaWQtbG9vcC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQUdFTlRfTUFYX1NURVBTID0gMjU7XG5cbmNvbnN0IEVWRU5URURfQ09OU1RSVUNUT1JfTU9ERUwgPSB7XG4gIHNwZWNpZmljYXRpb25WZXJzaW9uOiBcInYzXCIsXG4gIHByb3ZpZGVyOiBcImRieC10b29sc1wiLFxuICBtb2RlbElkOiBcImRlZmVycmVkXCIsXG4gIHN1cHBvcnRlZFVybHM6IHt9LFxuICBhc3luYyBkb0dlbmVyYXRlKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkRlZmVycmVkIGV2ZW50ZWQgY29uc3RydWN0b3IgbW9kZWwgbXVzdCBub3QgZXhlY3V0ZVwiKTtcbiAgfSxcbiAgYXN5bmMgZG9TdHJlYW0oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGVmZXJyZWQgZXZlbnRlZCBjb25zdHJ1Y3RvciBtb2RlbCBtdXN0IG5vdCBleGVjdXRlXCIpO1xuICB9LFxufSBhcyBuZXZlcjtcblxuLyoqXG4gKiBgRXZlbnRlZEFnZW50YCBkZWxlZ2F0ZXMgbW9kZWwgcmVzb2x1dGlvbiB0byB0aGUgd3JhcHBlZCBhZ2VudCBhdCBleGVjdXRpb25cbiAqIHRpbWUsIGJ1dCBpdHMgY29uc3RydWN0b3IgYWxzbyBwcm9iZXMgYW4gdW50eXBlZCBgX19tb2RlbGAgc2xvdCBhbmQgb3RoZXJ3aXNlXG4gKiBjYWxscyBgZ2V0TW9kZWwoKWAgd2l0aCBhbiBlbXB0eSByZXF1ZXN0IGNvbnRleHQuIFRlbXBvcmFyaWx5IGZpbGxpbmcgdGhhdFxuICogcHJvYmUgYXZvaWRzIGFuIGVhZ2VyIHNlcnZpY2UtcHJpbmNpcGFsIGxvb2t1cCB3aGlsZSBwcmVzZXJ2aW5nIHRoZSB3cmFwcGVkXG4gKiBhZ2VudCdzIHJlcXVlc3Qtc2NvcGVkIG1vZGVsIHJlc29sdmVyIGZvciByZWFsIHR1cm5zLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCYWNrZ3JvdW5kQWdlbnQoYWdlbnQ6IEFnZW50LCBtYXhTdGVwczogbnVtYmVyKTogQWdlbnQge1xuICBjb25zdCBtb2RlbFNsb3QgPSBcIl9fbW9kZWxcIjtcbiAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYWdlbnQsIG1vZGVsU2xvdCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhZ2VudCwgbW9kZWxTbG90LCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiBFVkVOVEVEX0NPTlNUUlVDVE9SX01PREVMLFxuICB9KTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gY3JlYXRlRXZlbnRlZEFnZW50KHsgYWdlbnQsIG1heFN0ZXBzIH0pIGFzIHVua25vd24gYXMgQWdlbnQ7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGRlc2NyaXB0b3IpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhZ2VudCwgbW9kZWxTbG90LCBkZXNjcmlwdG9yKTtcbiAgICBlbHNlIGRlbGV0ZSAoYWdlbnQgYXMgQWdlbnQgJiB7IF9fbW9kZWw/OiB1bmtub3duIH0pLl9fbW9kZWw7XG4gIH1cbn1cblxuY29uc3QgRkFMTEJBQ0tfQUdFTlRfSU5TVFJVQ1RJT05TID0gYFlvdSBhcmUgYSBkYXRhIGFuYWx5c3QuIFRoZSB1c2VyIHdpbGwgYXNrIHF1ZXN0aW9ucyBhYm91dFxuYnVzaW5lc3MgbWV0cmljcyBhbmQgbWF5IHNoYXJlIHBlcnNvbmFsIHByZWZlcmVuY2VzIHlvdSBzaG91bGQgcmVtZW1iZXIgYWNyb3NzIHR1cm5zLlxuXG5SdWxlczpcblxuMS4gUXVvdGUgbnVtYmVycyBleGFjdGx5LiBOZXZlciBpbnZlbnQgZGF0YS5cbjIuIFdoZW4gdGhlIHVzZXIgc3RhdGVzIGEgcHJlZmVyZW5jZSBvciBkdXJhYmxlIGZhY3QgYWJvdXQgdGhlbXNlbHZlc1xuICAgKFwiSSdtIGluIEVVIHNvIHVzZSBFVVJcIiwgXCJhbHdheXMgc2hvdyBtZSB0aGUgU1FMXCIpLCBhY2tub3dsZWRnZSB0aGF0XG4gICB5b3Ugd2lsbCByZW1lbWJlciBpdC5cbjMuIElmIHlvdSBkb24ndCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBhbnN3ZXIsIGFzayBhIGNsYXJpZnlpbmdcbiAgIHF1ZXN0aW9uIGluc3RlYWQgb2YgZ3Vlc3NpbmcuYDtcblxuLyoqIFRvb2wtY2FsbCBndWlkYW5jZSBhcHBlbmRlZCB0byBldmVyeSByZWdpc3RlcmVkIGFnZW50LiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVE9PTF9XT1JLRkxPV19JTlNUUlVDVElPTlMgPSBbXG4gIFwiVG9vbCB3b3JrZmxvdzpcIixcbiAgXCJXaGVuIHRoZSBhY3RpdmUgbW9kZWwgc3VwcG9ydHMgaXQsIGNhbGwgbXVsdGlwbGUgdG9vbHMgaW4gdGhlIHNhbWUgdHVybiB3aGVuIHRoZWlyIGlucHV0cyBhcmUgaW5kZXBlbmRlbnQsIGluY2x1ZGluZyBtdWx0aXBsZSBjYWxscyB0byB0aGUgc2FtZSB0b29sLlwiLFxuICBcIktlZXAgY2FsbHMgc2VxdWVudGlhbCB3aGVuIGEgbGF0ZXIgaW5wdXQgZGVwZW5kcyBvbiBhbiBlYXJsaWVyIHJlc3VsdCBvciB3aGVuIGNhbGxzIG11dGF0ZSB0aGUgc2FtZSByZXNvdXJjZS5cIixcbl0uam9pbihcIlxcblwiKTtcblxuLyoqIEh5YnJpZCByb3V0aW5nIGd1aWRhbmNlIGFwcGVuZGVkIGFmdGVyIE1hc3RyYSdzIGdlbmVyYXRlZCBDb2RlIE1vZGUgY29udHJhY3QuICovXG5leHBvcnQgY29uc3QgQ09ERV9NT0RFX1JPVVRJTkdfSU5TVFJVQ1RJT05TID0gW1xuICBcIlRvb2wgcm91dGluZzpcIixcbiAgXCJUaGUgQ29kZSBNb2RlIGNvbnRyYWN0IGFib3ZlIGV4cGxhaW5zIGhvdyB0byB1c2UgZXhlY3V0ZV90eXBlc2NyaXB0IHdoZW4gc2VsZWN0ZWQ7IGl0IGRvZXMgbm90IHJlcXVpcmUgdXNpbmcgQ29kZSBNb2RlIGZvciBldmVyeSB0b29sIGNhbGwuXCIsXG4gIFwiQ2FsbCBhIGRpcmVjdGx5IGV4cG9zZWQgdG9vbCBkaXJlY3RseSB3aGVuIG9uZSBvcmRpbmFyeSBjYWxsIGlzIHN1ZmZpY2llbnQuXCIsXG4gIFwiQ2FsbCBpbmRlcGVuZGVudCB0b29scyBkaXJlY3RseSBpbiBwYXJhbGxlbCB3aGVuIHRoZWlyIHJlc3VsdHMgZG8gbm90IHJlcXVpcmUgY29kZS1zaWRlIHRyYW5zZm9ybWF0aW9uLlwiLFxuICBcIktlZXAgZGVwZW5kZW50IGNhbGxzIGFzIGRpcmVjdCBzZXF1ZW50aWFsIHRvb2wgY2FsbHMgd2hlbiBjb2RlLXNpZGUgdHJhbnNmb3JtYXRpb24gaXMgdW5uZWNlc3NhcnkuXCIsXG4gIFwiVXNlIGV4ZWN1dGVfdHlwZXNjcmlwdCB3aGVuIHRoZSB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdHMgQ29kZSBNb2RlIG9yIHdoZW4gY29kZSBpcyB1c2VmdWwgZm9yIGxvb3BzLCBmaWx0ZXJpbmcsIGpvaW5zLCByYW5kb20gc2VsZWN0aW9uLCBhZ2dyZWdhdGlvbiwgYXJpdGhtZXRpYywgZHluYW1pYyBmYW4tb3V0LCBvciBrZWVwaW5nIHN1YnN0YW50aWFsIGludGVybWVkaWF0ZSByZXN1bHRzIG91dCBvZiBtb2RlbCBjb250ZXh0LlwiLFxuICBcIkRvIG5vdCB3cmFwIGEgc2luZ2xlIG9yZGluYXJ5IHRvb2wgY2FsbCBpbiBleGVjdXRlX3R5cGVzY3JpcHQuXCIsXG5dLmpvaW4oXCJcXG5cIik7XG5cbi8qKlxuICogU3R5bGUgZ3VhcmRyYWlscyBhcHBlbmRlZCB0byBldmVyeSBhZ2VudCdzIGBpbnN0cnVjdGlvbnNgIHRvIGN1cmJcbiAqIGNvbW1vbiBMTE0taXNtcyAoZW0gZGFzaGVzLCBlbW9qaXMsIHN5Y29waGFudGljIG9wZW5lcnMsIGV4Y2Vzc2l2ZVxuICogaGVkZ2luZywgdGhyb3dhd2F5IGNsb3NlcnMpLiBBcHBlbmRlZCByYXRoZXIgdGhhbiBwcmVwZW5kZWQgc28gdGhlXG4gKiBhZ2VudCdzIHJvbGUvY29udGV4dCBjb21lcyBmaXJzdDsgdGhlIG1vZGVsJ3MgcmVjZW5jeSBiaWFzIHRoZW5cbiAqIGhlbHBzIHRoZSBzdHlsZSBydWxlcyBkb21pbmF0ZSB0aGUgcmVzcG9uc2Ugc3VyZmFjZS5cbiAqXG4gKiBPdmVycmlkZSBnbG9iYWxseSB2aWEge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5zdHlsZUluc3RydWN0aW9uc31cbiAqIChwYXNzIGBmYWxzZWAgdG8gZGlzYWJsZSBlbnRpcmVseSwgb3IgYSBzdHJpbmcgdG8gcmVwbGFjZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUyA9IFtcbiAgXCJPdXRwdXQgc3R5bGU6XCIsXG4gIFwiXCIsXG4gIFwiVXNlIG1hcmtkb3duIGZvcm1hdHRpbmcsIGluY2x1ZGluZyBoZWFkaW5ncywgbGlzdHMsIGFuZCBjb2RlIGJsb2Nrcy5cIixcbiAgXCJBdm9pZCBsaXN0cyBhbmQgaGVhZGVycyBmb3Igc2hvcnQgcmVwbGllcy5cIixcbiAgXCJQbGFpbiBwcm9zZS5cIixcbiAgVFlQT0dSQVBIWV9SVUxFLFxuICBcIlNraXAgb3BlbmVycyBsaWtlICdHcmVhdCBxdWVzdGlvbicsICdBYnNvbHV0ZWx5JywgYW5kICdJJ2QgYmUgaGFwcHkgdG8gaGVscCcuXCIsXG4gIFwiU2tpcCBjbG9zZXJzIGxpa2UgJ0xldCBtZSBrbm93IGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMnLlwiLFxuICBcIlNraXAgc2VsZi1kaXNjbGFpbWVycyBsaWtlICdJIHNob3VsZCBtZW50aW9uJyBhbmQgJ0l0J3MgaW1wb3J0YW50IHRvIG5vdGUnLlwiLFxuICBcIkFuc3dlciBkaXJlY3RseS5cIixcbiAgXCJEbyBub3QgaW5jbHVkZSBhIHByZWFtYmxlIGJlZm9yZSB0aGUgYWN0dWFsIGFuc3dlci5cIixcbiAgXCJVc2UgbGlzdHMgYW5kIGhlYWRlcnMgb25seSB3aGVuIHRoZXkgY2xhcmlmeSBhIG11bHRpLXBhcnQgYW5zd2VyLlwiLFxuXS5qb2luKFwiXFxuXCIpO1xuXG4vKipcbiAqIFJlc29sdmUgdGhlIHN0eWxlIGJsb2NrIHRvIGFwcGVuZCB0byBldmVyeSBhZ2VudCdzIGluc3RydWN0aW9ucy5cbiAqIFJldHVybnMgYG51bGxgIHdoZW4gdGhlIGNhbGxlciBvcHRlZCBvdXQgKGBzdHlsZUluc3RydWN0aW9uczogZmFsc2VgKS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN0eWxlSW5zdHJ1Y3Rpb25zKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChjb25maWcuc3R5bGVJbnN0cnVjdGlvbnMgPT09IGZhbHNlKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiBjb25maWcuc3R5bGVJbnN0cnVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zO1xuICB9XG5cbiAgcmV0dXJuIERFRkFVTFRfU1RZTEVfSU5TVFJVQ1RJT05TO1xufVxuXG4vKiogQXBwZW5kIHNoYXJlZCB3b3JrZmxvdyBhbmQgc3R5bGUgYmxvY2tzIHdpdGhvdXQgbmFycm93aW5nIE1hc3RyYSdzIGluc3RydWN0aW9uIHNoYXBlcy4gKi9cbmZ1bmN0aW9uIGFwcGVuZERlZmF1bHRJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogQWdlbnRJbnN0cnVjdGlvbnMsXG4gIHN0eWxlOiBzdHJpbmcgfCBudWxsLFxuKTogQWdlbnRJbnN0cnVjdGlvbnMge1xuICBjb25zdCBzdWZmaXggPSBzdHlsZVxuICAgID8gYCR7REVGQVVMVF9UT09MX1dPUktGTE9XX0lOU1RSVUNUSU9OU31cXG5cXG4ke3N0eWxlfWBcbiAgICA6IERFRkFVTFRfVE9PTF9XT1JLRkxPV19JTlNUUlVDVElPTlM7XG4gIGlmICh0eXBlb2YgaW5zdHJ1Y3Rpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGAke2luc3RydWN0aW9ucy50cmltRW5kKCl9XFxuXFxuJHtzdWZmaXh9YDtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShpbnN0cnVjdGlvbnMpKSB7XG4gICAgaWYgKGluc3RydWN0aW9ucy5ldmVyeSgoaW5zdHJ1Y3Rpb24pID0+IHR5cGVvZiBpbnN0cnVjdGlvbiA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgIHJldHVybiBbLi4uaW5zdHJ1Y3Rpb25zLCBzdWZmaXhdIGFzIEFnZW50SW5zdHJ1Y3Rpb25zO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLmluc3RydWN0aW9ucywgeyByb2xlOiBcInN5c3RlbVwiLCBjb250ZW50OiBzdWZmaXggfV0gYXMgQWdlbnRJbnN0cnVjdGlvbnM7XG4gIH1cbiAgcmV0dXJuIFtpbnN0cnVjdGlvbnMsIHsgcm9sZTogXCJzeXN0ZW1cIiwgY29udGVudDogc3VmZml4IH1dIGFzIEFnZW50SW5zdHJ1Y3Rpb25zO1xufVxuXG4vKipcbiAqIENvbXBvc2Ugc3RhdGljIG9yIHJlcXVlc3QtY29udGV4dC1hd2FyZSBpbnN0cnVjdGlvbnMgd2l0aCBzaGFyZWQgd29ya2Zsb3dcbiAqIGFuZCBzdHlsZSBndWlkYW5jZSB3aGlsZSBwcmVzZXJ2aW5nIE1hc3RyYSdzIG5hdGl2ZSBnZW5lcmljIGluZmVyZW5jZS5cbiAqL1xuZnVuY3Rpb24gY29tcG9zZUluc3RydWN0aW9uczxUUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd24+KFxuICBhZ2VudEluc3RydWN0aW9uczogQWdlbnRDb25maWc8c3RyaW5nLCBUb29sc0lucHV0LCB1bmRlZmluZWQsIFRSZXF1ZXN0Q29udGV4dD5bXCJpbnN0cnVjdGlvbnNcIl0sXG4gIHN0eWxlOiBzdHJpbmcgfCBudWxsLFxuICByZXNvbHZlQ29kZU1vZGU/OiBDb2RlTW9kZVJlc29sdmVyPFRSZXF1ZXN0Q29udGV4dD4sXG4pOiBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcImluc3RydWN0aW9uc1wiXSB7XG4gIGNvbnN0IGFwcGVuZCA9IChpbnN0cnVjdGlvbnM6IEFnZW50SW5zdHJ1Y3Rpb25zLCBjb2RlTW9kZUluc3RydWN0aW9ucz86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGNvbXBvc2VkID0gYXBwZW5kRGVmYXVsdEluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMsIHN0eWxlKTtcbiAgICByZXR1cm4gY29kZU1vZGVJbnN0cnVjdGlvbnNcbiAgICAgID8gYXBwZW5kSW5zdHJ1Y3Rpb25CbG9jayhcbiAgICAgICAgICBjb21wb3NlZCxcbiAgICAgICAgICBgJHtjb2RlTW9kZUluc3RydWN0aW9uc31cXG5cXG4ke0NPREVfTU9ERV9ST1VUSU5HX0lOU1RSVUNUSU9OU31gLFxuICAgICAgICApXG4gICAgICA6IGNvbXBvc2VkO1xuICB9O1xuICBpZiAodHlwZW9mIGFnZW50SW5zdHJ1Y3Rpb25zICE9PSBcImZ1bmN0aW9uXCIgJiYgIXJlc29sdmVDb2RlTW9kZSkge1xuICAgIHJldHVybiBhcHBlbmQoYWdlbnRJbnN0cnVjdGlvbnMpIGFzIEFnZW50Q29uZmlnPFxuICAgICAgc3RyaW5nLFxuICAgICAgVG9vbHNJbnB1dCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIFRSZXF1ZXN0Q29udGV4dFxuICAgID5bXCJpbnN0cnVjdGlvbnNcIl07XG4gIH1cbiAgcmV0dXJuIChhc3luYyAoYXJncykgPT4ge1xuICAgIGNvbnN0IFtpbnN0cnVjdGlvbnMsIGNvZGVNb2RlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHR5cGVvZiBhZ2VudEluc3RydWN0aW9ucyA9PT0gXCJmdW5jdGlvblwiID8gYWdlbnRJbnN0cnVjdGlvbnMoYXJncykgOiBhZ2VudEluc3RydWN0aW9ucyxcbiAgICAgIHJlc29sdmVDb2RlTW9kZT8uKGFyZ3MpLFxuICAgIF0pO1xuICAgIHJldHVybiBhcHBlbmQoaW5zdHJ1Y3Rpb25zLCBjb2RlTW9kZT8uaW5zdHJ1Y3Rpb25zKTtcbiAgfSkgYXMgQWdlbnRDb25maWc8c3RyaW5nLCBUb29sc0lucHV0LCB1bmRlZmluZWQsIFRSZXF1ZXN0Q29udGV4dD5bXCJpbnN0cnVjdGlvbnNcIl07XG59XG5cbi8qKiBBcHBlbmQgb25lIHN5c3RlbSBpbnN0cnVjdGlvbiBibG9jayB3aGlsZSBwcmVzZXJ2aW5nIE1hc3RyYSdzIGFjY2VwdGVkIHNoYXBlcy4gKi9cbmZ1bmN0aW9uIGFwcGVuZEluc3RydWN0aW9uQmxvY2soaW5zdHJ1Y3Rpb25zOiBBZ2VudEluc3RydWN0aW9ucywgYmxvY2s6IHN0cmluZyk6IEFnZW50SW5zdHJ1Y3Rpb25zIHtcbiAgaWYgKHR5cGVvZiBpbnN0cnVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHJldHVybiBgJHtpbnN0cnVjdGlvbnMudHJpbUVuZCgpfVxcblxcbiR7YmxvY2t9YDtcbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5zdHJ1Y3Rpb25zKSkge1xuICAgIGlmIChpbnN0cnVjdGlvbnMuZXZlcnkoKGluc3RydWN0aW9uKSA9PiB0eXBlb2YgaW5zdHJ1Y3Rpb24gPT09IFwic3RyaW5nXCIpKSB7XG4gICAgICByZXR1cm4gWy4uLmluc3RydWN0aW9ucywgYmxvY2tdIGFzIEFnZW50SW5zdHJ1Y3Rpb25zO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLmluc3RydWN0aW9ucywgeyByb2xlOiBcInN5c3RlbVwiLCBjb250ZW50OiBibG9jayB9XSBhcyBBZ2VudEluc3RydWN0aW9ucztcbiAgfVxuICByZXR1cm4gW2luc3RydWN0aW9ucywgeyByb2xlOiBcInN5c3RlbVwiLCBjb250ZW50OiBibG9jayB9XSBhcyBBZ2VudEluc3RydWN0aW9ucztcbn1cblxuLyoqIFJlc29sdmUgb25lIG5hdGl2ZSBDb2RlIE1vZGUgdHJhbnNwb3J0IGR1cmluZyBwbHVnaW4gc3RhcnR1cC4gKi9cbmZ1bmN0aW9uIGNvZGVNb2RlVHJhbnNwb3J0KCk6IFByb21pc2U8Q29kZU1vZGVUcmFuc3BvcnQ+IHtcbiAgcmVzb2x2ZWRDb2RlTW9kZVRyYW5zcG9ydCA/Pz0gKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXN1cHBvcnRzSXNvbGF0ZWRWbVRyYW5zcG9ydCgpKSB7XG4gICAgICBjb2RlTW9kZUxvZ2dlci5pbmZvKFwidHJhbnNwb3J0IHNlbGVjdGVkXCIsIHsgcHJvdmlkZXI6IFwicXVpY2tqc1wiIH0pO1xuICAgICAgcmV0dXJuIG5ldyBRdWlja0pzQ29kZU1vZGVUcmFuc3BvcnQoKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgSXNvbGF0ZWRWbUNvZGVNb2RlVHJhbnNwb3J0IH0gPSBhd2FpdCBpbXBvcnQoXCJAbWFzdHJhL2lzb2xhdGVkLXZtXCIpO1xuICAgICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IElzb2xhdGVkVm1Db2RlTW9kZVRyYW5zcG9ydCgpO1xuICAgICAgY29kZU1vZGVMb2dnZXIuaW5mbyhcInRyYW5zcG9ydCBzZWxlY3RlZFwiLCB7IHByb3ZpZGVyOiBcImlzb2xhdGVkLXZtXCIgfSk7XG4gICAgICByZXR1cm4gdHJhbnNwb3J0O1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgY29kZU1vZGVMb2dnZXIud2FybihcImlzb2xhdGVkLXZtIHVuYXZhaWxhYmxlOyB1c2luZyBRdWlja0pTXCIsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihjYXVnaHQpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IFF1aWNrSnNDb2RlTW9kZVRyYW5zcG9ydCgpO1xuICAgIH1cbiAgfSkoKTtcbiAgcmV0dXJuIHJlc29sdmVkQ29kZU1vZGVUcmFuc3BvcnQ7XG59XG5cbnR5cGUgQ29kZU1vZGVSZXNvbHZlcjxUUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd24gPSB1bmtub3duPiA9IChcbiAgYXJnczogUGFyYW1ldGVyczxcbiAgICBFeGNsdWRlPFxuICAgICAgQWdlbnRDb25maWc8c3RyaW5nLCBUb29sc0lucHV0LCB1bmRlZmluZWQsIFRSZXF1ZXN0Q29udGV4dD5bXCJpbnN0cnVjdGlvbnNcIl0sXG4gICAgICBBZ2VudEluc3RydWN0aW9uc1xuICAgID5cbiAgPlswXSxcbikgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb2RlTW9kZT4gfCB1bmRlZmluZWQ+O1xuXG4vKiogQnVpbGQgcmVxdWVzdC1zY29wZWQgbmF0aXZlIENvZGUgTW9kZSBvdmVyIGFsbCBleGVjdXRhYmxlIGNvbnRleHQgdG9vbHMuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZENvZGVNb2RlPFRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93bj4oXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICB0b29sczogTWFzdHJhVG9vbHMsXG4gIHdvcmtzcGFjZTogV29ya3NwYWNlIHwgdW5kZWZpbmVkLFxuICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQ8VFJlcXVlc3RDb250ZXh0Pixcbik6IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29kZU1vZGU+IHwgdW5kZWZpbmVkPiB7XG4gIGlmIChjb25maWcuY29kZU1vZGUgPT09IGZhbHNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB3b3Jrc3BhY2VUb29scyA9IHdvcmtzcGFjZVxuICAgID8gYXdhaXQgY3JlYXRlV29ya3NwYWNlVG9vbHMod29ya3NwYWNlLCB7IHJlcXVlc3RDb250ZXh0LCB3b3Jrc3BhY2UgfSlcbiAgICA6IHt9O1xuICBjb25zdCBjb250ZXh0VG9vbHMgPSB7IC4uLnRvb2xzLCAuLi53b3Jrc3BhY2VUb29scyB9O1xuICBjb25zdCBleGVjdXRhYmxlVG9vbHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoY29udGV4dFRvb2xzKS5maWx0ZXIoXG4gICAgICAoWywgdG9vbF0pID0+XG4gICAgICAgIHR5cGVvZiB0b29sID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHRvb2wgIT09IG51bGwgJiZcbiAgICAgICAgXCJleGVjdXRlXCIgaW4gdG9vbCAmJlxuICAgICAgICB0eXBlb2YgdG9vbC5leGVjdXRlID09PSBcImZ1bmN0aW9uXCIsXG4gICAgKSxcbiAgKSBhcyBUb29sc0lucHV0O1xuICBpZiAoT2JqZWN0LmtleXMoZXhlY3V0YWJsZVRvb2xzKS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG9wdGlvbnMgPSB0eXBlb2YgY29uZmlnLmNvZGVNb2RlID09PSBcIm9iamVjdFwiID8gY29uZmlnLmNvZGVNb2RlIDoge307XG4gIGNvbnN0IGNvZGVNb2RlID0gY3JlYXRlQ29kZU1vZGUoXG4gICAgeyB0b29sczogZXhlY3V0YWJsZVRvb2xzLCAuLi5vcHRpb25zIH0sXG4gICAgYXdhaXQgY29kZU1vZGVUcmFuc3BvcnQoKSxcbiAgKTtcbiAgaWYgKCEoXCJtYXN0cmFfd29ya3NwYWNlX3JlYWRfZmlsZVwiIGluIHdvcmtzcGFjZVRvb2xzKSkgcmV0dXJuIGNvZGVNb2RlO1xuICByZXR1cm4ge1xuICAgIC4uLmNvZGVNb2RlLFxuICAgIGluc3RydWN0aW9uczogYCR7Y29kZU1vZGUuaW5zdHJ1Y3Rpb25zfVxcblxcbldvcmtzcGFjZSBmaWxlIGNvbnRlbnQgbm90ZTpcXG5UZXh0IHJldHVybmVkIGJ5IGV4dGVybmFsX21hc3RyYV93b3Jrc3BhY2VfcmVhZF9maWxlIHN0YXJ0cyB3aXRoIG9uZSBtZXRhZGF0YSBsaW5lIGNvbnRhaW5pbmcgdGhlIHBhdGggYW5kIHNpemUuIEV4Y2x1ZGUgdGhhdCBmaXJzdCBsaW5lIGJlZm9yZSBjYWxjdWxhdGluZyBjb250ZW50IGNoYXJhY3RlciBjb3VudHMsIGhhc2hlcywgb3Igb3RoZXIgY29udGVudC1vbmx5IHZhbHVlcy5gLFxuICB9O1xufVxuXG4vKiogUmVzb2x2ZSBDb2RlIE1vZGUgbGF6aWx5IHNvIHdvcmtzcGFjZSBhbmQgZHluYW1pYyB0b29sIHBvbGljeSBmb2xsb3cgZWFjaCByZXF1ZXN0LiAqL1xuZnVuY3Rpb24gY29kZU1vZGVSZXNvbHZlcjxUUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd24+KFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgdG9vbHM6IE1hc3RyYVRvb2xzLFxuICB3b3Jrc3BhY2U6IFdvcmtzcGFjZSB8IHVuZGVmaW5lZCxcbik6IENvZGVNb2RlUmVzb2x2ZXI8VFJlcXVlc3RDb250ZXh0PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuY29kZU1vZGUgPT09IGZhbHNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gKHsgcmVxdWVzdENvbnRleHQgfSkgPT4gYnVpbGRDb2RlTW9kZShjb25maWcsIHRvb2xzLCB3b3Jrc3BhY2UsIHJlcXVlc3RDb250ZXh0KTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZWQgZGVzY3JpcHRpb24gZm9yIGFuIGFnZW50IHdob3NlIGRlZmluaXRpb24gb21pdHMgb25lLiBLZXB0XG4gKiBnZW5lcmljICh0aGUgYWdlbnQncyBvd24gbmFtZSBpcyB0aGUgb25seSByZWxpYWJsZSBzaWduYWwgYXQgYnVpbGRcbiAqIHRpbWUpIHNvIGl0IHJlYWRzIHNlbnNpYmx5IGFzIHRoZSBgYXNrXzxpZD5gIE1DUCB0b29sJ3MgZGVzY3JpcHRpb25cbiAqIGFuZCBpbiBhZ2VudCBtZXRhZGF0YS5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEFnZW50RGVzY3JpcHRpb24obmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBDb252ZXJzYXRpb25hbCBBSSBhZ2VudCBcIiR7bmFtZX1cIi5gO1xufVxuXG4vKipcbiAqIFJlc29sdmUgZXZlcnkgZW50cnkgaW4gYGNvbmZpZy5hZ2VudHNgIGludG8gYSBNYXN0cmEgYEFnZW50YFxuICogaW5zdGFuY2UuIFdoZW4gYGNvbmZpZy5hZ2VudHNgIGlzIG9taXR0ZWQgdGhlIHBsdWdpbiByZWdpc3RlcnMgYVxuICogc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0IHNvIHRoZSBiYXJlIGBtYXN0cmEoKWAgY2FsbCBzdGlsbFxuICogeWllbGRzIGEgd29ya2luZyBhZ2VudC5cbiAqXG4gKiBQZXItYWdlbnQgdG9vbCBjYWxsYmFja3MgYXJlIGludm9rZWQgb25jZSB3aXRoIGEgdHlwZWRcbiAqIHtAbGluayBNYXN0cmFQbHVnaW5zfSBpbmRleCBidWlsdCBmcm9tIHJlZ2lzdGVyZWQgc2libGluZyBwbHVnaW5zXG4gKiAoY3VycmVudGx5IGBnZW5pZWA7IGV4dGVuZCBgTWFzdHJhUGx1Z2luc2AgdG8gc3VyZmFjZSBtb3JlKS5cbiAqXG4gKiBAdGhyb3dzIHdoZW4gYGNvbmZpZy5kZWZhdWx0QWdlbnRgIGlzIHNldCB0byBhbiBpZCB0aGF0IGlzbid0IGluIHRoZVxuICogICByZXNvbHZlZCByZWdpc3RyeTsgdGhpcyBpcyBhIHdpcmluZyBidWcsIG5vdCBhIHJ1bnRpbWUgY29uZGl0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRBZ2VudHMob3B0czoge1xuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZztcbiAgY29udGV4dDogcGx1Z2luUmVnaXN0cnkuUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQ7XG4gIG1lbW9yeUJ1aWxkZXI/OiBNZW1vcnlCdWlsZGVyO1xuICBsb2c6IGxvZy5Mb2dnZXI7XG4gIC8qKlxuICAgKiBMb2NhbCBza2lsbCBmaWxlc3lzdGVtcyBtb3VudGVkIGludG8gZXZlcnkgYXV0by1jcmVhdGVkIGRlZmF1bHQgd29ya3NwYWNlLlxuICAgKiBTa2lsbCBhY3RpdmF0aW9uIGNvbWVzIGZyb20ge0BsaW5rIHN0YW5kYXJkU2tpbGxzfSwgbm90IHdvcmtzcGFjZSBzZWFyY2guXG4gICAqL1xuICBleHRyYVNraWxsTW91bnRzPzogRGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnNbXCJleHRyYVNraWxsTW91bnRzXCJdO1xuICAvKiogRmFzdCBpbi1tZW1vcnkgc2tpbGxzIHBhc3NlZCB0aHJvdWdoIE1hc3RyYSdzIHN0YW5kYXJkIGFnZW50IHNraWxsIHRvb2xzLiAqL1xuICBzdGFuZGFyZFNraWxscz86IHJlYWRvbmx5IElubGluZVNraWxsW107XG4gIC8qKiBTdGFuZGFyZCBza2lsbCBuYW1lcyBvbWl0dGVkIGZyb20gc2xvd2VyIERhdGFicmlja3Mgd29ya3NwYWNlIHNlYXJjaC4gKi9cbiAgZXhjbHVkZWRXb3Jrc3BhY2VTa2lsbE5hbWVzPzogcmVhZG9ubHkgc3RyaW5nW107XG59KTogUHJvbWlzZTxCdWlsdEFnZW50cz4ge1xuICBjb25zdCB7XG4gICAgY29uZmlnLFxuICAgIGNvbnRleHQsXG4gICAgbWVtb3J5QnVpbGRlcixcbiAgICBsb2csXG4gICAgZXh0cmFTa2lsbE1vdW50cyxcbiAgICBzdGFuZGFyZFNraWxscyA9IFtdLFxuICAgIGV4Y2x1ZGVkV29ya3NwYWNlU2tpbGxOYW1lcyA9IFtdLFxuICB9ID0gb3B0cztcbiAgY29uc3QgZGVmaW5pdGlvbnMgPSByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnKTtcbiAgY29uc3QgaWRzID0gT2JqZWN0LmtleXMoZGVmaW5pdGlvbnMpO1xuICBjb25zdCBkZWZhdWx0QWdlbnRJZCA9IGNvbmZpZy5kZWZhdWx0QWdlbnQgPz8gaWRzWzBdID8/IEZBTExCQUNLX0FHRU5UX0lEO1xuXG4gIGNvbnN0IHBsdWdpbnMgPSBidWlsZFBsdWdpbnNNYXAoY29uZmlnLCBjb250ZXh0KTtcbiAgLy8gU3lzdGVtLWRlZmF1bHQgYW1iaWVudCB0b29scyBldmVyeSBhZ2VudCBnZXRzIG91dCBvZiB0aGUgYm94OlxuICAvLyBgcmVuZGVyX2RhdGFgIGZvciBpbmxpbmUgdmlzdWFsaXphdGlvbnMgYW5kIGBzdW1tYXJpemVgIGZvclxuICAvLyBvZmZsb2FkaW5nIHRleHQgY29uZGVuc2luZyB0byB0aGUgZmFzdCAvIHNtYWxsIGNoYXQgdGllci4gVGhlXG4gIC8vIHVzZXIgY2FuIHNoYWRvdyBlaXRoZXIgYnkgaW5jbHVkaW5nIGEgc2FtZS1uYW1lZCB0b29sIGluIHRoZWlyIG93blxuICAvLyBgY29uZmlnLnRvb2xzYCBvciBwZXItYWdlbnQgYHRvb2xzYC4gTWVyZ2Ugb3JkZXIgaXNcbiAgLy8gYHN5c3RlbSAtPiBzdGFuZGFyZCBza2lsbHMgLT4gdXNlci1hbWJpZW50IC0+IHBlci1hZ2VudGAsIGxhc3Qgd3JpdGUgd2lucy5cbiAgY29uc3Qgc3lzdGVtVG9vbHM6IE1hc3RyYVRvb2xzID0ge1xuICAgIHJlbmRlcl9kYXRhOiBidWlsZFJlbmRlckRhdGFUb29sKGNvbmZpZyksXG4gICAgc3VtbWFyaXplOiBidWlsZFN1bW1hcml6ZVRvb2woY29uZmlnKSxcbiAgfTtcbiAgY29uc3Qgc3RhbmRhcmRTa2lsbFRvb2xzID1cbiAgICBzdGFuZGFyZFNraWxscy5sZW5ndGggPiAwID8gY3JlYXRlU2tpbGxUb29scyhyZXNvbHZlQWdlbnRTa2lsbHMoWy4uLnN0YW5kYXJkU2tpbGxzXSkpIDoge307XG4gIGNvbnN0IGFtYmllbnRUb29scyA9IHtcbiAgICAuLi5zeXN0ZW1Ub29scyxcbiAgICAuLi5zdGFuZGFyZFNraWxsVG9vbHMsXG4gICAgLi4uKGNvbmZpZy50b29scyA/PyB7fSksXG4gIH07XG4gIGNvbnN0IHN0eWxlID0gcmVzb2x2ZVN0eWxlSW5zdHJ1Y3Rpb25zKGNvbmZpZyk7XG4gIC8vIERlZmF1bHQtb24gcHJvdGVjdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCBjb3B5aW5nIHR1cm4tc2NvcGVkXG4gIC8vIGNoYXJ0SWRzIGZyb20gcHJpb3IgYXNzaXN0YW50IHRvb2wgcmVzdWx0cyBpbnRvIHRoZSBuZXdcbiAgLy8gdHVybidzIGBbY2hhcnQ6PGlkPl1gIG1hcmtlcnMuIE9wdCBvdXQgcGVyLXBsdWdpbiB2aWFcbiAgLy8gYGNvbmZpZy5zdHJpcFN0YWxlQ2hhcnRzOiBmYWxzZWAuXG4gIGNvbnN0IGlucHV0UHJvY2Vzc29ycyA9IFtcbiAgICAvLyBgcmVuZGVyX2RhdGFgIGNhbiBjYXJyeSBodW5kcmVkcyBvZiBpbmxpbmUgcm93cy4gS2VlcCB0aGUgY29tcGxldGUgY2FsbFxuICAgIC8vIGluIE1lbW9yeSBhbmQgdGhlIFVJIHRyYW5zY3JpcHQsIGJ1dCB1c2UgTWFzdHJhJ3MgbmF0aXZlIHByb21wdC1zdGFnZVxuICAgIC8vIGZpbHRlciB0byBvbWl0IHByaW9yIGNhbGxzL3Jlc3VsdHMgZnJvbSBsYXRlciBtb2RlbCByZXF1ZXN0cy4gQ3VycmVudFxuICAgIC8vIHR1cm4gY2FsbHMgcmVtYWluIGF2YWlsYWJsZSB0byB0aGUgYWdlbnQgbG9vcC5cbiAgICBuZXcgVG9vbENhbGxGaWx0ZXIoeyBleGNsdWRlOiBbXCJyZW5kZXJfZGF0YVwiXSB9KSxcbiAgICAuLi4oY29uZmlnLnN0cmlwU3RhbGVDaGFydHMgPT09IGZhbHNlID8gW10gOiBbc3RyaXBTdGFsZUNoYXJ0c1Byb2Nlc3Nvcl0pLFxuICBdO1xuICBjb25zdCBhZ2VudHM6IFJlY29yZDxzdHJpbmcsIEFnZW50PiA9IHt9O1xuICBjb25zdCBkZWZhdWx0TW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudERlZmF1bHRNb2RlbD4gPSB7fTtcbiAgY29uc3QgYXBwcm92YWxHYXRlZEJ5QWdlbnQ6IEFycmF5PHsgYWdlbnRJZDogc3RyaW5nOyB0b29sSWRzOiBzdHJpbmdbXSB9PiA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2lkLCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKGRlZmluaXRpb25zKSkge1xuICAgIGNvbnN0IHVzZXJUb29scyA9IGF3YWl0IHJlc29sdmVVc2VyVG9vbHMoZGVmLnRvb2xzLCBwbHVnaW5zKTtcbiAgICBjb25zdCB0b29scyA9IHsgLi4uYW1iaWVudFRvb2xzLCAuLi51c2VyVG9vbHMgfTtcbiAgICBsZXQgd29ya3NwYWNlID0gcmVzb2x2ZUFnZW50V29ya3NwYWNlKGRlZi53b3Jrc3BhY2UpO1xuICAgIGlmIChcbiAgICAgIChkZWYud29ya3NwYWNlID09PSB1bmRlZmluZWQgJiYgIXdvcmtzcGFjZSkgfHxcbiAgICAgICgoZXh0cmFTa2lsbE1vdW50cz8ubGVuZ3RoIHx8XG4gICAgICAgIGNvbmZpZy5zYW5kYm94ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgY29uZmlnLndvcmtzcGFjZUZhbGxiYWNrVG9UbXAgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBjb25maWcud29ya3NwYWNlVG9vbHMgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBjb250ZXh0ICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgIGlzRGVmYXVsdFdvcmtzcGFjZSh3b3Jrc3BhY2UpKVxuICAgICkge1xuICAgICAgd29ya3NwYWNlID0gZGF0YWJyaWNrc1dvcmtzcGFjZSh7XG4gICAgICAgIGV4dHJhU2tpbGxNb3VudHMsXG4gICAgICAgIGV4Y2x1ZGVTa2lsbE5hbWVzOiBleGNsdWRlZFdvcmtzcGFjZVNraWxsTmFtZXMsXG4gICAgICAgIGZhbGxiYWNrVG9UbXA6IGNvbmZpZy53b3Jrc3BhY2VGYWxsYmFja1RvVG1wLFxuICAgICAgICAuLi4oY29uZmlnLndvcmtzcGFjZVRvb2xzICE9PSB1bmRlZmluZWQgPyB7IHRvb2xzOiBjb25maWcud29ya3NwYWNlVG9vbHMgfSA6IHt9KSxcbiAgICAgICAgcGx1Z2luQ29udGV4dDogY29udGV4dCxcbiAgICAgICAgc2FuZGJveDogY29uZmlnLnNhbmRib3gsXG4gICAgICB9KTtcbiAgICAgIG1hcmtEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZSk7XG4gICAgfSBlbHNlIGlmICh3b3Jrc3BhY2UpIHtcbiAgICAgIHdvcmtzcGFjZSA9IGJpbmREYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCh3b3Jrc3BhY2UsIGNvbnRleHQsIGV4Y2x1ZGVkV29ya3NwYWNlU2tpbGxOYW1lcyk7XG4gICAgfVxuICAgIGNvbnN0IGdhdGVkID0gYXBwcm92YWxHYXRlZFRvb2xJZHModG9vbHMpO1xuICAgIGlmIChnYXRlZC5sZW5ndGggPiAwKSBhcHByb3ZhbEdhdGVkQnlBZ2VudC5wdXNoKHsgYWdlbnRJZDogaWQsIHRvb2xJZHM6IGdhdGVkIH0pO1xuICAgIGNvbnN0IG1lbW9yeSA9IG1lbW9yeUJ1aWxkZXI/LmZvckFnZW50KGlkLCBkZWYpO1xuICAgIGNvbnN0IHJlc29sdmVDb2RlTW9kZSA9IGNvZGVNb2RlUmVzb2x2ZXIoY29uZmlnLCB0b29scywgd29ya3NwYWNlKTtcbiAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudCh7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6IGRlZi5uYW1lID8/IGlkLFxuICAgICAgLy8gQWx3YXlzIGNhcnJ5IGEgbm9uLWVtcHR5IGRlc2NyaXB0aW9uOiBpdCdzIHN1cmZhY2VkIHRvIE1DUFxuICAgICAgLy8gY2xpZW50cyAod2hpY2ggcmVqZWN0IGEgZGVzY3JpcHRpb24tbGVzcyBhZ2VudCkgYW5kIGluIGFnZW50XG4gICAgICAvLyBtZXRhZGF0YS4gRmFsbCBiYWNrIHRvIGEgZ2VuZXJhdGVkIG9uZSB3aGVuIHRoZSBkZWZpbml0aW9uXG4gICAgICAvLyBvbWl0cyBpdC5cbiAgICAgIGRlc2NyaXB0aW9uOiBkZWYuZGVzY3JpcHRpb24/LnRyaW0oKSB8fCBkZWZhdWx0QWdlbnREZXNjcmlwdGlvbihkZWYubmFtZSA/PyBpZCksXG4gICAgICBpbnN0cnVjdGlvbnM6IGNvbXBvc2VJbnN0cnVjdGlvbnMoZGVmLmluc3RydWN0aW9ucywgc3R5bGUsIHJlc29sdmVDb2RlTW9kZSksXG4gICAgICAuLi4oZGVmLnJlcXVlc3RDb250ZXh0U2NoZW1hID8geyByZXF1ZXN0Q29udGV4dFNjaGVtYTogZGVmLnJlcXVlc3RDb250ZXh0U2NoZW1hIH0gOiB7fSksXG4gICAgICBtb2RlbDogcmVzb2x2ZU1vZGVsKGNvbmZpZywgZGVmLm1vZGVsKSxcbiAgICAgIGRlZmF1bHRPcHRpb25zOiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PlxuICAgICAgICB3aXRoUmVxdWVzdE1lbW9yeVNjb3BlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1heFN0ZXBzOiBjb25maWcuYWdlbnRNYXhTdGVwcyA/PyBERUZBVUxUX0FHRU5UX01BWF9TVEVQUyxcbiAgICAgICAgICAgIHByb3ZpZGVyT3B0aW9uczogUkVTUE9OU0VTX1BST1ZJREVSX09QVElPTlMsXG4gICAgICAgICAgICAuLi4oZGVmLnJlcXVpcmVUb29sQXBwcm92YWwgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IHsgcmVxdWlyZVRvb2xBcHByb3ZhbDogZGVmLnJlcXVpcmVUb29sQXBwcm92YWwgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lbW9yeSA/IHJlcXVlc3RDb250ZXh0IDogdW5kZWZpbmVkLFxuICAgICAgICApLFxuICAgICAgdG9vbHM6IHJlc29sdmVDb2RlTW9kZVxuICAgICAgICA/IGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb2RlTW9kZSA9IGF3YWl0IHJlc29sdmVDb2RlTW9kZShhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiBjb2RlTW9kZSA/IHsgLi4udG9vbHMsIFtjb2RlTW9kZS50b29sLmlkXTogY29kZU1vZGUudG9vbCB9IDogdG9vbHM7XG4gICAgICAgICAgfVxuICAgICAgICA6IHRvb2xzLFxuICAgICAgLi4uKG1lbW9yeSA/IHsgbWVtb3J5IH0gOiB7fSksXG4gICAgICAuLi4od29ya3NwYWNlID8geyB3b3Jrc3BhY2UgfSA6IHt9KSxcbiAgICAgIGlucHV0UHJvY2Vzc29yczogWy4uLmlucHV0UHJvY2Vzc29ycywgLi4ud29ya3NwYWNlU2tpbGxJbnB1dFByb2Nlc3NvcnMod29ya3NwYWNlLCBjb25maWcpXSxcbiAgICAgIG91dHB1dFByb2Nlc3NvcnM6IFt0b29sRXJyb3JMb2dnaW5nUHJvY2Vzc29yKGxvZyldLFxuICAgIH0pO1xuICAgIGFnZW50c1tpZF0gPVxuICAgICAgY29uZmlnLmJhY2tncm91bmRUdXJucyA9PT0gZmFsc2VcbiAgICAgICAgPyBhZ2VudFxuICAgICAgICA6IGNyZWF0ZUJhY2tncm91bmRBZ2VudChhZ2VudCwgY29uZmlnLmFnZW50TWF4U3RlcHMgPz8gREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMpO1xuICAgIC8vIFN1cmZhY2UgdGhlIGVmZmVjdGl2ZSBkZWZhdWx0IG1vZGVsIHBlciBhZ2VudCBzbyBvcGVyYXRvcnMgY2FuXG4gICAgLy8gc2VlIGF0IGEgZ2xhbmNlIHdoaWNoIGVuZHBvaW50IGVhY2ggYWdlbnQgcG9pbnRzIGF0IHdpdGhvdXRcbiAgICAvLyBoYXZpbmcgdG8gZmlyZSBhIHJlcXVlc3QgYW5kIGluc3BlY3QgYSB0cmFjZS4gVGhlIHZhbHVlIGlzIHRoZVxuICAgIC8vICpzdGF0aWMqIGRlZmF1bHQ7IHBlci1yZXF1ZXN0IG92ZXJyaWRlcyAoaGVhZGVyIC8gcXVlcnkgL1xuICAgIC8vIGJvZHkpIGFuZCB0aGUgd29ya3NwYWNlLWNhdGFsb2d1ZSBmdXp6eSBtYXRjaCBzdGlsbCBhcHBseSBhdFxuICAgIC8vIGNhbGwgdGltZS5cbiAgICBjb25zdCBkZWZhdWx0TW9kZWwgPSBkZXNjcmliZUFnZW50RGVmYXVsdE1vZGVsKGNvbmZpZywgZGVmKTtcbiAgICBkZWZhdWx0TW9kZWxzW2lkXSA9IGRlZmF1bHRNb2RlbDtcbiAgICBsb2cuaW5mbyhcImFnZW50IHJlZ2lzdGVyZWRcIiwge1xuICAgICAgaWQsXG4gICAgICBuYW1lOiBkZWYubmFtZSA/PyBpZCxcbiAgICAgIGRlZmF1bHRNb2RlbDpcbiAgICAgICAgZGVmYXVsdE1vZGVsLmtpbmQgPT09IFwiY29uZmlndXJlZFwiID8gZGVmYXVsdE1vZGVsLm1vZGVsIDogYDwke2RlZmF1bHRNb2RlbC5raW5kfT5gLFxuICAgICAgdG9vbHM6IFsuLi5PYmplY3Qua2V5cyh0b29scyksIC4uLihyZXNvbHZlQ29kZU1vZGUgPyBbXCI8ZHluYW1pYy1jb2RlLW1vZGU+XCJdIDogW10pXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmICghYWdlbnRzW2RlZmF1bHRBZ2VudElkXSkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYG1hc3RyYSBkZWZhdWx0QWdlbnQgXCIke2RlZmF1bHRBZ2VudElkfVwiYCxcbiAgICAgIGBSZWdpc3RlcmVkIGFnZW50czogJHtpZHMuam9pbihcIiwgXCIpIHx8IFwibm9uZVwifS5gLFxuICAgICk7XG4gIH1cblxuICBhc3NlcnRBcHByb3ZhbEdhdGVkVG9vbHNIYXZlU3RvcmFnZShhcHByb3ZhbEdhdGVkQnlBZ2VudCwgbWVtb3J5QnVpbGRlcik7XG5cbiAgbG9nLmluZm8oXCJhZ2VudHMgcmVhZHlcIiwgeyBpZHMsIGRlZmF1bHRBZ2VudElkIH0pO1xuICByZXR1cm4geyBhZ2VudHMsIGRlZmF1bHRBZ2VudElkLCBkZWZhdWx0TW9kZWxzLCBhbWJpZW50VG9vbHMgfTtcbn1cblxuLyoqIExvZyBmYWlsZWQgdG9vbCBjYWxscyB3aXRob3V0IGNoYW5naW5nIHRoZSBjaHVua3MgcmV0dXJuZWQgdG8gdGhlIGNsaWVudC4gKi9cbmZ1bmN0aW9uIHRvb2xFcnJvckxvZ2dpbmdQcm9jZXNzb3IobG9nZ2VyOiBsb2cuTG9nZ2VyKTogT3V0cHV0UHJvY2Vzc29yIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogXCJ0b29sLWVycm9yLWxvZ2dlclwiLFxuICAgIGFzeW5jIHByb2Nlc3NPdXRwdXRTdHJlYW0oeyBwYXJ0IH0pIHtcbiAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwidG9vbC1lcnJvclwiKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gZXJyb3JVdGlscy50b0Vycm9yKHBhcnQucGF5bG9hZC5lcnJvcik7XG4gICAgICAgIGxvZ2dlci5lcnJvcihcInRvb2wgZXhlY3V0aW9uIGZhaWxlZFwiLCB7XG4gICAgICAgICAgdG9vbE5hbWU6IHBhcnQucGF5bG9hZC50b29sTmFtZSxcbiAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LnBheWxvYWQudG9vbENhbGxJZCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFydDtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB3b3Jrc3BhY2VTa2lsbElucHV0UHJvY2Vzc29ycyhcbiAgd29ya3NwYWNlOiBXb3Jrc3BhY2UgfCB1bmRlZmluZWQsXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuKTogU2tpbGxTZWFyY2hQcm9jZXNzb3JbXSB7XG4gIGlmICghd29ya3NwYWNlIHx8IGNvbmZpZy53b3Jrc3BhY2VTa2lsbHMgPT09IGZhbHNlKSByZXR1cm4gW107XG4gIGNvbnN0IG9wdGlvbnMgPSB0eXBlb2YgY29uZmlnLndvcmtzcGFjZVNraWxscyA9PT0gXCJvYmplY3RcIiA/IGNvbmZpZy53b3Jrc3BhY2VTa2lsbHMgOiB1bmRlZmluZWQ7XG4gIGlmICghd29ya3NwYWNlLnNraWxscykgcmV0dXJuIFtdO1xuICByZXR1cm4gW1xuICAgIG5ldyBTa2lsbFNlYXJjaFByb2Nlc3Nvcih7XG4gICAgICB3b3Jrc3BhY2UsXG4gICAgICBzZWFyY2g6IHtcbiAgICAgICAgdG9wSzogb3B0aW9ucz8udG9wSyA/PyA1LFxuICAgICAgICBtaW5TY29yZTogb3B0aW9ucz8ubWluU2NvcmUgPz8gMC4xLFxuICAgICAgfSxcbiAgICAgIC4uLihvcHRpb25zPy50dGxNcyAhPT0gdW5kZWZpbmVkID8geyB0dGw6IG9wdGlvbnMudHRsTXMgfSA6IHt9KSxcbiAgICAgIGJsb2NraW5nUmVmcmVzaDogZmFsc2UsXG4gICAgfSksXG4gIF07XG59XG5cbi8qKlxuICogVG9vbCBpZHMgb24gYHRvb2xzYCB0aGF0IGFyZSBhcHByb3ZhbC1nYXRlZCAoYHJlcXVpcmVBcHByb3ZhbDogdHJ1ZWApLlxuICogS2V5cyBhcmUgdXNlZCBhcyBhIGZhbGxiYWNrIHdoZW4gYSB0b29sIG9taXRzIGFuIGV4cGxpY2l0IGBpZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHByb3ZhbEdhdGVkVG9vbElkcyh0b29sczogTWFzdHJhVG9vbHMpOiBzdHJpbmdbXSB7XG4gIGlmICghdG9vbHMgfHwgdHlwZW9mIHRvb2xzICE9PSBcIm9iamVjdFwiKSByZXR1cm4gW107XG4gIHJldHVybiBbXG4gICAgLi4ub2JqZWN0XG4gICAgICAuc2VxdWVuY2UoT2JqZWN0LmVudHJpZXModG9vbHMpKVxuICAgICAgLmZpbHRlcigoWywgdG9vbF0pID0+IGlzQXBwcm92YWxHYXRlZFRvb2wodG9vbCkpXG4gICAgICAubWFwKChba2V5LCB0b29sXSkgPT4gcmVzb2x2ZVRvb2xJZCh0b29sLCBrZXkpKSxcbiAgXTtcbn1cblxuLyoqIFRydWUgd2hlbiBhIE1hc3RyYSAvIEFJIFNESyB0b29sIHBhdXNlcyBmb3IgaHVtYW4gYXBwcm92YWwgYmVmb3JlIGV4ZWN1dGUuICovXG5mdW5jdGlvbiBpc0FwcHJvdmFsR2F0ZWRUb29sKHRvb2w6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCF0b29sIHx8IHR5cGVvZiB0b29sICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAodG9vbCBhcyB7IHJlcXVpcmVBcHByb3ZhbD86IGJvb2xlYW4gfSkucmVxdWlyZUFwcHJvdmFsID09PSB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVG9vbElkKHRvb2w6IHVua25vd24sIGZhbGxiYWNrS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodG9vbCAmJiB0eXBlb2YgdG9vbCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgKHRvb2wgYXMgeyBpZD86IHN0cmluZyB9KS5pZCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiAodG9vbCBhcyB7IGlkOiBzdHJpbmcgfSkuaWQ7XG4gIH1cbiAgcmV0dXJuIGZhbGxiYWNrS2V5O1xufVxuXG4vKipcbiAqIEFwcHJvdmFsLWdhdGVkIHRvb2xzIHN1c3BlbmQgdGhlIGFnZW50IGxvb3AgdW50aWwgYSBodW1hbiBhcHByb3Zlcy5cbiAqIE1hc3RyYSBwZXJzaXN0cyB0aG9zZSBzdXNwZW5kZWQgcnVucyBpbiBNYXN0cmEtaW5zdGFuY2UtbGV2ZWwgc3RvcmFnZVxuICogKGBtZW1vcnlCdWlsZGVyLmluc3RhbmNlU3RvcmFnZSgpYCksIG5vdCBwZXItYWdlbnQgbWVtb3J5IC0gc28gYm9vdFxuICogbXVzdCBmYWlsIGZhc3Qgd2hlbiBzdWNoIGEgdG9vbCBpcyByZWdpc3RlcmVkIHdpdGhvdXQgc3RvcmFnZS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0QXBwcm92YWxHYXRlZFRvb2xzSGF2ZVN0b3JhZ2UoXG4gIGdhdGVkOiBBcnJheTx7IGFnZW50SWQ6IHN0cmluZzsgdG9vbElkczogc3RyaW5nW10gfT4sXG4gIG1lbW9yeUJ1aWxkZXI6IE1lbW9yeUJ1aWxkZXIgfCB1bmRlZmluZWQsXG4pOiB2b2lkIHtcbiAgaWYgKGdhdGVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICBpZiAobWVtb3J5QnVpbGRlcj8uaW5zdGFuY2VTdG9yYWdlKCkpIHJldHVybjtcblxuICBjb25zdCBkZXRhaWwgPSBnYXRlZFxuICAgIC5tYXAoKHsgYWdlbnRJZCwgdG9vbElkcyB9KSA9PiBgJHthZ2VudElkfTogJHt0b29sSWRzLmpvaW4oXCIsIFwiKX1gKVxuICAgIC5qb2luKFwiOyBcIik7XG4gIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgXCJtYXN0cmE6IGFwcHJvdmFsLWdhdGVkIHRvb2xzIHJlcXVpcmUgcGx1Z2luIHN0b3JhZ2UgKFBvc3RncmVzU3RvcmUpIHRvIHBlcnNpc3Qgc3VzcGVuZGVkIHJ1bnMuIFwiICtcbiAgICAgIGBBZmZlY3RlZCBhZ2VudHMvdG9vbHM6ICR7ZGV0YWlsfS4gYCArXG4gICAgICBcIlJlZ2lzdGVyIGxha2ViYXNlKCkgYmVmb3JlIG1hc3RyYSgpIHNvIHN0b3JhZ2UgYXV0by1lbmFibGVzLCBvciBwYXNzIHN0b3JhZ2U6IHRydWUgZXhwbGljaXRseS5cIixcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXNjcmliZSBob3cgYW4gYWdlbnQgcmVzb2x2ZXMgaXRzIHVucGlubmVkIG1vZGVsOlxuICpcbiAqICAgMS4gUGVyLWFnZW50IGBkZWYubW9kZWxgIChzdHJpbmcgc3VnYXIgaXMgY29uZmlndXJlZDsgYSBmdW5jdGlvbiBpc1xuICogICAgICBkeW5hbWljKS5cbiAqICAgMi4gUGx1Z2luLWxldmVsIGBjb25maWcuZGVmYXVsdE1vZGVsYCAoc2FtZSBydWxlcykuXG4gKiAgIDMuIGBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRWAgZW52IHZhci5cbiAqICAgNC4gQXV0b21hdGljIGxpdmUtY2F0YWxvZ3VlIHJhbmtpbmcgd2hlbiBub25lIGlzIHNldC5cbiAqXG4gKiBVc2VkIGZvciB0aGUgc3RhcnR1cCBgYWdlbnQgcmVnaXN0ZXJlZGAgbG9nIHNvIG9wZXJhdG9ycyBjYW4gc2VlXG4gKiBgZGVmYXVsdE1vZGVsRmFsbGJhY2tzYCByZW1haW5zIGFuIG9wZXJhdG9yLXBpbm5lZCBjYW5kaWRhdGUgbGlzdCBpbnNpZGUgdGhlXG4gKiBhdXRvbWF0aWMgbGl2ZSBsb29rdXA7IGl0IGlzIG5vdCBhZHZlcnRpc2VkIGFzIGEgbW9kZWwgdW50aWwgYXZhaWxhYmlsaXR5IGlzXG4gKiBjaGVja2VkLlxuICovXG5mdW5jdGlvbiBkZXNjcmliZUFnZW50RGVmYXVsdE1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgZGVmOiBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24sXG4pOiBBZ2VudERlZmF1bHRNb2RlbCB7XG4gIGNvbnN0IGVmZmVjdGl2ZSA9IGRlZi5tb2RlbCA/PyBjb25maWcuZGVmYXVsdE1vZGVsO1xuICBpZiAodHlwZW9mIGVmZmVjdGl2ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHsga2luZDogXCJjb25maWd1cmVkXCIsIG1vZGVsOiBlZmZlY3RpdmUgfTtcbiAgaWYgKGVmZmVjdGl2ZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4geyBraW5kOiBcImR5bmFtaWNcIiB9O1xuICBjb25zdCBlbnZpcm9ubWVudCA9IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FO1xuICByZXR1cm4gZW52aXJvbm1lbnQgPyB7IGtpbmQ6IFwiY29uZmlndXJlZFwiLCBtb2RlbDogZW52aXJvbm1lbnQgfSA6IHsga2luZDogXCJhdXRvXCIgfTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYGNvbmZpZy5hZ2VudHNgIGludG8gYSBgUmVjb3JkPGlkLCBkZWZpbml0aW9uPmAuIEFjY2VwdHNcbiAqIGFueSBvZiB0aGUgdGhyZWUgc2hhcGVzIGRvY3VtZW50ZWQgb25cbiAqIHtAbGluayBNYXN0cmFQbHVnaW5Db25maWcuYWdlbnRzfTpcbiAqXG4gKiAtIFJlY29yZCAtIHJldHVybmVkIGFzLWlzIHdoZW4gbm9uLWVtcHR5LlxuICogLSBTaW5nbGUgZGVmaW5pdGlvbiAoZGV0ZWN0ZWQgdmlhIHRoZSByZXF1aXJlZCBgaW5zdHJ1Y3Rpb25zYFxuICogICBmaWVsZCkgLSBrZXllZCBieSBgc2x1Z2lmeShkZWYubmFtZSlgIG9yIGBGQUxMQkFDS19BR0VOVF9JRGAuXG4gKiAtIEFycmF5IC0ga2V5ZWQgYnkgYHNsdWdpZnkoZGVmLm5hbWUpYCBvciBgYWdlbnRfJHtpfWA7IGR1cGxpY2F0ZVxuICogICBzbHVncyBmYWlsIGxvdWRseSBzbyB1c2VycyBrbm93IHRvIHNldCBleHBsaWNpdCBuYW1lcy5cbiAqXG4gKiBPbWl0dGVkIG9yIGVtcHR5IGlucHV0cyBmYWxsIGJhY2sgdG8gYSBzaW5nbGUgYnVpbHQtaW4gYW5hbHlzdCBzb1xuICogdGhlIGJhcmUgYG1hc3RyYSgpYCBjYWxsIHN0aWxsIG1vdW50cyBhIHdvcmtpbmcgY2hhdCByb3V0ZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZURlZmluaXRpb25zKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogUmVjb3JkPHN0cmluZywgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uPiB7XG4gIGNvbnN0IGlucHV0ID0gY29uZmlnLmFnZW50cztcbiAgaWYgKCFpbnB1dCkgcmV0dXJuIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsbGJhY2tEZWZpbml0aW9ucygpO1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uPiA9IHt9O1xuICAgIGlucHV0LmZvckVhY2goKGRlZiwgaSkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZGVyaXZlQWdlbnRLZXkoZGVmLCBpKTtcbiAgICAgIGlmIChvdXRba2V5XSkge1xuICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgICAgICAgIGBtYXN0cmE6IGR1cGxpY2F0ZSBhZ2VudCBpZCBcIiR7a2V5fVwiIGRlcml2ZWQgZnJvbSBuYW1lIFwiJHtkZWYubmFtZSA/PyBcIlwifVwiOyBgICtcbiAgICAgICAgICAgIGBzZXQgdW5pcXVlIFxcYG5hbWVcXGBzIG9uIGVhY2ggZGVmaW5pdGlvbmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBvdXRba2V5XSA9IGRlZjtcbiAgICB9KTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLy8gU2luZ2xlLWRlZmluaXRpb24gc2hvcnRoYW5kOiBhbiBhZ2VudCBvd25zIHRoZSByZXF1aXJlZCBgaW5zdHJ1Y3Rpb25zYFxuICAvLyBmaWVsZCAoc3RhdGljIG9yIGR5bmFtaWMpOyBhIHJlY29yZC1vZi1hZ2VudHMgbmV2ZXIgb3ducyBpdCBkaXJlY3RseS5cbiAgaWYgKFwiaW5zdHJ1Y3Rpb25zXCIgaW4gaW5wdXQpIHtcbiAgICBjb25zdCBkZWYgPSBpbnB1dCBhcyBBbnlNYXN0cmFBZ2VudERlZmluaXRpb247XG4gICAgY29uc3Qga2V5ID0gZGVyaXZlQWdlbnRLZXkoZGVmKTtcbiAgICByZXR1cm4geyBba2V5XTogZGVmIH07XG4gIH1cblxuICBjb25zdCByZWNvcmQgPSBpbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+O1xuICBpZiAoT2JqZWN0LmtleXMocmVjb3JkKS5sZW5ndGggPT09IDApIHJldHVybiBmYWxsYmFja0RlZmluaXRpb25zKCk7XG4gIHJldHVybiByZWNvcmQ7XG59XG5cbi8qKiBEZXJpdmUgYSByZWdpc3RyeSBpZCBmcm9tIGEgZGVmaW5pdGlvbidzIGBuYW1lYCwgd2l0aCBhIGZhbGxiYWNrLiAqL1xuZnVuY3Rpb24gZGVyaXZlQWdlbnRLZXkoZGVmOiBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24sIGluZGV4PzogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGRlZi5uYW1lKSB7XG4gICAgY29uc3Qgc2x1ZyA9IHN0cmluZ1V0aWxzLnRvSWRlbnRpZmllcihkZWYubmFtZSk7XG4gICAgaWYgKHNsdWcpIHJldHVybiBzbHVnO1xuICB9XG4gIHJldHVybiBpbmRleCA9PT0gdW5kZWZpbmVkID8gRkFMTEJBQ0tfQUdFTlRfSUQgOiBgYWdlbnRfJHtpbmRleH1gO1xufVxuXG4vKiogQnVpbHQtaW4gZmFsbGJhY2sgcmVnaXN0cnkgdXNlZCB3aGVuIGBhZ2VudHNgIGlzIG9taXR0ZWQgLyBlbXB0eS4gKi9cbmZ1bmN0aW9uIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTogUmVjb3JkPHN0cmluZywgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uPiB7XG4gIHJldHVybiB7XG4gICAgW0ZBTExCQUNLX0FHRU5UX0lEXToge1xuICAgICAgbmFtZTogXCJEZWZhdWx0IEFnZW50XCIsXG4gICAgICBpbnN0cnVjdGlvbnM6IEZBTExCQUNLX0FHRU5UX0lOU1RSVUNUSU9OUyxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIGVmZmVjdGl2ZSBtb2RlbCBzcGVjIGZvciBhbiBhZ2VudC4gRmFsbGJhY2sgbGFkZGVyLCBpblxuICogb3JkZXI6XG4gKlxuICogICAxLiBQZXItYWdlbnQgYGRlZi5tb2RlbGAgKHN0cmluZyBzdWdhciBvciBgRHluYW1pY0FyZ3VtZW50YCkuXG4gKiAgIDIuIFBsdWdpbi1sZXZlbCBgY29uZmlnLmRlZmF1bHRNb2RlbGAgKHN0cmluZyBzdWdhciBvclxuICogICAgICBgRHluYW1pY0FyZ3VtZW50YCkgLSBtaXJyb3JzIEFwcEtpdCdzIGBhZ2VudHMoeyBkZWZhdWx0TW9kZWwgfSlgLlxuICogICAzLiBUaGUgYXV0by1yZXNvbHZlciB0aGF0IG1pbnRzIHVzZXItc2NvcGVkIHRva2VucyBhZ2FpbnN0XG4gKiAgICAgIGAvc2VydmluZy1lbmRwb2ludHNgIHZpYSB7QGxpbmsgYnVpbGRNb2RlbH0uXG4gKlxuICogU3RyaW5nIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBgbW9kZWxJZGAgc3VnYXIgYW5kIHRocmVhZGVkIHRocm91Z2hcbiAqIGBidWlsZE1vZGVsYCdzIG92ZXJyaWRlIGhvb2sgc28gdGhlIHJ1bnRpbWUgZnV6enkgbWF0Y2hlciBhbmQgdGhlXG4gKiBwZXItcmVxdWVzdCBgWC1NYXN0cmEtTW9kZWxgIG92ZXJyaWRlIGxheWVyIG9uIHRvcCBvZiB0aGUgc3RhdGljXG4gKiBjaG9pY2UuIE5vbi1zdHJpbmcgYER5bmFtaWNBcmd1bWVudGBzIGFyZSBwYXNzZWQgdGhyb3VnaCB2ZXJiYXRpbTtcbiAqIGNhbGxlcnMgdGhhdCBuZWVkIGZ1bGwgY29udHJvbCBvdmVyIGBwcm92aWRlcklkYCAvIGBoZWFkZXJzYCAvXG4gKiBgbW9kZWxJZGAgYnlwYXNzIHRoZSByZXNvbHZlciBwaXBlbGluZSBlbnRpcmVseS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgb3ZlcnJpZGU6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbltcIm1vZGVsXCJdLFxuKTogQWdlbnRDb25maWdbXCJtb2RlbFwiXSB7XG4gIGNvbnN0IGVmZmVjdGl2ZSA9IG92ZXJyaWRlID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmIChlZmZlY3RpdmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQpO1xuICB9XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgbW9kZWxJZCA9IGVmZmVjdGl2ZTtcbiAgICByZXR1cm4gKHsgcmVxdWVzdENvbnRleHQgfSkgPT4gYnVpbGRNb2RlbChjb25maWcsIHJlcXVlc3RDb250ZXh0LCB7IG1vZGVsSWQgfSk7XG4gIH1cbiAgcmV0dXJuIGVmZmVjdGl2ZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIG9ubHkgdGhlIHRvb2xzIGV4cGxpY2l0bHkgc3VwcGxpZWQgYnkgb25lIGFnZW50IGRlZmluaXRpb24uXG4gKiBDYWxsYmFjayBlcnJvcnMgcHJvcGFnYXRlIHZlcmJhdGltIHNvIHRoZSBvcmlnaW5hbCBzdGFjayBzdXJ2aXZlcyAtIHRoZVxuICogY2FsbGVyIGFscmVhZHkga25vd3Mgd2hpY2ggYWdlbnQgd2FzIHJlZ2lzdGVyaW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlVXNlclRvb2xzKFxuICBkZWZUb29sczogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1widG9vbHNcIl0sXG4gIHBsdWdpbnM6IE1hc3RyYVBsdWdpbnMsXG4pOiBQcm9taXNlPE1hc3RyYVRvb2xzPiB7XG4gIGlmICghZGVmVG9vbHMpIHJldHVybiB7fTtcbiAgcmV0dXJuIHR5cGVvZiBkZWZUb29scyA9PT0gXCJmdW5jdGlvblwiID8gZGVmVG9vbHMocGx1Z2lucykgOiBkZWZUb29scztcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFnZW50V29ya3NwYWNlKFxuICB3b3Jrc3BhY2U6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbltcIndvcmtzcGFjZVwiXSxcbik6IFdvcmtzcGFjZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghd29ya3NwYWNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIHdvcmtzcGFjZSA9PT0gXCJmdW5jdGlvblwiID8gd29ya3NwYWNlKCkgOiB3b3Jrc3BhY2U7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHtAbGluayBNYXN0cmFQbHVnaW5zfSBydW50aW1lIHByb3h5IGhhbmRlZCB0b1xuICogYHRvb2xzKHBsdWdpbnMpYCBjYWxsYmFja3MuXG4gKlxuICogSW1wbGVtZW50ZWQgYXMgYSBgUHJveHlgIG92ZXIgdGhlIEFwcEtpdCBwbHVnaW4gY29udGV4dCBzb1xuICogYHBsdWdpbnMuPG5hbWU+YCByZXNvbHZlcyBhdCBmaXJzdCBhY2Nlc3MuIEFueSBzaWJsaW5nIHBsdWdpbiB0aGF0XG4gKiBpbXBsZW1lbnRzIEFwcEtpdCdzIHN0YW5kYXJkIGBUb29sUHJvdmlkZXJgIGludGVyZmFjZVxuICogKGB0b29sa2l0KG9wdHM/KWAgKyBgZXhlY3V0ZUFnZW50VG9vbChuYW1lLCBhcmdzLCBzaWduYWw/LCBjb250ZXh0PylgKSBpc1xuICogYXV0by1hZGFwdGVkIGludG8gTWFzdHJhIHRvb2xzLiBVbmtub3duIG5hbWVzIHJldHVybiBgdW5kZWZpbmVkYCxcbiAqIG1hdGNoaW5nIEFwcEtpdCdzIGBQbHVnaW5zYCBzZW1hbnRpY3Mgc28gYHBsdWdpbnMuZm9vPy50b29sa2l0KClgXG4gKiByZW1haW5zIHNhZmUgaW4gZW52aXJvbm1lbnRzIHdoZXJlIGBmb29gIGlzbid0IHJlZ2lzdGVyZWQuXG4gKlxuICogYGdlbmllYCBpcyBzcGVjaWFsLWNhc2VkIHRvIHN3YXAgdGhlIGdlbmVyaWMgQXBwS2l0IHRvb2xraXQgKHdoaWNoXG4gKiBydW5zIGBleGVjdXRlQWdlbnRUb29sYCBhbmQgb25seSBlbWl0cyBhIHNpbmdsZSBmaW5hbCBgdG9vbC1yZXN1bHRgXG4gKiBjaHVuayBwZXIgY2FsbCkgZm9yIHRoZSBzdHJlYW1pbmctYXdhcmUgdG9vbHMgYnVpbHQgYnlcbiAqIHtAbGluayBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyfS4gVGhlIHN0cmVhbWluZyB2YXJpYW50IGZvcndhcmRzIGVhY2hcbiAqIEdlbmllIHdpcmUgZXZlbnQgKHN0YXR1cywgU1FMLCByb3cgY291bnRzLCBlcnJvcnMpIG91dCB0aHJvdWdoIHRoZVxuICogTWFzdHJhIGBjdHgud3JpdGVyYCwgc28gdGhlIFVJIGdldHMgYHRvb2wtb3V0cHV0YCBjaHVua3MgaW4gcmVhbFxuICogdGltZSBpbnN0ZWFkIG9mIHN0YXJpbmcgYXQgYSBzcGlubmVyIGZvciB0aGUgZnVsbCBHZW5pZSByb3VuZC10cmlwLlxuICovXG5mdW5jdGlvbiBidWlsZFBsdWdpbnNNYXAoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBjb250ZXh0OiBwbHVnaW5SZWdpc3RyeS5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbik6IE1hc3RyYVBsdWdpbnMge1xuICBjb25zdCBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIgfCBudWxsPigpO1xuICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIE1hc3RyYVBsdWdpbnMsIHtcbiAgICBnZXQoX3RhcmdldCwgcHJvcE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcE5hbWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FjaGUuaGFzKHByb3BOYW1lKSkgcmV0dXJuIGNhY2hlLmdldChwcm9wTmFtZSkgPz8gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcHJvdmlkZXIgPSByZXNvbHZlUHJvdmlkZXIoY29uZmlnLCBjb250ZXh0LCBwcm9wTmFtZSk7XG4gICAgICBjYWNoZS5zZXQocHJvcE5hbWUsIHByb3ZpZGVyKTtcbiAgICAgIHJldHVybiBwcm92aWRlciA/PyB1bmRlZmluZWQ7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUGljayB0aGUgcmlnaHQge0BsaW5rIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcn0gZm9yIGEgc2libGluZ1xuICogcGx1Z2luIGxvb2t1cC4gUmV0dXJucyB0aGUgR2VuaWUgYWdlbnQtYmFja2VkIGFkYXB0ZXIgd2hlblxuICogdGhlIGNhbGxlciBhc2tzIGZvciBgZ2VuaWVgIEFORCBhdCBsZWFzdCBvbmUgc3BhY2UgaXMgcmVhY2hhYmxlXG4gKiB2aWEge0BsaW5rIHJlc29sdmVHZW5pZVNwYWNlc30gKHRoZSBleHBsaWNpdFxuICogYGNvbmZpZy5nZW5pZVNwYWNlc2AsIHRoZSByZWdpc3RlcmVkIEFwcEtpdCBgZ2VuaWUoKWAgcGx1Z2luJ3NcbiAqIGBzcGFjZXNgIGNvbmZpZywgb3IgdGhlIGBEQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEYCBlbnYgdmFyKS5cbiAqIEZhbGxzIGJhY2sgdG8gdGhlIGdlbmVyaWMgQXBwS2l0IGBUb29sUHJvdmlkZXJgIGFkYXB0ZXIgZm9yXG4gKiBldmVyeSBvdGhlciBwbHVnaW4gbmFtZS4gYGNvbmZpZ2AgaXMgdGhyZWFkZWQgdGhyb3VnaCBzbyB0aGVcbiAqIEdlbmllIGFnZW50IGluaGVyaXRzIHRoZSBzYW1lIG1vZGVsIHJlc29sdmVyIC8gZmFsbGJhY2tcbiAqIGxhZGRlciB0aGUgY2FsbGluZyBhZ2VudHMgdXNlLlxuICpcbiAqIFRoZSBHZW5pZSB0b29scyB0YWxrIHRvIEdlbmllIGRpcmVjdGx5IHRocm91Z2ggYEBkYngtdG9vbHMvZ2VuaWVgXG4gKiAoYGdlbmllRXZlbnRDaGF0YCkgYW5kIHRoZSB3b3Jrc3BhY2UgYHN0YXRlbWVudEV4ZWN1dGlvbi5nZXRTdGF0ZW1lbnRgXG4gKiBBUEk7IEFwcEtpdCdzIHN0b2NrIGBnZW5pZWAgcGx1Z2luIGNvbnRyaWJ1dGVzIG9ubHkgaXRzIHJlc291cmNlXG4gKiBtYW5pZmVzdCBhbmQgYHNwYWNlc2AgY29uZmlnLCBzbyBhbiBgYXBwLnlhbWxgIHJlc291cmNlIGJpbmRpbmcgYW5kIGFcbiAqIGBnZW5pZSh7IHNwYWNlcyB9KWAgcmVjb3JkIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBoZXJlIGFzIHRoZXkgZG8gdGhlcmUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVQcm92aWRlcihcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IHBsdWdpblJlZ2lzdHJ5LlBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkLFxuICBwcm9wTmFtZTogc3RyaW5nLFxuKTogTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHwgbnVsbCB7XG4gIGlmIChwcm9wTmFtZSA9PT0gXCJnZW5pZVwiKSB7XG4gICAgY29uc3Qgc3BhY2VzID0gcmVzb2x2ZUdlbmllU3BhY2VzKGNvbmZpZywgY29udGV4dCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNwYWNlcykubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYnVpbGRHZW5pZVRvb2xraXRQcm92aWRlcih7XG4gICAgICBzcGFjZXMsXG4gICAgICBjb25maWcsXG4gICAgfSkgYXMgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyO1xuICB9XG4gIGNvbnN0IHBsdWdpbiA9IGNvbnRleHQ/LmdldFBsdWdpbnMoKS5nZXQocHJvcE5hbWUpO1xuICByZXR1cm4gYWRhcHRQbHVnaW5Ub29sa2l0KHBsdWdpbiwgcHJvcE5hbWUpO1xufVxuXG50eXBlIENvbnRleHR1YWxUb29sUHJvdmlkZXIgPSBQYXJ0aWFsPFBpY2s8VG9vbFByb3ZpZGVyLCBcImdldEFnZW50VG9vbHNcIj4+ICYge1xuICB0b29sa2l0PzogKFxuICAgIG9wdHM/OiBUb29sa2l0T3B0aW9ucyxcbiAgKSA9PlxuICAgIHwgUmV0dXJuVHlwZTxQbHVnaW5Ub29sa2l0UHJvdmlkZXJbXCJ0b29sa2l0XCJdPlxuICAgIHwgUHJvbWlzZTxSZXR1cm5UeXBlPFBsdWdpblRvb2xraXRQcm92aWRlcltcInRvb2xraXRcIl0+PjtcbiAgZXhlY3V0ZUFnZW50VG9vbD86IChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgYXJnczogdW5rbm93bixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICBjb250ZXh0PzogQWdlbnRUb29sRXhlY3V0aW9uQ29udGV4dCxcbiAgKSA9PiBQcm9taXNlPHVua25vd24+O1xufTtcblxuLyoqXG4gKiBBZGFwdCBhbiBBcHBLaXQgYFRvb2xQcm92aWRlcmAgcGx1Z2luIGluc3RhbmNlIGludG8gYVxuICoge0BsaW5rIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcn0uIFJldHVybnMgYG51bGxgIGZvciBhbnkgcGx1Z2luXG4gKiB0aGF0IGRvZXNuJ3QgaW1wbGVtZW50IGBleGVjdXRlQWdlbnRUb29sYCBwbHVzIGVpdGhlciBBcHBLaXQncyBuYXRpdmVcbiAqIGB0b29sa2l0YCBvciBgZ2V0QWdlbnRUb29sc2Agc3VyZmFjZS5cbiAqL1xuZnVuY3Rpb24gYWRhcHRQbHVnaW5Ub29sa2l0KFxuICBwbHVnaW46IHVua25vd24sXG4gIHBsdWdpbk5hbWU6IHN0cmluZyxcbik6IE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB8IG51bGwge1xuICBpZiAoIXBsdWdpbiB8fCB0eXBlb2YgcGx1Z2luICE9PSBcIm9iamVjdFwiKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcCA9IHBsdWdpbiBhcyBDb250ZXh0dWFsVG9vbFByb3ZpZGVyO1xuICBpZiAoXG4gICAgdHlwZW9mIHAuZXhlY3V0ZUFnZW50VG9vbCAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgKHR5cGVvZiBwLnRvb2xraXQgIT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgcC5nZXRBZ2VudFRvb2xzICE9PSBcImZ1bmN0aW9uXCIpXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB7XG4gICAgdG9vbGtpdChvcHRzPzogVG9vbGtpdE9wdGlvbnMpOiBNYXN0cmFUb29scyB8IFByb21pc2U8TWFzdHJhVG9vbHM+IHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPVxuICAgICAgICB0eXBlb2YgcC50b29sa2l0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHAudG9vbGtpdChvcHRzKVxuICAgICAgICAgIDogdG9vbGtpdEVudHJpZXNGcm9tRGVmaW5pdGlvbnMocGx1Z2luTmFtZSwgcC5nZXRBZ2VudFRvb2xzISgpLCBvcHRzKTtcbiAgICAgIGlmIChpc1Byb21pc2VMaWtlKGVudHJpZXMpKSB7XG4gICAgICAgIHJldHVybiBlbnRyaWVzLnRoZW4oKHJlc29sdmVkKSA9PiB0b29sa2l0RW50cmllc1RvTWFzdHJhVG9vbHMocmVzb2x2ZWQsIHApKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0b29sa2l0RW50cmllc1RvTWFzdHJhVG9vbHMoZW50cmllcywgcCk7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdG9vbGtpdEVudHJpZXNGcm9tRGVmaW5pdGlvbnMoXG4gIHBsdWdpbk5hbWU6IHN0cmluZyxcbiAgZGVmaW5pdGlvbnM6IEFnZW50VG9vbERlZmluaXRpb25bXSxcbiAgb3B0aW9uczogVG9vbGtpdE9wdGlvbnMgPSB7fSxcbik6IFJlY29yZDxzdHJpbmcsIFRvb2xraXRFbnRyeT4ge1xuICByZXR1cm4gdG9vbGtpdEVudHJpZXMuZW50cmllcyhwbHVnaW5OYW1lLCBkZWZpbml0aW9ucywgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZUxpa2U8VD4odmFsdWU6IFQgfCBQcm9taXNlPFQ+KTogdmFsdWUgaXMgUHJvbWlzZTxUPiB7XG4gIHJldHVybiB0eXBlb2YgKHZhbHVlIGFzIHsgdGhlbj86IHVua25vd24gfSk/LnRoZW4gPT09IFwiZnVuY3Rpb25cIjtcbn1cblxuZnVuY3Rpb24gdG9vbGtpdEVudHJpZXNUb01hc3RyYVRvb2xzKFxuICBlbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBUb29sa2l0RW50cnk+LFxuICBwbHVnaW46IENvbnRleHR1YWxUb29sUHJvdmlkZXIsXG4pOiBNYXN0cmFUb29scyB7XG4gIGNvbnN0IHRvb2xzOiBNYXN0cmFUb29scyA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzKSkge1xuICAgIHRvb2xzW2tleV0gPSB0b29sa2l0RW50cnlUb01hc3RyYVRvb2woZW50cnksIHBsdWdpbik7XG4gIH1cbiAgcmV0dXJuIHRvb2xzO1xufVxuXG4vKipcbiAqIFdyYXAgYSBzaW5nbGUge0BsaW5rIEFwcEtpdFRvb2xraXRFbnRyeX0gYXMgYSBNYXN0cmEgdG9vbCB3aG9zZVxuICogYGV4ZWN1dGVgIGRpc3BhdGNoZXMgYmFjayB0aHJvdWdoIGBwbHVnaW4uZXhlY3V0ZUFnZW50VG9vbCguLi4pYCBzb1xuICogQXBwS2l0J3MgT0JPIGF1dGggKGBhc1VzZXJgKSwgdGVsZW1ldHJ5IHNwYW5zLCBhbmQgdGhlIE1hc3RyYSBtZW1vcnkgcmVzb3VyY2VcbiAqIGlkIHN0YXkgaW50YWN0LiBKU09OIFNjaGVtYSBwYXJhbWV0ZXJzIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQgLSBNYXN0cmEnc1xuICogYFB1YmxpY1NjaGVtYWAgYWNjZXB0cyBgSlNPTlNjaGVtYTdgIGRpcmVjdGx5IHZpYSBgQG1hc3RyYS9zY2hlbWEtY29tcGF0YC5cbiAqL1xuZnVuY3Rpb24gdG9vbGtpdEVudHJ5VG9NYXN0cmFUb29sKGVudHJ5OiBUb29sa2l0RW50cnksIHBsdWdpbjogQ29udGV4dHVhbFRvb2xQcm92aWRlcik6IFRvb2wge1xuICBjb25zdCBhbm5vdGF0aW9ucyA9IGVudHJ5LmFubm90YXRpb25zID8/IGVudHJ5LmRlZi5hbm5vdGF0aW9ucztcbiAgY29uc3QgZWZmZWN0ID0gYW5ub3RhdGlvbnM/LmVmZmVjdDtcbiAgY29uc3QgcmVxdWlyZXNBcHByb3ZhbCA9IGVmZmVjdCA9PT0gXCJkZXN0cnVjdGl2ZVwiIHx8IGFubm90YXRpb25zPy5kZXN0cnVjdGl2ZSA9PT0gdHJ1ZTtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiBgJHtlbnRyeS5wbHVnaW5OYW1lfV9fJHtlbnRyeS5sb2NhbE5hbWV9YCxcbiAgICBkZXNjcmlwdGlvbjogZW50cnkuZGVmLmRlc2NyaXB0aW9uLFxuICAgIC4uLihlbnRyeS5kZWYucGFyYW1ldGVycyA/IHsgaW5wdXRTY2hlbWE6IGVudHJ5LmRlZi5wYXJhbWV0ZXJzIGFzIG5ldmVyIH0gOiB7fSksXG4gICAgLi4uKHJlcXVpcmVzQXBwcm92YWwgPyB7IHJlcXVpcmVBcHByb3ZhbDogdHJ1ZSB9IDoge30pLFxuICAgIC4uLihhbm5vdGF0aW9uc1xuICAgICAgPyB7XG4gICAgICAgICAgbWNwOiB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgICAgICByZWFkT25seUhpbnQ6IGVmZmVjdCA9PT0gXCJyZWFkXCIgfHwgYW5ub3RhdGlvbnMucmVhZE9ubHkgPT09IHRydWUsXG4gICAgICAgICAgICAgIGRlc3RydWN0aXZlSGludDogZWZmZWN0ID09PSBcImRlc3RydWN0aXZlXCIgfHwgYW5ub3RhdGlvbnMuZGVzdHJ1Y3RpdmUgPT09IHRydWUsXG4gICAgICAgICAgICAgIGlkZW1wb3RlbnRIaW50OiBhbm5vdGF0aW9ucy5pZGVtcG90ZW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbiA9IGNvbnRleHQgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBhZ2VudD86IHsgdG9vbENhbGxJZD86IHN0cmluZyB9O1xuICAgICAgICAgICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0PzogeyBnZXQoa2V5OiBzdHJpbmcpOiB1bmtub3duIH07XG4gICAgICAgICAgICB3cml0ZXI/OiB7XG4gICAgICAgICAgICAgIGN1c3RvbShwYXJ0OiB7IHR5cGU6IHN0cmluZzsgZGF0YTogdW5rbm93bjsgdHJhbnNpZW50PzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJlc291cmNlSWQgPSBleGVjdXRpb24/LnJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSk7XG4gICAgICBjb25zdCBtb2RlbCA9IGV4ZWN1dGlvbj8ucmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfUkVTT0xWRURfTU9ERUxfS0VZKTtcbiAgICAgIGNvbnN0IHRvb2xDYWxsSWQgPSBleGVjdXRpb24/LmFnZW50Py50b29sQ2FsbElkO1xuICAgICAgY29uc3Qgd3JpdGVyID0gZXhlY3V0aW9uPy53cml0ZXI7XG4gICAgICByZXR1cm4gcGx1Z2luLmV4ZWN1dGVBZ2VudFRvb2whKGVudHJ5LmxvY2FsTmFtZSwgaW5wdXQsIGV4ZWN1dGlvbj8uYWJvcnRTaWduYWwsIHtcbiAgICAgICAgLi4uKHR5cGVvZiByZXNvdXJjZUlkID09PSBcInN0cmluZ1wiID8geyByZXNvdXJjZUlkIH0gOiB7fSksXG4gICAgICAgIC4uLih0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIgPyB7IG1vZGVsIH0gOiB7fSksXG4gICAgICAgIC4uLih3cml0ZXIgJiYgdG9vbENhbGxJZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICB3cml0ZVByb2dyZXNzOiBhc3luYyAoZXZlbnQsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBUb29sUHJvZ3Jlc3NFdmVudFNjaGVtYS5wYXJzZShldmVudCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgd3JpdGVyXG4gICAgICAgICAgICAgICAgICAuY3VzdG9tKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogVE9PTF9QUk9HUkVTU19QQVJUX1RZUEUsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHsgdG9vbENhbGxJZCwgZXZlbnQ6IHBhcnNlZCB9LFxuICAgICAgICAgICAgICAgICAgICAuLi4ob3B0aW9ucz8udHJhbnNpZW50ID8geyB0cmFuc2llbnQ6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufVxuIl19
|
package/lib/src/config.d.ts
CHANGED
|
@@ -614,7 +614,7 @@ export interface MastraPluginConfig extends BasePluginConfig {
|
|
|
614
614
|
* ```
|
|
615
615
|
*/
|
|
616
616
|
remoteSkills?: RemoteSkillsOption;
|
|
617
|
-
/** Read-only local skill trees mounted
|
|
617
|
+
/** Read-only local skill trees mounted for files and passed as standard agent-level skills. */
|
|
618
618
|
localSkillMounts?: LocalSkillMount[];
|
|
619
619
|
}
|
|
620
620
|
/**
|