aws-cdk 2.10.0 → 2.11.0
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/CONTRIBUTING.md +1 -1
- package/build-info.json +2 -2
- package/lib/api/cloudformation-deployments.d.ts +8 -1
- package/lib/api/cloudformation-deployments.js +86 -16
- package/lib/api/hotswap-deployments.js +1 -1
- package/lib/assets.js +2 -1
- package/lib/cdk-toolkit.js +3 -3
- package/lib/context-providers/index.d.ts +6 -0
- package/lib/context-providers/index.js +16 -3
- package/lib/context-providers/vpcs.js +4 -1
- package/lib/plugin.d.ts +15 -1
- package/lib/plugin.js +17 -3
- package/npm-shrinkwrap.json +20 -20
- package/package.json +11 -11
- package/test/api/cloudformation-deployments.test.js +643 -1
- package/test/context-providers/generic.test.js +7 -6
- package/test/context-providers/vpcs.test.js +132 -1
- package/test/diff-nested-stacks-templates/one-output-one-param-stack.nested.template.json +20 -0
- package/test/diff-nested-stacks-templates/one-resource-one-stack-stack.nested.template.json +19 -0
- package/test/diff-nested-stacks-templates/one-resource-stack.nested.template.json +10 -0
- package/test/diff-nested-stacks-templates/one-resource-two-stacks-stack.nested.template.json +28 -0
- package/test/diff.test.js +215 -96
- package/test/util.js +18 -1
package/test/diff.test.js
CHANGED
|
@@ -9,109 +9,228 @@ const util_1 = require("./util");
|
|
|
9
9
|
let cloudExecutable;
|
|
10
10
|
let cloudFormation;
|
|
11
11
|
let toolkit;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
{
|
|
24
|
-
stackName: 'C',
|
|
25
|
-
depends: ['A'],
|
|
26
|
-
template: { resource: 'C' },
|
|
27
|
-
metadata: {
|
|
28
|
-
'/resource': [
|
|
29
|
-
{
|
|
30
|
-
type: cxschema.ArtifactMetadataEntryType.ERROR,
|
|
31
|
-
data: 'this is an error',
|
|
32
|
-
},
|
|
33
|
-
],
|
|
12
|
+
describe('non-nested stacks', () => {
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
cloudExecutable = new util_1.MockCloudExecutable({
|
|
15
|
+
stacks: [{
|
|
16
|
+
stackName: 'A',
|
|
17
|
+
template: { resource: 'A' },
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
stackName: 'B',
|
|
21
|
+
depends: ['A'],
|
|
22
|
+
template: { resource: 'B' },
|
|
34
23
|
},
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
24
|
+
{
|
|
25
|
+
stackName: 'C',
|
|
26
|
+
depends: ['A'],
|
|
27
|
+
template: { resource: 'C' },
|
|
28
|
+
metadata: {
|
|
29
|
+
'/resource': [
|
|
30
|
+
{
|
|
31
|
+
type: cxschema.ArtifactMetadataEntryType.ERROR,
|
|
32
|
+
data: 'this is an error',
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
stackName: 'D',
|
|
39
|
+
template: { resource: 'D' },
|
|
40
|
+
}],
|
|
41
|
+
});
|
|
42
|
+
cloudFormation = util_1.instanceMockFrom(cloudformation_deployments_1.CloudFormationDeployments);
|
|
43
|
+
toolkit = new cdk_toolkit_1.CdkToolkit({
|
|
44
|
+
cloudExecutable,
|
|
45
|
+
cloudFormation,
|
|
46
|
+
configuration: cloudExecutable.configuration,
|
|
47
|
+
sdkProvider: cloudExecutable.sdkProvider,
|
|
48
|
+
});
|
|
49
|
+
// Default implementations
|
|
50
|
+
cloudFormation.readCurrentTemplateWithNestedStacks.mockImplementation((stackArtifact) => {
|
|
51
|
+
if (stackArtifact.stackName === 'D') {
|
|
52
|
+
return Promise.resolve({ resource: 'D' });
|
|
53
|
+
}
|
|
54
|
+
return Promise.resolve({});
|
|
55
|
+
});
|
|
56
|
+
cloudFormation.deployStack.mockImplementation((options) => Promise.resolve({
|
|
57
|
+
noOp: true,
|
|
58
|
+
outputs: {},
|
|
59
|
+
stackArn: '',
|
|
60
|
+
stackArtifact: options.stack,
|
|
61
|
+
}));
|
|
40
62
|
});
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
63
|
+
test('diff can diff multiple stacks', async () => {
|
|
64
|
+
// GIVEN
|
|
65
|
+
const buffer = new StringWritable();
|
|
66
|
+
// WHEN
|
|
67
|
+
const exitCode = await toolkit.diff({
|
|
68
|
+
stackNames: ['B'],
|
|
69
|
+
stream: buffer,
|
|
70
|
+
});
|
|
71
|
+
// THEN
|
|
72
|
+
const plainTextOutput = buffer.data.replace(/\x1B\[[0-?]*[ -/]*[@-~]/g, '');
|
|
73
|
+
expect(plainTextOutput).toContain('Stack A');
|
|
74
|
+
expect(plainTextOutput).toContain('Stack B');
|
|
75
|
+
expect(exitCode).toBe(0);
|
|
47
76
|
});
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
77
|
+
test('exits with 1 with diffs and fail set to true', async () => {
|
|
78
|
+
// GIVEN
|
|
79
|
+
const buffer = new StringWritable();
|
|
80
|
+
// WHEN
|
|
81
|
+
const exitCode = await toolkit.diff({
|
|
82
|
+
stackNames: ['A'],
|
|
83
|
+
stream: buffer,
|
|
84
|
+
fail: true,
|
|
85
|
+
});
|
|
86
|
+
// THEN
|
|
87
|
+
expect(exitCode).toBe(1);
|
|
54
88
|
});
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
});
|
|
62
|
-
test('diff can diff multiple stacks', async () => {
|
|
63
|
-
// GIVEN
|
|
64
|
-
const buffer = new StringWritable();
|
|
65
|
-
// WHEN
|
|
66
|
-
const exitCode = await toolkit.diff({
|
|
67
|
-
stackNames: ['B'],
|
|
68
|
-
stream: buffer,
|
|
89
|
+
test('throws an error if no valid stack names given', async () => {
|
|
90
|
+
const buffer = new StringWritable();
|
|
91
|
+
// WHEN
|
|
92
|
+
await expect(() => toolkit.diff({
|
|
93
|
+
stackNames: ['X', 'Y', 'Z'],
|
|
94
|
+
stream: buffer,
|
|
95
|
+
})).rejects.toThrow('No stacks match the name(s) X,Y,Z');
|
|
69
96
|
});
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
stackNames: ['A'],
|
|
82
|
-
stream: buffer,
|
|
83
|
-
fail: true,
|
|
97
|
+
test('exits with 1 with diff in first stack, but not in second stack and fail set to true', async () => {
|
|
98
|
+
// GIVEN
|
|
99
|
+
const buffer = new StringWritable();
|
|
100
|
+
// WHEN
|
|
101
|
+
const exitCode = await toolkit.diff({
|
|
102
|
+
stackNames: ['A', 'D'],
|
|
103
|
+
stream: buffer,
|
|
104
|
+
fail: true,
|
|
105
|
+
});
|
|
106
|
+
// THEN
|
|
107
|
+
expect(exitCode).toBe(1);
|
|
84
108
|
});
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
stackNames: ['X', 'Y', 'Z'],
|
|
93
|
-
stream: buffer,
|
|
94
|
-
})).rejects.toThrow('No stacks match the name(s) X,Y,Z');
|
|
95
|
-
});
|
|
96
|
-
test('exits with 1 with diff in first stack, but not in second stack and fail set to true', async () => {
|
|
97
|
-
// GIVEN
|
|
98
|
-
const buffer = new StringWritable();
|
|
99
|
-
// WHEN
|
|
100
|
-
const exitCode = await toolkit.diff({
|
|
101
|
-
stackNames: ['A', 'D'],
|
|
102
|
-
stream: buffer,
|
|
103
|
-
fail: true,
|
|
109
|
+
test('throws an error during diffs on stack with error metadata', async () => {
|
|
110
|
+
const buffer = new StringWritable();
|
|
111
|
+
// WHEN
|
|
112
|
+
await expect(() => toolkit.diff({
|
|
113
|
+
stackNames: ['C'],
|
|
114
|
+
stream: buffer,
|
|
115
|
+
})).rejects.toThrow(/Found errors/);
|
|
104
116
|
});
|
|
105
|
-
// THEN
|
|
106
|
-
expect(exitCode).toBe(1);
|
|
107
117
|
});
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
118
|
+
describe('nested stacks', () => {
|
|
119
|
+
beforeEach(() => {
|
|
120
|
+
cloudExecutable = new util_1.MockCloudExecutable({
|
|
121
|
+
stacks: [{
|
|
122
|
+
stackName: 'Parent',
|
|
123
|
+
template: {},
|
|
124
|
+
}],
|
|
125
|
+
});
|
|
126
|
+
cloudFormation = util_1.instanceMockFrom(cloudformation_deployments_1.CloudFormationDeployments);
|
|
127
|
+
toolkit = new cdk_toolkit_1.CdkToolkit({
|
|
128
|
+
cloudExecutable,
|
|
129
|
+
cloudFormation,
|
|
130
|
+
configuration: cloudExecutable.configuration,
|
|
131
|
+
sdkProvider: cloudExecutable.sdkProvider,
|
|
132
|
+
});
|
|
133
|
+
cloudFormation.readCurrentTemplateWithNestedStacks.mockImplementation((stackArtifact) => {
|
|
134
|
+
if (stackArtifact.stackName === 'Parent') {
|
|
135
|
+
stackArtifact.template.Resources = {
|
|
136
|
+
AdditionChild: {
|
|
137
|
+
Type: 'AWS::CloudFormation::Stack',
|
|
138
|
+
Resources: {
|
|
139
|
+
SomeResource: {
|
|
140
|
+
Type: 'AWS::Something',
|
|
141
|
+
Properties: {
|
|
142
|
+
Prop: 'added-value',
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
DeletionChild: {
|
|
148
|
+
Type: 'AWS::CloudFormation::Stack',
|
|
149
|
+
Resources: {
|
|
150
|
+
SomeResource: {
|
|
151
|
+
Type: 'AWS::Something',
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
ChangedChild: {
|
|
156
|
+
Type: 'AWS::CloudFormation::Stack',
|
|
157
|
+
Resources: {
|
|
158
|
+
SomeResource: {
|
|
159
|
+
Type: 'AWS::Something',
|
|
160
|
+
Properties: {
|
|
161
|
+
Prop: 'new-value',
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
return Promise.resolve({
|
|
168
|
+
Resources: {
|
|
169
|
+
AdditionChild: {
|
|
170
|
+
Type: 'AWS::CloudFormation::Stack',
|
|
171
|
+
Resources: {
|
|
172
|
+
SomeResource: {
|
|
173
|
+
Type: 'AWS::Something',
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
DeletionChild: {
|
|
178
|
+
Type: 'AWS::CloudFormation::Stack',
|
|
179
|
+
Resources: {
|
|
180
|
+
SomeResource: {
|
|
181
|
+
Type: 'AWS::Something',
|
|
182
|
+
Properties: {
|
|
183
|
+
Prop: 'value-to-be-removed',
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
ChangedChild: {
|
|
189
|
+
Type: 'AWS::CloudFormation::Stack',
|
|
190
|
+
Resources: {
|
|
191
|
+
SomeResource: {
|
|
192
|
+
Type: 'AWS::Something',
|
|
193
|
+
Properties: {
|
|
194
|
+
Prop: 'old-value',
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
return Promise.resolve({});
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
test('diff can diff nested stacks', async () => {
|
|
206
|
+
// GIVEN
|
|
207
|
+
const buffer = new StringWritable();
|
|
208
|
+
// WHEN
|
|
209
|
+
const exitCode = await toolkit.diff({
|
|
210
|
+
stackNames: ['Parent'],
|
|
211
|
+
stream: buffer,
|
|
212
|
+
});
|
|
213
|
+
// THEN
|
|
214
|
+
const plainTextOutput = buffer.data.replace(/\x1B\[[0-?]*[ -/]*[@-~]/g, '');
|
|
215
|
+
expect(plainTextOutput.trim()).toEqual(`Stack Parent
|
|
216
|
+
Resources
|
|
217
|
+
[~] AWS::CloudFormation::Stack AdditionChild
|
|
218
|
+
└─ [~] Resources
|
|
219
|
+
└─ [~] .SomeResource:
|
|
220
|
+
└─ [+] Added: .Properties
|
|
221
|
+
[~] AWS::CloudFormation::Stack DeletionChild
|
|
222
|
+
└─ [~] Resources
|
|
223
|
+
└─ [~] .SomeResource:
|
|
224
|
+
└─ [-] Removed: .Properties
|
|
225
|
+
[~] AWS::CloudFormation::Stack ChangedChild
|
|
226
|
+
└─ [~] Resources
|
|
227
|
+
└─ [~] .SomeResource:
|
|
228
|
+
└─ [~] .Properties:
|
|
229
|
+
└─ [~] .Prop:
|
|
230
|
+
├─ [-] old-value
|
|
231
|
+
└─ [+] new-value`);
|
|
232
|
+
expect(exitCode).toBe(0);
|
|
233
|
+
});
|
|
115
234
|
});
|
|
116
235
|
class StringWritable extends stream_1.Writable {
|
|
117
236
|
constructor(options = {}) {
|
|
@@ -131,4 +250,4 @@ class StringWritable extends stream_1.Writable {
|
|
|
131
250
|
callback();
|
|
132
251
|
}
|
|
133
252
|
}
|
|
134
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlmZi50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQWtDO0FBQ2xDLG1EQUFrRTtBQUNsRSwyREFBMkQ7QUFFM0Qsc0ZBQWtGO0FBQ2xGLG9EQUFnRDtBQUNoRCxpQ0FBK0Q7QUFFL0QsSUFBSSxlQUFvQyxDQUFDO0FBQ3pDLElBQUksY0FBc0QsQ0FBQztBQUMzRCxJQUFJLE9BQW1CLENBQUM7QUFDeEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtJQUNkLGVBQWUsR0FBRyxJQUFJLDBCQUFtQixDQUFDO1FBQ3hDLE1BQU0sRUFBRSxDQUFDO2dCQUNQLFNBQVMsRUFBRSxHQUFHO2dCQUNkLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7YUFDNUI7WUFDRDtnQkFDRSxTQUFTLEVBQUUsR0FBRztnQkFDZCxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUM7Z0JBQ2QsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTthQUM1QjtZQUNEO2dCQUNFLFNBQVMsRUFBRSxHQUFHO2dCQUNkLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQztnQkFDZCxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUMzQixRQUFRLEVBQUU7b0JBQ1IsV0FBVyxFQUFFO3dCQUNYOzRCQUNFLElBQUksRUFBRSxRQUFRLENBQUMseUJBQXlCLENBQUMsS0FBSzs0QkFDOUMsSUFBSSxFQUFFLGtCQUFrQjt5QkFDekI7cUJBQ0Y7aUJBQ0Y7YUFDRjtZQUNEO2dCQUNFLFNBQVMsRUFBRSxHQUFHO2dCQUNkLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7YUFDNUIsQ0FBQztLQUNILENBQUMsQ0FBQztJQUVILGNBQWMsR0FBRyx1QkFBZ0IsQ0FBQyxzREFBeUIsQ0FBQyxDQUFDO0lBRTdELE9BQU8sR0FBRyxJQUFJLHdCQUFVLENBQUM7UUFDdkIsZUFBZTtRQUNmLGNBQWM7UUFDZCxhQUFhLEVBQUUsZUFBZSxDQUFDLGFBQWE7UUFDNUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxXQUFXO0tBQ3pDLENBQUMsQ0FBQztJQUVILDBCQUEwQjtJQUMxQixjQUFjLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxhQUEwQyxFQUFFLEVBQUU7UUFDbkcsSUFBSSxhQUFhLENBQUMsU0FBUyxLQUFLLEdBQUcsRUFBRTtZQUNuQyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUMzQztRQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDLENBQUMsQ0FBQztJQUNILGNBQWMsQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDekUsSUFBSSxFQUFFLElBQUk7UUFDVixPQUFPLEVBQUUsRUFBRTtRQUNYLFFBQVEsRUFBRSxFQUFFO1FBQ1osYUFBYSxFQUFFLE9BQU8sQ0FBQyxLQUFLO0tBQzdCLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsK0JBQStCLEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFDL0MsUUFBUTtJQUNSLE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7SUFFcEMsT0FBTztJQUNQLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQztRQUNsQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDakIsTUFBTSxFQUFFLE1BQU07S0FDZixDQUFDLENBQUM7SUFFSCxPQUFPO0lBQ1AsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTdDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsOENBQThDLEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFDOUQsUUFBUTtJQUNSLE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7SUFFcEMsT0FBTztJQUNQLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQztRQUNsQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDakIsTUFBTSxFQUFFLE1BQU07UUFDZCxJQUFJLEVBQUUsSUFBSTtLQUNYLENBQUMsQ0FBQztJQUVILE9BQU87SUFDUCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLCtDQUErQyxFQUFFLEtBQUssSUFBSSxFQUFFO0lBQy9ELE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7SUFFcEMsT0FBTztJQUNQLE1BQU0sTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDOUIsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDM0IsTUFBTSxFQUFFLE1BQU07S0FDZixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7QUFDM0QsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMscUZBQXFGLEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFDckcsUUFBUTtJQUNSLE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7SUFFcEMsT0FBTztJQUNQLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQztRQUNsQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ3RCLE1BQU0sRUFBRSxNQUFNO1FBQ2QsSUFBSSxFQUFFLElBQUk7S0FDWCxDQUFDLENBQUM7SUFFSCxPQUFPO0lBQ1AsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQywyREFBMkQsRUFBRSxLQUFLLElBQUksRUFBRTtJQUMzRSxNQUFNLE1BQU0sR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO0lBRXBDLE9BQU87SUFDUCxNQUFNLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQzlCLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQztRQUNqQixNQUFNLEVBQUUsTUFBTTtLQUNmLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDdEMsQ0FBQyxDQUFDLENBQUM7QUFFSCxNQUFNLGNBQWUsU0FBUSxpQkFBUTtJQUluQyxZQUFZLFVBQWUsRUFBRTtRQUMzQixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksOEJBQWEsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBVSxFQUFFLFFBQWdCLEVBQUUsUUFBNkM7UUFDdkYsSUFBSSxRQUFRLEtBQUssUUFBUSxFQUFFO1lBQ3pCLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNwQztRQUNELElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDO1FBQ25CLFFBQVEsRUFBRSxDQUFDO0lBQ2IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxRQUF3QztRQUNwRCxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDakMsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXcml0YWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBOb2RlU3RyaW5nRGVjb2RlciwgU3RyaW5nRGVjb2RlciB9IGZyb20gJ3N0cmluZ19kZWNvZGVyJztcbmltcG9ydCAqIGFzIGN4c2NoZW1hIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgeyBDbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QgfSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb25EZXBsb3ltZW50cyB9IGZyb20gJy4uL2xpYi9hcGkvY2xvdWRmb3JtYXRpb24tZGVwbG95bWVudHMnO1xuaW1wb3J0IHsgQ2RrVG9vbGtpdCB9IGZyb20gJy4uL2xpYi9jZGstdG9vbGtpdCc7XG5pbXBvcnQgeyBpbnN0YW5jZU1vY2tGcm9tLCBNb2NrQ2xvdWRFeGVjdXRhYmxlIH0gZnJvbSAnLi91dGlsJztcblxubGV0IGNsb3VkRXhlY3V0YWJsZTogTW9ja0Nsb3VkRXhlY3V0YWJsZTtcbmxldCBjbG91ZEZvcm1hdGlvbjogamVzdC5Nb2NrZWQ8Q2xvdWRGb3JtYXRpb25EZXBsb3ltZW50cz47XG5sZXQgdG9vbGtpdDogQ2RrVG9vbGtpdDtcbmJlZm9yZUVhY2goKCkgPT4ge1xuICBjbG91ZEV4ZWN1dGFibGUgPSBuZXcgTW9ja0Nsb3VkRXhlY3V0YWJsZSh7XG4gICAgc3RhY2tzOiBbe1xuICAgICAgc3RhY2tOYW1lOiAnQScsXG4gICAgICB0ZW1wbGF0ZTogeyByZXNvdXJjZTogJ0EnIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBzdGFja05hbWU6ICdCJyxcbiAgICAgIGRlcGVuZHM6IFsnQSddLFxuICAgICAgdGVtcGxhdGU6IHsgcmVzb3VyY2U6ICdCJyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgc3RhY2tOYW1lOiAnQycsXG4gICAgICBkZXBlbmRzOiBbJ0EnXSxcbiAgICAgIHRlbXBsYXRlOiB7IHJlc291cmNlOiAnQycgfSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICcvcmVzb3VyY2UnOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogY3hzY2hlbWEuQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5FUlJPUixcbiAgICAgICAgICAgIGRhdGE6ICd0aGlzIGlzIGFuIGVycm9yJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHN0YWNrTmFtZTogJ0QnLFxuICAgICAgdGVtcGxhdGU6IHsgcmVzb3VyY2U6ICdEJyB9LFxuICAgIH1dLFxuICB9KTtcblxuICBjbG91ZEZvcm1hdGlvbiA9IGluc3RhbmNlTW9ja0Zyb20oQ2xvdWRGb3JtYXRpb25EZXBsb3ltZW50cyk7XG5cbiAgdG9vbGtpdCA9IG5ldyBDZGtUb29sa2l0KHtcbiAgICBjbG91ZEV4ZWN1dGFibGUsXG4gICAgY2xvdWRGb3JtYXRpb24sXG4gICAgY29uZmlndXJhdGlvbjogY2xvdWRFeGVjdXRhYmxlLmNvbmZpZ3VyYXRpb24sXG4gICAgc2RrUHJvdmlkZXI6IGNsb3VkRXhlY3V0YWJsZS5zZGtQcm92aWRlcixcbiAgfSk7XG5cbiAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbnNcbiAgY2xvdWRGb3JtYXRpb24ucmVhZEN1cnJlbnRUZW1wbGF0ZS5tb2NrSW1wbGVtZW50YXRpb24oKHN0YWNrQXJ0aWZhY3Q6IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCkgPT4ge1xuICAgIGlmIChzdGFja0FydGlmYWN0LnN0YWNrTmFtZSA9PT0gJ0QnKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgcmVzb3VyY2U6ICdEJyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gIH0pO1xuICBjbG91ZEZvcm1hdGlvbi5kZXBsb3lTdGFjay5tb2NrSW1wbGVtZW50YXRpb24oKG9wdGlvbnMpID0+IFByb21pc2UucmVzb2x2ZSh7XG4gICAgbm9PcDogdHJ1ZSxcbiAgICBvdXRwdXRzOiB7fSxcbiAgICBzdGFja0FybjogJycsXG4gICAgc3RhY2tBcnRpZmFjdDogb3B0aW9ucy5zdGFjayxcbiAgfSkpO1xufSk7XG5cbnRlc3QoJ2RpZmYgY2FuIGRpZmYgbXVsdGlwbGUgc3RhY2tzJywgYXN5bmMgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGFibGUoKTtcblxuICAvLyBXSEVOXG4gIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdG9vbGtpdC5kaWZmKHtcbiAgICBzdGFja05hbWVzOiBbJ0InXSxcbiAgICBzdHJlYW06IGJ1ZmZlcixcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBjb25zdCBwbGFpblRleHRPdXRwdXQgPSBidWZmZXIuZGF0YS5yZXBsYWNlKC9cXHgxQlxcW1swLT9dKlsgLS9dKltALX5dL2csICcnKTtcbiAgZXhwZWN0KHBsYWluVGV4dE91dHB1dCkudG9Db250YWluKCdTdGFjayBBJyk7XG4gIGV4cGVjdChwbGFpblRleHRPdXRwdXQpLnRvQ29udGFpbignU3RhY2sgQicpO1xuXG4gIGV4cGVjdChleGl0Q29kZSkudG9CZSgwKTtcbn0pO1xuXG50ZXN0KCdleGl0cyB3aXRoIDEgd2l0aCBkaWZmcyBhbmQgZmFpbCBzZXQgdG8gdHJ1ZScsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3QgYnVmZmVyID0gbmV3IFN0cmluZ1dyaXRhYmxlKCk7XG5cbiAgLy8gV0hFTlxuICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRvb2xraXQuZGlmZih7XG4gICAgc3RhY2tOYW1lczogWydBJ10sXG4gICAgc3RyZWFtOiBidWZmZXIsXG4gICAgZmFpbDogdHJ1ZSxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMSk7XG59KTtcblxudGVzdCgndGhyb3dzIGFuIGVycm9yIGlmIG5vIHZhbGlkIHN0YWNrIG5hbWVzIGdpdmVuJywgYXN5bmMgKCkgPT4ge1xuICBjb25zdCBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGFibGUoKTtcblxuICAvLyBXSEVOXG4gIGF3YWl0IGV4cGVjdCgoKSA9PiB0b29sa2l0LmRpZmYoe1xuICAgIHN0YWNrTmFtZXM6IFsnWCcsICdZJywgJ1onXSxcbiAgICBzdHJlYW06IGJ1ZmZlcixcbiAgfSkpLnJlamVjdHMudG9UaHJvdygnTm8gc3RhY2tzIG1hdGNoIHRoZSBuYW1lKHMpIFgsWSxaJyk7XG59KTtcblxudGVzdCgnZXhpdHMgd2l0aCAxIHdpdGggZGlmZiBpbiBmaXJzdCBzdGFjaywgYnV0IG5vdCBpbiBzZWNvbmQgc3RhY2sgYW5kIGZhaWwgc2V0IHRvIHRydWUnLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBTdHJpbmdXcml0YWJsZSgpO1xuXG4gIC8vIFdIRU5cbiAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCB0b29sa2l0LmRpZmYoe1xuICAgIHN0YWNrTmFtZXM6IFsnQScsICdEJ10sXG4gICAgc3RyZWFtOiBidWZmZXIsXG4gICAgZmFpbDogdHJ1ZSxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMSk7XG59KTtcblxudGVzdCgndGhyb3dzIGFuIGVycm9yIGR1cmluZyBkaWZmcyBvbiBzdGFjayB3aXRoIGVycm9yIG1ldGFkYXRhJywgYXN5bmMgKCkgPT4ge1xuICBjb25zdCBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGFibGUoKTtcblxuICAvLyBXSEVOXG4gIGF3YWl0IGV4cGVjdCgoKSA9PiB0b29sa2l0LmRpZmYoe1xuICAgIHN0YWNrTmFtZXM6IFsnQyddLFxuICAgIHN0cmVhbTogYnVmZmVyLFxuICB9KSkucmVqZWN0cy50b1Rocm93KC9Gb3VuZCBlcnJvcnMvKTtcbn0pO1xuXG5jbGFzcyBTdHJpbmdXcml0YWJsZSBleHRlbmRzIFdyaXRhYmxlIHtcbiAgcHVibGljIGRhdGE6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVjb2RlcjogTm9kZVN0cmluZ0RlY29kZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogYW55ID0ge30pIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLl9kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucyAmJiBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyk7XG4gICAgdGhpcy5kYXRhID0gJyc7XG4gIH1cblxuICBwdWJsaWMgX3dyaXRlKGNodW5rOiBhbnksIGVuY29kaW5nOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvciB8IHVuZGVmaW5lZCkgPT4gdm9pZCkge1xuICAgIGlmIChlbmNvZGluZyA9PT0gJ2J1ZmZlcicpIHtcbiAgICAgIGNodW5rID0gdGhpcy5fZGVjb2Rlci53cml0ZShjaHVuayk7XG4gICAgfVxuICAgIHRoaXMuZGF0YSArPSBjaHVuaztcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgcHVibGljIF9maW5hbChjYWxsYmFjazogKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5kYXRhICs9IHRoaXMuX2RlY29kZXIuZW5kKCk7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxufVxuIl19
|
|
253
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlmZi50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQWtDO0FBQ2xDLG1EQUFrRTtBQUNsRSwyREFBMkQ7QUFFM0Qsc0ZBQWtGO0FBQ2xGLG9EQUFnRDtBQUNoRCxpQ0FBK0Q7QUFFL0QsSUFBSSxlQUFvQyxDQUFDO0FBQ3pDLElBQUksY0FBc0QsQ0FBQztBQUMzRCxJQUFJLE9BQW1CLENBQUM7QUFFeEIsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsZUFBZSxHQUFHLElBQUksMEJBQW1CLENBQUM7WUFDeEMsTUFBTSxFQUFFLENBQUM7b0JBQ1AsU0FBUyxFQUFFLEdBQUc7b0JBQ2QsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtpQkFDNUI7Z0JBQ0Q7b0JBQ0UsU0FBUyxFQUFFLEdBQUc7b0JBQ2QsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDO29CQUNkLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7aUJBQzVCO2dCQUNEO29CQUNFLFNBQVMsRUFBRSxHQUFHO29CQUNkLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDZCxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO29CQUMzQixRQUFRLEVBQUU7d0JBQ1IsV0FBVyxFQUFFOzRCQUNYO2dDQUNFLElBQUksRUFBRSxRQUFRLENBQUMseUJBQXlCLENBQUMsS0FBSztnQ0FDOUMsSUFBSSxFQUFFLGtCQUFrQjs2QkFDekI7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsU0FBUyxFQUFFLEdBQUc7b0JBQ2QsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtpQkFDNUIsQ0FBQztTQUNILENBQUMsQ0FBQztRQUVILGNBQWMsR0FBRyx1QkFBZ0IsQ0FBQyxzREFBeUIsQ0FB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QUMsZUFBZSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFVLEVBQUUsUUFBZ0IsRUFBRSxRQUE2QztRQUN2RixJQUFJLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDekIsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7UUFDbkIsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDO0lBRU0sTUFBTSxDQUFDLFFBQXdDO1FBQ3BELElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNqQyxRQUFRLEVBQUUsQ0FBQztJQUNiLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdyaXRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IE5vZGVTdHJpbmdEZWNvZGVyLCBTdHJpbmdEZWNvZGVyIH0gZnJvbSAnc3RyaW5nX2RlY29kZXInO1xuaW1wb3J0ICogYXMgY3hzY2hlbWEgZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCB9IGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgeyBDbG91ZEZvcm1hdGlvbkRlcGxveW1lbnRzIH0gZnJvbSAnLi4vbGliL2FwaS9jbG91ZGZvcm1hdGlvbi1kZXBsb3ltZW50cyc7XG5pbXBvcnQgeyBDZGtUb29sa2l0IH0gZnJvbSAnLi4vbGliL2Nkay10b29sa2l0JztcbmltcG9ydCB7IGluc3RhbmNlTW9ja0Zyb20sIE1vY2tDbG91ZEV4ZWN1dGFibGUgfSBmcm9tICcuL3V0aWwnO1xuXG5sZXQgY2xvdWRFeGVjdXRhYmxlOiBNb2NrQ2xvdWRFeGVjdXRhYmxlO1xubGV0IGNsb3VkRm9ybWF0aW9uOiBqZXN0Lk1vY2tlZDxDbG91ZEZvcm1hdGlvbkRlcGxveW1lbnRzPjtcbmxldCB0b29sa2l0OiBDZGtUb29sa2l0O1xuXG5kZXNjcmliZSgnbm9uLW5lc3RlZCBzdGFja3MnLCAoKSA9PiB7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGNsb3VkRXhlY3V0YWJsZSA9IG5ldyBNb2NrQ2xvdWRFeGVjdXRhYmxlKHtcbiAgICAgIHN0YWNrczogW3tcbiAgICAgICAgc3RhY2tOYW1lOiAnQScsXG4gICAgICAgIHRlbXBsYXRlOiB7IHJlc291cmNlOiAnQScgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHN0YWNrTmFtZTogJ0InLFxuICAgICAgICBkZXBlbmRzOiBbJ0EnXSxcbiAgICAgICAgdGVtcGxhdGU6IHsgcmVzb3VyY2U6ICdCJyB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3RhY2tOYW1lOiAnQycsXG4gICAgICAgIGRlcGVuZHM6IFsnQSddLFxuICAgICAgICB0ZW1wbGF0ZTogeyByZXNvdXJjZTogJ0MnIH0sXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgJy9yZXNvdXJjZSc6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogY3hzY2hlbWEuQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5FUlJPUixcbiAgICAgICAgICAgICAgZGF0YTogJ3RoaXMgaXMgYW4gZXJyb3InLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3RhY2tOYW1lOiAnRCcsXG4gICAgICAgIHRlbXBsYXRlOiB7IHJlc291cmNlOiAnRCcgfSxcbiAgICAgIH1dLFxuICAgIH0pO1xuXG4gICAgY2xvdWRGb3JtYXRpb24gPSBpbnN0YW5jZU1vY2tGcm9tKENsb3VkRm9ybWF0aW9uRGVwbG95bWVudHMpO1xuXG4gICAgdG9vbGtpdCA9IG5ldyBDZGtUb29sa2l0KHtcbiAgICAgIGNsb3VkRXhlY3V0YWJsZSxcbiAgICAgIGNsb3VkRm9ybWF0aW9uLFxuICAgICAgY29uZmlndXJhdGlvbjogY2xvdWRFeGVjdXRhYmxlLmNvbmZpZ3VyYXRpb24sXG4gICAgICBzZGtQcm92aWRlcjogY2xvdWRFeGVjdXRhYmxlLnNka1Byb3ZpZGVyLFxuICAgIH0pO1xuXG4gICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbnNcbiAgICBjbG91ZEZvcm1hdGlvbi5yZWFkQ3VycmVudFRlbXBsYXRlV2l0aE5lc3RlZFN0YWNrcy5tb2NrSW1wbGVtZW50YXRpb24oKHN0YWNrQXJ0aWZhY3Q6IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCkgPT4ge1xuICAgICAgaWYgKHN0YWNrQXJ0aWZhY3Quc3RhY2tOYW1lID09PSAnRCcpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHJlc291cmNlOiAnRCcgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICB9KTtcbiAgICBjbG91ZEZvcm1hdGlvbi5kZXBsb3lTdGFjay5tb2NrSW1wbGVtZW50YXRpb24oKG9wdGlvbnMpID0+IFByb21pc2UucmVzb2x2ZSh7XG4gICAgICBub09wOiB0cnVlLFxuICAgICAgb3V0cHV0czoge30sXG4gICAgICBzdGFja0FybjogJycsXG4gICAgICBzdGFja0FydGlmYWN0OiBvcHRpb25zLnN0YWNrLFxuICAgIH0pKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGlmZiBjYW4gZGlmZiBtdWx0aXBsZSBzdGFja3MnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGFibGUoKTtcblxuICAgIC8vIFdIRU5cbiAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRvb2xraXQuZGlmZih7XG4gICAgICBzdGFja05hbWVzOiBbJ0InXSxcbiAgICAgIHN0cmVhbTogYnVmZmVyLFxuICAgIH0pO1xuXG4gICAgLy8gVEhFTlxuICAgIGNvbnN0IHBsYWluVGV4dE91dHB1dCA9IGJ1ZmZlci5kYXRhLnJlcGxhY2UoL1xceDFCXFxbWzAtP10qWyAtL10qW0Atfl0vZywgJycpO1xuICAgIGV4cGVjdChwbGFpblRleHRPdXRwdXQpLnRvQ29udGFpbignU3RhY2sgQScpO1xuICAgIGV4cGVjdChwbGFpblRleHRPdXRwdXQpLnRvQ29udGFpbignU3RhY2sgQicpO1xuXG4gICAgZXhwZWN0KGV4aXRDb2RlKS50b0JlKDApO1xuICB9KTtcblxuICB0ZXN0KCdleGl0cyB3aXRoIDEgd2l0aCBkaWZmcyBhbmQgZmFpbCBzZXQgdG8gdHJ1ZScsIGFzeW5jICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTdHJpbmdXcml0YWJsZSgpO1xuXG4gICAgLy8gV0hFTlxuICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdG9vbGtpdC5kaWZmKHtcbiAgICAgIHN0YWNrTmFtZXM6IFsnQSddLFxuICAgICAgc3RyZWFtOiBidWZmZXIsXG4gICAgICBmYWlsOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gVEhFTlxuICAgIGV4cGVjdChleGl0Q29kZSkudG9CZSgxKTtcbiAgfSk7XG5cbiAgdGVzdCgndGhyb3dzIGFuIGVycm9yIGlmIG5vIHZhbGlkIHN0YWNrIG5hbWVzIGdpdmVuJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTdHJpbmdXcml0YWJsZSgpO1xuXG4gICAgLy8gV0hFTlxuICAgIGF3YWl0IGV4cGVjdCgoKSA9PiB0b29sa2l0LmRpZmYoe1xuICAgICAgc3RhY2tOYW1lczogWydYJywgJ1knLCAnWiddLFxuICAgICAgc3RyZWFtOiBidWZmZXIsXG4gICAgfSkpLnJlamVjdHMudG9UaHJvdygnTm8gc3RhY2tzIG1hdGNoIHRoZSBuYW1lKHMpIFgsWSxaJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2V4aXRzIHdpdGggMSB3aXRoIGRpZmYgaW4gZmlyc3Qgc3RhY2ssIGJ1dCBub3QgaW4gc2Vjb25kIHN0YWNrIGFuZCBmYWlsIHNldCB0byB0cnVlJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFN0cmluZ1dyaXRhYmxlKCk7XG5cbiAgICAvLyBXSEVOXG4gICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCB0b29sa2l0LmRpZmYoe1xuICAgICAgc3RhY2tOYW1lczogWydBJywgJ0QnXSxcbiAgICAgIHN0cmVhbTogYnVmZmVyLFxuICAgICAgZmFpbDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFRIRU5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3Rocm93cyBhbiBlcnJvciBkdXJpbmcgZGlmZnMgb24gc3RhY2sgd2l0aCBlcnJvciBtZXRhZGF0YScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGFibGUoKTtcblxuICAgIC8vIFdIRU5cbiAgICBhd2FpdCBleHBlY3QoKCkgPT4gdG9vbGtpdC5kaWZmKHtcbiAgICAgIHN0YWNrTmFtZXM6IFsnQyddLFxuICAgICAgc3RyZWFtOiBidWZmZXIsXG4gICAgfSkpLnJlamVjdHMudG9UaHJvdygvRm91bmQgZXJyb3JzLyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCduZXN0ZWQgc3RhY2tzJywgKCkgPT4ge1xuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBjbG91ZEV4ZWN1dGFibGUgPSBuZXcgTW9ja0Nsb3VkRXhlY3V0YWJsZSh7XG4gICAgICBzdGFja3M6IFt7XG4gICAgICAgIHN0YWNrTmFtZTogJ1BhcmVudCcsXG4gICAgICAgIHRlbXBsYXRlOiB7IH0sXG4gICAgICB9XSxcbiAgICB9KTtcblxuICAgIGNsb3VkRm9ybWF0aW9uID0gaW5zdGFuY2VNb2NrRnJvbShDbG91ZEZvcm1hdGlvbkRlcGxveW1lbnRzKTtcblxuICAgIHRvb2xraXQgPSBuZXcgQ2RrVG9vbGtpdCh7XG4gICAgICBjbG91ZEV4ZWN1dGFibGUsXG4gICAgICBjbG91ZEZvcm1hdGlvbixcbiAgICAgIGNvbmZpZ3VyYXRpb246IGNsb3VkRXhlY3V0YWJsZS5jb25maWd1cmF0aW9uLFxuICAgICAgc2RrUHJvdmlkZXI6IGNsb3VkRXhlY3V0YWJsZS5zZGtQcm92aWRlcixcbiAgICB9KTtcblxuICAgIGNsb3VkRm9ybWF0aW9uLnJlYWRDdXJyZW50VGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzLm1vY2tJbXBsZW1lbnRhdGlvbigoc3RhY2tBcnRpZmFjdDogQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0KSA9PiB7XG4gICAgICBpZiAoc3RhY2tBcnRpZmFjdC5zdGFja05hbWUgPT09ICdQYXJlbnQnKSB7XG4gICAgICAgIHN0YWNrQXJ0aWZhY3QudGVtcGxhdGUuUmVzb3VyY2VzID0ge1xuICAgICAgICAgIEFkZGl0aW9uQ2hpbGQ6IHtcbiAgICAgICAgICAgIFR5cGU6ICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjaycsXG4gICAgICAgICAgICBSZXNvdXJjZXM6IHtcbiAgICAgICAgICAgICAgU29tZVJlc291cmNlOiB7XG4gICAgICAgICAgICAgICAgVHlwZTogJ0FXUzo6U29tZXRoaW5nJyxcbiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICBQcm9wOiAnYWRkZWQtdmFsdWUnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgRGVsZXRpb25DaGlsZDoge1xuICAgICAgICAgICAgVHlwZTogJ0FXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrJyxcbiAgICAgICAgICAgIFJlc291cmNlczoge1xuICAgICAgICAgICAgICBTb21lUmVzb3VyY2U6IHtcbiAgICAgICAgICAgICAgICBUeXBlOiAnQVdTOjpTb21ldGhpbmcnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIENoYW5nZWRDaGlsZDoge1xuICAgICAgICAgICAgVHlwZTogJ0FXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrJyxcbiAgICAgICAgICAgIFJlc291cmNlczoge1xuICAgICAgICAgICAgICBTb21lUmVzb3VyY2U6IHtcbiAgICAgICAgICAgICAgICBUeXBlOiAnQVdTOjpTb21ldGhpbmcnLFxuICAgICAgICAgICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgIFByb3A6ICduZXctdmFsdWUnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgIFJlc291cmNlczoge1xuICAgICAgICAgICAgQWRkaXRpb25DaGlsZDoge1xuICAgICAgICAgICAgICBUeXBlOiAnQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2snLFxuICAgICAgICAgICAgICBSZXNvdXJjZXM6IHtcbiAgICAgICAgICAgICAgICBTb21lUmVzb3VyY2U6IHtcbiAgICAgICAgICAgICAgICAgIFR5cGU6ICdBV1M6OlNvbWV0aGluZycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBEZWxldGlvbkNoaWxkOiB7XG4gICAgICAgICAgICAgIFR5cGU6ICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjaycsXG4gICAgICAgICAgICAgIFJlc291cmNlczoge1xuICAgICAgICAgICAgICAgIFNvbWVSZXNvdXJjZToge1xuICAgICAgICAgICAgICAgICAgVHlwZTogJ0FXUzo6U29tZXRoaW5nJyxcbiAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgUHJvcDogJ3ZhbHVlLXRvLWJlLXJlbW92ZWQnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIENoYW5nZWRDaGlsZDoge1xuICAgICAgICAgICAgICBUeXBlOiAnQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2snLFxuICAgICAgICAgICAgICBSZXNvdXJjZXM6IHtcbiAgICAgICAgICAgICAgICBTb21lUmVzb3VyY2U6IHtcbiAgICAgICAgICAgICAgICAgIFR5cGU6ICdBV1M6OlNvbWV0aGluZycsXG4gICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICAgIFByb3A6ICdvbGQtdmFsdWUnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdkaWZmIGNhbiBkaWZmIG5lc3RlZCBzdGFja3MnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGFibGUoKTtcblxuICAgIC8vIFdIRU5cbiAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRvb2xraXQuZGlmZih7XG4gICAgICBzdGFja05hbWVzOiBbJ1BhcmVudCddLFxuICAgICAgc3RyZWFtOiBidWZmZXIsXG4gICAgfSk7XG5cbiAgICAvLyBUSEVOXG4gICAgY29uc3QgcGxhaW5UZXh0T3V0cHV0ID0gYnVmZmVyLmRhdGEucmVwbGFjZSgvXFx4MUJcXFtbMC0/XSpbIC0vXSpbQC1+XS9nLCAnJyk7XG4gICAgZXhwZWN0KHBsYWluVGV4dE91dHB1dC50cmltKCkpLnRvRXF1YWwoYFN0YWNrIFBhcmVudFxuUmVzb3VyY2VzXG5bfl0gQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2sgQWRkaXRpb25DaGlsZCBcbiDilJTilIAgW35dIFJlc291cmNlc1xuICAgICDilJTilIAgW35dIC5Tb21lUmVzb3VyY2U6XG4gICAgICAgICDilJTilIAgWytdIEFkZGVkOiAuUHJvcGVydGllc1xuW35dIEFXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrIERlbGV0aW9uQ2hpbGQgXG4g4pSU4pSAIFt+XSBSZXNvdXJjZXNcbiAgICAg4pSU4pSAIFt+XSAuU29tZVJlc291cmNlOlxuICAgICAgICAg4pSU4pSAIFstXSBSZW1vdmVkOiAuUHJvcGVydGllc1xuW35dIEFXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrIENoYW5nZWRDaGlsZCBcbiDilJTilIAgW35dIFJlc291cmNlc1xuICAgICDilJTilIAgW35dIC5Tb21lUmVzb3VyY2U6XG4gICAgICAgICDilJTilIAgW35dIC5Qcm9wZXJ0aWVzOlxuICAgICAgICAgICAgIOKUlOKUgCBbfl0gLlByb3A6XG4gICAgICAgICAgICAgICAgIOKUnOKUgCBbLV0gb2xkLXZhbHVlXG4gICAgICAgICAgICAgICAgIOKUlOKUgCBbK10gbmV3LXZhbHVlYCk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gIH0pO1xufSk7XG5cbmNsYXNzIFN0cmluZ1dyaXRhYmxlIGV4dGVuZHMgV3JpdGFibGUge1xuICBwdWJsaWMgZGF0YTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZWNvZGVyOiBOb2RlU3RyaW5nRGVjb2RlcjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBhbnkgPSB7fSkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMuX2RlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zICYmIG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nKTtcbiAgICB0aGlzLmRhdGEgPSAnJztcbiAgfVxuXG4gIHB1YmxpYyBfd3JpdGUoY2h1bms6IGFueSwgZW5jb2Rpbmc6IHN0cmluZywgY2FsbGJhY2s6IChlcnJvcj86IEVycm9yIHwgdW5kZWZpbmVkKSA9PiB2b2lkKSB7XG4gICAgaWYgKGVuY29kaW5nID09PSAnYnVmZmVyJykge1xuICAgICAgY2h1bmsgPSB0aGlzLl9kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICB9XG4gICAgdGhpcy5kYXRhICs9IGNodW5rO1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBwdWJsaWMgX2ZpbmFsKGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpIHtcbiAgICB0aGlzLmRhdGEgKz0gdGhpcy5fZGVjb2Rlci5lbmQoKTtcbiAgICBjYWxsYmFjaygpO1xuICB9XG59XG4iXX0=
|
package/test/util.js
CHANGED
|
@@ -32,6 +32,7 @@ function addAttributes(assembly, builder) {
|
|
|
32
32
|
const templateFile = `${stack.stackName}.template.json`;
|
|
33
33
|
const template = (_a = stack.template) !== null && _a !== void 0 ? _a : exports.DEFAULT_FAKE_TEMPLATE;
|
|
34
34
|
fs.writeFileSync(path.join(builder.outdir, templateFile), JSON.stringify(template, undefined, 2));
|
|
35
|
+
addNestedStacks(templateFile, builder.outdir, template);
|
|
35
36
|
// we call patchStackTags here to simulate the tags formatter
|
|
36
37
|
// that is used when building real manifest files.
|
|
37
38
|
const metadata = patchStackTags({ ...stack.metadata });
|
|
@@ -57,6 +58,22 @@ function addAttributes(assembly, builder) {
|
|
|
57
58
|
});
|
|
58
59
|
}
|
|
59
60
|
}
|
|
61
|
+
function addNestedStacks(templatePath, outdir, rootStackTemplate) {
|
|
62
|
+
let template = rootStackTemplate;
|
|
63
|
+
if (!template) {
|
|
64
|
+
const templatePathWithDir = path.join('diff-nested-stacks-templates', templatePath);
|
|
65
|
+
template = JSON.parse(fs.readFileSync(path.join(__dirname, templatePathWithDir)).toString());
|
|
66
|
+
fs.writeFileSync(path.join(outdir, templatePath), JSON.stringify(template, undefined, 2));
|
|
67
|
+
}
|
|
68
|
+
for (const logicalId in template.Resources) {
|
|
69
|
+
if (template.Resources[logicalId].Type === 'AWS::CloudFormation::Stack') {
|
|
70
|
+
if (template.Resources[logicalId].Metadata && template.Resources[logicalId].Metadata['aws:asset:path']) {
|
|
71
|
+
const nestedTemplatePath = template.Resources[logicalId].Metadata['aws:asset:path'];
|
|
72
|
+
addNestedStacks(nestedTemplatePath, outdir);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
60
77
|
function testAssembly(assembly) {
|
|
61
78
|
var _a;
|
|
62
79
|
const builder = new cxapi.CloudAssemblyBuilder();
|
|
@@ -161,4 +178,4 @@ exports.withMocked = withMocked;
|
|
|
161
178
|
function isPromise(object) {
|
|
162
179
|
return Promise.resolve(object) === object;
|
|
163
180
|
}
|
|
164
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QiwyREFBMkQ7QUFDM0QseUNBQXlDO0FBQ3pDLHdFQUFvRTtBQUNwRSw4Q0FBZ0Q7QUFDaEQsOENBQWtEO0FBRXJDLFFBQUEscUJBQXFCLEdBQUcsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFvQnpELE1BQWEsbUJBQW9CLFNBQVEsa0NBQWU7SUFJdEQsWUFBWSxRQUFzQjtRQUNoQyxNQUFNLGFBQWEsR0FBRyxJQUFJLHdCQUFhLEVBQUUsQ0FBQztRQUMxQyxNQUFNLFdBQVcsR0FBRyxJQUFJLDBCQUFlLEVBQUUsQ0FBQztRQUUxQyxLQUFLLENBQUM7WUFDSixhQUFhO1lBQ2IsV0FBVztZQUNYLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMzRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0NBQ0Y7QUFqQkQsa0RBaUJDO0FBRUQsU0FBUyxLQUFLLENBQUMsR0FBUTtJQUNyQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxRQUFzQixFQUFFLE9BQW1DOztJQUNoRixLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUU7UUFDbkMsTUFBTSxZQUFZLEdBQUcsR0FBRyxLQUFLLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQztRQUN4RCxNQUFNLFFBQVEsU0FBRyxLQUFLLENBQUMsUUFBUSxtQ0FBSSw2QkFBcUIsQ0FBQztRQUN6RCxF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QyxHQUFHLFFBQVEsQ0FBQztLQUNyQjtBQUNILENBQUM7QUFmRCw0REFlQztBQUVELFNBQWdCLFVBQVUsQ0FBeUMsR0FBTSxFQUFFLEdBQU0sRUFBRSxLQUFtQztJQUNwSCxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3hCLEdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7SUFFM0IsSUFBSSxZQUFZLEdBQVksS0FBSyxDQUFDO0lBQ2xDLElBQUk7UUFDRixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBYSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUFFLE9BQU8sR0FBRyxDQUFDO1NBQUU7UUFFcEMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBUSxDQUFDO0tBQzNEO1lBQVM7UUFDUixJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2pCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUM7U0FDckI7S0FDRjtBQUNILENBQUM7QUFqQkQsZ0NBaUJDO0FBRUQsU0FBUyxTQUFTLENBQUksTUFBVztJQUMvQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssTUFBTSxDQUFDO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgY3hzY2hlbWEgZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgeyBDbG91ZEV4ZWN1dGFibGUgfSBmcm9tICcuLi9saWIvYXBpL2N4YXBwL2Nsb3VkLWV4ZWN1dGFibGUnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL2xpYi9zZXR0aW5ncyc7XG5pbXBvcnQgeyBNb2NrU2RrUHJvdmlkZXIgfSBmcm9tICcuL3V0aWwvbW9jay1zZGsnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9GQUtFX1RFTVBMQVRFID0geyBObzogJ1Jlc291cmNlcycgfTtcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0U3RhY2tBcnRpZmFjdCB7XG4gIHN0YWNrTmFtZTogc3RyaW5nO1xuICB0ZW1wbGF0ZT86IGFueTtcbiAgZW52Pzogc3RyaW5nLFxuICBkZXBlbmRzPzogc3RyaW5nW107XG4gIG1ldGFkYXRhPzogY3hhcGkuU3RhY2tNZXRhZGF0YTtcbiAgYXNzZXRzPzogY3hzY2hlbWEuQXNzZXRNZXRhZGF0YUVudHJ5W107XG4gIHByb3BlcnRpZXM/OiBQYXJ0aWFsPGN4c2NoZW1hLkF3c0Nsb3VkRm9ybWF0aW9uU3RhY2tQcm9wZXJ0aWVzPjtcbiAgdGVybWluYXRpb25Qcm90ZWN0aW9uPzogYm9vbGVhbjtcbiAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEFzc2VtYmx5IHtcbiAgc3RhY2tzOiBUZXN0U3RhY2tBcnRpZmFjdFtdO1xuICBtaXNzaW5nPzogY3hzY2hlbWEuTWlzc2luZ0NvbnRleHRbXTtcbiAgbmVzdGVkQXNzZW1ibGllcz86IFRlc3RBc3NlbWJseVtdO1xufVxuXG5leHBvcnQgY2xhc3MgTW9ja0Nsb3VkRXhlY3V0YWJsZSBleHRlbmRzIENsb3VkRXhlY3V0YWJsZSB7XG4gIHB1YmxpYyByZWFkb25seSBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgc2RrUHJvdmlkZXI6IE1vY2tTZGtQcm92aWRlcjtcblxuICBjb25zdHJ1Y3Rvcihhc3NlbWJseTogVGVzdEFzc2VtYmx5KSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7XG4gICAgY29uc3Qgc2RrUHJvdmlkZXIgPSBuZXcgTW9ja1Nka1Byb3ZpZGVyKCk7XG5cbiAgICBzdXBlcih7XG4gICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgc2RrUHJvdmlkZXIsXG4gICAgICBzeW50aGVzaXplcjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRlc3RBc3NlbWJseShhc3NlbWJseSkpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgICB0aGlzLnNka1Byb3ZpZGVyID0gc2RrUHJvdmlkZXI7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvbmUob2JqOiBhbnkpIHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG59XG5cbmZ1bmN0aW9uIGFkZEF0dHJpYnV0ZXMoYXNzZW1ibHk6IFRlc3RBc3NlbWJseSwgYnVpbGRlcjogY3hhcGkuQ2xvdWRBc3NlbWJseUJ1aWxkZXIpIHtcbiAgZm9yIChjb25zdCBzdGFjayBvZiBhc3NlbWJseS5zdGFja3MpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZUZpbGUgPSBgJHtzdGFjay5zdGFja05hbWV9LnRlbXBsYXRlLmpzb25gO1xuICAgIGNvbnN0IHRlbXBsYXRlID0gc3RhY2sudGVtcGxhdGUgPz8gREVGQVVMVF9GQUtFX1RFTVBMQVRFO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKGJ1aWxkZXIub3V0ZGlyLCB0ZW1wbGF0ZUZpbGUpLCBKU09OLnN0cmluZ2lmeSh0ZW1wbGF0ZSwgdW5kZWZpbmVkLCAyKSk7XG5cbiAgICAvLyB3ZSBjYWxsIHBhdGNoU3RhY2tUYWdzIGhlcmUgdG8gc2ltdWxhdGUgdGhlIHRhZ3MgZm9ybWF0dGVyXG4gICAgLy8gdGhhdCBpcyB1c2VkIHdoZW4gYnVpbGRpbmcgcmVhbCBtYW5pZmVzdCBmaWxlcy5cbiAgICBjb25zdCBtZXRhZGF0YTogeyBbcGF0aDogc3RyaW5nXTogY3hzY2hlbWEuTWV0YWRhdGFFbnRyeVtdIH0gPSBwYXRjaFN0YWNrVGFncyh7IC4uLnN0YWNrLm1ldGFkYXRhIH0pO1xuICAgIGZvciAoY29uc3QgYXNzZXQgb2Ygc3RhY2suYXNzZXRzIHx8IFtdKSB7XG4gICAgICBtZXRhZGF0YVthc3NldC5pZF0gPSBbXG4gICAgICAgIHsgdHlwZTogY3hzY2hlbWEuQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5BU1NFVCwgZGF0YTogYXNzZXQgfSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBtaXNzaW5nIG9mIGFzc2VtYmx5Lm1pc3NpbmcgfHwgW10pIHtcbiAgICAgIGJ1aWxkZXIuYWRkTWlzc2luZyhtaXNzaW5nKTtcbiAgICB9XG5cbiAgICBidWlsZGVyLmFkZEFydGlmYWN0KHN0YWNrLnN0YWNrTmFtZSwge1xuICAgICAgdHlwZTogY3hzY2hlbWEuQXJ0aWZhY3RUeXBlLkFXU19DTE9VREZPUk1BVElPTl9TVEFDSyxcbiAgICAgIGVudmlyb25tZW50OiBzdGFjay5lbnYgfHwgJ2F3czovLzEyMzQ1Njc4OTAxMi9oZXJlJyxcblxuICAgICAgZGVwZW5kZW5jaWVzOiBzdGFjay5kZXBlbmRzLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIC4uLnN0YWNrLnByb3BlcnRpZXMsXG4gICAgICAgIHRlbXBsYXRlRmlsZSxcbiAgICAgICAgdGVybWluYXRpb25Qcm90ZWN0aW9uOiBzdGFjay50ZXJtaW5hdGlvblByb3RlY3Rpb24sXG4gICAgICB9LFxuICAgICAgZGlzcGxheU5hbWU6IHN0YWNrLmRpc3BsYXlOYW1lLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0QXNzZW1ibHkoYXNzZW1ibHk6IFRlc3RBc3NlbWJseSk6IGN4YXBpLkNsb3VkQXNzZW1ibHkge1xuICBjb25zdCBidWlsZGVyID0gbmV3IGN4YXBpLkNsb3VkQXNzZW1ibHlCdWlsZGVyKCk7XG4gIGFkZEF0dHJpYnV0ZXMoYXNzZW1ibHksIGJ1aWxkZXIpO1xuXG4gIGlmIChhc3NlbWJseS5uZXN0ZWRBc3NlbWJsaWVzICE9IG51bGwgJiYgYXNzZW1ibHkubmVzdGVkQXNzZW1ibGllcy5sZW5ndGggPiAwKSB7XG4gICAgYXNzZW1ibHkubmVzdGVkQXNzZW1ibGllcz8uZm9yRWFjaCgobmVzdGVkQXNzZW1ibHk6IFRlc3RBc3NlbWJseSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBuZXN0ZWRBc3NlbWJseUJ1aWxkZXIgPSBidWlsZGVyLmNyZWF0ZU5lc3RlZEFzc2VtYmx5KGBuZXN0ZWQke2l9YCwgYG5lc3RlZCR7aX1gKTtcbiAgICAgIGFkZEF0dHJpYnV0ZXMobmVzdGVkQXNzZW1ibHksIG5lc3RlZEFzc2VtYmx5QnVpbGRlcik7XG4gICAgICBuZXN0ZWRBc3NlbWJseUJ1aWxkZXIuYnVpbGRBc3NlbWJseSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGJ1aWxkZXIuYnVpbGRBc3NlbWJseSgpO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBzdGFjayB0YWdzIGZyb20gaG93IHRoZXkgYXJlIGRlY2FscmVkIGluIHNvdXJjZSBjb2RlIChsb3dlciBjYXNlZClcbiAqIHRvIGhvdyB0aGV5IGFyZSBzdG9yZWQgb24gZGlzayAodXBwZXIgY2FzZWQpLiBJbiByZWFsIHN5bnRoZXNpcyB0aGlzIGlzIGRvbmVcbiAqIGJ5IGEgc3BlY2lhbCB0YWdzIGZvcm1hdHRlci5cbiAqXG4gKiBAc2VlIEBhd3MtY2RrL2NvcmUvbGliL3N0YWNrLnRzXG4gKi9cbmZ1bmN0aW9uIHBhdGNoU3RhY2tUYWdzKG1ldGFkYXRhOiB7IFtwYXRoOiBzdHJpbmddOiBjeHNjaGVtYS5NZXRhZGF0YUVudHJ5W10gfSk6IHsgW3BhdGg6IHN0cmluZ106IGN4c2NoZW1hLk1ldGFkYXRhRW50cnlbXSB9IHtcblxuICBjb25zdCBjbG9uZWQgPSBjbG9uZShtZXRhZGF0YSkgYXMgeyBbcGF0aDogc3RyaW5nXTogY3hzY2hlbWEuTWV0YWRhdGFFbnRyeVtdIH07XG5cbiAgZm9yIChjb25zdCBtZXRhZGF0YUVudHJpZXMgb2YgT2JqZWN0LnZhbHVlcyhjbG9uZWQpKSB7XG4gICAgZm9yIChjb25zdCBtZXRhZGF0YUVudHJ5IG9mIG1ldGFkYXRhRW50cmllcykge1xuICAgICAgaWYgKG1ldGFkYXRhRW50cnkudHlwZSA9PT0gY3hzY2hlbWEuQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5TVEFDS19UQUdTICYmIG1ldGFkYXRhRW50cnkuZGF0YSkge1xuXG4gICAgICAgIGNvbnN0IG1ldGFkYXRhQW55ID0gbWV0YWRhdGFFbnRyeSBhcyBhbnk7XG5cbiAgICAgICAgbWV0YWRhdGFBbnkuZGF0YSA9IG1ldGFkYXRhQW55LmRhdGEubWFwKCh0OiBhbnkpID0+IHtcbiAgICAgICAgICByZXR1cm4geyBLZXk6IHQua2V5LCBWYWx1ZTogdC52YWx1ZSB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNsb25lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRlc3RTdGFjayhzdGFjazogVGVzdFN0YWNrQXJ0aWZhY3QpOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Qge1xuICBjb25zdCBhc3NlbWJseSA9IHRlc3RBc3NlbWJseSh7IHN0YWNrczogW3N0YWNrXSB9KTtcbiAgcmV0dXJuIGFzc2VtYmx5LmdldFN0YWNrQnlOYW1lKHN0YWNrLnN0YWNrTmFtZSk7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgbW9ja2VkIGluc3RhbmNlIG9mIGEgY2xhc3MsIGdpdmVuIGl0cyBjb25zdHJ1Y3RvclxuICpcbiAqIEkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgamVzdCBkb2Vzbid0IHByb3ZpZGUgdGhpcyBieSBkZWZhdWx0LFxuICogYnV0IHRoZXJlIHlvdSBnby5cbiAqXG4gKiBGSVhNRTogQ3VycmVudGx5IHZlcnkgbGltaXRlZC4gRG9lc24ndCBzdXBwb3J0IGluaGVyaXRhbmNlLCBnZXR0ZXJzIG9yXG4gKiBhdXRvbWF0aWMgZGV0ZWN0aW9uIG9mIHByb3BlcnRpZXMgKGFzIHRob3NlIGV4aXN0IG9uIGluc3RhbmNlcywgbm90XG4gKiBjbGFzc2VzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbmNlTW9ja0Zyb208QT4oY3RyOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBBKTogamVzdC5Nb2NrZWQ8QT4ge1xuICBjb25zdCByZXQ6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY3RyLnByb3RvdHlwZSkpIHtcbiAgICByZXRbbWV0aG9kTmFtZV0gPSBqZXN0LmZuKCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBSdW4gYW4gYXN5bmMgYmxvY2sgd2l0aCBhIGNsYXNzIChjb25zdHJ1Y3RvcikgcmVwbGFjZWQgd2l0aCBhIG1vY2tcbiAqXG4gKiBUaGUgY2xhc3MgY29uc3RydWN0b3Igd2lsbCBiZSByZXBsYWNlZCB3aXRoIGEgY29uc3RydWN0b3IgdGhhdCByZXR1cm5zXG4gKiBhIHNpbmdsZXRvbiwgYW5kIHRoZSBzaW5nbGV0b24gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGJsb2NrIHNvIHRoYXQgaXRzXG4gKiBtZXRob2RzIGNhbiBiZSBtb2NrZWQgaW5kaXZpZHVhbGx5LlxuICpcbiAqIFVzZXMgYGluc3RhbmNlTW9ja0Zyb21gIHNvIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgbGltaXRhdGlvbnMgdGhhdCBob2xkXG4gKiBmb3IgdGhhdCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhNb2NrZWRDbGFzc1NpbmdsZXRvbjxBIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgQSwgQj4oXG4gIG9iajogQSxcbiAga2V5OiBLLFxuICBjYjogKG1vY2s6IEFbS10gZXh0ZW5kcyBqZXN0LkNvbnN0cnVjdGFibGUgPyBqZXN0Lk1vY2tlZDxJbnN0YW5jZVR5cGU8QVtLXT4+IDogbmV2ZXIpID0+IFByb21pc2U8Qj4sXG4pOiBQcm9taXNlPEI+IHtcblxuICBjb25zdCBvcmlnaW5hbCA9IG9ialtrZXldO1xuICB0cnkge1xuICAgIGNvbnN0IG1vY2sgPSBpbnN0YW5jZU1vY2tGcm9tKG9yaWdpbmFsIGFzIGFueSk7XG4gICAgb2JqW2tleV0gPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKG1vY2spIGFzIGFueTtcbiAgICBjb25zdCByZXQgPSBhd2FpdCBjYihtb2NrIGFzIGFueSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfSBmaW5hbGx5IHtcbiAgICBvYmpba2V5XSA9IG9yaWdpbmFsO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoTW9ja2VkPEEgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBBLCBCPihvYmo6IEEsIGtleTogSywgYmxvY2s6IChmbjogamVzdC5Nb2NrZWQ8QT5bS10pID0+IEIpOiBCIHtcbiAgY29uc3Qgb3JpZ2luYWwgPSBvYmpba2V5XTtcbiAgY29uc3QgbW9ja0ZuID0gamVzdC5mbigpO1xuICAob2JqIGFzIGFueSlba2V5XSA9IG1vY2tGbjtcblxuICBsZXQgYXN5bmNGaW5hbGx5OiBib29sZWFuID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgcmV0ID0gYmxvY2sobW9ja0ZuIGFzIGFueSk7XG4gICAgaWYgKCFpc1Byb21pc2UocmV0KSkgeyByZXR1cm4gcmV0OyB9XG5cbiAgICBhc3luY0ZpbmFsbHkgPSB0cnVlO1xuICAgIHJldHVybiByZXQuZmluYWxseSgoKSA9PiB7IG9ialtrZXldID0gb3JpZ2luYWw7IH0pIGFzIGFueTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoIWFzeW5jRmluYWxseSkge1xuICAgICAgb2JqW2tleV0gPSBvcmlnaW5hbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQcm9taXNlPEE+KG9iamVjdDogYW55KTogb2JqZWN0IGlzIFByb21pc2U8QT4ge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9iamVjdCkgPT09IG9iamVjdDtcbn1cbiJdfQ==
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QiwyREFBMkQ7QUFDM0QseUNBQXlDO0FBQ3pDLHdFQUFvRTtBQUNwRSw4Q0FBZ0Q7QUFDaEQsOENBQWtEO0FBRXJDLFFBQUEscUJBQXFCLEdBQUcsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFvQnpELE1BQWEsbUJBQW9CLFNBQVEsa0NBQWU7SUFJdEQsWUFBWSxRQUFzQjtRQUNoQyxNQUFNLGFBQWEsR0FBRyxJQUFJLHdCQUFhLEVBQUUsQ0FBQztRQUMxQyxNQUFNLFdBQVcsR0FBRyxJQUFJLDBCQUFlLEVBQUUsQ0FBQztRQUUxQyxLQUFLLENBQUM7WUFDSixhQUFhO1lBQ2IsV0FBVztZQUNYLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMzRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0NBQ0Y7QUFqQkQsa0RBaUJDO0FBRUQsU0FBUyxLQUFLLENBQUMsR0FBUTtJQUNyQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxRQUFzQixFQUFFLE9BQW1DOztJQUNoRixLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUU7UUFDbkMsTUFBTSxZQUFZLEdBQUcsR0FBRyxLQUFLLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQztRQUN4RCxNQUFNLFFBQVEsU0FBRyxLQUFLLENBQUMsUUFBUSxtQ0FBSSw2QkFBcUIsQ0FBQztRQUN6RCxF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LENBQUM7S0FDckI7QUFDSCxDQUFDO0FBZkQsNERBZUM7QUFFRCxTQUFnQixVQUFVLENBQXlDLEdBQU0sRUFBRSxHQUFNLEVBQUUsS0FBbUM7SUFDcEgsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUN4QixHQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBRTNCLElBQUksWUFBWSxHQUFZLEtBQUssQ0FBQztJQUNsQyxJQUFJO1FBQ0YsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQWEsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFBRSxPQUFPLEdBQUcsQ0FBQztTQUFFO1FBRXBDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQVEsQ0FBQztLQUMzRDtZQUFTO1FBQ1IsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDO1NBQ3JCO0tBQ0Y7QUFDSCxDQUFDO0FBakJELGdDQWlCQztBQUVELFNBQVMsU0FBUyxDQUFJLE1BQVc7SUFDL0IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLE1BQU0sQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGN4c2NoZW1hIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHsgQ2xvdWRFeGVjdXRhYmxlIH0gZnJvbSAnLi4vbGliL2FwaS9jeGFwcC9jbG91ZC1leGVjdXRhYmxlJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9saWIvc2V0dGluZ3MnO1xuaW1wb3J0IHsgTW9ja1Nka1Byb3ZpZGVyIH0gZnJvbSAnLi91dGlsL21vY2stc2RrJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRkFLRV9URU1QTEFURSA9IHsgTm86ICdSZXNvdXJjZXMnIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdFN0YWNrQXJ0aWZhY3Qge1xuICBzdGFja05hbWU6IHN0cmluZztcbiAgdGVtcGxhdGU/OiBhbnk7XG4gIGVudj86IHN0cmluZyxcbiAgZGVwZW5kcz86IHN0cmluZ1tdO1xuICBtZXRhZGF0YT86IGN4YXBpLlN0YWNrTWV0YWRhdGE7XG4gIGFzc2V0cz86IGN4c2NoZW1hLkFzc2V0TWV0YWRhdGFFbnRyeVtdO1xuICBwcm9wZXJ0aWVzPzogUGFydGlhbDxjeHNjaGVtYS5Bd3NDbG91ZEZvcm1hdGlvblN0YWNrUHJvcGVydGllcz47XG4gIHRlcm1pbmF0aW9uUHJvdGVjdGlvbj86IGJvb2xlYW47XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RBc3NlbWJseSB7XG4gIHN0YWNrczogVGVzdFN0YWNrQXJ0aWZhY3RbXTtcbiAgbWlzc2luZz86IGN4c2NoZW1hLk1pc3NpbmdDb250ZXh0W107XG4gIG5lc3RlZEFzc2VtYmxpZXM/OiBUZXN0QXNzZW1ibHlbXTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tDbG91ZEV4ZWN1dGFibGUgZXh0ZW5kcyBDbG91ZEV4ZWN1dGFibGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IHNka1Byb3ZpZGVyOiBNb2NrU2RrUHJvdmlkZXI7XG5cbiAgY29uc3RydWN0b3IoYXNzZW1ibHk6IFRlc3RBc3NlbWJseSkge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpO1xuICAgIGNvbnN0IHNka1Byb3ZpZGVyID0gbmV3IE1vY2tTZGtQcm92aWRlcigpO1xuXG4gICAgc3VwZXIoe1xuICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgIHNka1Byb3ZpZGVyLFxuICAgICAgc3ludGhlc2l6ZXI6ICgpID0+IFByb21pc2UucmVzb2x2ZSh0ZXN0QXNzZW1ibHkoYXNzZW1ibHkpKSxcbiAgICB9KTtcblxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgdGhpcy5zZGtQcm92aWRlciA9IHNka1Byb3ZpZGVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb25lKG9iajogYW55KSB7XG4gIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xufVxuXG5mdW5jdGlvbiBhZGRBdHRyaWJ1dGVzKGFzc2VtYmx5OiBUZXN0QXNzZW1ibHksIGJ1aWxkZXI6IGN4YXBpLkNsb3VkQXNzZW1ibHlCdWlsZGVyKSB7XG4gIGZvciAoY29uc3Qgc3RhY2sgb2YgYXNzZW1ibHkuc3RhY2tzKSB7XG4gICAgY29uc3QgdGVtcGxhdGVGaWxlID0gYCR7c3RhY2suc3RhY2tOYW1lfS50ZW1wbGF0ZS5qc29uYDtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHN0YWNrLnRlbXBsYXRlID8/IERFRkFVTFRfRkFLRV9URU1QTEFURTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihidWlsZGVyLm91dGRpciwgdGVtcGxhdGVGaWxlKSwgSlNPTi5zdHJpbmdpZnkodGVtcGxhdGUsIHVuZGVmaW5lZCwgMikpO1xuICAgIGFkZE5lc3RlZFN0YWNrcyh0ZW1wbGF0ZUZpbGUsIGJ1aWxkZXIub3V0ZGlyLCB0ZW1wbGF0ZSk7XG5cbiAgICAvLyB3ZSBjYWxsIHBhdGNoU3RhY2tUYWdzIGhlcmUgdG8gc2ltdWxhdGUgdGhlIHRhZ3MgZm9ybWF0dGVyXG4gICAgLy8gdGhhdCBpcyB1c2VkIHdoZW4gYnVpbGRpbmcgcmVhbCBtYW5pZmVzdCBmaWxlcy5cbiAgICBjb25zdCBtZXRhZGF0YTogeyBbcGF0aDogc3RyaW5nXTogY3hzY2hlbWEuTWV0YWRhdGFFbnRyeVtdIH0gPSBwYXRjaFN0YWNrVGFncyh7IC4uLnN0YWNrLm1ldGFkYXRhIH0pO1xuICAgIGZvciAoY29uc3QgYXNzZXQgb2Ygc3RhY2suYXNzZXRzIHx8IFtdKSB7XG4gICAgICBtZXRhZGF0YVthc3NldC5pZF0gPSBbXG4gICAgICAgIHsgdHlwZTogY3hzY2hlbWEuQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5BU1NFVCwgZGF0YTogYXNzZXQgfSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBtaXNzaW5nIG9mIGFzc2VtYmx5Lm1pc3NpbmcgfHwgW10pIHtcbiAgICAgIGJ1aWxkZXIuYWRkTWlzc2luZyhtaXNzaW5nKTtcbiAgICB9XG5cbiAgICBidWlsZGVyLmFkZEFydGlmYWN0KHN0YWNrLnN0YWNrTmFtZSwge1xuICAgICAgdHlwZTogY3hzY2hlbWEuQXJ0aWZhY3RUeXBlLkFXU19DTE9VREZPUk1BVElPTl9TVEFDSyxcbiAgICAgIGVudmlyb25tZW50OiBzdGFjay5lbnYgfHwgJ2F3czovLzEyMzQ1Njc4OTAxMi9oZXJlJyxcblxuICAgICAgZGVwZW5kZW5jaWVzOiBzdGFjay5kZXBlbmRzLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIC4uLnN0YWNrLnByb3BlcnRpZXMsXG4gICAgICAgIHRlbXBsYXRlRmlsZSxcbiAgICAgICAgdGVybWluYXRpb25Qcm90ZWN0aW9uOiBzdGFjay50ZXJtaW5hdGlvblByb3RlY3Rpb24sXG4gICAgICB9LFxuICAgICAgZGlzcGxheU5hbWU6IHN0YWNrLmRpc3BsYXlOYW1lLFxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZE5lc3RlZFN0YWNrcyh0ZW1wbGF0ZVBhdGg6IHN0cmluZywgb3V0ZGlyOiBzdHJpbmcsIHJvb3RTdGFja1RlbXBsYXRlPzogYW55KSB7XG4gIGxldCB0ZW1wbGF0ZSA9IHJvb3RTdGFja1RlbXBsYXRlO1xuXG4gIGlmICghdGVtcGxhdGUpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZVBhdGhXaXRoRGlyID0gcGF0aC5qb2luKCdkaWZmLW5lc3RlZC1zdGFja3MtdGVtcGxhdGVzJywgdGVtcGxhdGVQYXRoKTtcbiAgICB0ZW1wbGF0ZSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsIHRlbXBsYXRlUGF0aFdpdGhEaXIpKS50b1N0cmluZygpKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihvdXRkaXIsIHRlbXBsYXRlUGF0aCksIEpTT04uc3RyaW5naWZ5KHRlbXBsYXRlLCB1bmRlZmluZWQsIDIpKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgbG9naWNhbElkIGluIHRlbXBsYXRlLlJlc291cmNlcykge1xuICAgIGlmICh0ZW1wbGF0ZS5SZXNvdXJjZXNbbG9naWNhbElkXS5UeXBlID09PSAnQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2snKSB7XG4gICAgICBpZiAodGVtcGxhdGUuUmVzb3VyY2VzW2xvZ2ljYWxJZF0uTWV0YWRhdGEgJiYgdGVtcGxhdGUuUmVzb3VyY2VzW2xvZ2ljYWxJZF0uTWV0YWRhdGFbJ2F3czphc3NldDpwYXRoJ10pIHtcbiAgICAgICAgY29uc3QgbmVzdGVkVGVtcGxhdGVQYXRoID0gdGVtcGxhdGUuUmVzb3VyY2VzW2xvZ2ljYWxJZF0uTWV0YWRhdGFbJ2F3czphc3NldDpwYXRoJ107XG4gICAgICAgIGFkZE5lc3RlZFN0YWNrcyhuZXN0ZWRUZW1wbGF0ZVBhdGgsIG91dGRpcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0QXNzZW1ibHkoYXNzZW1ibHk6IFRlc3RBc3NlbWJseSk6IGN4YXBpLkNsb3VkQXNzZW1ibHkge1xuICBjb25zdCBidWlsZGVyID0gbmV3IGN4YXBpLkNsb3VkQXNzZW1ibHlCdWlsZGVyKCk7XG4gIGFkZEF0dHJpYnV0ZXMoYXNzZW1ibHksIGJ1aWxkZXIpO1xuXG4gIGlmIChhc3NlbWJseS5uZXN0ZWRBc3NlbWJsaWVzICE9IG51bGwgJiYgYXNzZW1ibHkubmVzdGVkQXNzZW1ibGllcy5sZW5ndGggPiAwKSB7XG4gICAgYXNzZW1ibHkubmVzdGVkQXNzZW1ibGllcz8uZm9yRWFjaCgobmVzdGVkQXNzZW1ibHk6IFRlc3RBc3NlbWJseSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBuZXN0ZWRBc3NlbWJseUJ1aWxkZXIgPSBidWlsZGVyLmNyZWF0ZU5lc3RlZEFzc2VtYmx5KGBuZXN0ZWQke2l9YCwgYG5lc3RlZCR7aX1gKTtcbiAgICAgIGFkZEF0dHJpYnV0ZXMobmVzdGVkQXNzZW1ibHksIG5lc3RlZEFzc2VtYmx5QnVpbGRlcik7XG4gICAgICBuZXN0ZWRBc3NlbWJseUJ1aWxkZXIuYnVpbGRBc3NlbWJseSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGJ1aWxkZXIuYnVpbGRBc3NlbWJseSgpO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBzdGFjayB0YWdzIGZyb20gaG93IHRoZXkgYXJlIGRlY2FscmVkIGluIHNvdXJjZSBjb2RlIChsb3dlciBjYXNlZClcbiAqIHRvIGhvdyB0aGV5IGFyZSBzdG9yZWQgb24gZGlzayAodXBwZXIgY2FzZWQpLiBJbiByZWFsIHN5bnRoZXNpcyB0aGlzIGlzIGRvbmVcbiAqIGJ5IGEgc3BlY2lhbCB0YWdzIGZvcm1hdHRlci5cbiAqXG4gKiBAc2VlIEBhd3MtY2RrL2NvcmUvbGliL3N0YWNrLnRzXG4gKi9cbmZ1bmN0aW9uIHBhdGNoU3RhY2tUYWdzKG1ldGFkYXRhOiB7IFtwYXRoOiBzdHJpbmddOiBjeHNjaGVtYS5NZXRhZGF0YUVudHJ5W10gfSk6IHsgW3BhdGg6IHN0cmluZ106IGN4c2NoZW1hLk1ldGFkYXRhRW50cnlbXSB9IHtcblxuICBjb25zdCBjbG9uZWQgPSBjbG9uZShtZXRhZGF0YSkgYXMgeyBbcGF0aDogc3RyaW5nXTogY3hzY2hlbWEuTWV0YWRhdGFFbnRyeVtdIH07XG5cbiAgZm9yIChjb25zdCBtZXRhZGF0YUVudHJpZXMgb2YgT2JqZWN0LnZhbHVlcyhjbG9uZWQpKSB7XG4gICAgZm9yIChjb25zdCBtZXRhZGF0YUVudHJ5IG9mIG1ldGFkYXRhRW50cmllcykge1xuICAgICAgaWYgKG1ldGFkYXRhRW50cnkudHlwZSA9PT0gY3hzY2hlbWEuQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5TVEFDS19UQUdTICYmIG1ldGFkYXRhRW50cnkuZGF0YSkge1xuXG4gICAgICAgIGNvbnN0IG1ldGFkYXRhQW55ID0gbWV0YWRhdGFFbnRyeSBhcyBhbnk7XG5cbiAgICAgICAgbWV0YWRhdGFBbnkuZGF0YSA9IG1ldGFkYXRhQW55LmRhdGEubWFwKCh0OiBhbnkpID0+IHtcbiAgICAgICAgICByZXR1cm4geyBLZXk6IHQua2V5LCBWYWx1ZTogdC52YWx1ZSB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNsb25lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRlc3RTdGFjayhzdGFjazogVGVzdFN0YWNrQXJ0aWZhY3QpOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Qge1xuICBjb25zdCBhc3NlbWJseSA9IHRlc3RBc3NlbWJseSh7IHN0YWNrczogW3N0YWNrXSB9KTtcbiAgcmV0dXJuIGFzc2VtYmx5LmdldFN0YWNrQnlOYW1lKHN0YWNrLnN0YWNrTmFtZSk7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgbW9ja2VkIGluc3RhbmNlIG9mIGEgY2xhc3MsIGdpdmVuIGl0cyBjb25zdHJ1Y3RvclxuICpcbiAqIEkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgamVzdCBkb2Vzbid0IHByb3ZpZGUgdGhpcyBieSBkZWZhdWx0LFxuICogYnV0IHRoZXJlIHlvdSBnby5cbiAqXG4gKiBGSVhNRTogQ3VycmVudGx5IHZlcnkgbGltaXRlZC4gRG9lc24ndCBzdXBwb3J0IGluaGVyaXRhbmNlLCBnZXR0ZXJzIG9yXG4gKiBhdXRvbWF0aWMgZGV0ZWN0aW9uIG9mIHByb3BlcnRpZXMgKGFzIHRob3NlIGV4aXN0IG9uIGluc3RhbmNlcywgbm90XG4gKiBjbGFzc2VzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbmNlTW9ja0Zyb208QT4oY3RyOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBBKTogamVzdC5Nb2NrZWQ8QT4ge1xuICBjb25zdCByZXQ6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY3RyLnByb3RvdHlwZSkpIHtcbiAgICByZXRbbWV0aG9kTmFtZV0gPSBqZXN0LmZuKCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBSdW4gYW4gYXN5bmMgYmxvY2sgd2l0aCBhIGNsYXNzIChjb25zdHJ1Y3RvcikgcmVwbGFjZWQgd2l0aCBhIG1vY2tcbiAqXG4gKiBUaGUgY2xhc3MgY29uc3RydWN0b3Igd2lsbCBiZSByZXBsYWNlZCB3aXRoIGEgY29uc3RydWN0b3IgdGhhdCByZXR1cm5zXG4gKiBhIHNpbmdsZXRvbiwgYW5kIHRoZSBzaW5nbGV0b24gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGJsb2NrIHNvIHRoYXQgaXRzXG4gKiBtZXRob2RzIGNhbiBiZSBtb2NrZWQgaW5kaXZpZHVhbGx5LlxuICpcbiAqIFVzZXMgYGluc3RhbmNlTW9ja0Zyb21gIHNvIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgbGltaXRhdGlvbnMgdGhhdCBob2xkXG4gKiBmb3IgdGhhdCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhNb2NrZWRDbGFzc1NpbmdsZXRvbjxBIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgQSwgQj4oXG4gIG9iajogQSxcbiAga2V5OiBLLFxuICBjYjogKG1vY2s6IEFbS10gZXh0ZW5kcyBqZXN0LkNvbnN0cnVjdGFibGUgPyBqZXN0Lk1vY2tlZDxJbnN0YW5jZVR5cGU8QVtLXT4+IDogbmV2ZXIpID0+IFByb21pc2U8Qj4sXG4pOiBQcm9taXNlPEI+IHtcblxuICBjb25zdCBvcmlnaW5hbCA9IG9ialtrZXldO1xuICB0cnkge1xuICAgIGNvbnN0IG1vY2sgPSBpbnN0YW5jZU1vY2tGcm9tKG9yaWdpbmFsIGFzIGFueSk7XG4gICAgb2JqW2tleV0gPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKG1vY2spIGFzIGFueTtcbiAgICBjb25zdCByZXQgPSBhd2FpdCBjYihtb2NrIGFzIGFueSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfSBmaW5hbGx5IHtcbiAgICBvYmpba2V5XSA9IG9yaWdpbmFsO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoTW9ja2VkPEEgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBBLCBCPihvYmo6IEEsIGtleTogSywgYmxvY2s6IChmbjogamVzdC5Nb2NrZWQ8QT5bS10pID0+IEIpOiBCIHtcbiAgY29uc3Qgb3JpZ2luYWwgPSBvYmpba2V5XTtcbiAgY29uc3QgbW9ja0ZuID0gamVzdC5mbigpO1xuICAob2JqIGFzIGFueSlba2V5XSA9IG1vY2tGbjtcblxuICBsZXQgYXN5bmNGaW5hbGx5OiBib29sZWFuID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgcmV0ID0gYmxvY2sobW9ja0ZuIGFzIGFueSk7XG4gICAgaWYgKCFpc1Byb21pc2UocmV0KSkgeyByZXR1cm4gcmV0OyB9XG5cbiAgICBhc3luY0ZpbmFsbHkgPSB0cnVlO1xuICAgIHJldHVybiByZXQuZmluYWxseSgoKSA9PiB7IG9ialtrZXldID0gb3JpZ2luYWw7IH0pIGFzIGFueTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoIWFzeW5jRmluYWxseSkge1xuICAgICAgb2JqW2tleV0gPSBvcmlnaW5hbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQcm9taXNlPEE+KG9iamVjdDogYW55KTogb2JqZWN0IGlzIFByb21pc2U8QT4ge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9iamVjdCkgPT09IG9iamVjdDtcbn1cbiJdfQ==
|