@ruvector/ruvllm 2.5.0 → 2.5.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"intelligence.d.ts","sourceRoot":"","sources":["../../src/intelligence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,wBAAwB;IACxB,OAAO,EAAE,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAAC;IACnD,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACvC,gEAAgE;IAChE,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,sBAAsB,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,4CAA4C;IAC5C,IAAI,IAAI,MAAM,CAAC;IACf,4DAA4D;IAC5D,WAAW,IAAI,aAAa,EAAE,CAAC;IAC/B,wCAAwC;IACxC,cAAc,CAAC,IAAI,sBAAsB,GAAG,SAAS,CAAC;CACvD;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,YAAW,oBAAoB;IAC7D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,QAAQ,EAAE,MAAM;IAI5B,IAAI,IAAI,MAAM;IAId,WAAW,IAAI,aAAa,EAAE;IA8B9B,cAAc,IAAI,sBAAsB,GAAG,SAAS;CAiBrD;AAgBD;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,SAAS,CAA8B;IAE/C,iDAAiD;IACjD,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAItD,iDAAiD;IACjD,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,oDAAoD;IACpD,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED;;;;;OAKG;IACH,cAAc,IAAI;QAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QAAC,MAAM,EAAE,aAAa,EAAE,CAAA;KAAE;IAmBvE,6DAA6D;IAC7D,WAAW,IAAI,cAAc,EAAE;CAehC"}
1
+ {"version":3,"file":"intelligence.d.ts","sourceRoot":"","sources":["../../src/intelligence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAiBH;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,wBAAwB;IACxB,OAAO,EAAE,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAAC;IACnD,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACvC,gEAAgE;IAChE,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,sBAAsB,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,4CAA4C;IAC5C,IAAI,IAAI,MAAM,CAAC;IACf,4DAA4D;IAC5D,WAAW,IAAI,aAAa,EAAE,CAAC;IAC/B,wCAAwC;IACxC,cAAc,CAAC,IAAI,sBAAsB,GAAG,SAAS,CAAC;CACvD;AAuCD;;;;;GAKG;AACH,qBAAa,kBAAmB,YAAW,oBAAoB;IAC7D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,QAAQ,EAAE,MAAM;IAI5B,IAAI,IAAI,MAAM;IAId,WAAW,IAAI,aAAa,EAAE;IAwC9B,cAAc,IAAI,sBAAsB,GAAG,SAAS;CAerD;AAED;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,SAAS,CAA8B;IAE/C,iDAAiD;IACjD,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAItD,iDAAiD;IACjD,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,oDAAoD;IACpD,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED;;;;;OAKG;IACH,cAAc,IAAI;QAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QAAC,MAAM,EAAE,aAAa,EAAE,CAAA;KAAE;IAmBvE,6DAA6D;IAC7D,WAAW,IAAI,cAAc,EAAE;CAehC"}
@@ -16,8 +16,86 @@
16
16
  * console.log(`Loaded ${signals.length} signals`);
17
17
  * ```
18
18
  */
19
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ var desc = Object.getOwnPropertyDescriptor(m, k);
22
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
23
+ desc = { enumerable: true, get: function() { return m[k]; } };
24
+ }
25
+ Object.defineProperty(o, k2, desc);
26
+ }) : (function(o, m, k, k2) {
27
+ if (k2 === undefined) k2 = k;
28
+ o[k2] = m[k];
29
+ }));
30
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
31
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
32
+ }) : function(o, v) {
33
+ o["default"] = v;
34
+ });
35
+ var __importStar = (this && this.__importStar) || (function () {
36
+ var ownKeys = function(o) {
37
+ ownKeys = Object.getOwnPropertyNames || function (o) {
38
+ var ar = [];
39
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
40
+ return ar;
41
+ };
42
+ return ownKeys(o);
43
+ };
44
+ return function (mod) {
45
+ if (mod && mod.__esModule) return mod;
46
+ var result = {};
47
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
48
+ __setModuleDefault(result, mod);
49
+ return result;
50
+ };
51
+ })();
19
52
  Object.defineProperty(exports, "__esModule", { value: true });
20
53
  exports.IntelligenceLoader = exports.FileSignalProvider = void 0;
54
+ const fs = __importStar(require("fs"));
55
+ const path = __importStar(require("path"));
56
+ /** Maximum signal file size (10 MiB) */
57
+ const MAX_SIGNAL_FILE_SIZE = 10 * 1024 * 1024;
58
+ /** Maximum number of signals per file */
59
+ const MAX_SIGNALS_PER_FILE = 10000;
60
+ /** Valid outcome values */
61
+ const VALID_OUTCOMES = new Set(['success', 'partial_success', 'failure']);
62
+ /** Valid human verdict values */
63
+ const VALID_VERDICTS = new Set(['approved', 'rejected']);
64
+ function asOptionalNumber(val) {
65
+ if (val === undefined || val === null)
66
+ return undefined;
67
+ const n = Number(val);
68
+ return Number.isFinite(n) && n >= 0 && n <= 1 ? n : undefined;
69
+ }
70
+ function validateOutcome(val) {
71
+ const s = String(val ?? 'failure');
72
+ return VALID_OUTCOMES.has(s) ? s : 'failure';
73
+ }
74
+ function validateVerdict(val) {
75
+ if (val === undefined || val === null)
76
+ return undefined;
77
+ const s = String(val);
78
+ return VALID_VERDICTS.has(s) ? s : undefined;
79
+ }
80
+ function validateScore(val) {
81
+ const n = Number(val ?? 0);
82
+ if (!Number.isFinite(n) || n < 0 || n > 1)
83
+ return 0;
84
+ return n;
85
+ }
86
+ function mapQualityFactors(raw) {
87
+ return {
88
+ acceptanceCriteriaMet: asOptionalNumber(raw.acceptance_criteria_met),
89
+ testsPassing: asOptionalNumber(raw.tests_passing),
90
+ noRegressions: asOptionalNumber(raw.no_regressions),
91
+ lintClean: asOptionalNumber(raw.lint_clean),
92
+ typeCheckClean: asOptionalNumber(raw.type_check_clean),
93
+ followsPatterns: asOptionalNumber(raw.follows_patterns),
94
+ contextRelevance: asOptionalNumber(raw.context_relevance),
95
+ reasoningCoherence: asOptionalNumber(raw.reasoning_coherence),
96
+ executionEfficiency: asOptionalNumber(raw.execution_efficiency),
97
+ };
98
+ }
21
99
  /**
22
100
  * Built-in file-based intelligence provider.
23
101
  *
@@ -26,45 +104,44 @@ exports.IntelligenceLoader = exports.FileSignalProvider = void 0;
26
104
  */
27
105
  class FileSignalProvider {
28
106
  constructor(filePath) {
29
- this.filePath = filePath;
107
+ this.filePath = path.resolve(filePath);
30
108
  }
31
109
  name() {
32
110
  return 'file-signals';
33
111
  }
34
112
  loadSignals() {
35
- try {
36
- // eslint-disable-next-line @typescript-eslint/no-var-requires
37
- const fs = require('fs');
38
- if (!fs.existsSync(this.filePath)) {
39
- return [];
40
- }
41
- const raw = fs.readFileSync(this.filePath, 'utf-8');
42
- const data = JSON.parse(raw);
43
- if (!Array.isArray(data)) {
44
- return [];
45
- }
46
- return data.map((item) => ({
47
- id: String(item.id ?? ''),
48
- taskDescription: String(item.task_description ?? item.taskDescription ?? ''),
49
- outcome: String(item.outcome ?? 'failure'),
50
- qualityScore: Number(item.quality_score ?? item.qualityScore ?? 0),
51
- humanVerdict: item.human_verdict ?? item.humanVerdict
52
- ? String(item.human_verdict ?? item.humanVerdict)
53
- : undefined,
54
- qualityFactors: (item.quality_factors || item.qualityFactors)
55
- ? mapQualityFactors((item.quality_factors ?? item.qualityFactors))
56
- : undefined,
57
- completedAt: String(item.completed_at ?? item.completedAt ?? new Date().toISOString()),
58
- }));
113
+ if (!fs.existsSync(this.filePath)) {
114
+ return [];
59
115
  }
60
- catch {
116
+ // Check file size before reading (prevent OOM)
117
+ const stat = fs.statSync(this.filePath);
118
+ if (stat.size > MAX_SIGNAL_FILE_SIZE) {
119
+ throw new Error(`Signal file exceeds max size (${stat.size} bytes, limit ${MAX_SIGNAL_FILE_SIZE})`);
120
+ }
121
+ const raw = fs.readFileSync(this.filePath, 'utf-8');
122
+ const data = JSON.parse(raw);
123
+ if (!Array.isArray(data)) {
61
124
  return [];
62
125
  }
126
+ // Check signal count
127
+ if (data.length > MAX_SIGNALS_PER_FILE) {
128
+ throw new Error(`Signal file contains ${data.length} signals, max is ${MAX_SIGNALS_PER_FILE}`);
129
+ }
130
+ return data.map((item) => {
131
+ const qfRaw = (item.quality_factors ?? item.qualityFactors);
132
+ return {
133
+ id: String(item.id ?? ''),
134
+ taskDescription: String(item.task_description ?? item.taskDescription ?? ''),
135
+ outcome: validateOutcome(item.outcome),
136
+ qualityScore: validateScore(item.quality_score ?? item.qualityScore),
137
+ humanVerdict: validateVerdict(item.human_verdict ?? item.humanVerdict),
138
+ qualityFactors: qfRaw ? mapQualityFactors(qfRaw) : undefined,
139
+ completedAt: String(item.completed_at ?? item.completedAt ?? new Date().toISOString()),
140
+ };
141
+ });
63
142
  }
64
143
  qualityWeights() {
65
144
  try {
66
- const fs = require('fs');
67
- const path = require('path');
68
145
  const weightsPath = path.join(path.dirname(this.filePath), 'quality-weights.json');
69
146
  if (!fs.existsSync(weightsPath))
70
147
  return undefined;
@@ -82,19 +159,6 @@ class FileSignalProvider {
82
159
  }
83
160
  }
84
161
  exports.FileSignalProvider = FileSignalProvider;
85
- function mapQualityFactors(raw) {
86
- return {
87
- acceptanceCriteriaMet: raw.acceptance_criteria_met,
88
- testsPassing: raw.tests_passing,
89
- noRegressions: raw.no_regressions,
90
- lintClean: raw.lint_clean,
91
- typeCheckClean: raw.type_check_clean,
92
- followsPatterns: raw.follows_patterns,
93
- contextRelevance: raw.context_relevance,
94
- reasoningCoherence: raw.reasoning_coherence,
95
- executionEfficiency: raw.execution_efficiency,
96
- };
97
- }
98
162
  /**
99
163
  * Aggregates quality signals from multiple registered providers.
100
164
  *
@@ -159,4 +223,4 @@ class IntelligenceLoader {
159
223
  }
160
224
  }
161
225
  exports.IntelligenceLoader = IntelligenceLoader;
162
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWxsaWdlbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludGVsbGlnZW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7OztBQXNGSDs7Ozs7R0FLRztBQUNILE1BQWEsa0JBQWtCO0lBRzdCLFlBQVksUUFBZ0I7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUk7UUFDRixPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQztZQUNILDhEQUE4RDtZQUM5RCxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQztZQUNELE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNwRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQTZCLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2xELEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQ3pCLGVBQWUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDO2dCQUM1RSxPQUFPLEVBQUUsTUFB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QW9CLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUM7Z0JBQ0gsZUFBZSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMzQyxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLFlBQVk7WUFDZCxDQUFDO1lBQ0QsT0FBTztnQkFDTCxZQUFZLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRTtnQkFDN0IsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLE9BQU8sRUFBRSxRQUFRLENBQUMsY0FBYyxFQUFFLEVBQUU7YUFDckMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBM0RELGdEQTJEQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXh0ZXJuYWwgSW50ZWxsaWdlbmNlIFByb3ZpZGVycyBmb3IgU09OQSBMZWFybmluZyAoQURSLTA0MylcbiAqXG4gKiBUeXBlU2NyaXB0IGJpbmRpbmdzIGZvciB0aGUgSW50ZWxsaWdlbmNlUHJvdmlkZXIgdHJhaXQsIGVuYWJsaW5nXG4gKiBleHRlcm5hbCBzeXN0ZW1zIHRvIGZlZWQgcXVhbGl0eSBzaWduYWxzIGludG8gUnV2TExNJ3MgbGVhcm5pbmcgbG9vcHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEludGVsbGlnZW5jZUxvYWRlciwgRmlsZVNpZ25hbFByb3ZpZGVyLCBRdWFsaXR5U2lnbmFsIH0gZnJvbSAnQHJ1dmVjdG9yL3J1dmxsbSc7XG4gKlxuICogY29uc3QgbG9hZGVyID0gbmV3IEludGVsbGlnZW5jZUxvYWRlcigpO1xuICogbG9hZGVyLnJlZ2lzdGVyUHJvdmlkZXIobmV3IEZpbGVTaWduYWxQcm92aWRlcignLi9zaWduYWxzLmpzb24nKSk7XG4gKlxuICogY29uc3QgeyBzaWduYWxzLCBlcnJvcnMgfSA9IGxvYWRlci5sb2FkQWxsU2lnbmFscygpO1xuICogY29uc29sZS5sb2coYExvYWRlZCAke3NpZ25hbHMubGVuZ3RofSBzaWduYWxzYCk7XG4gKiBgYGBcbiAqL1xuXG4vKipcbiAqIEEgcXVhbGl0eSBzaWduYWwgZnJvbSBhbiBleHRlcm5hbCBzeXN0ZW0uXG4gKlxuICogUmVwcmVzZW50cyBvbmUgY29tcGxldGVkIHRhc2sgd2l0aCBxdWFsaXR5IGFzc2Vzc21lbnQgZGF0YVxuICogdGhhdCBjYW4gZmVlZCBpbnRvIFNPTkEgdHJhamVjdG9yaWVzLCB0aGUgZW1iZWRkaW5nIGNsYXNzaWZpZXIsXG4gKiBhbmQgbW9kZWwgcm91dGVyIGNhbGlicmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1YWxpdHlTaWduYWwge1xuICAvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgc2lnbmFsICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSB0YXNrIGRlc2NyaXB0aW9uICh1c2VkIGZvciBlbWJlZGRpbmcgZ2VuZXJhdGlvbikgKi9cbiAgdGFza0Rlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKiBFeGVjdXRpb24gb3V0Y29tZSAqL1xuICBvdXRjb21lOiAnc3VjY2VzcycgfCAncGFydGlhbF9zdWNjZXNzJyB8ICdmYWlsdXJlJztcbiAgLyoqIENvbXBvc2l0ZSBxdWFsaXR5IHNjb3JlICgwLjAgLSAxLjApICovXG4gIHF1YWxpdHlTY29yZTogbnVtYmVyO1xuICAvKiogT3B0aW9uYWwgaHVtYW4gdmVyZGljdCAqL1xuICBodW1hblZlcmRpY3Q/OiAnYXBwcm92ZWQnIHwgJ3JlamVjdGVkJztcbiAgLyoqIE9wdGlvbmFsIHN0cnVjdHVyZWQgcXVhbGl0eSBmYWN0b3JzIGZvciBkZXRhaWxlZCBhbmFseXNpcyAqL1xuICBxdWFsaXR5RmFjdG9ycz86IFF1YWxpdHlGYWN0b3JzO1xuICAvKiogSVNPIDg2MDEgdGltZXN0YW1wIG9mIHRhc2sgY29tcGxldGlvbiAqL1xuICBjb21wbGV0ZWRBdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEdyYW51bGFyIHF1YWxpdHkgZmFjdG9yIGJyZWFrZG93bi5cbiAqXG4gKiBOb3QgYWxsIHByb3ZpZGVycyB3aWxsIGhhdmUgYWxsIGZhY3RvcnMuIFVuZGVmaW5lZCBmaWVsZHMgbWVhblxuICogXCJub3QgYXNzZXNzZWRcIiAoZGlzdGluY3QgZnJvbSAwLjAsIHdoaWNoIG1lYW5zIFwiYXNzZXNzZWQgYXMgemVyb1wiKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWFsaXR5RmFjdG9ycyB7XG4gIGFjY2VwdGFuY2VDcml0ZXJpYU1ldD86IG51bWJlcjtcbiAgdGVzdHNQYXNzaW5nPzogbnVtYmVyO1xuICBub1JlZ3Jlc3Npb25zPzogbnVtYmVyO1xuICBsaW50Q2xlYW4/OiBudW1iZXI7XG4gIHR5cGVDaGVja0NsZWFuPzogbnVtYmVyO1xuICBmb2xsb3dzUGF0dGVybnM/OiBudW1iZXI7XG4gIGNvbnRleHRSZWxldmFuY2U/OiBudW1iZXI7XG4gIHJlYXNvbmluZ0NvaGVyZW5jZT86IG51bWJlcjtcbiAgZXhlY3V0aW9uRWZmaWNpZW5jeT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBRdWFsaXR5IHdlaWdodCBvdmVycmlkZXMgZnJvbSBhIHByb3ZpZGVyLlxuICpcbiAqIFdlaWdodHMgc2hvdWxkIHN1bSB0byBhcHByb3hpbWF0ZWx5IDEuMC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aWRlclF1YWxpdHlXZWlnaHRzIHtcbiAgdGFza0NvbXBsZXRpb246IG51bWJlcjtcbiAgY29kZVF1YWxpdHk6IG51bWJlcjtcbiAgcHJvY2VzczogbnVtYmVyO1xufVxuXG4vKipcbiAqIEVycm9yIGZyb20gYSBzaW5nbGUgcHJvdmlkZXIgZHVyaW5nIGJhdGNoIGxvYWRpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZXJFcnJvciB7XG4gIHByb3ZpZGVyTmFtZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzdWx0IGZyb20gYSBzaW5nbGUgcHJvdmlkZXIgZHVyaW5nIGdyb3VwZWQgbG9hZGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aWRlclJlc3VsdCB7XG4gIHByb3ZpZGVyTmFtZTogc3RyaW5nO1xuICBzaWduYWxzOiBRdWFsaXR5U2lnbmFsW107XG4gIHdlaWdodHM/OiBQcm92aWRlclF1YWxpdHlXZWlnaHRzO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgZXh0ZXJuYWwgc3lzdGVtcyB0aGF0IHN1cHBseSBxdWFsaXR5IHNpZ25hbHMgdG8gUnV2TExNLlxuICpcbiAqIEltcGxlbWVudCB0aGlzIGludGVyZmFjZSBhbmQgcmVnaXN0ZXIgd2l0aCBJbnRlbGxpZ2VuY2VMb2FkZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZWxsaWdlbmNlUHJvdmlkZXIge1xuICAvKiogSHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBwcm92aWRlciAqL1xuICBuYW1lKCk6IHN0cmluZztcbiAgLyoqIExvYWQgcXVhbGl0eSBzaWduYWxzIGZyb20gdGhpcyBwcm92aWRlcidzIGRhdGEgc291cmNlICovXG4gIGxvYWRTaWduYWxzKCk6IFF1YWxpdHlTaWduYWxbXTtcbiAgLyoqIE9wdGlvbmFsIHF1YWxpdHkgd2VpZ2h0IG92ZXJyaWRlcyAqL1xuICBxdWFsaXR5V2VpZ2h0cz8oKTogUHJvdmlkZXJRdWFsaXR5V2VpZ2h0cyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCdWlsdC1pbiBmaWxlLWJhc2VkIGludGVsbGlnZW5jZSBwcm92aWRlci5cbiAqXG4gKiBSZWFkcyBxdWFsaXR5IHNpZ25hbHMgZnJvbSBhIEpTT04gZmlsZS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBwcm92aWRlclxuICogZm9yIG5vbi1SdXN0IGludGVncmF0aW9ucyB0aGF0IHdyaXRlIHNpZ25hbCBmaWxlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVTaWduYWxQcm92aWRlciBpbXBsZW1lbnRzIEludGVsbGlnZW5jZVByb3ZpZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZpbGVQYXRoID0gZmlsZVBhdGg7XG4gIH1cblxuICBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdmaWxlLXNpZ25hbHMnO1xuICB9XG5cbiAgbG9hZFNpZ25hbHMoKTogUXVhbGl0eVNpZ25hbFtdIHtcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbiAgICAgIGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmZpbGVQYXRoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmModGhpcy5maWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShyYXcpO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhLm1hcCgoaXRlbTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+ICh7XG4gICAgICAgIGlkOiBTdHJpbmcoaXRlbS5pZCA/PyAnJyksXG4gICAgICAgIHRhc2tEZXNjcmlwdGlvbjogU3RyaW5nKGl0ZW0udGFza19kZXNjcmlwdGlvbiA/PyBpdGVtLnRhc2tEZXNjcmlwdGlvbiA/PyAnJyksXG4gICAgICAgIG91dGNvbWU6IFN0cmluZyhpdGVtLm91dGNvbWUgPz8gJ2ZhaWx1cmUnKSBhcyBRdWFsaXR5U2lnbmFsWydvdXRjb21lJ10sXG4gICAgICAgIHF1YWxpdHlTY29yZTogTnVtYmVyKGl0ZW0ucXVhbGl0eV9zY29yZSA/PyBpdGVtLnF1YWxpdHlTY29yZSA/PyAwKSxcbiAgICAgICAgaHVtYW5WZXJkaWN0OiBpdGVtLmh1bWFuX3ZlcmRpY3QgPz8gaXRlbS5odW1hblZlcmRpY3RcbiAgICAgICAgICA/IFN0cmluZyhpdGVtLmh1bWFuX3ZlcmRpY3QgPz8gaXRlbS5odW1hblZlcmRpY3QpIGFzIFF1YWxpdHlTaWduYWxbJ2h1bWFuVmVyZGljdCddXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHF1YWxpdHlGYWN0b3JzOiAoaXRlbS5xdWFsaXR5X2ZhY3RvcnMgfHwgaXRlbS5xdWFsaXR5RmFjdG9ycylcbiAgICAgICAgICA/IG1hcFF1YWxpdHlGYWN0b3JzKChpdGVtLnF1YWxpdHlfZmFjdG9ycyA/PyBpdGVtLnF1YWxpdHlGYWN0b3JzKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgY29tcGxldGVkQXQ6IFN0cmluZyhpdGVtLmNvbXBsZXRlZF9hdCA/PyBpdGVtLmNvbXBsZXRlZEF0ID8/IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSksXG4gICAgICB9KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgcXVhbGl0eVdlaWdodHMoKTogUHJvdmlkZXJRdWFsaXR5V2VpZ2h0cyB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbiAgICAgIGNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG4gICAgICBjb25zdCB3ZWlnaHRzUGF0aCA9IHBhdGguam9pbihwYXRoLmRpcm5hbWUodGhpcy5maWxlUGF0aCksICdxdWFsaXR5LXdlaWdodHMuanNvbicpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHdlaWdodHNQYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJhdyA9IGZzLnJlYWRGaWxlU3luYyh3ZWlnaHRzUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShyYXcpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFza0NvbXBsZXRpb246IE51bWJlcihkYXRhLnRhc2tfY29tcGxldGlvbiA/PyBkYXRhLnRhc2tDb21wbGV0aW9uID8/IDAuNSksXG4gICAgICAgIGNvZGVRdWFsaXR5OiBOdW1iZXIoZGF0YS5jb2RlX3F1YWxpdHkgPz8gZGF0YS5jb2RlUXVhbGl0eSA/PyAwLjMpLFxuICAgICAgICBwcm9jZXNzOiBOdW1iZXIoZGF0YS5wcm9jZXNzID8/IDAuMiksXG4gICAgICB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwUXVhbGl0eUZhY3RvcnMocmF3OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFF1YWxpdHlGYWN0b3JzIHtcbiAgcmV0dXJuIHtcbiAgICBhY2NlcHRhbmNlQ3JpdGVyaWFNZXQ6IHJhdy5hY2NlcHRhbmNlX2NyaXRlcmlhX21ldCBhcyBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgdGVzdHNQYXNzaW5nOiByYXcudGVzdHNfcGFzc2luZyBhcyBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgbm9SZWdyZXNzaW9uczogcmF3Lm5vX3JlZ3Jlc3Npb25zIGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBsaW50Q2xlYW46IHJhdy5saW50X2NsZWFuIGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICB0eXBlQ2hlY2tDbGVhbjogcmF3LnR5cGVfY2hlY2tfY2xlYW4gYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGZvbGxvd3NQYXR0ZXJuczogcmF3LmZvbGxvd3NfcGF0dGVybnMgYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRleHRSZWxldmFuY2U6IHJhdy5jb250ZXh0X3JlbGV2YW5jZSBhcyBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgcmVhc29uaW5nQ29oZXJlbmNlOiByYXcucmVhc29uaW5nX2NvaGVyZW5jZSBhcyBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgZXhlY3V0aW9uRWZmaWNpZW5jeTogcmF3LmV4ZWN1dGlvbl9lZmZpY2llbmN5IGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBBZ2dyZWdhdGVzIHF1YWxpdHkgc2lnbmFscyBmcm9tIG11bHRpcGxlIHJlZ2lzdGVyZWQgcHJvdmlkZXJzLlxuICpcbiAqIElmIG5vIHByb3ZpZGVycyBhcmUgcmVnaXN0ZXJlZCwgbG9hZEFsbFNpZ25hbHMgcmV0dXJucyBlbXB0eSBhcnJheXNcbiAqIHdpdGggemVybyBvdmVyaGVhZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEludGVsbGlnZW5jZUxvYWRlciB7XG4gIHByaXZhdGUgcHJvdmlkZXJzOiBJbnRlbGxpZ2VuY2VQcm92aWRlcltdID0gW107XG5cbiAgLyoqIFJlZ2lzdGVyIGFuIGV4dGVybmFsIGludGVsbGlnZW5jZSBwcm92aWRlciAqL1xuICByZWdpc3RlclByb3ZpZGVyKHByb3ZpZGVyOiBJbnRlbGxpZ2VuY2VQcm92aWRlcik6IHZvaWQge1xuICAgIHRoaXMucHJvdmlkZXJzLnB1c2gocHJvdmlkZXIpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIG51bWJlciBvZiByZWdpc3RlcmVkIHByb3ZpZGVycyAqL1xuICBnZXQgcHJvdmlkZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnByb3ZpZGVycy5sZW5ndGg7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgbmFtZXMgb2YgYWxsIHJlZ2lzdGVyZWQgcHJvdmlkZXJzICovXG4gIGdldCBwcm92aWRlck5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5wcm92aWRlcnMubWFwKHAgPT4gcC5uYW1lKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgc2lnbmFscyBmcm9tIGFsbCByZWdpc3RlcmVkIHByb3ZpZGVycy5cbiAgICpcbiAgICogTm9uLWZhdGFsOiBpZiBhIHByb3ZpZGVyIGZhaWxzLCBpdHMgZXJyb3IgaXMgY2FwdHVyZWQgYnV0XG4gICAqIG90aGVyIHByb3ZpZGVycyBjb250aW51ZSBsb2FkaW5nLlxuICAgKi9cbiAgbG9hZEFsbFNpZ25hbHMoKTogeyBzaWduYWxzOiBRdWFsaXR5U2lnbmFsW107IGVycm9yczogUHJvdmlkZXJFcnJvcltdIH0ge1xuICAgIGNvbnN0IHNpZ25hbHM6IFF1YWxpdHlTaWduYWxbXSA9IFtdO1xuICAgIGNvbnN0IGVycm9yczogUHJvdmlkZXJFcnJvcltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHByb3ZpZGVyIG9mIHRoaXMucHJvdmlkZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcm92aWRlclNpZ25hbHMgPSBwcm92aWRlci5sb2FkU2lnbmFscygpO1xuICAgICAgICBzaWduYWxzLnB1c2goLi4ucHJvdmlkZXJTaWduYWxzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgIHByb3ZpZGVyTmFtZTogcHJvdmlkZXIubmFtZSgpLFxuICAgICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2lnbmFscywgZXJyb3JzIH07XG4gIH1cblxuICAvKiogTG9hZCBzaWduYWxzIGdyb3VwZWQgYnkgcHJvdmlkZXIgd2l0aCB3ZWlnaHQgb3ZlcnJpZGVzICovXG4gIGxvYWRHcm91cGVkKCk6IFByb3ZpZGVyUmVzdWx0W10ge1xuICAgIHJldHVybiB0aGlzLnByb3ZpZGVycy5tYXAocHJvdmlkZXIgPT4ge1xuICAgICAgbGV0IHByb3ZpZGVyU2lnbmFsczogUXVhbGl0eVNpZ25hbFtdID0gW107XG4gICAgICB0cnkge1xuICAgICAgICBwcm92aWRlclNpZ25hbHMgPSBwcm92aWRlci5sb2FkU2lnbmFscygpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIE5vbi1mYXRhbFxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvdmlkZXJOYW1lOiBwcm92aWRlci5uYW1lKCksXG4gICAgICAgIHNpZ25hbHM6IHByb3ZpZGVyU2lnbmFscyxcbiAgICAgICAgd2VpZ2h0czogcHJvdmlkZXIucXVhbGl0eVdlaWdodHM/LigpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuIl19
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWxsaWdlbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludGVsbGlnZW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFFN0Isd0NBQXdDO0FBQ3hDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFOUMseUNBQXlDO0FBQ3pDLE1BQU0sb0JBQW9CLEdBQUcsS0FBTSxDQUFDO0FBRXBDLDJCQUEyQjtBQUMzQixNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBRTFFLGlDQUFpQztBQUNqQyxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBc0Z6RCxTQUFTLGdCQUFnQixDQUFDLEdBQVk7SUFDcEMsSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxJQUFJO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDeEQsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxHQUFZO0lBQ25DLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLElBQUksU0FBUyxDQUFDLENBQUM7SUFDbkMsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFD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IEludGVsbGlnZW5jZSBQcm92aWRlcnMgZm9yIFNPTkEgTGVhcm5pbmcgKEFEUi0wNDMpXG4gKlxuICogVHlwZVNjcmlwdCBiaW5kaW5ncyBmb3IgdGhlIEludGVsbGlnZW5jZVByb3ZpZGVyIHRyYWl0LCBlbmFibGluZ1xuICogZXh0ZXJuYWwgc3lzdGVtcyB0byBmZWVkIHF1YWxpdHkgc2lnbmFscyBpbnRvIFJ1dkxMTSdzIGxlYXJuaW5nIGxvb3BzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBJbnRlbGxpZ2VuY2VMb2FkZXIsIEZpbGVTaWduYWxQcm92aWRlciwgUXVhbGl0eVNpZ25hbCB9IGZyb20gJ0BydXZlY3Rvci9ydXZsbG0nO1xuICpcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBJbnRlbGxpZ2VuY2VMb2FkZXIoKTtcbiAqIGxvYWRlci5yZWdpc3RlclByb3ZpZGVyKG5ldyBGaWxlU2lnbmFsUHJvdmlkZXIoJy4vc2lnbmFscy5qc29uJykpO1xuICpcbiAqIGNvbnN0IHsgc2lnbmFscywgZXJyb3JzIH0gPSBsb2FkZXIubG9hZEFsbFNpZ25hbHMoKTtcbiAqIGNvbnNvbGUubG9nKGBMb2FkZWQgJHtzaWduYWxzLmxlbmd0aH0gc2lnbmFsc2ApO1xuICogYGBgXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuLyoqIE1heGltdW0gc2lnbmFsIGZpbGUgc2l6ZSAoMTAgTWlCKSAqL1xuY29uc3QgTUFYX1NJR05BTF9GSUxFX1NJWkUgPSAxMCAqIDEwMjQgKiAxMDI0O1xuXG4vKiogTWF4aW11bSBudW1iZXIgb2Ygc2lnbmFscyBwZXIgZmlsZSAqL1xuY29uc3QgTUFYX1NJR05BTFNfUEVSX0ZJTEUgPSAxMF8wMDA7XG5cbi8qKiBWYWxpZCBvdXRjb21lIHZhbHVlcyAqL1xuY29uc3QgVkFMSURfT1VUQ09NRVMgPSBuZXcgU2V0KFsnc3VjY2VzcycsICdwYXJ0aWFsX3N1Y2Nlc3MnLCAnZmFpbHVyZSddKTtcblxuLyoqIFZhbGlkIGh1bWFuIHZlcmRpY3QgdmFsdWVzICovXG5jb25zdCBWQUxJRF9WRVJESUNUUyA9IG5ldyBTZXQoWydhcHByb3ZlZCcsICdyZWplY3RlZCddKTtcblxuLyoqXG4gKiBBIHF1YWxpdHkgc2lnbmFsIGZyb20gYW4gZXh0ZXJuYWwgc3lzdGVtLlxuICpcbiAqIFJlcHJlc2VudHMgb25lIGNvbXBsZXRlZCB0YXNrIHdpdGggcXVhbGl0eSBhc3Nlc3NtZW50IGRhdGFcbiAqIHRoYXQgY2FuIGZlZWQgaW50byBTT05BIHRyYWplY3RvcmllcywgdGhlIGVtYmVkZGluZyBjbGFzc2lmaWVyLFxuICogYW5kIG1vZGVsIHJvdXRlciBjYWxpYnJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWFsaXR5U2lnbmFsIHtcbiAgLyoqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHNpZ25hbCAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgdGFzayBkZXNjcmlwdGlvbiAodXNlZCBmb3IgZW1iZWRkaW5nIGdlbmVyYXRpb24pICovXG4gIHRhc2tEZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKiogRXhlY3V0aW9uIG91dGNvbWUgKi9cbiAgb3V0Y29tZTogJ3N1Y2Nlc3MnIHwgJ3BhcnRpYWxfc3VjY2VzcycgfCAnZmFpbHVyZSc7XG4gIC8qKiBDb21wb3NpdGUgcXVhbGl0eSBzY29yZSAoMC4wIC0gMS4wKSAqL1xuICBxdWFsaXR5U2NvcmU6IG51bWJlcjtcbiAgLyoqIE9wdGlvbmFsIGh1bWFuIHZlcmRpY3QgKi9cbiAgaHVtYW5WZXJkaWN0PzogJ2FwcHJvdmVkJyB8ICdyZWplY3RlZCc7XG4gIC8qKiBPcHRpb25hbCBzdHJ1Y3R1cmVkIHF1YWxpdHkgZmFjdG9ycyBmb3IgZGV0YWlsZWQgYW5hbHlzaXMgKi9cbiAgcXVhbGl0eUZhY3RvcnM/OiBRdWFsaXR5RmFjdG9ycztcbiAgLyoqIElTTyA4NjAxIHRpbWVzdGFtcCBvZiB0YXNrIGNvbXBsZXRpb24gKi9cbiAgY29tcGxldGVkQXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBHcmFudWxhciBxdWFsaXR5IGZhY3RvciBicmVha2Rvd24uXG4gKlxuICogTm90IGFsbCBwcm92aWRlcnMgd2lsbCBoYXZlIGFsbCBmYWN0b3JzLiBVbmRlZmluZWQgZmllbGRzIG1lYW5cbiAqIFwibm90IGFzc2Vzc2VkXCIgKGRpc3RpbmN0IGZyb20gMC4wLCB3aGljaCBtZWFucyBcImFzc2Vzc2VkIGFzIHplcm9cIikuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVhbGl0eUZhY3RvcnMge1xuICBhY2NlcHRhbmNlQ3JpdGVyaWFNZXQ/OiBudW1iZXI7XG4gIHRlc3RzUGFzc2luZz86IG51bWJlcjtcbiAgbm9SZWdyZXNzaW9ucz86IG51bWJlcjtcbiAgbGludENsZWFuPzogbnVtYmVyO1xuICB0eXBlQ2hlY2tDbGVhbj86IG51bWJlcjtcbiAgZm9sbG93c1BhdHRlcm5zPzogbnVtYmVyO1xuICBjb250ZXh0UmVsZXZhbmNlPzogbnVtYmVyO1xuICByZWFzb25pbmdDb2hlcmVuY2U/OiBudW1iZXI7XG4gIGV4ZWN1dGlvbkVmZmljaWVuY3k/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUXVhbGl0eSB3ZWlnaHQgb3ZlcnJpZGVzIGZyb20gYSBwcm92aWRlci5cbiAqXG4gKiBXZWlnaHRzIHNob3VsZCBzdW0gdG8gYXBwcm94aW1hdGVseSAxLjAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZXJRdWFsaXR5V2VpZ2h0cyB7XG4gIHRhc2tDb21wbGV0aW9uOiBudW1iZXI7XG4gIGNvZGVRdWFsaXR5OiBudW1iZXI7XG4gIHByb2Nlc3M6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBFcnJvciBmcm9tIGEgc2luZ2xlIHByb3ZpZGVyIGR1cmluZyBiYXRjaCBsb2FkaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3ZpZGVyRXJyb3Ige1xuICBwcm92aWRlck5hbWU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc3VsdCBmcm9tIGEgc2luZ2xlIHByb3ZpZGVyIGR1cmluZyBncm91cGVkIGxvYWRpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZXJSZXN1bHQge1xuICBwcm92aWRlck5hbWU6IHN0cmluZztcbiAgc2lnbmFsczogUXVhbGl0eVNpZ25hbFtdO1xuICB3ZWlnaHRzPzogUHJvdmlkZXJRdWFsaXR5V2VpZ2h0cztcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGV4dGVybmFsIHN5c3RlbXMgdGhhdCBzdXBwbHkgcXVhbGl0eSBzaWduYWxzIHRvIFJ1dkxMTS5cbiAqXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgYW5kIHJlZ2lzdGVyIHdpdGggSW50ZWxsaWdlbmNlTG9hZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVsbGlnZW5jZVByb3ZpZGVyIHtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgcHJvdmlkZXIgKi9cbiAgbmFtZSgpOiBzdHJpbmc7XG4gIC8qKiBMb2FkIHF1YWxpdHkgc2lnbmFscyBmcm9tIHRoaXMgcHJvdmlkZXIncyBkYXRhIHNvdXJjZSAqL1xuICBsb2FkU2lnbmFscygpOiBRdWFsaXR5U2lnbmFsW107XG4gIC8qKiBPcHRpb25hbCBxdWFsaXR5IHdlaWdodCBvdmVycmlkZXMgKi9cbiAgcXVhbGl0eVdlaWdodHM/KCk6IFByb3ZpZGVyUXVhbGl0eVdlaWdodHMgfCB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFzT3B0aW9uYWxOdW1iZXIodmFsOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbiA9IE51bWJlcih2YWwpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG4pICYmIG4gPj0gMCAmJiBuIDw9IDEgPyBuIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU91dGNvbWUodmFsOiB1bmtub3duKTogUXVhbGl0eVNpZ25hbFsnb3V0Y29tZSddIHtcbiAgY29uc3QgcyA9IFN0cmluZyh2YWwgPz8gJ2ZhaWx1cmUnKTtcbiAgcmV0dXJuIFZBTElEX09VVENPTUVTLmhhcyhzKSA/IHMgYXMgUXVhbGl0eVNpZ25hbFsnb3V0Y29tZSddIDogJ2ZhaWx1cmUnO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVZlcmRpY3QodmFsOiB1bmtub3duKTogUXVhbGl0eVNpZ25hbFsnaHVtYW5WZXJkaWN0J10gfCB1bmRlZmluZWQge1xuICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBzID0gU3RyaW5nKHZhbCk7XG4gIHJldHVybiBWQUxJRF9WRVJESUNUUy5oYXMocykgPyBzIGFzIFF1YWxpdHlTaWduYWxbJ2h1bWFuVmVyZGljdCddIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNjb3JlKHZhbDogdW5rbm93bik6IG51bWJlciB7XG4gIGNvbnN0IG4gPSBOdW1iZXIodmFsID8/IDApO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSB8fCBuIDwgMCB8fCBuID4gMSkgcmV0dXJuIDA7XG4gIHJldHVybiBuO1xufVxuXG5mdW5jdGlvbiBtYXBRdWFsaXR5RmFjdG9ycyhyYXc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUXVhbGl0eUZhY3RvcnMge1xuICByZXR1cm4ge1xuICAgIGFjY2VwdGFuY2VDcml0ZXJpYU1ldDogYXNPcHRpb25hbE51bWJlcihyYXcuYWNjZXB0YW5jZV9jcml0ZXJpYV9tZXQpLFxuICAgIHRlc3RzUGFzc2luZzogYXNPcHRpb25hbE51bWJlcihyYXcudGVzdHNfcGFzc2luZyksXG4gICAgbm9SZWdyZXNzaW9uczogYXNPcHRpb25hbE51bWJlcihyYXcubm9fcmVncmVzc2lvbnMpLFxuICAgIGxpbnRDbGVhbjogYXNPcHRpb25hbE51bWJlcihyYXcubGludF9jbGVhbiksXG4gICAgdHlwZUNoZWNrQ2xlYW46IGFzT3B0aW9uYWxOdW1iZXIocmF3LnR5cGVfY2hlY2tfY2xlYW4pLFxuICAgIGZvbGxvd3NQYXR0ZXJuczogYXNPcHRpb25hbE51bWJlcihyYXcuZm9sbG93c19wYXR0ZXJucyksXG4gICAgY29udGV4dFJlbGV2YW5jZTogYXNPcHRpb25hbE51bWJlcihyYXcuY29udGV4dF9yZWxldmFuY2UpLFxuICAgIHJlYXNvbmluZ0NvaGVyZW5jZTogYXNPcHRpb25hbE51bWJlcihyYXcucmVhc29uaW5nX2NvaGVyZW5jZSksXG4gICAgZXhlY3V0aW9uRWZmaWNpZW5jeTogYXNPcHRpb25hbE51bWJlcihyYXcuZXhlY3V0aW9uX2VmZmljaWVuY3kpLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWx0LWluIGZpbGUtYmFzZWQgaW50ZWxsaWdlbmNlIHByb3ZpZGVyLlxuICpcbiAqIFJlYWRzIHF1YWxpdHkgc2lnbmFscyBmcm9tIGEgSlNPTiBmaWxlLiBUaGlzIGlzIHRoZSBkZWZhdWx0IHByb3ZpZGVyXG4gKiBmb3Igbm9uLVJ1c3QgaW50ZWdyYXRpb25zIHRoYXQgd3JpdGUgc2lnbmFsIGZpbGVzLlxuICovXG5leHBvcnQgY2xhc3MgRmlsZVNpZ25hbFByb3ZpZGVyIGltcGxlbWVudHMgSW50ZWxsaWdlbmNlUHJvdmlkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHRoaXMuZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpO1xuICB9XG5cbiAgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnZmlsZS1zaWduYWxzJztcbiAgfVxuXG4gIGxvYWRTaWduYWxzKCk6IFF1YWxpdHlTaWduYWxbXSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuZmlsZVBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZmlsZSBzaXplIGJlZm9yZSByZWFkaW5nIChwcmV2ZW50IE9PTSlcbiAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmModGhpcy5maWxlUGF0aCk7XG4gICAgaWYgKHN0YXQuc2l6ZSA+IE1BWF9TSUdOQUxfRklMRV9TSVpFKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTaWduYWwgZmlsZSBleGNlZWRzIG1heCBzaXplICgke3N0YXQuc2l6ZX0gYnl0ZXMsIGxpbWl0ICR7TUFYX1NJR05BTF9GSUxFX1NJWkV9KWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuZmlsZVBhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IGRhdGE6IHVua25vd24gPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgc2lnbmFsIGNvdW50XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gTUFYX1NJR05BTFNfUEVSX0ZJTEUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFNpZ25hbCBmaWxlIGNvbnRhaW5zICR7ZGF0YS5sZW5ndGh9IHNpZ25hbHMsIG1heCBpcyAke01BWF9TSUdOQUxTX1BFUl9GSUxFfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGEubWFwKChpdGVtOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgY29uc3QgcWZSYXcgPSAoaXRlbS5xdWFsaXR5X2ZhY3RvcnMgPz8gaXRlbS5xdWFsaXR5RmFjdG9ycykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogU3RyaW5nKGl0ZW0uaWQgPz8gJycpLFxuICAgICAgICB0YXNrRGVzY3JpcHRpb246IFN0cmluZyhpdGVtLnRhc2tfZGVzY3JpcHRpb24gPz8gaXRlbS50YXNrRGVzY3JpcHRpb24gPz8gJycpLFxuICAgICAgICBvdXRjb21lOiB2YWxpZGF0ZU91dGNvbWUoaXRlbS5vdXRjb21lKSxcbiAgICAgICAgcXVhbGl0eVNjb3JlOiB2YWxpZGF0ZVNjb3JlKGl0ZW0ucXVhbGl0eV9zY29yZSA/PyBpdGVtLnF1YWxpdHlTY29yZSksXG4gICAgICAgIGh1bWFuVmVyZGljdDogdmFsaWRhdGVWZXJkaWN0KGl0ZW0uaHVtYW5fdmVyZGljdCA/PyBpdGVtLmh1bWFuVmVyZGljdCksXG4gICAgICAgIHF1YWxpdHlGYWN0b3JzOiBxZlJhdyA/IG1hcFF1YWxpdHlGYWN0b3JzKHFmUmF3KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgY29tcGxldGVkQXQ6IFN0cmluZyhpdGVtLmNvbXBsZXRlZF9hdCA/PyBpdGVtLmNvbXBsZXRlZEF0ID8/IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcXVhbGl0eVdlaWdodHMoKTogUHJvdmlkZXJRdWFsaXR5V2VpZ2h0cyB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdlaWdodHNQYXRoID0gcGF0aC5qb2luKHBhdGguZGlybmFtZSh0aGlzLmZpbGVQYXRoKSwgJ3F1YWxpdHktd2VpZ2h0cy5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMod2VpZ2h0c1BhdGgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKHdlaWdodHNQYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJhdykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXNrQ29tcGxldGlvbjogTnVtYmVyKGRhdGEudGFza19jb21wbGV0aW9uID8/IGRhdGEudGFza0NvbXBsZXRpb24gPz8gMC41KSxcbiAgICAgICAgY29kZVF1YWxpdHk6IE51bWJlcihkYXRhLmNvZGVfcXVhbGl0eSA/PyBkYXRhLmNvZGVRdWFsaXR5ID8/IDAuMyksXG4gICAgICAgIHByb2Nlc3M6IE51bWJlcihkYXRhLnByb2Nlc3MgPz8gMC4yKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFnZ3JlZ2F0ZXMgcXVhbGl0eSBzaWduYWxzIGZyb20gbXVsdGlwbGUgcmVnaXN0ZXJlZCBwcm92aWRlcnMuXG4gKlxuICogSWYgbm8gcHJvdmlkZXJzIGFyZSByZWdpc3RlcmVkLCBsb2FkQWxsU2lnbmFscyByZXR1cm5zIGVtcHR5IGFycmF5c1xuICogd2l0aCB6ZXJvIG92ZXJoZWFkLlxuICovXG5leHBvcnQgY2xhc3MgSW50ZWxsaWdlbmNlTG9hZGVyIHtcbiAgcHJpdmF0ZSBwcm92aWRlcnM6IEludGVsbGlnZW5jZVByb3ZpZGVyW10gPSBbXTtcblxuICAvKiogUmVnaXN0ZXIgYW4gZXh0ZXJuYWwgaW50ZWxsaWdlbmNlIHByb3ZpZGVyICovXG4gIHJlZ2lzdGVyUHJvdmlkZXIocHJvdmlkZXI6IEludGVsbGlnZW5jZVByb3ZpZGVyKTogdm9pZCB7XG4gICAgdGhpcy5wcm92aWRlcnMucHVzaChwcm92aWRlcik7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgcHJvdmlkZXJzICovXG4gIGdldCBwcm92aWRlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucHJvdmlkZXJzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCBwcm92aWRlcnMgKi9cbiAgZ2V0IHByb3ZpZGVyTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnByb3ZpZGVycy5tYXAocCA9PiBwLm5hbWUoKSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBzaWduYWxzIGZyb20gYWxsIHJlZ2lzdGVyZWQgcHJvdmlkZXJzLlxuICAgKlxuICAgKiBOb24tZmF0YWw6IGlmIGEgcHJvdmlkZXIgZmFpbHMsIGl0cyBlcnJvciBpcyBjYXB0dXJlZCBidXRcbiAgICogb3RoZXIgcHJvdmlkZXJzIGNvbnRpbnVlIGxvYWRpbmcuXG4gICAqL1xuICBsb2FkQWxsU2lnbmFscygpOiB7IHNpZ25hbHM6IFF1YWxpdHlTaWduYWxbXTsgZXJyb3JzOiBQcm92aWRlckVycm9yW10gfSB7XG4gICAgY29uc3Qgc2lnbmFsczogUXVhbGl0eVNpZ25hbFtdID0gW107XG4gICAgY29uc3QgZXJyb3JzOiBQcm92aWRlckVycm9yW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcHJvdmlkZXIgb2YgdGhpcy5wcm92aWRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyU2lnbmFscyA9IHByb3ZpZGVyLmxvYWRTaWduYWxzKCk7XG4gICAgICAgIHNpZ25hbHMucHVzaCguLi5wcm92aWRlclNpZ25hbHMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgcHJvdmlkZXJOYW1lOiBwcm92aWRlci5uYW1lKCksXG4gICAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzaWduYWxzLCBlcnJvcnMgfTtcbiAgfVxuXG4gIC8qKiBMb2FkIHNpZ25hbHMgZ3JvdXBlZCBieSBwcm92aWRlciB3aXRoIHdlaWdodCBvdmVycmlkZXMgKi9cbiAgbG9hZEdyb3VwZWQoKTogUHJvdmlkZXJSZXN1bHRbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvdmlkZXJzLm1hcChwcm92aWRlciA9PiB7XG4gICAgICBsZXQgcHJvdmlkZXJTaWduYWxzOiBRdWFsaXR5U2lnbmFsW10gPSBbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHByb3ZpZGVyU2lnbmFscyA9IHByb3ZpZGVyLmxvYWRTaWduYWxzKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTm9uLWZhdGFsXG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm92aWRlck5hbWU6IHByb3ZpZGVyLm5hbWUoKSxcbiAgICAgICAgc2lnbmFsczogcHJvdmlkZXJTaWduYWxzLFxuICAgICAgICB3ZWlnaHRzOiBwcm92aWRlci5xdWFsaXR5V2VpZ2h0cz8uKCksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"intelligence.d.ts","sourceRoot":"","sources":["../../src/intelligence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,wBAAwB;IACxB,OAAO,EAAE,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAAC;IACnD,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACvC,gEAAgE;IAChE,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,sBAAsB,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,4CAA4C;IAC5C,IAAI,IAAI,MAAM,CAAC;IACf,4DAA4D;IAC5D,WAAW,IAAI,aAAa,EAAE,CAAC;IAC/B,wCAAwC;IACxC,cAAc,CAAC,IAAI,sBAAsB,GAAG,SAAS,CAAC;CACvD;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,YAAW,oBAAoB;IAC7D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,QAAQ,EAAE,MAAM;IAI5B,IAAI,IAAI,MAAM;IAId,WAAW,IAAI,aAAa,EAAE;IA8B9B,cAAc,IAAI,sBAAsB,GAAG,SAAS;CAiBrD;AAgBD;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,SAAS,CAA8B;IAE/C,iDAAiD;IACjD,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAItD,iDAAiD;IACjD,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,oDAAoD;IACpD,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED;;;;;OAKG;IACH,cAAc,IAAI;QAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QAAC,MAAM,EAAE,aAAa,EAAE,CAAA;KAAE;IAmBvE,6DAA6D;IAC7D,WAAW,IAAI,cAAc,EAAE;CAehC"}
1
+ {"version":3,"file":"intelligence.d.ts","sourceRoot":"","sources":["../../src/intelligence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAiBH;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,wBAAwB;IACxB,OAAO,EAAE,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAAC;IACnD,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACvC,gEAAgE;IAChE,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,sBAAsB,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,4CAA4C;IAC5C,IAAI,IAAI,MAAM,CAAC;IACf,4DAA4D;IAC5D,WAAW,IAAI,aAAa,EAAE,CAAC;IAC/B,wCAAwC;IACxC,cAAc,CAAC,IAAI,sBAAsB,GAAG,SAAS,CAAC;CACvD;AAuCD;;;;;GAKG;AACH,qBAAa,kBAAmB,YAAW,oBAAoB;IAC7D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,QAAQ,EAAE,MAAM;IAI5B,IAAI,IAAI,MAAM;IAId,WAAW,IAAI,aAAa,EAAE;IAwC9B,cAAc,IAAI,sBAAsB,GAAG,SAAS;CAerD;AAED;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,SAAS,CAA8B;IAE/C,iDAAiD;IACjD,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAItD,iDAAiD;IACjD,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,oDAAoD;IACpD,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED;;;;;OAKG;IACH,cAAc,IAAI;QAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QAAC,MAAM,EAAE,aAAa,EAAE,CAAA;KAAE;IAmBvE,6DAA6D;IAC7D,WAAW,IAAI,cAAc,EAAE;CAehC"}
@@ -15,6 +15,51 @@
15
15
  * console.log(`Loaded ${signals.length} signals`);
16
16
  * ```
17
17
  */
18
+ import * as fs from 'fs';
19
+ import * as path from 'path';
20
+ /** Maximum signal file size (10 MiB) */
21
+ const MAX_SIGNAL_FILE_SIZE = 10 * 1024 * 1024;
22
+ /** Maximum number of signals per file */
23
+ const MAX_SIGNALS_PER_FILE = 10000;
24
+ /** Valid outcome values */
25
+ const VALID_OUTCOMES = new Set(['success', 'partial_success', 'failure']);
26
+ /** Valid human verdict values */
27
+ const VALID_VERDICTS = new Set(['approved', 'rejected']);
28
+ function asOptionalNumber(val) {
29
+ if (val === undefined || val === null)
30
+ return undefined;
31
+ const n = Number(val);
32
+ return Number.isFinite(n) && n >= 0 && n <= 1 ? n : undefined;
33
+ }
34
+ function validateOutcome(val) {
35
+ const s = String(val ?? 'failure');
36
+ return VALID_OUTCOMES.has(s) ? s : 'failure';
37
+ }
38
+ function validateVerdict(val) {
39
+ if (val === undefined || val === null)
40
+ return undefined;
41
+ const s = String(val);
42
+ return VALID_VERDICTS.has(s) ? s : undefined;
43
+ }
44
+ function validateScore(val) {
45
+ const n = Number(val ?? 0);
46
+ if (!Number.isFinite(n) || n < 0 || n > 1)
47
+ return 0;
48
+ return n;
49
+ }
50
+ function mapQualityFactors(raw) {
51
+ return {
52
+ acceptanceCriteriaMet: asOptionalNumber(raw.acceptance_criteria_met),
53
+ testsPassing: asOptionalNumber(raw.tests_passing),
54
+ noRegressions: asOptionalNumber(raw.no_regressions),
55
+ lintClean: asOptionalNumber(raw.lint_clean),
56
+ typeCheckClean: asOptionalNumber(raw.type_check_clean),
57
+ followsPatterns: asOptionalNumber(raw.follows_patterns),
58
+ contextRelevance: asOptionalNumber(raw.context_relevance),
59
+ reasoningCoherence: asOptionalNumber(raw.reasoning_coherence),
60
+ executionEfficiency: asOptionalNumber(raw.execution_efficiency),
61
+ };
62
+ }
18
63
  /**
19
64
  * Built-in file-based intelligence provider.
20
65
  *
@@ -23,45 +68,44 @@
23
68
  */
24
69
  export class FileSignalProvider {
25
70
  constructor(filePath) {
26
- this.filePath = filePath;
71
+ this.filePath = path.resolve(filePath);
27
72
  }
28
73
  name() {
29
74
  return 'file-signals';
30
75
  }
31
76
  loadSignals() {
32
- try {
33
- // eslint-disable-next-line @typescript-eslint/no-var-requires
34
- const fs = require('fs');
35
- if (!fs.existsSync(this.filePath)) {
36
- return [];
37
- }
38
- const raw = fs.readFileSync(this.filePath, 'utf-8');
39
- const data = JSON.parse(raw);
40
- if (!Array.isArray(data)) {
41
- return [];
42
- }
43
- return data.map((item) => ({
44
- id: String(item.id ?? ''),
45
- taskDescription: String(item.task_description ?? item.taskDescription ?? ''),
46
- outcome: String(item.outcome ?? 'failure'),
47
- qualityScore: Number(item.quality_score ?? item.qualityScore ?? 0),
48
- humanVerdict: item.human_verdict ?? item.humanVerdict
49
- ? String(item.human_verdict ?? item.humanVerdict)
50
- : undefined,
51
- qualityFactors: (item.quality_factors || item.qualityFactors)
52
- ? mapQualityFactors((item.quality_factors ?? item.qualityFactors))
53
- : undefined,
54
- completedAt: String(item.completed_at ?? item.completedAt ?? new Date().toISOString()),
55
- }));
77
+ if (!fs.existsSync(this.filePath)) {
78
+ return [];
56
79
  }
57
- catch {
80
+ // Check file size before reading (prevent OOM)
81
+ const stat = fs.statSync(this.filePath);
82
+ if (stat.size > MAX_SIGNAL_FILE_SIZE) {
83
+ throw new Error(`Signal file exceeds max size (${stat.size} bytes, limit ${MAX_SIGNAL_FILE_SIZE})`);
84
+ }
85
+ const raw = fs.readFileSync(this.filePath, 'utf-8');
86
+ const data = JSON.parse(raw);
87
+ if (!Array.isArray(data)) {
58
88
  return [];
59
89
  }
90
+ // Check signal count
91
+ if (data.length > MAX_SIGNALS_PER_FILE) {
92
+ throw new Error(`Signal file contains ${data.length} signals, max is ${MAX_SIGNALS_PER_FILE}`);
93
+ }
94
+ return data.map((item) => {
95
+ const qfRaw = (item.quality_factors ?? item.qualityFactors);
96
+ return {
97
+ id: String(item.id ?? ''),
98
+ taskDescription: String(item.task_description ?? item.taskDescription ?? ''),
99
+ outcome: validateOutcome(item.outcome),
100
+ qualityScore: validateScore(item.quality_score ?? item.qualityScore),
101
+ humanVerdict: validateVerdict(item.human_verdict ?? item.humanVerdict),
102
+ qualityFactors: qfRaw ? mapQualityFactors(qfRaw) : undefined,
103
+ completedAt: String(item.completed_at ?? item.completedAt ?? new Date().toISOString()),
104
+ };
105
+ });
60
106
  }
61
107
  qualityWeights() {
62
108
  try {
63
- const fs = require('fs');
64
- const path = require('path');
65
109
  const weightsPath = path.join(path.dirname(this.filePath), 'quality-weights.json');
66
110
  if (!fs.existsSync(weightsPath))
67
111
  return undefined;
@@ -78,19 +122,6 @@ export class FileSignalProvider {
78
122
  }
79
123
  }
80
124
  }
81
- function mapQualityFactors(raw) {
82
- return {
83
- acceptanceCriteriaMet: raw.acceptance_criteria_met,
84
- testsPassing: raw.tests_passing,
85
- noRegressions: raw.no_regressions,
86
- lintClean: raw.lint_clean,
87
- typeCheckClean: raw.type_check_clean,
88
- followsPatterns: raw.follows_patterns,
89
- contextRelevance: raw.context_relevance,
90
- reasoningCoherence: raw.reasoning_coherence,
91
- executionEfficiency: raw.execution_efficiency,
92
- };
93
- }
94
125
  /**
95
126
  * Aggregates quality signals from multiple registered providers.
96
127
  *
@@ -154,4 +185,4 @@ export class IntelligenceLoader {
154
185
  });
155
186
  }
156
187
  }
157
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWxsaWdlbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludGVsbGlnZW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQXNGSDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFHN0IsWUFBWSxRQUFnQjtRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSTtRQUNGLE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDO1lBQ0gsOERBQThEO1lBQzlELE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1lBQ0QsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDekIsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBNkIsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbEQsRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDekIsZUFBZSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUM7Z0JBQzVFLE9BQU8sRUFBRSxN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QUUsQ0FBQztZQUMxQyxJQUFJLENBQUM7Z0JBQ0gsZUFBZSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMzQyxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLFlBQVk7WUFDZCxDQUFDO1lBQ0QsT0FBTztnQkFDTCxZQUFZLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRTtnQkFDN0IsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLE9BQU8sRUFBRSxRQUFRLENBQUMsY0FBYyxFQUFFLEVBQUU7YUFDckMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFeHRlcm5hbCBJbnRlbGxpZ2VuY2UgUHJvdmlkZXJzIGZvciBTT05BIExlYXJuaW5nIChBRFItMDQzKVxuICpcbiAqIFR5cGVTY3JpcHQgYmluZGluZ3MgZm9yIHRoZSBJbnRlbGxpZ2VuY2VQcm92aWRlciB0cmFpdCwgZW5hYmxpbmdcbiAqIGV4dGVybmFsIHN5c3RlbXMgdG8gZmVlZCBxdWFsaXR5IHNpZ25hbHMgaW50byBSdXZMTE0ncyBsZWFybmluZyBsb29wcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgSW50ZWxsaWdlbmNlTG9hZGVyLCBGaWxlU2lnbmFsUHJvdmlkZXIsIFF1YWxpdHlTaWduYWwgfSBmcm9tICdAcnV2ZWN0b3IvcnV2bGxtJztcbiAqXG4gKiBjb25zdCBsb2FkZXIgPSBuZXcgSW50ZWxsaWdlbmNlTG9hZGVyKCk7XG4gKiBsb2FkZXIucmVnaXN0ZXJQcm92aWRlcihuZXcgRmlsZVNpZ25hbFByb3ZpZGVyKCcuL3NpZ25hbHMuanNvbicpKTtcbiAqXG4gKiBjb25zdCB7IHNpZ25hbHMsIGVycm9ycyB9ID0gbG9hZGVyLmxvYWRBbGxTaWduYWxzKCk7XG4gKiBjb25zb2xlLmxvZyhgTG9hZGVkICR7c2lnbmFscy5sZW5ndGh9IHNpZ25hbHNgKTtcbiAqIGBgYFxuICovXG5cbi8qKlxuICogQSBxdWFsaXR5IHNpZ25hbCBmcm9tIGFuIGV4dGVybmFsIHN5c3RlbS5cbiAqXG4gKiBSZXByZXNlbnRzIG9uZSBjb21wbGV0ZWQgdGFzayB3aXRoIHF1YWxpdHkgYXNzZXNzbWVudCBkYXRhXG4gKiB0aGF0IGNhbiBmZWVkIGludG8gU09OQSB0cmFqZWN0b3JpZXMsIHRoZSBlbWJlZGRpbmcgY2xhc3NpZmllcixcbiAqIGFuZCBtb2RlbCByb3V0ZXIgY2FsaWJyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVhbGl0eVNpZ25hbCB7XG4gIC8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBzaWduYWwgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHRhc2sgZGVzY3JpcHRpb24gKHVzZWQgZm9yIGVtYmVkZGluZyBnZW5lcmF0aW9uKSAqL1xuICB0YXNrRGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqIEV4ZWN1dGlvbiBvdXRjb21lICovXG4gIG91dGNvbWU6ICdzdWNjZXNzJyB8ICdwYXJ0aWFsX3N1Y2Nlc3MnIHwgJ2ZhaWx1cmUnO1xuICAvKiogQ29tcG9zaXRlIHF1YWxpdHkgc2NvcmUgKDAuMCAtIDEuMCkgKi9cbiAgcXVhbGl0eVNjb3JlOiBudW1iZXI7XG4gIC8qKiBPcHRpb25hbCBodW1hbiB2ZXJkaWN0ICovXG4gIGh1bWFuVmVyZGljdD86ICdhcHByb3ZlZCcgfCAncmVqZWN0ZWQnO1xuICAvKiogT3B0aW9uYWwgc3RydWN0dXJlZCBxdWFsaXR5IGZhY3RvcnMgZm9yIGRldGFpbGVkIGFuYWx5c2lzICovXG4gIHF1YWxpdHlGYWN0b3JzPzogUXVhbGl0eUZhY3RvcnM7XG4gIC8qKiBJU08gODYwMSB0aW1lc3RhbXAgb2YgdGFzayBjb21wbGV0aW9uICovXG4gIGNvbXBsZXRlZEF0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogR3JhbnVsYXIgcXVhbGl0eSBmYWN0b3IgYnJlYWtkb3duLlxuICpcbiAqIE5vdCBhbGwgcHJvdmlkZXJzIHdpbGwgaGF2ZSBhbGwgZmFjdG9ycy4gVW5kZWZpbmVkIGZpZWxkcyBtZWFuXG4gKiBcIm5vdCBhc3Nlc3NlZFwiIChkaXN0aW5jdCBmcm9tIDAuMCwgd2hpY2ggbWVhbnMgXCJhc3Nlc3NlZCBhcyB6ZXJvXCIpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1YWxpdHlGYWN0b3JzIHtcbiAgYWNjZXB0YW5jZUNyaXRlcmlhTWV0PzogbnVtYmVyO1xuICB0ZXN0c1Bhc3Npbmc/OiBudW1iZXI7XG4gIG5vUmVncmVzc2lvbnM/OiBudW1iZXI7XG4gIGxpbnRDbGVhbj86IG51bWJlcjtcbiAgdHlwZUNoZWNrQ2xlYW4/OiBudW1iZXI7XG4gIGZvbGxvd3NQYXR0ZXJucz86IG51bWJlcjtcbiAgY29udGV4dFJlbGV2YW5jZT86IG51bWJlcjtcbiAgcmVhc29uaW5nQ29oZXJlbmNlPzogbnVtYmVyO1xuICBleGVjdXRpb25FZmZpY2llbmN5PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFF1YWxpdHkgd2VpZ2h0IG92ZXJyaWRlcyBmcm9tIGEgcHJvdmlkZXIuXG4gKlxuICogV2VpZ2h0cyBzaG91bGQgc3VtIHRvIGFwcHJveGltYXRlbHkgMS4wLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3ZpZGVyUXVhbGl0eVdlaWdodHMge1xuICB0YXNrQ29tcGxldGlvbjogbnVtYmVyO1xuICBjb2RlUXVhbGl0eTogbnVtYmVyO1xuICBwcm9jZXNzOiBudW1iZXI7XG59XG5cbi8qKlxuICogRXJyb3IgZnJvbSBhIHNpbmdsZSBwcm92aWRlciBkdXJpbmcgYmF0Y2ggbG9hZGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aWRlckVycm9yIHtcbiAgcHJvdmlkZXJOYW1lOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXN1bHQgZnJvbSBhIHNpbmdsZSBwcm92aWRlciBkdXJpbmcgZ3JvdXBlZCBsb2FkaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3ZpZGVyUmVzdWx0IHtcbiAgcHJvdmlkZXJOYW1lOiBzdHJpbmc7XG4gIHNpZ25hbHM6IFF1YWxpdHlTaWduYWxbXTtcbiAgd2VpZ2h0cz86IFByb3ZpZGVyUXVhbGl0eVdlaWdodHM7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBleHRlcm5hbCBzeXN0ZW1zIHRoYXQgc3VwcGx5IHF1YWxpdHkgc2lnbmFscyB0byBSdXZMTE0uXG4gKlxuICogSW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGFuZCByZWdpc3RlciB3aXRoIEludGVsbGlnZW5jZUxvYWRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlbGxpZ2VuY2VQcm92aWRlciB7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBuYW1lIGZvciB0aGlzIHByb3ZpZGVyICovXG4gIG5hbWUoKTogc3RyaW5nO1xuICAvKiogTG9hZCBxdWFsaXR5IHNpZ25hbHMgZnJvbSB0aGlzIHByb3ZpZGVyJ3MgZGF0YSBzb3VyY2UgKi9cbiAgbG9hZFNpZ25hbHMoKTogUXVhbGl0eVNpZ25hbFtdO1xuICAvKiogT3B0aW9uYWwgcXVhbGl0eSB3ZWlnaHQgb3ZlcnJpZGVzICovXG4gIHF1YWxpdHlXZWlnaHRzPygpOiBQcm92aWRlclF1YWxpdHlXZWlnaHRzIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEJ1aWx0LWluIGZpbGUtYmFzZWQgaW50ZWxsaWdlbmNlIHByb3ZpZGVyLlxuICpcbiAqIFJlYWRzIHF1YWxpdHkgc2lnbmFscyBmcm9tIGEgSlNPTiBmaWxlLiBUaGlzIGlzIHRoZSBkZWZhdWx0IHByb3ZpZGVyXG4gKiBmb3Igbm9uLVJ1c3QgaW50ZWdyYXRpb25zIHRoYXQgd3JpdGUgc2lnbmFsIGZpbGVzLlxuICovXG5leHBvcnQgY2xhc3MgRmlsZVNpZ25hbFByb3ZpZGVyIGltcGxlbWVudHMgSW50ZWxsaWdlbmNlUHJvdmlkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHRoaXMuZmlsZVBhdGggPSBmaWxlUGF0aDtcbiAgfVxuXG4gIG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2ZpbGUtc2lnbmFscyc7XG4gIH1cblxuICBsb2FkU2lnbmFscygpOiBRdWFsaXR5U2lnbmFsW10ge1xuICAgIHRyeSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICAgICAgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuZmlsZVBhdGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJhdyA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGEubWFwKChpdGVtOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gKHtcbiAgICAgICAgaWQ6IFN0cmluZyhpdGVtLmlkID8/ICcnKSxcbiAgICAgICAgdGFza0Rlc2NyaXB0aW9uOiBTdHJpbmcoaXRlbS50YXNrX2Rlc2NyaXB0aW9uID8/IGl0ZW0udGFza0Rlc2NyaXB0aW9uID8/ICcnKSxcbiAgICAgICAgb3V0Y29tZTogU3RyaW5nKGl0ZW0ub3V0Y29tZSA/PyAnZmFpbHVyZScpIGFzIFF1YWxpdHlTaWduYWxbJ291dGNvbWUnXSxcbiAgICAgICAgcXVhbGl0eVNjb3JlOiBOdW1iZXIoaXRlbS5xdWFsaXR5X3Njb3JlID8/IGl0ZW0ucXVhbGl0eVNjb3JlID8/IDApLFxuICAgICAgICBodW1hblZlcmRpY3Q6IGl0ZW0uaHVtYW5fdmVyZGljdCA/PyBpdGVtLmh1bWFuVmVyZGljdFxuICAgICAgICAgID8gU3RyaW5nKGl0ZW0uaHVtYW5fdmVyZGljdCA/PyBpdGVtLmh1bWFuVmVyZGljdCkgYXMgUXVhbGl0eVNpZ25hbFsnaHVtYW5WZXJkaWN0J11cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgcXVhbGl0eUZhY3RvcnM6IChpdGVtLnF1YWxpdHlfZmFjdG9ycyB8fCBpdGVtLnF1YWxpdHlGYWN0b3JzKVxuICAgICAgICAgID8gbWFwUXVhbGl0eUZhY3RvcnMoKGl0ZW0ucXVhbGl0eV9mYWN0b3JzID8/IGl0ZW0ucXVhbGl0eUZhY3RvcnMpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBjb21wbGV0ZWRBdDogU3RyaW5nKGl0ZW0uY29tcGxldGVkX2F0ID8/IGl0ZW0uY29tcGxldGVkQXQgPz8gbmV3IERhdGUoKS50b0lTT1N0cmluZygpKSxcbiAgICAgIH0pKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBxdWFsaXR5V2VpZ2h0cygpOiBQcm92aWRlclF1YWxpdHlXZWlnaHRzIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuICAgICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbiAgICAgIGNvbnN0IHdlaWdodHNQYXRoID0gcGF0aC5qb2luKHBhdGguZGlybmFtZSh0aGlzLmZpbGVQYXRoKSwgJ3F1YWxpdHktd2VpZ2h0cy5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMod2VpZ2h0c1BhdGgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKHdlaWdodHNQYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXNrQ29tcGxldGlvbjogTnVtYmVyKGRhdGEudGFza19jb21wbGV0aW9uID8/IGRhdGEudGFza0NvbXBsZXRpb24gPz8gMC41KSxcbiAgICAgICAgY29kZVF1YWxpdHk6IE51bWJlcihkYXRhLmNvZGVfcXVhbGl0eSA/PyBkYXRhLmNvZGVRdWFsaXR5ID8/IDAuMyksXG4gICAgICAgIHByb2Nlc3M6IE51bWJlcihkYXRhLnByb2Nlc3MgPz8gMC4yKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBRdWFsaXR5RmFjdG9ycyhyYXc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUXVhbGl0eUZhY3RvcnMge1xuICByZXR1cm4ge1xuICAgIGFjY2VwdGFuY2VDcml0ZXJpYU1ldDogcmF3LmFjY2VwdGFuY2VfY3JpdGVyaWFfbWV0IGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICB0ZXN0c1Bhc3Npbmc6IHJhdy50ZXN0c19wYXNzaW5nIGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBub1JlZ3Jlc3Npb25zOiByYXcubm9fcmVncmVzc2lvbnMgYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGxpbnRDbGVhbjogcmF3LmxpbnRfY2xlYW4gYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIHR5cGVDaGVja0NsZWFuOiByYXcudHlwZV9jaGVja19jbGVhbiBhcyBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgZm9sbG93c1BhdHRlcm5zOiByYXcuZm9sbG93c19wYXR0ZXJucyBhcyBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgY29udGV4dFJlbGV2YW5jZTogcmF3LmNvbnRleHRfcmVsZXZhbmNlIGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICByZWFzb25pbmdDb2hlcmVuY2U6IHJhdy5yZWFzb25pbmdfY29oZXJlbmNlIGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBleGVjdXRpb25FZmZpY2llbmN5OiByYXcuZXhlY3V0aW9uX2VmZmljaWVuY3kgYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIEFnZ3JlZ2F0ZXMgcXVhbGl0eSBzaWduYWxzIGZyb20gbXVsdGlwbGUgcmVnaXN0ZXJlZCBwcm92aWRlcnMuXG4gKlxuICogSWYgbm8gcHJvdmlkZXJzIGFyZSByZWdpc3RlcmVkLCBsb2FkQWxsU2lnbmFscyByZXR1cm5zIGVtcHR5IGFycmF5c1xuICogd2l0aCB6ZXJvIG92ZXJoZWFkLlxuICovXG5leHBvcnQgY2xhc3MgSW50ZWxsaWdlbmNlTG9hZGVyIHtcbiAgcHJpdmF0ZSBwcm92aWRlcnM6IEludGVsbGlnZW5jZVByb3ZpZGVyW10gPSBbXTtcblxuICAvKiogUmVnaXN0ZXIgYW4gZXh0ZXJuYWwgaW50ZWxsaWdlbmNlIHByb3ZpZGVyICovXG4gIHJlZ2lzdGVyUHJvdmlkZXIocHJvdmlkZXI6IEludGVsbGlnZW5jZVByb3ZpZGVyKTogdm9pZCB7XG4gICAgdGhpcy5wcm92aWRlcnMucHVzaChwcm92aWRlcik7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgcHJvdmlkZXJzICovXG4gIGdldCBwcm92aWRlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucHJvdmlkZXJzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCBwcm92aWRlcnMgKi9cbiAgZ2V0IHByb3ZpZGVyTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnByb3ZpZGVycy5tYXAocCA9PiBwLm5hbWUoKSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBzaWduYWxzIGZyb20gYWxsIHJlZ2lzdGVyZWQgcHJvdmlkZXJzLlxuICAgKlxuICAgKiBOb24tZmF0YWw6IGlmIGEgcHJvdmlkZXIgZmFpbHMsIGl0cyBlcnJvciBpcyBjYXB0dXJlZCBidXRcbiAgICogb3RoZXIgcHJvdmlkZXJzIGNvbnRpbnVlIGxvYWRpbmcuXG4gICAqL1xuICBsb2FkQWxsU2lnbmFscygpOiB7IHNpZ25hbHM6IFF1YWxpdHlTaWduYWxbXTsgZXJyb3JzOiBQcm92aWRlckVycm9yW10gfSB7XG4gICAgY29uc3Qgc2lnbmFsczogUXVhbGl0eVNpZ25hbFtdID0gW107XG4gICAgY29uc3QgZXJyb3JzOiBQcm92aWRlckVycm9yW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcHJvdmlkZXIgb2YgdGhpcy5wcm92aWRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyU2lnbmFscyA9IHByb3ZpZGVyLmxvYWRTaWduYWxzKCk7XG4gICAgICAgIHNpZ25hbHMucHVzaCguLi5wcm92aWRlclNpZ25hbHMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgcHJvdmlkZXJOYW1lOiBwcm92aWRlci5uYW1lKCksXG4gICAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzaWduYWxzLCBlcnJvcnMgfTtcbiAgfVxuXG4gIC8qKiBMb2FkIHNpZ25hbHMgZ3JvdXBlZCBieSBwcm92aWRlciB3aXRoIHdlaWdodCBvdmVycmlkZXMgKi9cbiAgbG9hZEdyb3VwZWQoKTogUHJvdmlkZXJSZXN1bHRbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvdmlkZXJzLm1hcChwcm92aWRlciA9PiB7XG4gICAgICBsZXQgcHJvdmlkZXJTaWduYWxzOiBRdWFsaXR5U2lnbmFsW10gPSBbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHByb3ZpZGVyU2lnbmFscyA9IHByb3ZpZGVyLmxvYWRTaWduYWxzKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTm9uLWZhdGFsXG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm92aWRlck5hbWU6IHByb3ZpZGVyLm5hbWUoKSxcbiAgICAgICAgc2lnbmFsczogcHJvdmlkZXJTaWduYWxzLFxuICAgICAgICB3ZWlnaHRzOiBwcm92aWRlci5xdWFsaXR5V2VpZ2h0cz8uKCksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iXX0=
188
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWxsaWdlbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludGVsbGlnZW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLHdDQUF3QztBQUN4QyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRTlDLHlDQUF5QztBQUN6QyxNQUFNLG9CQUFvQixHQUFHLEtBQU0sQ0FBQztBQUVwQywyQkFBMkI7QUFDM0IsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUUxRSxpQ0FBaUM7QUFDakMsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztBQXNGekQsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFZO0lBQ3BDLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3hELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsR0FBWTtJQUNuQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFD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bGlnZW5jZSBQcm92aWRlcnMgZm9yIFNPTkEgTGVhcm5pbmcgKEFEUi0wNDMpXG4gKlxuICogVHlwZVNjcmlwdCBiaW5kaW5ncyBmb3IgdGhlIEludGVsbGlnZW5jZVByb3ZpZGVyIHRyYWl0LCBlbmFibGluZ1xuICogZXh0ZXJuYWwgc3lzdGVtcyB0byBmZWVkIHF1YWxpdHkgc2lnbmFscyBpbnRvIFJ1dkxMTSdzIGxlYXJuaW5nIGxvb3BzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBJbnRlbGxpZ2VuY2VMb2FkZXIsIEZpbGVTaWduYWxQcm92aWRlciwgUXVhbGl0eVNpZ25hbCB9IGZyb20gJ0BydXZlY3Rvci9ydXZsbG0nO1xuICpcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBJbnRlbGxpZ2VuY2VMb2FkZXIoKTtcbiAqIGxvYWRlci5yZWdpc3RlclByb3ZpZGVyKG5ldyBGaWxlU2lnbmFsUHJvdmlkZXIoJy4vc2lnbmFscy5qc29uJykpO1xuICpcbiAqIGNvbnN0IHsgc2lnbmFscywgZXJyb3JzIH0gPSBsb2FkZXIubG9hZEFsbFNpZ25hbHMoKTtcbiAqIGNvbnNvbGUubG9nKGBMb2FkZWQgJHtzaWduYWxzLmxlbmd0aH0gc2lnbmFsc2ApO1xuICogYGBgXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuLyoqIE1heGltdW0gc2lnbmFsIGZpbGUgc2l6ZSAoMTAgTWlCKSAqL1xuY29uc3QgTUFYX1NJR05BTF9GSUxFX1NJWkUgPSAxMCAqIDEwMjQgKiAxMDI0O1xuXG4vKiogTWF4aW11bSBudW1iZXIgb2Ygc2lnbmFscyBwZXIgZmlsZSAqL1xuY29uc3QgTUFYX1NJR05BTFNfUEVSX0ZJTEUgPSAxMF8wMDA7XG5cbi8qKiBWYWxpZCBvdXRjb21lIHZhbHVlcyAqL1xuY29uc3QgVkFMSURfT1VUQ09NRVMgPSBuZXcgU2V0KFsnc3VjY2VzcycsICdwYXJ0aWFsX3N1Y2Nlc3MnLCAnZmFpbHVyZSddKTtcblxuLyoqIFZhbGlkIGh1bWFuIHZlcmRpY3QgdmFsdWVzICovXG5jb25zdCBWQUxJRF9WRVJESUNUUyA9IG5ldyBTZXQoWydhcHByb3ZlZCcsICdyZWplY3RlZCddKTtcblxuLyoqXG4gKiBBIHF1YWxpdHkgc2lnbmFsIGZyb20gYW4gZXh0ZXJuYWwgc3lzdGVtLlxuICpcbiAqIFJlcHJlc2VudHMgb25lIGNvbXBsZXRlZCB0YXNrIHdpdGggcXVhbGl0eSBhc3Nlc3NtZW50IGRhdGFcbiAqIHRoYXQgY2FuIGZlZWQgaW50byBTT05BIHRyYWplY3RvcmllcywgdGhlIGVtYmVkZGluZyBjbGFzc2lmaWVyLFxuICogYW5kIG1vZGVsIHJvdXRlciBjYWxpYnJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWFsaXR5U2lnbmFsIHtcbiAgLyoqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHNpZ25hbCAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgdGFzayBkZXNjcmlwdGlvbiAodXNlZCBmb3IgZW1iZWRkaW5nIGdlbmVyYXRpb24pICovXG4gIHRhc2tEZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKiogRXhlY3V0aW9uIG91dGNvbWUgKi9cbiAgb3V0Y29tZTogJ3N1Y2Nlc3MnIHwgJ3BhcnRpYWxfc3VjY2VzcycgfCAnZmFpbHVyZSc7XG4gIC8qKiBDb21wb3NpdGUgcXVhbGl0eSBzY29yZSAoMC4wIC0gMS4wKSAqL1xuICBxdWFsaXR5U2NvcmU6IG51bWJlcjtcbiAgLyoqIE9wdGlvbmFsIGh1bWFuIHZlcmRpY3QgKi9cbiAgaHVtYW5WZXJkaWN0PzogJ2FwcHJvdmVkJyB8ICdyZWplY3RlZCc7XG4gIC8qKiBPcHRpb25hbCBzdHJ1Y3R1cmVkIHF1YWxpdHkgZmFjdG9ycyBmb3IgZGV0YWlsZWQgYW5hbHlzaXMgKi9cbiAgcXVhbGl0eUZhY3RvcnM/OiBRdWFsaXR5RmFjdG9ycztcbiAgLyoqIElTTyA4NjAxIHRpbWVzdGFtcCBvZiB0YXNrIGNvbXBsZXRpb24gKi9cbiAgY29tcGxldGVkQXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBHcmFudWxhciBxdWFsaXR5IGZhY3RvciBicmVha2Rvd24uXG4gKlxuICogTm90IGFsbCBwcm92aWRlcnMgd2lsbCBoYXZlIGFsbCBmYWN0b3JzLiBVbmRlZmluZWQgZmllbGRzIG1lYW5cbiAqIFwibm90IGFzc2Vzc2VkXCIgKGRpc3RpbmN0IGZyb20gMC4wLCB3aGljaCBtZWFucyBcImFzc2Vzc2VkIGFzIHplcm9cIikuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVhbGl0eUZhY3RvcnMge1xuICBhY2NlcHRhbmNlQ3JpdGVyaWFNZXQ/OiBudW1iZXI7XG4gIHRlc3RzUGFzc2luZz86IG51bWJlcjtcbiAgbm9SZWdyZXNzaW9ucz86IG51bWJlcjtcbiAgbGludENsZWFuPzogbnVtYmVyO1xuICB0eXBlQ2hlY2tDbGVhbj86IG51bWJlcjtcbiAgZm9sbG93c1BhdHRlcm5zPzogbnVtYmVyO1xuICBjb250ZXh0UmVsZXZhbmNlPzogbnVtYmVyO1xuICByZWFzb25pbmdDb2hlcmVuY2U/OiBudW1iZXI7XG4gIGV4ZWN1dGlvbkVmZmljaWVuY3k/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUXVhbGl0eSB3ZWlnaHQgb3ZlcnJpZGVzIGZyb20gYSBwcm92aWRlci5cbiAqXG4gKiBXZWlnaHRzIHNob3VsZCBzdW0gdG8gYXBwcm94aW1hdGVseSAxLjAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZXJRdWFsaXR5V2VpZ2h0cyB7XG4gIHRhc2tDb21wbGV0aW9uOiBudW1iZXI7XG4gIGNvZGVRdWFsaXR5OiBudW1iZXI7XG4gIHByb2Nlc3M6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBFcnJvciBmcm9tIGEgc2luZ2xlIHByb3ZpZGVyIGR1cmluZyBiYXRjaCBsb2FkaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3ZpZGVyRXJyb3Ige1xuICBwcm92aWRlck5hbWU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc3VsdCBmcm9tIGEgc2luZ2xlIHByb3ZpZGVyIGR1cmluZyBncm91cGVkIGxvYWRpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZXJSZXN1bHQge1xuICBwcm92aWRlck5hbWU6IHN0cmluZztcbiAgc2lnbmFsczogUXVhbGl0eVNpZ25hbFtdO1xuICB3ZWlnaHRzPzogUHJvdmlkZXJRdWFsaXR5V2VpZ2h0cztcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGV4dGVybmFsIHN5c3RlbXMgdGhhdCBzdXBwbHkgcXVhbGl0eSBzaWduYWxzIHRvIFJ1dkxMTS5cbiAqXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgYW5kIHJlZ2lzdGVyIHdpdGggSW50ZWxsaWdlbmNlTG9hZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVsbGlnZW5jZVByb3ZpZGVyIHtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgcHJvdmlkZXIgKi9cbiAgbmFtZSgpOiBzdHJpbmc7XG4gIC8qKiBMb2FkIHF1YWxpdHkgc2lnbmFscyBmcm9tIHRoaXMgcHJvdmlkZXIncyBkYXRhIHNvdXJjZSAqL1xuICBsb2FkU2lnbmFscygpOiBRdWFsaXR5U2lnbmFsW107XG4gIC8qKiBPcHRpb25hbCBxdWFsaXR5IHdlaWdodCBvdmVycmlkZXMgKi9cbiAgcXVhbGl0eVdlaWdodHM/KCk6IFByb3ZpZGVyUXVhbGl0eVdlaWdodHMgfCB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFzT3B0aW9uYWxOdW1iZXIodmFsOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbiA9IE51bWJlcih2YWwpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG4pICYmIG4gPj0gMCAmJiBuIDw9IDEgPyBuIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU91dGNvbWUodmFsOiB1bmtub3duKTogUXVhbGl0eVNpZ25hbFsnb3V0Y29tZSddIHtcbiAgY29uc3QgcyA9IFN0cmluZyh2YWwgPz8gJ2ZhaWx1cmUnKTtcbiAgcmV0dXJuIFZBTElEX09VVENPTUVTLmhhcyhzKSA/IHMgYXMgUXVhbGl0eVNpZ25hbFsnb3V0Y29tZSddIDogJ2ZhaWx1cmUnO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVZlcmRpY3QodmFsOiB1bmtub3duKTogUXVhbGl0eVNpZ25hbFsnaHVtYW5WZXJkaWN0J10gfCB1bmRlZmluZWQge1xuICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBzID0gU3RyaW5nKHZhbCk7XG4gIHJldHVybiBWQUxJRF9WRVJESUNUUy5oYXMocykgPyBzIGFzIFF1YWxpdHlTaWduYWxbJ2h1bWFuVmVyZGljdCddIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNjb3JlKHZhbDogdW5rbm93bik6IG51bWJlciB7XG4gIGNvbnN0IG4gPSBOdW1iZXIodmFsID8/IDApO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSB8fCBuIDwgMCB8fCBuID4gMSkgcmV0dXJuIDA7XG4gIHJldHVybiBuO1xufVxuXG5mdW5jdGlvbiBtYXBRdWFsaXR5RmFjdG9ycyhyYXc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUXVhbGl0eUZhY3RvcnMge1xuICByZXR1cm4ge1xuICAgIGFjY2VwdGFuY2VDcml0ZXJpYU1ldDogYXNPcHRpb25hbE51bWJlcihyYXcuYWNjZXB0YW5jZV9jcml0ZXJpYV9tZXQpLFxuICAgIHRlc3RzUGFzc2luZzogYXNPcHRpb25hbE51bWJlcihyYXcudGVzdHNfcGFzc2luZyksXG4gICAgbm9SZWdyZXNzaW9uczogYXNPcHRpb25hbE51bWJlcihyYXcubm9fcmVncmVzc2lvbnMpLFxuICAgIGxpbnRDbGVhbjogYXNPcHRpb25hbE51bWJlcihyYXcubGludF9jbGVhbiksXG4gICAgdHlwZUNoZWNrQ2xlYW46IGFzT3B0aW9uYWxOdW1iZXIocmF3LnR5cGVfY2hlY2tfY2xlYW4pLFxuICAgIGZvbGxvd3NQYXR0ZXJuczogYXNPcHRpb25hbE51bWJlcihyYXcuZm9sbG93c19wYXR0ZXJucyksXG4gICAgY29udGV4dFJlbGV2YW5jZTogYXNPcHRpb25hbE51bWJlcihyYXcuY29udGV4dF9yZWxldmFuY2UpLFxuICAgIHJlYXNvbmluZ0NvaGVyZW5jZTogYXNPcHRpb25hbE51bWJlcihyYXcucmVhc29uaW5nX2NvaGVyZW5jZSksXG4gICAgZXhlY3V0aW9uRWZmaWNpZW5jeTogYXNPcHRpb25hbE51bWJlcihyYXcuZXhlY3V0aW9uX2VmZmljaWVuY3kpLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWx0LWluIGZpbGUtYmFzZWQgaW50ZWxsaWdlbmNlIHByb3ZpZGVyLlxuICpcbiAqIFJlYWRzIHF1YWxpdHkgc2lnbmFscyBmcm9tIGEgSlNPTiBmaWxlLiBUaGlzIGlzIHRoZSBkZWZhdWx0IHByb3ZpZGVyXG4gKiBmb3Igbm9uLVJ1c3QgaW50ZWdyYXRpb25zIHRoYXQgd3JpdGUgc2lnbmFsIGZpbGVzLlxuICovXG5leHBvcnQgY2xhc3MgRmlsZVNpZ25hbFByb3ZpZGVyIGltcGxlbWVudHMgSW50ZWxsaWdlbmNlUHJvdmlkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHRoaXMuZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpO1xuICB9XG5cbiAgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnZmlsZS1zaWduYWxzJztcbiAgfVxuXG4gIGxvYWRTaWduYWxzKCk6IFF1YWxpdHlTaWduYWxbXSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuZmlsZVBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZmlsZSBzaXplIGJlZm9yZSByZWFkaW5nIChwcmV2ZW50IE9PTSlcbiAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmModGhpcy5maWxlUGF0aCk7XG4gICAgaWYgKHN0YXQuc2l6ZSA+IE1BWF9TSUdOQUxfRklMRV9TSVpFKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTaWduYWwgZmlsZSBleGNlZWRzIG1heCBzaXplICgke3N0YXQuc2l6ZX0gYnl0ZXMsIGxpbWl0ICR7TUFYX1NJR05BTF9GSUxFX1NJWkV9KWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuZmlsZVBhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IGRhdGE6IHVua25vd24gPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgc2lnbmFsIGNvdW50XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gTUFYX1NJR05BTFNfUEVSX0ZJTEUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFNpZ25hbCBmaWxlIGNvbnRhaW5zICR7ZGF0YS5sZW5ndGh9IHNpZ25hbHMsIG1heCBpcyAke01BWF9TSUdOQUxTX1BFUl9GSUxFfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGEubWFwKChpdGVtOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgY29uc3QgcWZSYXcgPSAoaXRlbS5xdWFsaXR5X2ZhY3RvcnMgPz8gaXRlbS5xdWFsaXR5RmFjdG9ycykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogU3RyaW5nKGl0ZW0uaWQgPz8gJycpLFxuICAgICAgICB0YXNrRGVzY3JpcHRpb246IFN0cmluZyhpdGVtLnRhc2tfZGVzY3JpcHRpb24gPz8gaXRlbS50YXNrRGVzY3JpcHRpb24gPz8gJycpLFxuICAgICAgICBvdXRjb21lOiB2YWxpZGF0ZU91dGNvbWUoaXRlbS5vdXRjb21lKSxcbiAgICAgICAgcXVhbGl0eVNjb3JlOiB2YWxpZGF0ZVNjb3JlKGl0ZW0ucXVhbGl0eV9zY29yZSA/PyBpdGVtLnF1YWxpdHlTY29yZSksXG4gICAgICAgIGh1bWFuVmVyZGljdDogdmFsaWRhdGVWZXJkaWN0KGl0ZW0uaHVtYW5fdmVyZGljdCA/PyBpdGVtLmh1bWFuVmVyZGljdCksXG4gICAgICAgIHF1YWxpdHlGYWN0b3JzOiBxZlJhdyA/IG1hcFF1YWxpdHlGYWN0b3JzKHFmUmF3KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgY29tcGxldGVkQXQ6IFN0cmluZyhpdGVtLmNvbXBsZXRlZF9hdCA/PyBpdGVtLmNvbXBsZXRlZEF0ID8/IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcXVhbGl0eVdlaWdodHMoKTogUHJvdmlkZXJRdWFsaXR5V2VpZ2h0cyB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdlaWdodHNQYXRoID0gcGF0aC5qb2luKHBhdGguZGlybmFtZSh0aGlzLmZpbGVQYXRoKSwgJ3F1YWxpdHktd2VpZ2h0cy5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMod2VpZ2h0c1BhdGgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKHdlaWdodHNQYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJhdykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXNrQ29tcGxldGlvbjogTnVtYmVyKGRhdGEudGFza19jb21wbGV0aW9uID8/IGRhdGEudGFza0NvbXBsZXRpb24gPz8gMC41KSxcbiAgICAgICAgY29kZVF1YWxpdHk6IE51bWJlcihkYXRhLmNvZGVfcXVhbGl0eSA/PyBkYXRhLmNvZGVRdWFsaXR5ID8/IDAuMyksXG4gICAgICAgIHByb2Nlc3M6IE51bWJlcihkYXRhLnByb2Nlc3MgPz8gMC4yKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFnZ3JlZ2F0ZXMgcXVhbGl0eSBzaWduYWxzIGZyb20gbXVsdGlwbGUgcmVnaXN0ZXJlZCBwcm92aWRlcnMuXG4gKlxuICogSWYgbm8gcHJvdmlkZXJzIGFyZSByZWdpc3RlcmVkLCBsb2FkQWxsU2lnbmFscyByZXR1cm5zIGVtcHR5IGFycmF5c1xuICogd2l0aCB6ZXJvIG92ZXJoZWFkLlxuICovXG5leHBvcnQgY2xhc3MgSW50ZWxsaWdlbmNlTG9hZGVyIHtcbiAgcHJpdmF0ZSBwcm92aWRlcnM6IEludGVsbGlnZW5jZVByb3ZpZGVyW10gPSBbXTtcblxuICAvKiogUmVnaXN0ZXIgYW4gZXh0ZXJuYWwgaW50ZWxsaWdlbmNlIHByb3ZpZGVyICovXG4gIHJlZ2lzdGVyUHJvdmlkZXIocHJvdmlkZXI6IEludGVsbGlnZW5jZVByb3ZpZGVyKTogdm9pZCB7XG4gICAgdGhpcy5wcm92aWRlcnMucHVzaChwcm92aWRlcik7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgcHJvdmlkZXJzICovXG4gIGdldCBwcm92aWRlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucHJvdmlkZXJzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCBwcm92aWRlcnMgKi9cbiAgZ2V0IHByb3ZpZGVyTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnByb3ZpZGVycy5tYXAocCA9PiBwLm5hbWUoKSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBzaWduYWxzIGZyb20gYWxsIHJlZ2lzdGVyZWQgcHJvdmlkZXJzLlxuICAgKlxuICAgKiBOb24tZmF0YWw6IGlmIGEgcHJvdmlkZXIgZmFpbHMsIGl0cyBlcnJvciBpcyBjYXB0dXJlZCBidXRcbiAgICogb3RoZXIgcHJvdmlkZXJzIGNvbnRpbnVlIGxvYWRpbmcuXG4gICAqL1xuICBsb2FkQWxsU2lnbmFscygpOiB7IHNpZ25hbHM6IFF1YWxpdHlTaWduYWxbXTsgZXJyb3JzOiBQcm92aWRlckVycm9yW10gfSB7XG4gICAgY29uc3Qgc2lnbmFsczogUXVhbGl0eVNpZ25hbFtdID0gW107XG4gICAgY29uc3QgZXJyb3JzOiBQcm92aWRlckVycm9yW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcHJvdmlkZXIgb2YgdGhpcy5wcm92aWRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyU2lnbmFscyA9IHByb3ZpZGVyLmxvYWRTaWduYWxzKCk7XG4gICAgICAgIHNpZ25hbHMucHVzaCguLi5wcm92aWRlclNpZ25hbHMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgcHJvdmlkZXJOYW1lOiBwcm92aWRlci5uYW1lKCksXG4gICAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzaWduYWxzLCBlcnJvcnMgfTtcbiAgfVxuXG4gIC8qKiBMb2FkIHNpZ25hbHMgZ3JvdXBlZCBieSBwcm92aWRlciB3aXRoIHdlaWdodCBvdmVycmlkZXMgKi9cbiAgbG9hZEdyb3VwZWQoKTogUHJvdmlkZXJSZXN1bHRbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvdmlkZXJzLm1hcChwcm92aWRlciA9PiB7XG4gICAgICBsZXQgcHJvdmlkZXJTaWduYWxzOiBRdWFsaXR5U2lnbmFsW10gPSBbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHByb3ZpZGVyU2lnbmFscyA9IHByb3ZpZGVyLmxvYWRTaWduYWxzKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTm9uLWZhdGFsXG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm92aWRlck5hbWU6IHByb3ZpZGVyLm5hbWUoKSxcbiAgICAgICAgc2lnbmFsczogcHJvdmlkZXJTaWduYWxzLFxuICAgICAgICB3ZWlnaHRzOiBwcm92aWRlci5xdWFsaXR5V2VpZ2h0cz8uKCksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ruvector/ruvllm",
3
- "version": "2.5.0",
3
+ "version": "2.5.1",
4
4
  "description": "Self-learning LLM orchestration with SONA adaptive learning, HNSW memory, FastGRNN routing, and SIMD inference",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",