@datagrok-libraries/statistics 1.1.1 → 1.1.2
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/package.json
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
import { Property } from "datagrok-api/src/entities";
|
|
1
2
|
export declare type FitResult = {
|
|
2
3
|
parameters: number[];
|
|
3
4
|
fittedCurve: (x: number) => number;
|
|
4
5
|
confidenceTop: (x: number) => number;
|
|
5
6
|
confidenceBottom: (x: number) => number;
|
|
6
|
-
rSquared
|
|
7
|
-
auc
|
|
7
|
+
rSquared?: number;
|
|
8
|
+
auc?: number;
|
|
8
9
|
};
|
|
10
|
+
/** Properties that describe {@link FitResult}. Useful for editing, initialization, transformations, etc. */
|
|
11
|
+
export declare const fitResultProperties: Property[];
|
|
9
12
|
export declare enum FitErrorModel {
|
|
10
13
|
Constant = 0,
|
|
11
14
|
Proportional = 1
|
|
@@ -16,9 +19,17 @@ export declare type FitFunctionType = 'Sigmoid' | 'Linear';
|
|
|
16
19
|
export declare const fitFunctions: {
|
|
17
20
|
[index: string]: any;
|
|
18
21
|
};
|
|
22
|
+
export interface IFitOptions {
|
|
23
|
+
errorModel: FitErrorModel;
|
|
24
|
+
confidenceLevel: number;
|
|
25
|
+
statistics: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* statistics - whether or not to calculate fit statistics (potentially computationally intensive)
|
|
29
|
+
* */
|
|
19
30
|
export declare function fit(data: {
|
|
20
31
|
x: number[];
|
|
21
32
|
y: number[];
|
|
22
|
-
}, params: number[], curveFunction: (params: number[], x: number) => number, errorModel: FitErrorModel, confidenceLevel?: number): FitResult;
|
|
33
|
+
}, params: number[], curveFunction: (params: number[], x: number) => number, errorModel: FitErrorModel, confidenceLevel?: number, statistics?: boolean): FitResult;
|
|
23
34
|
export declare function sigmoid(params: number[], x: number): number;
|
|
24
35
|
//# sourceMappingURL=fit-curve.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fit-curve.d.ts","sourceRoot":"","sources":["fit-curve.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fit-curve.d.ts","sourceRoot":"","sources":["fit-curve.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,QAAQ,EAAC,MAAM,2BAA2B,CAAC;AASnD,oBAAY,SAAS,GAAG;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,CAAC,CAAC,EAAC,MAAM,KAAI,MAAM,CAAC;IACjC,aAAa,EAAE,CAAC,CAAC,EAAC,MAAM,KAAI,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,CAAC,EAAC,MAAM,KAAI,MAAM,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,4GAA4G;AAC5G,eAAO,MAAM,mBAAmB,EAAE,QAAQ,EAGzC,CAAC;AAMF,oBAAY,aAAa;IACvB,QAAQ,IAAA;IACR,YAAY,IAAA;CACb;AAED,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAC9C,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAE5C,oBAAY,eAAe,GAAG,SAAS,GAAG,QAAQ,CAAC;AA4CnD,eAAO,MAAM,YAAY,EAAE;IAAC,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAA;CAG/C,CAAC;AAGF,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,aAAa,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAGD;;KAEK;AACL,wBAAgB,GAAG,CAAC,IAAI,EAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAA;CAAC,EAC/B,MAAM,EAAE,MAAM,EAAE,EAChB,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,EACtD,UAAU,EAAE,aAAa,EACzB,eAAe,GAAE,MAAa,EAC9B,UAAU,GAAE,OAAc,GAAG,SAAS,CAuEzD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAO3D"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { limitedMemoryBFGS } from "../../lbfgs/lbfgs";
|
|
2
2
|
//@ts-ignore: no types
|
|
3
3
|
import * as jStat from 'jstat';
|
|
4
|
+
import { Property } from "datagrok-api/src/entities";
|
|
5
|
+
import { TYPE } from "datagrok-api/src/const";
|
|
6
|
+
/** Properties that describe {@link FitResult}. Useful for editing, initialization, transformations, etc. */
|
|
7
|
+
export const fitResultProperties = [
|
|
8
|
+
Property.js('rSquared', TYPE.FLOAT),
|
|
9
|
+
Property.js('auc', TYPE.FLOAT)
|
|
10
|
+
];
|
|
4
11
|
export var FitErrorModel;
|
|
5
12
|
(function (FitErrorModel) {
|
|
6
13
|
FitErrorModel[FitErrorModel["Constant"] = 0] = "Constant";
|
|
@@ -38,7 +45,10 @@ export const fitFunctions = {
|
|
|
38
45
|
FIT_FUNCTION_LINEAR: new LinearFunction(),
|
|
39
46
|
FIT_FUNCTION_SIGMOID: new SigmoidFunction(),
|
|
40
47
|
};
|
|
41
|
-
|
|
48
|
+
/**
|
|
49
|
+
* statistics - whether or not to calculate fit statistics (potentially computationally intensive)
|
|
50
|
+
* */
|
|
51
|
+
export function fit(data, params, curveFunction, errorModel, confidenceLevel = 0.05, statistics = true) {
|
|
42
52
|
let of;
|
|
43
53
|
switch (errorModel) {
|
|
44
54
|
case FitErrorModel.Constant:
|
|
@@ -92,8 +102,8 @@ export function fit(data, params, curveFunction, errorModel, confidenceLevel = 0
|
|
|
92
102
|
fittedCurve: fittedCurve,
|
|
93
103
|
confidenceTop: top,
|
|
94
104
|
confidenceBottom: bottom,
|
|
95
|
-
rSquared: getDetCoeff(fittedCurve, data),
|
|
96
|
-
auc: getAuc(fittedCurve, data)
|
|
105
|
+
rSquared: statistics ? getDetCoeff(fittedCurve, data) : undefined,
|
|
106
|
+
auc: statistics ? getAuc(fittedCurve, data) : undefined
|
|
97
107
|
};
|
|
98
108
|
return fitRes;
|
|
99
109
|
}
|
|
@@ -126,7 +136,7 @@ function getObjectiveDerivative(of, curveFunction, data, params, selectedParam)
|
|
|
126
136
|
}
|
|
127
137
|
function getAuc(fittedCurve, data) {
|
|
128
138
|
let auc = 0;
|
|
129
|
-
const integrationStep = 0.
|
|
139
|
+
const integrationStep = 0.001;
|
|
130
140
|
let min = Math.min(...data.x);
|
|
131
141
|
let max = Math.max(...data.x);
|
|
132
142
|
for (let x = min; x < max; x += integrationStep)
|
|
@@ -183,4 +193,4 @@ function objectiveNormalProportional(targetFunc, data, params) {
|
|
|
183
193
|
likelihood += residuesSquares[i] / sigmaSq + Math.log(2 * pi * sigmaSq);
|
|
184
194
|
return { value: -likelihood, const: sigma, mult: 0 };
|
|
185
195
|
}
|
|
186
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml0LWN1cnZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZml0LWN1cnZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ25ELHNCQUFzQjtBQUN0QixPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQXFCL0IsTUFBTSxDQUFOLElBQVksYUFHWDtBQUhELFdBQVksYUFBYTtJQUN2Qix5REFBUSxDQUFBO0lBQ1IsaUVBQVksQ0FBQTtBQUNkLENBQUMsRUFIVyxhQUFhLEtBQWIsYUFBYSxRQUd4QjtBQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztBQUM5QyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQUM7QUFJNUMsTUFBZSxXQUFXO0NBS3pCO0FBR0QsTUFBTSxjQUFlLFNBQVEsV0FBVztJQUN0QyxJQUFJLElBQUksS0FBYSxPQUFPLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUVsRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsQ0FBQyxDQUFDLE1BQWdCLEVBQUUsQ0FBUztRQUMzQixNQUFNLGlCQUFpQixDQUFDO0lBQzFCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxDQUFXLEVBQUUsQ0FBVztRQUMzQyxNQUFNLGlCQUFpQixDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQUdELE1BQU0sZUFBZ0IsU0FBUSxXQUFXO0lBQ3ZDLElBQUksSUFBSSxLQUFhLE9BQU8sb0JBQW9CLENBQUMsQ0FBQyxDQUFDO0lBRW5ELElBQUksY0FBYztRQUNoQixPQUFPLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELENBQUMsQ0FBQyxNQUFnQixFQUFFLENBQVM7UUFDM0IsTUFBTSxpQkFBaUIs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Q0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDMUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztLQUM5QztJQUVELEtBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUM1QyxPQUFPLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDO0lBQ2xDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTNCLEtBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUM1QyxVQUFVLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBQyxFQUFFLEdBQUMsT0FBTyxDQUFDLENBQUM7SUFFcEUsT0FBTyxFQUFDLEtBQUssRUFBRSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUMsQ0FBQztBQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtsaW1pdGVkTWVtb3J5QkZHU30gZnJvbSBcIi4uLy4uL2xiZmdzL2xiZmdzXCJcbi8vQHRzLWlnbm9yZTogbm8gdHlwZXNcbmltcG9ydCAqIGFzIGpTdGF0IGZyb20gJ2pzdGF0JztcblxudHlwZSBMaWtlbGlob29kID0ge1xuICB2YWx1ZTogbnVtYmVyLCBcbiAgY29uc3Q6IG51bWJlciwgXG4gIG11bHQ6IG51bWJlclxufTtcblxuZXhwb3J0IHR5cGUgRml0UmVzdWx0ID0ge1xuICBwYXJhbWV0ZXJzOiBudW1iZXJbXSxcbiAgZml0dGVkQ3VydmU6ICh4Om51bWJlcik9PiBudW1iZXIsXG4gIGNvbmZpZGVuY2VUb3A6ICh4Om51bWJlcik9PiBudW1iZXIsXG4gIGNvbmZpZGVuY2VCb3R0b206ICh4Om51bWJlcik9PiBudW1iZXIsXG4gIHJTcXVhcmVkOiBudW1iZXIsXG4gIGF1YzogbnVtYmVyO1xufTtcblxudHlwZSBPYmplY3RpdmVGdW5jdGlvbiA9ICh0YXJnZXRGdW5jOiAocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKSA9PiBudW1iZXIsIFxuZGF0YToge3g6IG51bWJlcltdLCB5OiBudW1iZXJbXX0sXG5wYXJhbXM6IG51bWJlcltdKSA9PiBMaWtlbGlob29kO1xuXG5leHBvcnQgZW51bSBGaXRFcnJvck1vZGVsIHtcbiAgQ29uc3RhbnQsXG4gIFByb3BvcnRpb25hbFxufVxuXG5leHBvcnQgY29uc3QgRklUX0ZVTkNUSU9OX1NJR01PSUQgPSAnU2lnbW9pZCc7XG5leHBvcnQgY29uc3QgRklUX0ZVTkNUSU9OX0xJTkVBUiA9ICdMaW5lYXInO1xuXG5leHBvcnQgdHlwZSBGaXRGdW5jdGlvblR5cGUgPSAnU2lnbW9pZCcgfCAnTGluZWFyJztcblxuYWJzdHJhY3QgY2xhc3MgRml0RnVuY3Rpb24ge1xuICBhYnN0cmFjdCBnZXQgbmFtZSgpOiBzdHJpbmc7XG4gIGFic3RyYWN0IGdldCBwYXJhbWV0ZXJOYW1lcygpOiBzdHJpbmdbXTtcbiAgYWJzdHJhY3QgeShwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpOiBudW1iZXI7XG4gIGFic3RyYWN0IGdldEluaXRpYWxQYXJhbWV0ZXJzKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSk6IG51bWJlcltdO1xufVxuXG5cbmNsYXNzIExpbmVhckZ1bmN0aW9uIGV4dGVuZHMgRml0RnVuY3Rpb24ge1xuICBnZXQgbmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gRklUX0ZVTkNUSU9OX0xJTkVBUjsgfVxuXG4gIGdldCBwYXJhbWV0ZXJOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnU2xvcGUnLCAnSW50ZXJjZXB0J107XG4gIH1cblxuICB5KHBhcmFtczogbnVtYmVyW10sIHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgdGhyb3cgJ05vdCBpbXBsZW1lbnRlZCc7XG4gIH1cblxuICBnZXRJbml0aWFsUGFyYW1ldGVycyh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gICAgdGhyb3cgJ05vdCBpbXBsZW1lbnRlZCc7XG4gIH1cbn1cblxuXG5jbGFzcyBTaWdtb2lkRnVuY3Rpb24gZXh0ZW5kcyBGaXRGdW5jdGlvbiB7XG4gIGdldCBuYW1lKCk6IHN0cmluZyB7IHJldHVybiBGSVRfRlVOQ1RJT05fU0lHTU9JRDsgfVxuXG4gIGdldCBwYXJhbWV0ZXJOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnVG9wJywgJ0JvdHRvbScsICdTbG9wZScsICdJQzUwJ107XG4gIH1cblxuICB5KHBhcmFtczogbnVtYmVyW10sIHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgdGhyb3cgJ05vdCBpbXBsZW1lbnRlZCc7XG4gIH1cblxuICBnZXRJbml0aWFsUGFyYW1ldGVycyh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gICAgdGhyb3cgJ05vdCBpbXBsZW1lbnRlZCc7XG4gIH1cbn1cblxuXG5leHBvcnQgY29uc3QgZml0RnVuY3Rpb25zOiB7W2luZGV4OiBzdHJpbmddOiBhbnl9ID0ge1xuICBGSVRfRlVOQ1RJT05fTElORUFSOiBuZXcgTGluZWFyRnVuY3Rpb24oKSxcbiAgRklUX0ZVTkNUSU9OX1NJR01PSUQ6IG5ldyBTaWdtb2lkRnVuY3Rpb24oKSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXQoZGF0YTp7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSwgXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgIGN1cnZlRnVuY3Rpb246IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlciwgXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTW9kZWw6IEZpdEVycm9yTW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2VMZXZlbDogbnVtYmVyID0gMC4wNSk6IEZpdFJlc3VsdCB7XG5cbiAgbGV0IG9mOiBPYmplY3RpdmVGdW5jdGlvbjtcbiAgc3dpdGNoKGVycm9yTW9kZWwpIHtcbiAgICBjYXNlIEZpdEVycm9yTW9kZWwuQ29uc3RhbnQ6XG4gICAgICBvZiA9IG9iamVjdGl2ZU5vcm1hbENvbnN0YW50O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBGaXRFcnJvck1vZGVsLlByb3BvcnRpb25hbDpcbiAgICAgIG9mID0gb2JqZWN0aXZlTm9ybWFsUHJvcG9ydGlvbmFsO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIG9mID0gb2JqZWN0aXZlTm9ybWFsQ29uc3RhbnQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGxldCBpdGVyYXRpb25zID0gMDtcblxuICBsZXQgb3B0aW1pemFibGUgPSB7XG4gICAgZ2V0VmFsdWU6IChwYXJhbWV0ZXJzOiBudW1iZXJbXSkgPT4ge1xuICAgICAgcmV0dXJuIG9mKGN1cnZlRnVuY3Rpb24sIGRhdGEsIHBhcmFtZXRlcnMpLnZhbHVlO1xuICAgIH0sXG4gICAgZ2V0R3JhZGllbnQ6IChwYXJhbWV0ZXJzOiBudW1iZXJbXSwgZ3JhZGllbnQ6IG51bWJlcltdKSA9PiB7XG4gICAgICBjb25zdCBsZW5ndGggPSBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKS5sZW5ndGg7XG4gICAgICBpdGVyYXRpb25zKys7XG4gICAgICBcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKylcbiAgICAgICAgZ3JhZGllbnRbaV0gPSBnZXRPYmplY3RpdmVEZXJpdmF0aXZlKG9mLCBjdXJ2ZUZ1bmN0aW9uLCBkYXRhLCBwYXJhbWV0ZXJzLCBpKTtcblxuICAgICAgcmV0dXJuIGdyYWRpZW50O1xuICAgIH1cbiAgfTtcblxuICBsaW1pdGVkTWVtb3J5QkZHUyhvcHRpbWl6YWJsZSwgcGFyYW1zKTtcbiAgbGltaXRlZE1lbW9yeUJGR1Mob3B0aW1pemFibGUsIHBhcmFtcyk7XG5cbiAgbGV0IGZpdHRlZEN1cnZlID0gKHg6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiBjdXJ2ZUZ1bmN0aW9uKHBhcmFtcywgeCk7XG4gIH1cblxuICBsZXQgZXJyb3IgPSBlcnJvck1vZGVsID09IEZpdEVycm9yTW9kZWwuUHJvcG9ydGlvbmFsID9cbiAgb2YoY3VydmVGdW5jdGlvbiwgZGF0YSwgcGFyYW1zKS5tdWx0IDpcbiAgb2YoY3VydmVGdW5jdGlvbiwgZGF0YSwgcGFyYW1zKS5jb25zdDtcblxuICBsZXQgc3R1ZGVudFEgPSBqU3RhdC5zdHVkZW50dC5pbnYoMSAtIGNvbmZpZGVuY2VMZXZlbC8yLCBkYXRhLngubGVuZ3RoIC0gcGFyYW1zLmxlbmd0aCk7XG5cbiAgbGV0IHRvcCA9ICh4OiBudW1iZXIpID0+e1xuICAgIGxldCB2YWx1ZSA9IGN1cnZlRnVuY3Rpb24ocGFyYW1zLCB4KTtcbiAgICBpZiAoZXJyb3JNb2RlbCA9PSBGaXRFcnJvck1vZGVsLkNvbnN0YW50KVxuICAgICAgcmV0dXJuICB2YWx1ZSArIHN0dWRlbnRRKmVycm9yL01hdGguc3FydChkYXRhLngubGVuZ3RoKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gIHZhbHVlICsgc3R1ZGVudFEqKE1hdGguYWJzKHZhbHVlKSplcnJvci9NYXRoLnNxcnQoZGF0YS54Lmxlbmd0aCkpO1xuICB9XG5cbiAgbGV0IGJvdHRvbSA9ICh4OiBudW1iZXIpID0+IHtcbiAgICBsZXQgdmFsdWUgPSBjdXJ2ZUZ1bmN0aW9uKHBhcmFtcywgeCk7XG4gICAgaWYgKGVycm9yTW9kZWwgPT0gRml0RXJyb3JNb2RlbC5Db25zdGFudClcbiAgICAgIHJldHVybiAgdmFsdWUgLSBzdHVkZW50USplcnJvci9NYXRoLnNxcnQoZGF0YS54Lmxlbmd0aCk7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuICB2YWx1ZSAtIHN0dWRlbnRRKihNYXRoLmFicyh2YWx1ZSkqZXJyb3IvTWF0aC5zcXJ0KGRhdGEueC5sZW5ndGgpKTtcbiAgfVxuXG4gIGxldCBmaXRSZXM6IEZpdFJlc3VsdCA9IHtcbiAgICBwYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgZml0dGVkQ3VydmU6IGZpdHRlZEN1cnZlLFxuICAgIGNvbmZpZGVuY2VUb3A6IHRvcCxcbiAgICBjb25maWRlbmNlQm90dG9tOiBib3R0b20sXG4gICAgclNxdWFyZWQ6IGdldERldENvZWZmKGZpdHRlZEN1cnZlLCBkYXRhKSxcbiAgICBhdWM6IGdldEF1YyhmaXR0ZWRDdXJ2ZSwgZGF0YSlcbiAgfTtcblxuICByZXR1cm4gZml0UmVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2lnbW9pZChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBBID0gcGFyYW1zWzBdO1xuICBjb25zdCBCID0gcGFyYW1zWzFdO1xuICBjb25zdCBDID0gcGFyYW1zWzJdO1xuICBjb25zdCBEID0gcGFyYW1zWzNdO1xuICBjb25zdCByZXMgPSBEICsgKEEgLSBEKS8oMSArIE1hdGgucG93KDEwLCAoeCAtIEMpKkIpKTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gZ2V0T2JqZWN0aXZlRGVyaXZhdGl2ZShvZjogT2JqZWN0aXZlRnVuY3Rpb24sIGN1cnZlRnVuY3Rpb246IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlciwgXG4gICAgZGF0YToge3g6IG51bWJlcltdLCB5OiBudW1iZXJbXX0sIHBhcmFtczogbnVtYmVyW10sIHNlbGVjdGVkUGFyYW06IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBzdGVwID0gcGFyYW1zW3NlbGVjdGVkUGFyYW1dKjAuMDAwMTtcbiAgc3RlcCA9IHN0ZXAgPT0gMCA/IDAuMDAxIDogc3RlcDsgXG4gIGxldCBwYXJhbXNUb3A6IG51bWJlcltdID0gW107XG4gIGxldCBwYXJhbXNCb3R0b206IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYoaSA9PSBzZWxlY3RlZFBhcmFtKSB7XG4gICAgICBwYXJhbXNUb3AucHVzaChwYXJhbXNbaV0gKyBzdGVwKTtcbiAgICAgIHBhcmFtc0JvdHRvbS5wdXNoKHBhcmFtc1tpXSAtIHN0ZXApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbXNUb3AucHVzaChwYXJhbXNbaV0pO1xuICAgICAgcGFyYW1zQm90dG9tLnB1c2gocGFyYW1zW2ldKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZHJ2VG9wID0gb2YoY3VydmVGdW5jdGlvbiwgZGF0YSwgcGFyYW1zVG9wKS52YWx1ZTtcbiAgY29uc3QgZHJ2Qm90dG9tID0gb2YoY3VydmVGdW5jdGlvbiwgZGF0YSwgcGFyYW1zQm90dG9tKS52YWx1ZTtcblxuICByZXR1cm4gKGRydlRvcCAtIGRydkJvdHRvbSkvKDIqc3RlcCk7XG59XG5cbmZ1bmN0aW9uIGdldEF1YyhmaXR0ZWRDdXJ2ZTogKHg6IG51bWJlcikgPT4gbnVtYmVyLCBcbiAgICAgICAgICAgICAgICBkYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSk6IG51bWJlciB7XG4gIGxldCBhdWMgPSAwO1xuICBjb25zdCBpbnRlZ3JhdGlvblN0ZXAgPSAwLjAwMDAxO1xuICBsZXQgbWluID0gTWF0aC5taW4oLi4uZGF0YS54KTtcbiAgbGV0IG1heCA9IE1hdGgubWF4KC4uLmRhdGEueCk7XG5cblxuICBmb3IobGV0IHggPSBtaW47IHggPCBtYXg7IHgrPSBpbnRlZ3JhdGlvblN0ZXApXG4gICAgYXVjICs9IGludGVncmF0aW9uU3RlcCpmaXR0ZWRDdXJ2ZSh4KTtcblxuICByZXR1cm4gYXVjO1xufVxuXG5mdW5jdGlvbiBnZXREZXRDb2VmZihmaXR0ZWRDdXJ2ZTogKHg6IG51bWJlcikgPT4gbnVtYmVyLCBcbiAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHt4OiBudW1iZXJbXSwgeTogbnVtYmVyW119KTogbnVtYmVyIHtcbiAgbGV0IHNzUmVzID0gMDtcbiAgbGV0IHNzVG90ID0gMDtcbiAgXG4gIGNvbnN0IHlNZWFuID0galN0YXQubWVhbihkYXRhLnkpO1xuXG4gIGZvcihsZXQgaSA9IDA7IGkgPCBkYXRhLngubGVuZ3RoOyBpKyspIHtcbiAgICBzc1JlcyArPSBNYXRoLnBvdyhkYXRhLnlbaV0gLSBmaXR0ZWRDdXJ2ZShkYXRhLnhbaV0pLCAyKTtcbiAgICBzc1RvdCArPSBNYXRoLnBvdyhkYXRhLnlbaV0gLSB5TWVhbiwgMik7XG4gIH1cblxuICByZXR1cm4gMSAtIHNzUmVzL3NzVG90O1xufVxuXG5cbmZ1bmN0aW9uIG9iamVjdGl2ZU5vcm1hbENvbnN0YW50IChcbiAgdGFyZ2V0RnVuYzogKHBhcmFtczogbnVtYmVyW10sIHg6IG51bWJlcikgPT4gbnVtYmVyLCBcbiAgZGF0YToge3k6IG51bWJlcltdLCB4OiBudW1iZXJbXX0sXG4gIHBhcmFtczogbnVtYmVyW11cbik6IExpa2VsaWhvb2Qge1xuICAvL2Fzc3VyZSBvYnNlcnZlZCBhbmQgYXJncyBzYW1lIGxlbmd0aFxuICBjb25zdCBwaSA9IE1hdGguUEk7XG4gIGxldCBzaWdtYSA9IDA7XG4gIGxldCBzaWdtYVNxID0gMDtcbiAgbGV0IGxpa2VsaWhvb2QgPSAwO1xuXG4gIGxldCByZXNpZHVlc1NxdWFyZXMgPSBuZXcgRmxvYXQzMkFycmF5KGRhdGEueC5sZW5ndGgpO1xuICBmb3IobGV0IGkgPSAwOyBpIDwgZGF0YS54Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgb2JzID0gZGF0YS55W2ldO1xuICAgIGNvbnN0IHByZWQgPSB0YXJnZXRGdW5jKHBhcmFtcywgZGF0YS54W2ldKTtcbiAgICByZXNpZHVlc1NxdWFyZXNbaV0gPSBNYXRoLnBvdyhvYnMgLSBwcmVkLCAyKTtcbiAgfVxuXG4gIGZvcihsZXQgaSA9IDA7IGkgPCByZXNpZHVlc1NxdWFyZXMubGVuZ3RoOyBpKyspXG4gICAgc2lnbWFTcSArPSByZXNpZHVlc1NxdWFyZXNbaV07XG4gIHNpZ21hU3EgLz0gcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aDtcbiAgc2lnbWEgPSBNYXRoLnNxcnQoc2lnbWFTcSk7XG5cbiAgZm9yKGxldCBpID0gMDsgaSA8IHJlc2lkdWVzU3F1YXJlcy5sZW5ndGg7IGkrKylcbiAgICBsaWtlbGlob29kICs9IHJlc2lkdWVzU3F1YXJlc1tpXS9zaWdtYVNxICsgTWF0aC5sb2coMiAqIHBpICogc2lnbWFTcSk7XG5cbiAgcmV0dXJuIHt2YWx1ZTogLWxpa2VsaWhvb2QsIGNvbnN0OiBzaWdtYSwgbXVsdDogMH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxufVxuXG5mdW5jdGlvbiBvYmplY3RpdmVOb3JtYWxQcm9wb3J0aW9uYWwgKFxudGFyZ2V0RnVuYzogKHBhcmFtczogbnVtYmVyW10sIHg6IG51bWJlcikgPT4gbnVtYmVyLCBcbmRhdGE6IHt5OiBudW1iZXJbXSwgeDogbnVtYmVyW119LFxucGFyYW1zOiBudW1iZXJbXVxuKTogTGlrZWxpaG9vZCB7XG4gIC8vYXNzdXJlIG9ic2VydmVkIGFuZCBhcmdzIHNhbWUgbGVuZ3RoXG4gIGNvbnN0IHBpID0gTWF0aC5QSTtcbiAgbGV0IHNpZ21hID0gMDtcbiAgbGV0IHNpZ21hU3EgPSAwO1xuICBsZXQgbGlrZWxpaG9vZCA9IDA7XG5cbiAgbGV0IHJlc2lkdWVzU3F1YXJlcyA9IG5ldyBGbG9hdDMyQXJyYXkoZGF0YS54Lmxlbmd0aCk7XG4gIGZvcihsZXQgaSA9IDA7IGkgPCBkYXRhLngubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBvYnMgPSBkYXRhLnlbaV07XG4gICAgY29uc3QgcHJlZCA9IHRhcmdldEZ1bmMocGFyYW1zLCBkYXRhLnhbaV0pXG4gICAgcmVzaWR1ZXNTcXVhcmVzW2ldID0gTWF0aC5wb3cob2JzIC0gcHJlZCwgMik7XG4gIH1cblxuICBmb3IobGV0IGkgPSAwOyBpIDwgcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aDsgaSsrKVxuICAgIHNpZ21hU3EgKz0gcmVzaWR1ZXNTcXVhcmVzW2ldO1xuICBzaWdtYVNxIC89IHJlc2lkdWVzU3F1YXJlcy5sZW5ndGg7XG4gIHNpZ21hID0gTWF0aC5zcXJ0KHNpZ21hU3EpO1xuXG4gIGZvcihsZXQgaSA9IDA7IGkgPCByZXNpZHVlc1NxdWFyZXMubGVuZ3RoOyBpKyspXG4gICAgbGlrZWxpaG9vZCArPSByZXNpZHVlc1NxdWFyZXNbaV0vc2lnbWFTcSArIE1hdGgubG9nKDIqcGkqc2lnbWFTcSk7XG5cbiAgcmV0dXJuIHt2YWx1ZTogLWxpa2VsaWhvb2QsIGNvbnN0OiBzaWdtYSwgbXVsdDogMH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxufVxuIl19
|
|
196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml0LWN1cnZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZml0LWN1cnZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ25ELHNCQUFzQjtBQUN0QixPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDbkQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBaUI1Qyw0R0FBNEc7QUFDNUcsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWU7SUFDN0MsUUFBUSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNuQyxRQUFRLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDO0NBQy9CLENBQUM7QUFNRixNQUFNLENBQU4sSUFBWSxhQUdYO0FBSEQsV0FBWSxhQUFhO0lBQ3ZCLHlEQUFRLENBQUE7SUFDUixpRUFBWSxDQUFBO0FBQ2QsQ0FBQyxFQUhXLGFBQWEsS0FBYixhQUFhLFFBR3hCO0FBRUQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsU0FBUyxDQUFDO0FBQzlDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQztBQUk1QyxNQUFlLFdBQVc7Q0FLekI7QUFHRCxNQUFNLGNBQWUsU0FBUSxXQUFXO0lBQ3RDLElBQUksSUFBSSxLQUFhLE9BQU8sbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBRWxELElBQUksY0FBYztRQUNoQixPQUFPLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxDQUFDLENBQUMsTUFBZ0IsRUFBRSxDQUFTO1FBQzNCLE1BQU0saUJBQWlCLENBQUM7SUFDMUIsQ0FBQztJQUVELG9CQUFvQixDQUFDLENBQVcsRUFBRSxD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VUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBQyxDQUFDO0FBQ3JELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2xpbWl0ZWRNZW1vcnlCRkdTfSBmcm9tIFwiLi4vLi4vbGJmZ3MvbGJmZ3NcIlxuLy9AdHMtaWdub3JlOiBubyB0eXBlc1xuaW1wb3J0ICogYXMgalN0YXQgZnJvbSAnanN0YXQnO1xuaW1wb3J0IHtQcm9wZXJ0eX0gZnJvbSBcImRhdGFncm9rLWFwaS9zcmMvZW50aXRpZXNcIjtcbmltcG9ydCB7VFlQRX0gZnJvbSBcImRhdGFncm9rLWFwaS9zcmMvY29uc3RcIjtcblxudHlwZSBMaWtlbGlob29kID0ge1xuICB2YWx1ZTogbnVtYmVyLCBcbiAgY29uc3Q6IG51bWJlciwgXG4gIG11bHQ6IG51bWJlclxufTtcblxuZXhwb3J0IHR5cGUgRml0UmVzdWx0ID0ge1xuICBwYXJhbWV0ZXJzOiBudW1iZXJbXSxcbiAgZml0dGVkQ3VydmU6ICh4Om51bWJlcik9PiBudW1iZXIsXG4gIGNvbmZpZGVuY2VUb3A6ICh4Om51bWJlcik9PiBudW1iZXIsXG4gIGNvbmZpZGVuY2VCb3R0b206ICh4Om51bWJlcik9PiBudW1iZXIsXG4gIHJTcXVhcmVkPzogbnVtYmVyLFxuICBhdWM/OiBudW1iZXI7XG59O1xuXG4vKiogUHJvcGVydGllcyB0aGF0IGRlc2NyaWJlIHtAbGluayBGaXRSZXN1bHR9LiBVc2VmdWwgZm9yIGVkaXRpbmcsIGluaXRpYWxpemF0aW9uLCB0cmFuc2Zvcm1hdGlvbnMsIGV0Yy4gKi9cbmV4cG9ydCBjb25zdCBmaXRSZXN1bHRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVtdID0gW1xuICBQcm9wZXJ0eS5qcygnclNxdWFyZWQnLCBUWVBFLkZMT0FUKSxcbiAgUHJvcGVydHkuanMoJ2F1YycsIFRZUEUuRkxPQVQpXG5dO1xuXG50eXBlIE9iamVjdGl2ZUZ1bmN0aW9uID0gKHRhcmdldEZ1bmM6IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlciwgXG5kYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSxcbnBhcmFtczogbnVtYmVyW10pID0+IExpa2VsaWhvb2Q7XG5cbmV4cG9ydCBlbnVtIEZpdEVycm9yTW9kZWwge1xuICBDb25zdGFudCxcbiAgUHJvcG9ydGlvbmFsXG59XG5cbmV4cG9ydCBjb25zdCBGSVRfRlVOQ1RJT05fU0lHTU9JRCA9ICdTaWdtb2lkJztcbmV4cG9ydCBjb25zdCBGSVRfRlVOQ1RJT05fTElORUFSID0gJ0xpbmVhcic7XG5cbmV4cG9ydCB0eXBlIEZpdEZ1bmN0aW9uVHlwZSA9ICdTaWdtb2lkJyB8ICdMaW5lYXInO1xuXG5hYnN0cmFjdCBjbGFzcyBGaXRGdW5jdGlvbiB7XG4gIGFic3RyYWN0IGdldCBuYW1lKCk6IHN0cmluZztcbiAgYWJzdHJhY3QgZ2V0IHBhcmFtZXRlck5hbWVzKCk6IHN0cmluZ1tdO1xuICBhYnN0cmFjdCB5KHBhcmFtczogbnVtYmVyW10sIHg6IG51bWJlcik6IG51bWJlcjtcbiAgYWJzdHJhY3QgZ2V0SW5pdGlhbFBhcmFtZXRlcnMoeDogbnVtYmVyW10sIHk6IG51bWJlcltdKTogbnVtYmVyW107XG59XG5cblxuY2xhc3MgTGluZWFyRnVuY3Rpb24gZXh0ZW5kcyBGaXRGdW5jdGlvbiB7XG4gIGdldCBuYW1lKCk6IHN0cmluZyB7IHJldHVybiBGSVRfRlVOQ1RJT05fTElORUFSOyB9XG5cbiAgZ2V0IHBhcmFtZXRlck5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydTbG9wZScsICdJbnRlcmNlcHQnXTtcbiAgfVxuXG4gIHkocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICB0aHJvdyAnTm90IGltcGxlbWVudGVkJztcbiAgfVxuXG4gIGdldEluaXRpYWxQYXJhbWV0ZXJzKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgICB0aHJvdyAnTm90IGltcGxlbWVudGVkJztcbiAgfVxufVxuXG5cbmNsYXNzIFNpZ21vaWRGdW5jdGlvbiBleHRlbmRzIEZpdEZ1bmN0aW9uIHtcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIEZJVF9GVU5DVElPTl9TSUdNT0lEOyB9XG5cbiAgZ2V0IHBhcmFtZXRlck5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydUb3AnLCAnQm90dG9tJywgJ1Nsb3BlJywgJ0lDNTAnXTtcbiAgfVxuXG4gIHkocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICB0aHJvdyAnTm90IGltcGxlbWVudGVkJztcbiAgfVxuXG4gIGdldEluaXRpYWxQYXJhbWV0ZXJzKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgICB0aHJvdyAnTm90IGltcGxlbWVudGVkJztcbiAgfVxufVxuXG5cbmV4cG9ydCBjb25zdCBmaXRGdW5jdGlvbnM6IHtbaW5kZXg6IHN0cmluZ106IGFueX0gPSB7XG4gIEZJVF9GVU5DVElPTl9MSU5FQVI6IG5ldyBMaW5lYXJGdW5jdGlvbigpLFxuICBGSVRfRlVOQ1RJT05fU0lHTU9JRDogbmV3IFNpZ21vaWRGdW5jdGlvbigpLFxufTtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElGaXRPcHRpb25zIHtcbiAgZXJyb3JNb2RlbDogRml0RXJyb3JNb2RlbDtcbiAgY29uZmlkZW5jZUxldmVsOiBudW1iZXI7XG4gIHN0YXRpc3RpY3M6IGJvb2xlYW47XG59XG5cblxuLyoqXG4gKiBzdGF0aXN0aWNzIC0gd2hldGhlciBvciBub3QgdG8gY2FsY3VsYXRlIGZpdCBzdGF0aXN0aWNzIChwb3RlbnRpYWxseSBjb21wdXRhdGlvbmFsbHkgaW50ZW5zaXZlKVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXQoZGF0YTp7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSwgXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgIGN1cnZlRnVuY3Rpb246IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlciwgXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTW9kZWw6IEZpdEVycm9yTW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2VMZXZlbDogbnVtYmVyID0gMC4wNSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGlzdGljczogYm9vbGVhbiA9IHRydWUpOiBGaXRSZXN1bHQge1xuXG4gIGxldCBvZjogT2JqZWN0aXZlRnVuY3Rpb247XG4gIHN3aXRjaChlcnJvck1vZGVsKSB7XG4gICAgY2FzZSBGaXRFcnJvck1vZGVsLkNvbnN0YW50OlxuICAgICAgb2YgPSBvYmplY3RpdmVOb3JtYWxDb25zdGFudDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRml0RXJyb3JNb2RlbC5Qcm9wb3J0aW9uYWw6XG4gICAgICBvZiA9IG9iamVjdGl2ZU5vcm1hbFByb3BvcnRpb25hbDtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBvZiA9IG9iamVjdGl2ZU5vcm1hbENvbnN0YW50O1xuICAgICAgYnJlYWs7XG4gIH1cblxuICBsZXQgaXRlcmF0aW9ucyA9IDA7XG5cbiAgbGV0IG9wdGltaXphYmxlID0ge1xuICAgIGdldFZhbHVlOiAocGFyYW1ldGVyczogbnVtYmVyW10pID0+IHtcbiAgICAgIHJldHVybiBvZihjdXJ2ZUZ1bmN0aW9uLCBkYXRhLCBwYXJhbWV0ZXJzKS52YWx1ZTtcbiAgICB9LFxuICAgIGdldEdyYWRpZW50OiAocGFyYW1ldGVyczogbnVtYmVyW10sIGdyYWRpZW50OiBudW1iZXJbXSkgPT4ge1xuICAgICAgY29uc3QgbGVuZ3RoID0gT2JqZWN0LmtleXMocGFyYW1ldGVycykubGVuZ3RoO1xuICAgICAgaXRlcmF0aW9ucysrO1xuICAgICAgXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspXG4gICAgICAgIGdyYWRpZW50W2ldID0gZ2V0T2JqZWN0aXZlRGVyaXZhdGl2ZShvZiwgY3VydmVGdW5jdGlvbiwgZGF0YSwgcGFyYW1ldGVycywgaSk7XG5cbiAgICAgIHJldHVybiBncmFkaWVudDtcbiAgICB9XG4gIH07XG5cbiAgbGltaXRlZE1lbW9yeUJGR1Mob3B0aW1pemFibGUsIHBhcmFtcyk7XG4gIGxpbWl0ZWRNZW1vcnlCRkdTKG9wdGltaXphYmxlLCBwYXJhbXMpO1xuXG4gIGxldCBmaXR0ZWRDdXJ2ZSA9ICh4OiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gY3VydmVGdW5jdGlvbihwYXJhbXMsIHgpO1xuICB9XG5cbiAgbGV0IGVycm9yID0gZXJyb3JNb2RlbCA9PSBGaXRFcnJvck1vZGVsLlByb3BvcnRpb25hbCA/XG4gIG9mKGN1cnZlRnVuY3Rpb24sIGRhdGEsIHBhcmFtcykubXVsdCA6XG4gIG9mKGN1cnZlRnVuY3Rpb24sIGRhdGEsIHBhcmFtcykuY29uc3Q7XG5cbiAgbGV0IHN0dWRlbnRRID0galN0YXQuc3R1ZGVudHQuaW52KDEgLSBjb25maWRlbmNlTGV2ZWwvMiwgZGF0YS54Lmxlbmd0aCAtIHBhcmFtcy5sZW5ndGgpO1xuXG4gIGxldCB0b3AgPSAoeDogbnVtYmVyKSA9PntcbiAgICBsZXQgdmFsdWUgPSBjdXJ2ZUZ1bmN0aW9uKHBhcmFtcywgeCk7XG4gICAgaWYgKGVycm9yTW9kZWwgPT0gRml0RXJyb3JNb2RlbC5Db25zdGFudClcbiAgICAgIHJldHVybiAgdmFsdWUgKyBzdHVkZW50USplcnJvci9NYXRoLnNxcnQoZGF0YS54Lmxlbmd0aCk7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuICB2YWx1ZSArIHN0dWRlbnRRKihNYXRoLmFicyh2YWx1ZSkqZXJyb3IvTWF0aC5zcXJ0KGRhdGEueC5sZW5ndGgpKTtcbiAgfVxuXG4gIGxldCBib3R0b20gPSAoeDogbnVtYmVyKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gY3VydmVGdW5jdGlvbihwYXJhbXMsIHgpO1xuICAgIGlmIChlcnJvck1vZGVsID09IEZpdEVycm9yTW9kZWwuQ29uc3RhbnQpXG4gICAgICByZXR1cm4gIHZhbHVlIC0gc3R1ZGVudFEqZXJyb3IvTWF0aC5zcXJ0KGRhdGEueC5sZW5ndGgpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiAgdmFsdWUgLSBzdHVkZW50USooTWF0aC5hYnModmFsdWUpKmVycm9yL01hdGguc3FydChkYXRhLngubGVuZ3RoKSk7XG4gIH1cblxuICBsZXQgZml0UmVzOiBGaXRSZXN1bHQgPSB7XG4gICAgcGFyYW1ldGVyczogcGFyYW1zLFxuICAgIGZpdHRlZEN1cnZlOiBmaXR0ZWRDdXJ2ZSxcbiAgICBjb25maWRlbmNlVG9wOiB0b3AsXG4gICAgY29uZmlkZW5jZUJvdHRvbTogYm90dG9tLFxuICAgIHJTcXVhcmVkOiBzdGF0aXN0aWNzID8gZ2V0RGV0Q29lZmYoZml0dGVkQ3VydmUsIGRhdGEpIDogdW5kZWZpbmVkLFxuICAgIGF1Yzogc3RhdGlzdGljcyA/IGdldEF1YyhmaXR0ZWRDdXJ2ZSwgZGF0YSkgOiB1bmRlZmluZWRcbiAgfTtcblxuICByZXR1cm4gZml0UmVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2lnbW9pZChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBBID0gcGFyYW1zWzBdO1xuICBjb25zdCBCID0gcGFyYW1zWzFdO1xuICBjb25zdCBDID0gcGFyYW1zWzJdO1xuICBjb25zdCBEID0gcGFyYW1zWzNdO1xuICBjb25zdCByZXMgPSBEICsgKEEgLSBEKS8oMSArIE1hdGgucG93KDEwLCAoeCAtIEMpKkIpKTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gZ2V0T2JqZWN0aXZlRGVyaXZhdGl2ZShvZjogT2JqZWN0aXZlRnVuY3Rpb24sIGN1cnZlRnVuY3Rpb246IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlciwgXG4gICAgZGF0YToge3g6IG51bWJlcltdLCB5OiBudW1iZXJbXX0sIHBhcmFtczogbnVtYmVyW10sIHNlbGVjdGVkUGFyYW06IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBzdGVwID0gcGFyYW1zW3NlbGVjdGVkUGFyYW1dKjAuMDAwMTtcbiAgc3RlcCA9IHN0ZXAgPT0gMCA/IDAuMDAxIDogc3RlcDsgXG4gIGxldCBwYXJhbXNUb3A6IG51bWJlcltdID0gW107XG4gIGxldCBwYXJhbXNCb3R0b206IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYoaSA9PSBzZWxlY3RlZFBhcmFtKSB7XG4gICAgICBwYXJhbXNUb3AucHVzaChwYXJhbXNbaV0gKyBzdGVwKTtcbiAgICAgIHBhcmFtc0JvdHRvbS5wdXNoKHBhcmFtc1tpXSAtIHN0ZXApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbXNUb3AucHVzaChwYXJhbXNbaV0pO1xuICAgICAgcGFyYW1zQm90dG9tLnB1c2gocGFyYW1zW2ldKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZHJ2VG9wID0gb2YoY3VydmVGdW5jdGlvbiwgZGF0YSwgcGFyYW1zVG9wKS52YWx1ZTtcbiAgY29uc3QgZHJ2Qm90dG9tID0gb2YoY3VydmVGdW5jdGlvbiwgZGF0YSwgcGFyYW1zQm90dG9tKS52YWx1ZTtcblxuICByZXR1cm4gKGRydlRvcCAtIGRydkJvdHRvbSkvKDIqc3RlcCk7XG59XG5cbmZ1bmN0aW9uIGdldEF1YyhmaXR0ZWRDdXJ2ZTogKHg6IG51bWJlcikgPT4gbnVtYmVyLCBcbiAgICAgICAgICAgICAgICBkYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSk6IG51bWJlciB7XG4gIGxldCBhdWMgPSAwO1xuICBjb25zdCBpbnRlZ3JhdGlvblN0ZXAgPSAwLjAwMTtcbiAgbGV0IG1pbiA9IE1hdGgubWluKC4uLmRhdGEueCk7XG4gIGxldCBtYXggPSBNYXRoLm1heCguLi5kYXRhLngpO1xuXG5cbiAgZm9yKGxldCB4ID0gbWluOyB4IDwgbWF4OyB4Kz0gaW50ZWdyYXRpb25TdGVwKVxuICAgIGF1YyArPSBpbnRlZ3JhdGlvblN0ZXAqZml0dGVkQ3VydmUoeCk7XG5cbiAgcmV0dXJuIGF1Yztcbn1cblxuZnVuY3Rpb24gZ2V0RGV0Q29lZmYoZml0dGVkQ3VydmU6ICh4OiBudW1iZXIpID0+IG51bWJlciwgXG4gICAgICAgICAgICAgICAgICAgICBkYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSk6IG51bWJlciB7XG4gIGxldCBzc1JlcyA9IDA7XG4gIGxldCBzc1RvdCA9IDA7XG4gIFxuICBjb25zdCB5TWVhbiA9IGpTdGF0Lm1lYW4oZGF0YS55KTtcblxuICBmb3IobGV0IGkgPSAwOyBpIDwgZGF0YS54Lmxlbmd0aDsgaSsrKSB7XG4gICAgc3NSZXMgKz0gTWF0aC5wb3coZGF0YS55W2ldIC0gZml0dGVkQ3VydmUoZGF0YS54W2ldKSwgMik7XG4gICAgc3NUb3QgKz0gTWF0aC5wb3coZGF0YS55W2ldIC0geU1lYW4sIDIpO1xuICB9XG5cbiAgcmV0dXJuIDEgLSBzc1Jlcy9zc1RvdDtcbn1cblxuXG5mdW5jdGlvbiBvYmplY3RpdmVOb3JtYWxDb25zdGFudCAoXG4gIHRhcmdldEZ1bmM6IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlciwgXG4gIGRhdGE6IHt5OiBudW1iZXJbXSwgeDogbnVtYmVyW119LFxuICBwYXJhbXM6IG51bWJlcltdXG4pOiBMaWtlbGlob29kIHtcbiAgLy9hc3N1cmUgb2JzZXJ2ZWQgYW5kIGFyZ3Mgc2FtZSBsZW5ndGhcbiAgY29uc3QgcGkgPSBNYXRoLlBJO1xuICBsZXQgc2lnbWEgPSAwO1xuICBsZXQgc2lnbWFTcSA9IDA7XG4gIGxldCBsaWtlbGlob29kID0gMDtcblxuICBsZXQgcmVzaWR1ZXNTcXVhcmVzID0gbmV3IEZsb2F0MzJBcnJheShkYXRhLngubGVuZ3RoKTtcbiAgZm9yKGxldCBpID0gMDsgaSA8IGRhdGEueC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG9icyA9IGRhdGEueVtpXTtcbiAgICBjb25zdCBwcmVkID0gdGFyZ2V0RnVuYyhwYXJhbXMsIGRhdGEueFtpXSk7XG4gICAgcmVzaWR1ZXNTcXVhcmVzW2ldID0gTWF0aC5wb3cob2JzIC0gcHJlZCwgMik7XG4gIH1cblxuICBmb3IobGV0IGkgPSAwOyBpIDwgcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aDsgaSsrKVxuICAgIHNpZ21hU3EgKz0gcmVzaWR1ZXNTcXVhcmVzW2ldO1xuICBzaWdtYVNxIC89IHJlc2lkdWVzU3F1YXJlcy5sZW5ndGg7XG4gIHNpZ21hID0gTWF0aC5zcXJ0KHNpZ21hU3EpO1xuXG4gIGZvcihsZXQgaSA9IDA7IGkgPCByZXNpZHVlc1NxdWFyZXMubGVuZ3RoOyBpKyspXG4gICAgbGlrZWxpaG9vZCArPSByZXNpZHVlc1NxdWFyZXNbaV0vc2lnbWFTcSArIE1hdGgubG9nKDIgKiBwaSAqIHNpZ21hU3EpO1xuXG4gIHJldHVybiB7dmFsdWU6IC1saWtlbGlob29kLCBjb25zdDogc2lnbWEsIG11bHQ6IDB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbn1cblxuZnVuY3Rpb24gb2JqZWN0aXZlTm9ybWFsUHJvcG9ydGlvbmFsIChcbnRhcmdldEZ1bmM6IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlciwgXG5kYXRhOiB7eTogbnVtYmVyW10sIHg6IG51bWJlcltdfSxcbnBhcmFtczogbnVtYmVyW11cbik6IExpa2VsaWhvb2Qge1xuICAvL2Fzc3VyZSBvYnNlcnZlZCBhbmQgYXJncyBzYW1lIGxlbmd0aFxuICBjb25zdCBwaSA9IE1hdGguUEk7XG4gIGxldCBzaWdtYSA9IDA7XG4gIGxldCBzaWdtYVNxID0gMDtcbiAgbGV0IGxpa2VsaWhvb2QgPSAwO1xuXG4gIGxldCByZXNpZHVlc1NxdWFyZXMgPSBuZXcgRmxvYXQzMkFycmF5KGRhdGEueC5sZW5ndGgpO1xuICBmb3IobGV0IGkgPSAwOyBpIDwgZGF0YS54Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgb2JzID0gZGF0YS55W2ldO1xuICAgIGNvbnN0IHByZWQgPSB0YXJnZXRGdW5jKHBhcmFtcywgZGF0YS54W2ldKVxuICAgIHJlc2lkdWVzU3F1YXJlc1tpXSA9IE1hdGgucG93KG9icyAtIHByZWQsIDIpO1xuICB9XG5cbiAgZm9yKGxldCBpID0gMDsgaSA8IHJlc2lkdWVzU3F1YXJlcy5sZW5ndGg7IGkrKylcbiAgICBzaWdtYVNxICs9IHJlc2lkdWVzU3F1YXJlc1tpXTtcbiAgc2lnbWFTcSAvPSByZXNpZHVlc1NxdWFyZXMubGVuZ3RoO1xuICBzaWdtYSA9IE1hdGguc3FydChzaWdtYVNxKTtcblxuICBmb3IobGV0IGkgPSAwOyBpIDwgcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aDsgaSsrKVxuICAgIGxpa2VsaWhvb2QgKz0gcmVzaWR1ZXNTcXVhcmVzW2ldL3NpZ21hU3EgKyBNYXRoLmxvZygyKnBpKnNpZ21hU3EpO1xuXG4gIHJldHVybiB7dmFsdWU6IC1saWtlbGlob29kLCBjb25zdDogc2lnbWEsIG11bHQ6IDB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbn1cbiJdfQ==
|