@rio-cloud/cdk-v2-constructs 9.0.0-alpha.8 → 9.0.0-alpha.9
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/.jsii +883 -183
- package/README.md +65 -0
- package/docs/AGENTS_DOCUMENTATION.md +80 -14
- package/lib/fargate/datadog.d.ts +4 -1
- package/lib/fargate/datadog.js +6 -3
- package/lib/fargate/rio-fargate-service-blue-green-alpha.js +6 -1
- package/lib/fargate/rio-fargate-service.d.ts +22 -1
- package/lib/fargate/rio-fargate-service.js +11 -2
- package/lib/fargate/trace-sampling.d.ts +87 -0
- package/lib/fargate/trace-sampling.js +123 -0
- package/package.json +1 -1
- package/version.json +1 -1
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type * as constructs from 'constructs';
|
|
2
|
+
/**
|
|
3
|
+
* The trace sampling strategy used by the Fargate Datadog integration.
|
|
4
|
+
*/
|
|
5
|
+
export declare enum TraceSamplingMode {
|
|
6
|
+
/**
|
|
7
|
+
* Use RIO's per-Agent head-sampling target of 5 traces/sec and an additional
|
|
8
|
+
* error-sampling budget of 10 local error trace chunks/sec.
|
|
9
|
+
* Target-per-second sampling is a practical default for both low- and
|
|
10
|
+
* high-traffic services.
|
|
11
|
+
*/
|
|
12
|
+
DEFAULT = 0,
|
|
13
|
+
/** Do not set sampling environment variables; retain Datadog's defaults. */
|
|
14
|
+
DATADOG_DEFAULT = 1,
|
|
15
|
+
/** Set a fixed sampling rule on the application tracer. */
|
|
16
|
+
FIXED_RATE = 2,
|
|
17
|
+
/** Set a per-Agent target number of traces per second. */
|
|
18
|
+
TARGET_PER_SECOND = 3
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Use RIO's default Datadog Agent sampling targets.
|
|
22
|
+
*
|
|
23
|
+
* This is also the default when `traceSampling` is omitted.
|
|
24
|
+
*/
|
|
25
|
+
export interface RioDefaultTraceSamplingOptions {
|
|
26
|
+
/**
|
|
27
|
+
* The sampling strategy. May be omitted to use the default.
|
|
28
|
+
*
|
|
29
|
+
* @defaultValue - `TraceSamplingMode.DEFAULT`
|
|
30
|
+
*/
|
|
31
|
+
readonly mode?: TraceSamplingMode.DEFAULT;
|
|
32
|
+
}
|
|
33
|
+
/** Do not set sampling environment variables; retain Datadog's defaults. */
|
|
34
|
+
export interface DatadogDefaultTraceSamplingOptions {
|
|
35
|
+
/** The sampling strategy. */
|
|
36
|
+
readonly mode: TraceSamplingMode.DATADOG_DEFAULT;
|
|
37
|
+
}
|
|
38
|
+
/** Configure a fixed application-tracer sampling rate. */
|
|
39
|
+
export interface FixedRateTraceSamplingOptions {
|
|
40
|
+
/** The sampling strategy. */
|
|
41
|
+
readonly mode: TraceSamplingMode.FIXED_RATE;
|
|
42
|
+
/**
|
|
43
|
+
* The global tracer sampling-rule rate, from 0.0 to 1.0 inclusive.
|
|
44
|
+
* Datadog tracers additionally apply their built-in 100-traces-per-second
|
|
45
|
+
* rate limit when sampling rules are configured. This construct does not
|
|
46
|
+
* expose or override that per-instance safeguard.
|
|
47
|
+
*/
|
|
48
|
+
readonly fixedRate: number;
|
|
49
|
+
}
|
|
50
|
+
/** Configure Datadog Agent target sampling. */
|
|
51
|
+
export interface TargetPerSecondTraceSamplingOptions {
|
|
52
|
+
/** The sampling strategy. */
|
|
53
|
+
readonly mode: TraceSamplingMode.TARGET_PER_SECOND;
|
|
54
|
+
/**
|
|
55
|
+
* The average head-sampling target in traces per second for each Agent
|
|
56
|
+
* sidecar (and therefore each Fargate service instance). Traffic spikes
|
|
57
|
+
* can exceed this target; it is not a hard cap on total ingestion.
|
|
58
|
+
*/
|
|
59
|
+
readonly targetTracesPerSecond: number;
|
|
60
|
+
/**
|
|
61
|
+
* The budget for additional local error trace chunks per second missed by
|
|
62
|
+
* head sampling, for each Agent sidecar (and therefore each Fargate service
|
|
63
|
+
* instance). This does not cap error traces already kept by head sampling.
|
|
64
|
+
*/
|
|
65
|
+
readonly errorTracesPerSecond?: number;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Options for configuring Datadog APM trace sampling.
|
|
69
|
+
*
|
|
70
|
+
* This discriminated union makes mode-specific settings invalid in TypeScript
|
|
71
|
+
* before synthesis. Numeric ranges are checked during synthesis.
|
|
72
|
+
*/
|
|
73
|
+
export type TraceSamplingOptions = RioDefaultTraceSamplingOptions | DatadogDefaultTraceSamplingOptions | FixedRateTraceSamplingOptions | TargetPerSecondTraceSamplingOptions;
|
|
74
|
+
export declare class TraceSamplingValidator implements constructs.IValidation {
|
|
75
|
+
private readonly traceSampling?;
|
|
76
|
+
constructor(traceSampling?: TraceSamplingOptions | undefined);
|
|
77
|
+
validate(): string[];
|
|
78
|
+
}
|
|
79
|
+
export declare function addTraceSamplingEnvironmentWarning(scope: constructs.Construct, environment: {
|
|
80
|
+
[key: string]: string;
|
|
81
|
+
} | undefined): void;
|
|
82
|
+
export declare function getApplicationTraceSamplingEnvironment(traceSampling?: TraceSamplingOptions): {
|
|
83
|
+
[key: string]: string;
|
|
84
|
+
};
|
|
85
|
+
export declare function getAgentTraceSamplingEnvironment(traceSampling?: TraceSamplingOptions): {
|
|
86
|
+
[key: string]: string;
|
|
87
|
+
};
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.TraceSamplingValidator = exports.TraceSamplingMode = void 0;
|
|
5
|
+
exports.addTraceSamplingEnvironmentWarning = addTraceSamplingEnvironmentWarning;
|
|
6
|
+
exports.getApplicationTraceSamplingEnvironment = getApplicationTraceSamplingEnvironment;
|
|
7
|
+
exports.getAgentTraceSamplingEnvironment = getAgentTraceSamplingEnvironment;
|
|
8
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
9
|
+
const cdk = require("aws-cdk-lib");
|
|
10
|
+
/**
|
|
11
|
+
* The trace sampling strategy used by the Fargate Datadog integration.
|
|
12
|
+
*/
|
|
13
|
+
var TraceSamplingMode;
|
|
14
|
+
(function (TraceSamplingMode) {
|
|
15
|
+
/**
|
|
16
|
+
* Use RIO's per-Agent head-sampling target of 5 traces/sec and an additional
|
|
17
|
+
* error-sampling budget of 10 local error trace chunks/sec.
|
|
18
|
+
* Target-per-second sampling is a practical default for both low- and
|
|
19
|
+
* high-traffic services.
|
|
20
|
+
*/
|
|
21
|
+
TraceSamplingMode[TraceSamplingMode["DEFAULT"] = 0] = "DEFAULT";
|
|
22
|
+
/** Do not set sampling environment variables; retain Datadog's defaults. */
|
|
23
|
+
TraceSamplingMode[TraceSamplingMode["DATADOG_DEFAULT"] = 1] = "DATADOG_DEFAULT";
|
|
24
|
+
/** Set a fixed sampling rule on the application tracer. */
|
|
25
|
+
TraceSamplingMode[TraceSamplingMode["FIXED_RATE"] = 2] = "FIXED_RATE";
|
|
26
|
+
/** Set a per-Agent target number of traces per second. */
|
|
27
|
+
TraceSamplingMode[TraceSamplingMode["TARGET_PER_SECOND"] = 3] = "TARGET_PER_SECOND";
|
|
28
|
+
})(TraceSamplingMode || (exports.TraceSamplingMode = TraceSamplingMode = {}));
|
|
29
|
+
class TraceSamplingValidator {
|
|
30
|
+
constructor(traceSampling) {
|
|
31
|
+
this.traceSampling = traceSampling;
|
|
32
|
+
}
|
|
33
|
+
validate() {
|
|
34
|
+
const options = this.traceSampling;
|
|
35
|
+
if (!options) {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
// Keep validating the runtime shape: JavaScript consumers and TypeScript
|
|
39
|
+
// callers using a cast can bypass the discriminated union.
|
|
40
|
+
const values = options;
|
|
41
|
+
const mode = values.mode ?? TraceSamplingMode.DEFAULT;
|
|
42
|
+
const hasFixedRate = values.fixedRate !== undefined;
|
|
43
|
+
const hasTargetTps = values.targetTracesPerSecond !== undefined;
|
|
44
|
+
const hasErrorTps = values.errorTracesPerSecond !== undefined;
|
|
45
|
+
const errors = [];
|
|
46
|
+
const isNonNegativeInteger = (value) => value !== undefined && Number.isInteger(value) && value >= 0;
|
|
47
|
+
if (mode === TraceSamplingMode.DEFAULT || mode === TraceSamplingMode.DATADOG_DEFAULT) {
|
|
48
|
+
if (hasFixedRate || hasTargetTps || hasErrorTps) {
|
|
49
|
+
errors.push(`${TraceSamplingMode[mode]} does not accept fixedRate, targetTracesPerSecond, or errorTracesPerSecond.`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else if (mode === TraceSamplingMode.FIXED_RATE) {
|
|
53
|
+
const fixedRate = values.fixedRate;
|
|
54
|
+
if (!hasFixedRate ||
|
|
55
|
+
fixedRate === undefined ||
|
|
56
|
+
!Number.isFinite(fixedRate) ||
|
|
57
|
+
fixedRate < 0.0 ||
|
|
58
|
+
fixedRate > 1.0) {
|
|
59
|
+
errors.push('FIXED_RATE requires fixedRate to be a number between 0 and 1 inclusive.');
|
|
60
|
+
}
|
|
61
|
+
if (hasTargetTps) {
|
|
62
|
+
errors.push('FIXED_RATE does not accept targetTracesPerSecond.');
|
|
63
|
+
}
|
|
64
|
+
if (hasErrorTps) {
|
|
65
|
+
errors.push('FIXED_RATE does not accept errorTracesPerSecond.');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (mode === TraceSamplingMode.TARGET_PER_SECOND) {
|
|
69
|
+
if (!isNonNegativeInteger(values.targetTracesPerSecond)) {
|
|
70
|
+
errors.push('TARGET_PER_SECOND requires targetTracesPerSecond to be a non-negative integer.');
|
|
71
|
+
}
|
|
72
|
+
if (hasFixedRate) {
|
|
73
|
+
errors.push('TARGET_PER_SECOND does not accept fixedRate.');
|
|
74
|
+
}
|
|
75
|
+
if (hasErrorTps && !isNonNegativeInteger(values.errorTracesPerSecond)) {
|
|
76
|
+
errors.push('TARGET_PER_SECOND errorTracesPerSecond must be a non-negative integer.');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
errors.push('traceSampling.mode must be a TraceSamplingMode value.');
|
|
81
|
+
}
|
|
82
|
+
return errors;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.TraceSamplingValidator = TraceSamplingValidator;
|
|
86
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
87
|
+
TraceSamplingValidator[_a] = { fqn: "@rio-cloud-internal/cdk-v2-constructs.TraceSamplingValidator", version: "0.0.0" };
|
|
88
|
+
function addTraceSamplingEnvironmentWarning(scope, environment) {
|
|
89
|
+
const samplingKeys = ['DD_TRACE_SAMPLING_RULES', 'DD_TRACE_SAMPLE_RATE', 'DD_APM_TARGET_TPS', 'DD_APM_ERROR_TPS'];
|
|
90
|
+
const configuredKeys = samplingKeys.filter(key => environment && key in environment);
|
|
91
|
+
if (configuredKeys.length > 0) {
|
|
92
|
+
cdk.Validations.of(scope).addWarning('@rio-cloud/cdk-v2-constructs:directTraceSamplingEnvironment', [
|
|
93
|
+
`Direct trace-sampling environment variable(s) detected: ${configuredKeys.join(', ')}.`,
|
|
94
|
+
'Recommended action: remove these variables to use the DEFAULT sampling policy.',
|
|
95
|
+
'To select a different policy, configure datadogOptions.traceSampling explicitly.',
|
|
96
|
+
'Direct sampling environment variables remain supported only for backwards compatibility. Users who choose them are responsible for their compatibility and maintenance.',
|
|
97
|
+
].join('\n'));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function getApplicationTraceSamplingEnvironment(traceSampling) {
|
|
101
|
+
if (traceSampling?.mode === TraceSamplingMode.FIXED_RATE) {
|
|
102
|
+
const rules = [{ sample_rate: traceSampling.fixedRate }];
|
|
103
|
+
return { DD_TRACE_SAMPLING_RULES: JSON.stringify(rules) };
|
|
104
|
+
}
|
|
105
|
+
return {};
|
|
106
|
+
}
|
|
107
|
+
function getAgentTraceSamplingEnvironment(traceSampling) {
|
|
108
|
+
if (traceSampling?.mode === undefined || traceSampling.mode === TraceSamplingMode.DEFAULT) {
|
|
109
|
+
return { DD_APM_TARGET_TPS: '5', DD_APM_ERROR_TPS: '10' };
|
|
110
|
+
}
|
|
111
|
+
if (traceSampling?.mode === TraceSamplingMode.TARGET_PER_SECOND) {
|
|
112
|
+
const environment = {};
|
|
113
|
+
if (traceSampling.targetTracesPerSecond !== undefined) {
|
|
114
|
+
environment.DD_APM_TARGET_TPS = String(traceSampling.targetTracesPerSecond);
|
|
115
|
+
}
|
|
116
|
+
if (traceSampling.errorTracesPerSecond !== undefined) {
|
|
117
|
+
environment.DD_APM_ERROR_TPS = String(traceSampling.errorTracesPerSecond);
|
|
118
|
+
}
|
|
119
|
+
return environment;
|
|
120
|
+
}
|
|
121
|
+
return {};
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2Utc2FtcGxpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmFyZ2F0ZS90cmFjZS1zYW1wbGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBZ0tBLGdGQWlCQztBQUVELHdGQVFDO0FBRUQsNEVBZUM7O0FBNU1ELG1DQUFtQztBQUduQzs7R0FFRztBQUNILElBQVksaUJBaUJYO0FBakJELFdBQVksaUJBQWlCO0lBQzNCOzs7OztPQUtHO0lBQ0gsK0RBQU8sQ0FBQTtJQUVQLDRFQUE0RTtJQUM1RSwrRUFBZSxDQUFBO0lBRWYsMkRBQTJEO0lBQzNELHFFQUFVLENBQUE7SUFFViwwREFBMEQ7SUFDMUQsbUZBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQWpCVyxpQkFBaUIsaUNBQWpCLGlCQUFpQixRQWlCNUI7QUE0RUQsTUFBYSxzQkFBc0I7SUFDakMsWUFBNkIsYUFBb0M7UUFBcEMsa0JBQWEsR0FBYixhQUFhLENBQXVCO0lBQUcsQ0FBQztJQUVyRSxRQUFRO1FBQ04sTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCx5RUFBeUU7UUFDekUsMkRBQTJEO1FBQzNELE1BQU0sTUFBTSxHQUFHLE9BQThCLENBQUM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7UUFDdEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7UUFDcEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixLQUFLLFNBQVMsQ0FBQztRQUNoRSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsb0JBQW9CLEtBQUssU0FBUyxDQUFDO1FBQzlELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztRQUM1QixNQUFNLG9CQUFvQixHQUFHLENBQUMsS0FBeUIsRUFBRSxFQUFFLENBQ3pELEtBQUssS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBRS9ELElBQUksSUFBSSxLQUFLLGlCQUFpQixDQUFDLE9BQU8sSUFBSSxJQUFJLEtBQUssaUJBQWlCLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckYsSUFBSSxZQUFZLElBQUksWUFBWSxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoRCxNQUFNLENBQUMsSUFBSSxDQUNULEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLDZFQUE2RSxDQUN4RyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLElBQUksS0FBSyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNqRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1lBQ25DLElBQ0UsQ0FBQyxZQUFZO2dCQUNiLFNBQVMsS0FBSyxTQUFTO2dCQUN2QixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO2dCQUMzQixTQUFTLEdBQUcsR0FBRztnQkFDZixTQUFTLEdBQUcsR0FBRyxFQUNmLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyx5RUFBeUUsQ0FBQyxDQUFDO1lBQ3pGLENBQUM7WUFDRCxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxDQUFDLENBQUM7WUFDbkUsQ0FBQztZQUNELElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0RBQWtELENBQUMsQ0FBQztZQUNsRSxDQUFDO1FBQ0gsQ0FBQzthQUFNLElBQUksSUFBSSxLQUFLLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDeEQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hELE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0ZBQWdGLENBQUMsQ0FBQztZQUNoRyxDQUFDO1lBQ0QsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxDQUFDLElBQUksQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1lBQzlELENBQUM7WUFDRCxJQUFJLFdBQVcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RFLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0VBQXdFLENBQUMsQ0FBQztZQUN4RixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsSUFBSSxDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7O0FBMURILHdEQTJEQzs7O0FBRUQsU0FBZ0Isa0NBQWtDLENBQ2hELEtBQTJCLEVBQzNCLFdBQWtEO0lBRWxELE1BQU0sWUFBWSxHQUFHLENBQUMseUJBQXlCLEVBQUUsc0JBQXNCLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUNsSCxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsV0FBVyxJQUFJLEdBQUcsSUFBSSxXQUFXLENBQUMsQ0FBQztJQUNyRixJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDOUIsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUNsQyw2REFBNkQsRUFDN0Q7WUFDRSwyREFBMkQsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRztZQUN2RixnRkFBZ0Y7WUFDaEYsa0ZBQWtGO1lBQ2xGLHlLQUF5SztTQUMxSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDYixDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRCxTQUFnQixzQ0FBc0MsQ0FBQyxhQUFvQztJQUd6RixJQUFJLGFBQWEsRUFBRSxJQUFJLEtBQUssaUJBQWlCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQzVELENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFFRCxTQUFnQixnQ0FBZ0MsQ0FBQyxhQUFvQztJQUNuRixJQUFJLGFBQWEsRUFBRSxJQUFJLEtBQUssU0FBUyxJQUFJLGFBQWEsQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUM1RCxDQUFDO0lBQ0QsSUFBSSxhQUFhLEVBQUUsSUFBSSxLQUFLLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDaEUsTUFBTSxXQUFXLEdBQThCLEVBQUUsQ0FBQztRQUNsRCxJQUFJLGFBQWEsQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0RCxXQUFXLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxJQUFJLGFBQWEsQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyRCxXQUFXLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlICogYXMgY29uc3RydWN0cyBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBUaGUgdHJhY2Ugc2FtcGxpbmcgc3RyYXRlZ3kgdXNlZCBieSB0aGUgRmFyZ2F0ZSBEYXRhZG9nIGludGVncmF0aW9uLlxuICovXG5leHBvcnQgZW51bSBUcmFjZVNhbXBsaW5nTW9kZSB7XG4gIC8qKlxuICAgKiBVc2UgUklPJ3MgcGVyLUFnZW50IGhlYWQtc2FtcGxpbmcgdGFyZ2V0IG9mIDUgdHJhY2VzL3NlYyBhbmQgYW4gYWRkaXRpb25hbFxuICAgKiBlcnJvci1zYW1wbGluZyBidWRnZXQgb2YgMTAgbG9jYWwgZXJyb3IgdHJhY2UgY2h1bmtzL3NlYy5cbiAgICogVGFyZ2V0LXBlci1zZWNvbmQgc2FtcGxpbmcgaXMgYSBwcmFjdGljYWwgZGVmYXVsdCBmb3IgYm90aCBsb3ctIGFuZFxuICAgKiBoaWdoLXRyYWZmaWMgc2VydmljZXMuXG4gICAqL1xuICBERUZBVUxULFxuXG4gIC8qKiBEbyBub3Qgc2V0IHNhbXBsaW5nIGVudmlyb25tZW50IHZhcmlhYmxlczsgcmV0YWluIERhdGFkb2cncyBkZWZhdWx0cy4gKi9cbiAgREFUQURPR19ERUZBVUxULFxuXG4gIC8qKiBTZXQgYSBmaXhlZCBzYW1wbGluZyBydWxlIG9uIHRoZSBhcHBsaWNhdGlvbiB0cmFjZXIuICovXG4gIEZJWEVEX1JBVEUsXG5cbiAgLyoqIFNldCBhIHBlci1BZ2VudCB0YXJnZXQgbnVtYmVyIG9mIHRyYWNlcyBwZXIgc2Vjb25kLiAqL1xuICBUQVJHRVRfUEVSX1NFQ09ORCxcbn1cblxuLyoqXG4gKiBVc2UgUklPJ3MgZGVmYXVsdCBEYXRhZG9nIEFnZW50IHNhbXBsaW5nIHRhcmdldHMuXG4gKlxuICogVGhpcyBpcyBhbHNvIHRoZSBkZWZhdWx0IHdoZW4gYHRyYWNlU2FtcGxpbmdgIGlzIG9taXR0ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlvRGVmYXVsdFRyYWNlU2FtcGxpbmdPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBzYW1wbGluZyBzdHJhdGVneS4gTWF5IGJlIG9taXR0ZWQgdG8gdXNlIHRoZSBkZWZhdWx0LlxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIC0gYFRyYWNlU2FtcGxpbmdNb2RlLkRFRkFVTFRgXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogVHJhY2VTYW1wbGluZ01vZGUuREVGQVVMVDtcbn1cblxuLyoqIERvIG5vdCBzZXQgc2FtcGxpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzOyByZXRhaW4gRGF0YWRvZydzIGRlZmF1bHRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhZG9nRGVmYXVsdFRyYWNlU2FtcGxpbmdPcHRpb25zIHtcbiAgLyoqIFRoZSBzYW1wbGluZyBzdHJhdGVneS4gKi9cbiAgcmVhZG9ubHkgbW9kZTogVHJhY2VTYW1wbGluZ01vZGUuREFUQURPR19ERUZBVUxUO1xufVxuXG4vKiogQ29uZmlndXJlIGEgZml4ZWQgYXBwbGljYXRpb24tdHJhY2VyIHNhbXBsaW5nIHJhdGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpeGVkUmF0ZVRyYWNlU2FtcGxpbmdPcHRpb25zIHtcbiAgLyoqIFRoZSBzYW1wbGluZyBzdHJhdGVneS4gKi9cbiAgcmVhZG9ubHkgbW9kZTogVHJhY2VTYW1wbGluZ01vZGUuRklYRURfUkFURTtcblxuICAvKipcbiAgICogVGhlIGdsb2JhbCB0cmFjZXIgc2FtcGxpbmctcnVsZSByYXRlLCBmcm9tIDAuMCB0byAxLjAgaW5jbHVzaXZlLlxuICAgKiBEYXRhZG9nIHRyYWNlcnMgYWRkaXRpb25hbGx5IGFwcGx5IHRoZWlyIGJ1aWx0LWluIDEwMC10cmFjZXMtcGVyLXNlY29uZFxuICAgKiByYXRlIGxpbWl0IHdoZW4gc2FtcGxpbmcgcnVsZXMgYXJlIGNvbmZpZ3VyZWQuIFRoaXMgY29uc3RydWN0IGRvZXMgbm90XG4gICAqIGV4cG9zZSBvciBvdmVycmlkZSB0aGF0IHBlci1pbnN0YW5jZSBzYWZlZ3VhcmQuXG4gICAqL1xuICByZWFkb25seSBmaXhlZFJhdGU6IG51bWJlcjtcbn1cblxuLyoqIENvbmZpZ3VyZSBEYXRhZG9nIEFnZW50IHRhcmdldCBzYW1wbGluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFyZ2V0UGVyU2Vjb25kVHJhY2VTYW1wbGluZ09wdGlvbnMge1xuICAvKiogVGhlIHNhbXBsaW5nIHN0cmF0ZWd5LiAqL1xuICByZWFkb25seSBtb2RlOiBUcmFjZVNhbXBsaW5nTW9kZS5UQVJHRVRfUEVSX1NFQ09ORDtcblxuICAvKipcbiAgICogVGhlIGF2ZXJhZ2UgaGVhZC1zYW1wbGluZyB0YXJnZXQgaW4gdHJhY2VzIHBlciBzZWNvbmQgZm9yIGVhY2ggQWdlbnRcbiAgICogc2lkZWNhciAoYW5kIHRoZXJlZm9yZSBlYWNoIEZhcmdhdGUgc2VydmljZSBpbnN0YW5jZSkuIFRyYWZmaWMgc3Bpa2VzXG4gICAqIGNhbiBleGNlZWQgdGhpcyB0YXJnZXQ7IGl0IGlzIG5vdCBhIGhhcmQgY2FwIG9uIHRvdGFsIGluZ2VzdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFRyYWNlc1BlclNlY29uZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgYnVkZ2V0IGZvciBhZGRpdGlvbmFsIGxvY2FsIGVycm9yIHRyYWNlIGNodW5rcyBwZXIgc2Vjb25kIG1pc3NlZCBieVxuICAgKiBoZWFkIHNhbXBsaW5nLCBmb3IgZWFjaCBBZ2VudCBzaWRlY2FyIChhbmQgdGhlcmVmb3JlIGVhY2ggRmFyZ2F0ZSBzZXJ2aWNlXG4gICAqIGluc3RhbmNlKS4gVGhpcyBkb2VzIG5vdCBjYXAgZXJyb3IgdHJhY2VzIGFscmVhZHkga2VwdCBieSBoZWFkIHNhbXBsaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3JUcmFjZXNQZXJTZWNvbmQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgRGF0YWRvZyBBUE0gdHJhY2Ugc2FtcGxpbmcuXG4gKlxuICogVGhpcyBkaXNjcmltaW5hdGVkIHVuaW9uIG1ha2VzIG1vZGUtc3BlY2lmaWMgc2V0dGluZ3MgaW52YWxpZCBpbiBUeXBlU2NyaXB0XG4gKiBiZWZvcmUgc3ludGhlc2lzLiBOdW1lcmljIHJhbmdlcyBhcmUgY2hlY2tlZCBkdXJpbmcgc3ludGhlc2lzLlxuICovXG5leHBvcnQgdHlwZSBUcmFjZVNhbXBsaW5nT3B0aW9ucyA9XG4gIHwgUmlvRGVmYXVsdFRyYWNlU2FtcGxpbmdPcHRpb25zXG4gIHwgRGF0YWRvZ0RlZmF1bHRUcmFjZVNhbXBsaW5nT3B0aW9uc1xuICB8IEZpeGVkUmF0ZVRyYWNlU2FtcGxpbmdPcHRpb25zXG4gIHwgVGFyZ2V0UGVyU2Vjb25kVHJhY2VTYW1wbGluZ09wdGlvbnM7XG5cbi8qKiBUaGUgdW50cnVzdGVkIHJ1bnRpbWUgc2hhcGUgdXNlZCBieSBzeW50aGVzaXMtdGltZSB2YWxpZGF0aW9uLiAqL1xudHlwZSBUcmFjZVNhbXBsaW5nVmFsdWVzID0ge1xuICByZWFkb25seSBtb2RlPzogVHJhY2VTYW1wbGluZ01vZGU7XG4gIHJlYWRvbmx5IGZpeGVkUmF0ZT86IG51bWJlcjtcbiAgcmVhZG9ubHkgdGFyZ2V0VHJhY2VzUGVyU2Vjb25kPzogbnVtYmVyO1xuICByZWFkb25seSBlcnJvclRyYWNlc1BlclNlY29uZD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCBjbGFzcyBUcmFjZVNhbXBsaW5nVmFsaWRhdG9yIGltcGxlbWVudHMgY29uc3RydWN0cy5JVmFsaWRhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdHJhY2VTYW1wbGluZz86IFRyYWNlU2FtcGxpbmdPcHRpb25zKSB7fVxuXG4gIHZhbGlkYXRlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy50cmFjZVNhbXBsaW5nO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIEtlZXAgdmFsaWRhdGluZyB0aGUgcnVudGltZSBzaGFwZTogSmF2YVNjcmlwdCBjb25zdW1lcnMgYW5kIFR5cGVTY3JpcHRcbiAgICAvLyBjYWxsZXJzIHVzaW5nIGEgY2FzdCBjYW4gYnlwYXNzIHRoZSBkaXNjcmltaW5hdGVkIHVuaW9uLlxuICAgIGNvbnN0IHZhbHVlcyA9IG9wdGlvbnMgYXMgVHJhY2VTYW1wbGluZ1ZhbHVlcztcbiAgICBjb25zdCBtb2RlID0gdmFsdWVzLm1vZGUgPz8gVHJhY2VTYW1wbGluZ01vZGUuREVGQVVMVDtcbiAgICBjb25zdCBoYXNGaXhlZFJhdGUgPSB2YWx1ZXMuZml4ZWRSYXRlICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgaGFzVGFyZ2V0VHBzID0gdmFsdWVzLnRhcmdldFRyYWNlc1BlclNlY29uZCAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGhhc0Vycm9yVHBzID0gdmFsdWVzLmVycm9yVHJhY2VzUGVyU2Vjb25kICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGlzTm9uTmVnYXRpdmVJbnRlZ2VyID0gKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpID0+XG4gICAgICB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIE51bWJlci5pc0ludGVnZXIodmFsdWUpICYmIHZhbHVlID49IDA7XG5cbiAgICBpZiAobW9kZSA9PT0gVHJhY2VTYW1wbGluZ01vZGUuREVGQVVMVCB8fCBtb2RlID09PSBUcmFjZVNhbXBsaW5nTW9kZS5EQVRBRE9HX0RFRkFVTFQpIHtcbiAgICAgIGlmIChoYXNGaXhlZFJhdGUgfHwgaGFzVGFyZ2V0VHBzIHx8IGhhc0Vycm9yVHBzKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgIGAke1RyYWNlU2FtcGxpbmdNb2RlW21vZGVdfSBkb2VzIG5vdCBhY2NlcHQgZml4ZWRSYXRlLCB0YXJnZXRUcmFjZXNQZXJTZWNvbmQsIG9yIGVycm9yVHJhY2VzUGVyU2Vjb25kLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1vZGUgPT09IFRyYWNlU2FtcGxpbmdNb2RlLkZJWEVEX1JBVEUpIHtcbiAgICAgIGNvbnN0IGZpeGVkUmF0ZSA9IHZhbHVlcy5maXhlZFJhdGU7XG4gICAgICBpZiAoXG4gICAgICAgICFoYXNGaXhlZFJhdGUgfHxcbiAgICAgICAgZml4ZWRSYXRlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgIU51bWJlci5pc0Zpbml0ZShmaXhlZFJhdGUpIHx8XG4gICAgICAgIGZpeGVkUmF0ZSA8IDAuMCB8fFxuICAgICAgICBmaXhlZFJhdGUgPiAxLjBcbiAgICAgICkge1xuICAgICAgICBlcnJvcnMucHVzaCgnRklYRURfUkFURSByZXF1aXJlcyBmaXhlZFJhdGUgdG8gYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxIGluY2x1c2l2ZS4nKTtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNUYXJnZXRUcHMpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ0ZJWEVEX1JBVEUgZG9lcyBub3QgYWNjZXB0IHRhcmdldFRyYWNlc1BlclNlY29uZC4nKTtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNFcnJvclRwcykge1xuICAgICAgICBlcnJvcnMucHVzaCgnRklYRURfUkFURSBkb2VzIG5vdCBhY2NlcHQgZXJyb3JUcmFjZXNQZXJTZWNvbmQuJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtb2RlID09PSBUcmFjZVNhbXBsaW5nTW9kZS5UQVJHRVRfUEVSX1NFQ09ORCkge1xuICAgICAgaWYgKCFpc05vbk5lZ2F0aXZlSW50ZWdlcih2YWx1ZXMudGFyZ2V0VHJhY2VzUGVyU2Vjb25kKSkge1xuICAgICAgICBlcnJvcnMucHVzaCgnVEFSR0VUX1BFUl9TRUNPTkQgcmVxdWlyZXMgdGFyZ2V0VHJhY2VzUGVyU2Vjb25kIHRvIGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuJyk7XG4gICAgICB9XG4gICAgICBpZiAoaGFzRml4ZWRSYXRlKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdUQVJHRVRfUEVSX1NFQ09ORCBkb2VzIG5vdCBhY2NlcHQgZml4ZWRSYXRlLicpO1xuICAgICAgfVxuICAgICAgaWYgKGhhc0Vycm9yVHBzICYmICFpc05vbk5lZ2F0aXZlSW50ZWdlcih2YWx1ZXMuZXJyb3JUcmFjZXNQZXJTZWNvbmQpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdUQVJHRVRfUEVSX1NFQ09ORCBlcnJvclRyYWNlc1BlclNlY29uZCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9ycy5wdXNoKCd0cmFjZVNhbXBsaW5nLm1vZGUgbXVzdCBiZSBhIFRyYWNlU2FtcGxpbmdNb2RlIHZhbHVlLicpO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFRyYWNlU2FtcGxpbmdFbnZpcm9ubWVudFdhcm5pbmcoXG4gIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgZW52aXJvbm1lbnQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfCB1bmRlZmluZWRcbik6IHZvaWQge1xuICBjb25zdCBzYW1wbGluZ0tleXMgPSBbJ0REX1RSQUNFX1NBTVBMSU5HX1JVTEVTJywgJ0REX1RSQUNFX1NBTVBMRV9SQVRFJywgJ0REX0FQTV9UQVJHRVRfVFBTJywgJ0REX0FQTV9FUlJPUl9UUFMnXTtcbiAgY29uc3QgY29uZmlndXJlZEtleXMgPSBzYW1wbGluZ0tleXMuZmlsdGVyKGtleSA9PiBlbnZpcm9ubWVudCAmJiBrZXkgaW4gZW52aXJvbm1lbnQpO1xuICBpZiAoY29uZmlndXJlZEtleXMubGVuZ3RoID4gMCkge1xuICAgIGNkay5WYWxpZGF0aW9ucy5vZihzY29wZSkuYWRkV2FybmluZyhcbiAgICAgICdAcmlvLWNsb3VkL2Nkay12Mi1jb25zdHJ1Y3RzOmRpcmVjdFRyYWNlU2FtcGxpbmdFbnZpcm9ubWVudCcsXG4gICAgICBbXG4gICAgICAgIGBEaXJlY3QgdHJhY2Utc2FtcGxpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUocykgZGV0ZWN0ZWQ6ICR7Y29uZmlndXJlZEtleXMuam9pbignLCAnKX0uYCxcbiAgICAgICAgJ1JlY29tbWVuZGVkIGFjdGlvbjogcmVtb3ZlIHRoZXNlIHZhcmlhYmxlcyB0byB1c2UgdGhlIERFRkFVTFQgc2FtcGxpbmcgcG9saWN5LicsXG4gICAgICAgICdUbyBzZWxlY3QgYSBkaWZmZXJlbnQgcG9saWN5LCBjb25maWd1cmUgZGF0YWRvZ09wdGlvbnMudHJhY2VTYW1wbGluZyBleHBsaWNpdGx5LicsXG4gICAgICAgICdEaXJlY3Qgc2FtcGxpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlbWFpbiBzdXBwb3J0ZWQgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFVzZXJzIHdobyBjaG9vc2UgdGhlbSBhcmUgcmVzcG9uc2libGUgZm9yIHRoZWlyIGNvbXBhdGliaWxpdHkgYW5kIG1haW50ZW5hbmNlLicsXG4gICAgICBdLmpvaW4oJ1xcbicpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBwbGljYXRpb25UcmFjZVNhbXBsaW5nRW52aXJvbm1lbnQodHJhY2VTYW1wbGluZz86IFRyYWNlU2FtcGxpbmdPcHRpb25zKToge1xuICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG59IHtcbiAgaWYgKHRyYWNlU2FtcGxpbmc/Lm1vZGUgPT09IFRyYWNlU2FtcGxpbmdNb2RlLkZJWEVEX1JBVEUpIHtcbiAgICBjb25zdCBydWxlcyA9IFt7IHNhbXBsZV9yYXRlOiB0cmFjZVNhbXBsaW5nLmZpeGVkUmF0ZSB9XTtcbiAgICByZXR1cm4geyBERF9UUkFDRV9TQU1QTElOR19SVUxFUzogSlNPTi5zdHJpbmdpZnkocnVsZXMpIH07XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWdlbnRUcmFjZVNhbXBsaW5nRW52aXJvbm1lbnQodHJhY2VTYW1wbGluZz86IFRyYWNlU2FtcGxpbmdPcHRpb25zKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gIGlmICh0cmFjZVNhbXBsaW5nPy5tb2RlID09PSB1bmRlZmluZWQgfHwgdHJhY2VTYW1wbGluZy5tb2RlID09PSBUcmFjZVNhbXBsaW5nTW9kZS5ERUZBVUxUKSB7XG4gICAgcmV0dXJuIHsgRERfQVBNX1RBUkdFVF9UUFM6ICc1JywgRERfQVBNX0VSUk9SX1RQUzogJzEwJyB9O1xuICB9XG4gIGlmICh0cmFjZVNhbXBsaW5nPy5tb2RlID09PSBUcmFjZVNhbXBsaW5nTW9kZS5UQVJHRVRfUEVSX1NFQ09ORCkge1xuICAgIGNvbnN0IGVudmlyb25tZW50OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgaWYgKHRyYWNlU2FtcGxpbmcudGFyZ2V0VHJhY2VzUGVyU2Vjb25kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVudmlyb25tZW50LkREX0FQTV9UQVJHRVRfVFBTID0gU3RyaW5nKHRyYWNlU2FtcGxpbmcudGFyZ2V0VHJhY2VzUGVyU2Vjb25kKTtcbiAgICB9XG4gICAgaWYgKHRyYWNlU2FtcGxpbmcuZXJyb3JUcmFjZXNQZXJTZWNvbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW52aXJvbm1lbnQuRERfQVBNX0VSUk9SX1RQUyA9IFN0cmluZyh0cmFjZVNhbXBsaW5nLmVycm9yVHJhY2VzUGVyU2Vjb25kKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudmlyb25tZW50O1xuICB9XG4gIHJldHVybiB7fTtcbn1cbiJdfQ==
|
package/package.json
CHANGED
package/version.json
CHANGED