@decaf-ts/ui-decorators 0.5.11 → 0.5.13
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/dist/ui-decorators.cjs +59 -57
- package/dist/ui-decorators.esm.cjs +59 -57
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/ui/Rendering.js +19 -29
- package/lib/esm/ui/decorators.d.ts +35 -25
- package/lib/esm/ui/decorators.js +40 -28
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/ui/Rendering.cjs +19 -29
- package/lib/ui/decorators.cjs +40 -28
- package/lib/ui/decorators.d.ts +35 -25
- package/package.json +1 -1
package/lib/ui/Rendering.cjs
CHANGED
|
@@ -145,13 +145,15 @@ class RenderingEngine {
|
|
|
145
145
|
* RE-->>C: FieldDefinition<T>
|
|
146
146
|
*/
|
|
147
147
|
toFieldDefinition(model, globalProps = {}, generateId = true) {
|
|
148
|
+
const { inheritsTag, ...globalPropsWithoutInherits } = globalProps;
|
|
149
|
+
globalProps = globalPropsWithoutInherits;
|
|
148
150
|
const classDecorators = [
|
|
149
151
|
Reflect.getMetadata(RenderingEngine.key(constants_1.UIKeys.UIMODEL), model.constructor) ||
|
|
150
152
|
Reflect.getMetadata(RenderingEngine.key(constants_1.UIKeys.UIMODEL), decorator_validation_1.Model.get(model.constructor.name)),
|
|
151
153
|
Reflect.getMetadata(RenderingEngine.key(constants_1.UIKeys.UILISTITEM), model.constructor) ||
|
|
152
154
|
Reflect.getMetadata(RenderingEngine.key(constants_1.UIKeys.UILISTITEM), decorator_validation_1.Model.get(model.constructor.name)),
|
|
153
155
|
Reflect.getMetadata(RenderingEngine.key(constants_1.UIKeys.HANDLERS), model.constructor) ||
|
|
154
|
-
Reflect.getMetadata(RenderingEngine.key(constants_1.UIKeys.HANDLERS), decorator_validation_1.Model.get(model.constructor.name))
|
|
156
|
+
Reflect.getMetadata(RenderingEngine.key(constants_1.UIKeys.HANDLERS), decorator_validation_1.Model.get(model.constructor.name)),
|
|
155
157
|
];
|
|
156
158
|
if (!classDecorators)
|
|
157
159
|
throw new errors_1.RenderingError(`No ui definitions set for model ${model.constructor.name}. Did you use @uimodel?`);
|
|
@@ -177,43 +179,30 @@ class RenderingEngine {
|
|
|
177
179
|
throw new errors_1.RenderingError(`No decorator found`);
|
|
178
180
|
switch (dec.key) {
|
|
179
181
|
case constants_1.UIKeys.PROP: {
|
|
180
|
-
|
|
181
|
-
childProps[key] = dec.props;
|
|
182
|
-
break;
|
|
183
|
-
}
|
|
184
|
-
let Clazz;
|
|
185
|
-
const submodel = model[key];
|
|
186
|
-
const constructable = typeof submodel === "object" &&
|
|
187
|
-
submodel !== null &&
|
|
188
|
-
!Array.isArray(submodel);
|
|
189
|
-
if (!constructable)
|
|
190
|
-
Clazz = new (decorator_validation_1.Model.get(dec.props?.name))();
|
|
191
|
-
children = children || [];
|
|
192
|
-
const childrenGlobalProps = Object.assign({}, globalProps || {}, {
|
|
193
|
-
childOf: getPath(globalProps?.childOf, key),
|
|
194
|
-
});
|
|
195
|
-
const childDefinition = this.toFieldDefinition(submodel || Clazz, childrenGlobalProps, false);
|
|
196
|
-
children.push(childDefinition);
|
|
182
|
+
childProps[key] = dec.props;
|
|
197
183
|
break;
|
|
198
184
|
}
|
|
199
185
|
case constants_1.UIKeys.CHILD: {
|
|
200
|
-
if (!decorator_validation_1.Model.isPropertyModel(model, key))
|
|
201
|
-
|
|
202
|
-
break;
|
|
203
|
-
}
|
|
186
|
+
if (!decorator_validation_1.Model.isPropertyModel(model, key))
|
|
187
|
+
throw new errors_1.RenderingError(`Child "${key}" must be a model.`);
|
|
204
188
|
let Clazz;
|
|
205
189
|
const submodel = model[key];
|
|
206
190
|
const constructable = typeof submodel === "object" &&
|
|
207
191
|
submodel !== null &&
|
|
208
192
|
!Array.isArray(submodel);
|
|
209
|
-
if
|
|
210
|
-
|
|
193
|
+
// create instance if undefined
|
|
194
|
+
if (!constructable) {
|
|
195
|
+
const clazzName = dec.props.props
|
|
196
|
+
?.name;
|
|
197
|
+
Clazz = new (decorator_validation_1.Model.get(clazzName))();
|
|
198
|
+
}
|
|
211
199
|
children = children || [];
|
|
212
200
|
const childrenGlobalProps = Object.assign({}, globalProps || {}, {
|
|
213
201
|
inheritsTag: dec.props.tag,
|
|
214
202
|
childOf: getPath(globalProps?.childOf, key),
|
|
215
203
|
});
|
|
216
|
-
const childDefinition = this.toFieldDefinition(submodel || Clazz,
|
|
204
|
+
const childDefinition = this.toFieldDefinition(submodel || Clazz, // Must avoid undefined values — an instance is required to retrieve properties.
|
|
205
|
+
childrenGlobalProps, false);
|
|
217
206
|
children.push(childDefinition);
|
|
218
207
|
break;
|
|
219
208
|
}
|
|
@@ -234,7 +223,6 @@ class RenderingEngine {
|
|
|
234
223
|
path: getPath(globalProps?.childOf, uiProps.props.name),
|
|
235
224
|
childOf: undefined, // The childOf prop is passed by globalProps when it is a nested prop
|
|
236
225
|
}, globalProps);
|
|
237
|
-
delete props["inheritsTag"];
|
|
238
226
|
const childDefinition = {
|
|
239
227
|
tag: uiProps.tag,
|
|
240
228
|
props,
|
|
@@ -271,9 +259,11 @@ class RenderingEngine {
|
|
|
271
259
|
}
|
|
272
260
|
}
|
|
273
261
|
const result = {
|
|
274
|
-
tag:
|
|
262
|
+
tag: inheritsTag || tag,
|
|
275
263
|
item: childProps,
|
|
276
|
-
props: Object.assign({}, props, globalProps, {
|
|
264
|
+
props: Object.assign({}, props, globalProps, {
|
|
265
|
+
handlers: handlers || {},
|
|
266
|
+
}),
|
|
277
267
|
children: children,
|
|
278
268
|
};
|
|
279
269
|
if (generateId)
|
|
@@ -365,4 +355,4 @@ class RenderingEngine {
|
|
|
365
355
|
}
|
|
366
356
|
}
|
|
367
357
|
exports.RenderingEngine = RenderingEngine;
|
|
368
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVuZGVyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL1JlbmRlcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyREFBd0Q7QUFDeEQseUVBT3dDO0FBQ3hDLCtDQU1xQjtBQVVyQix5Q0FBMEM7QUFDMUMscURBQXFFO0FBQ3JFLHVDQUEwRDtBQUUxRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFzQixlQUFlO0lBQ25DOzs7O09BSUc7YUFDWSxVQUFLLEdBSWhCLEVBQUUsQUFKYyxDQUliO0lBZ0JQLFlBQStCLE9BQWU7UUFBZixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBTDlDOztXQUVHO1FBQ08sZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFHckMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsT0FBTywwQkFBMEIsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFhRDs7Ozs7OztPQU9HO0lBQ0gsU0FBUyxDQUFDLEdBQVcsRUFBRSxTQUFrQixJQUFJO1FBQzNDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUNaLEtBQUsscUNBQWMsQ0FBQyxNQUFNO29CQUN4QixPQUFPLDJCQUFlLENBQUMsSUFBSSxDQUFDO2dCQUM5QixLQUFLLHFDQUFjLENBQUMsTUFBTSxDQUFDO2dCQUMzQixLQUFLLHFDQUFjLENBQUMsTUFBTTtvQkFDeEIsT0FBTywyQkFBZSxDQUFDLE1BQU0sQ0FBQztnQkFDaEMsS0FBSyxxQ0FBYyxDQUFDLE9BQU87b0JBQ3pCLE9BQU8sMkJBQWUsQ0FBQyxRQUFRLENBQUM7Z0JBQ2xDLEtBQUsscUNBQWMsQ0FBQyxJQUFJO29CQUN0QixPQUFPLDJCQUFlLENBQUMsSUFBSSxDQUFDO1lBQ2hDLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JB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QU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQzFCLE1BQU0sSUFBSSw2QkFBYSxDQUNyQiwwQkFBMEIsT0FBTyxpQkFBaUIsQ0FDbkQsQ0FBQztRQUNKLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBRUksQ0FDdkIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILE1BQU0sQ0FBQyxNQUFNLENBQWtCLEtBQVEsRUFBRSxHQUFHLElBQVc7UUFDckQsTUFBTSxXQUFXLEdBQUcsNEJBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSw0QkFBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsV0FBVztZQUNkLE1BQU0sSUFBSSw2QkFBYSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDdkQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FDakMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxrQkFBTSxDQUFDLFdBQVcsQ0FBQyxFQUN2QyxXQUFzQyxDQUN2QyxDQUFDO1FBRUYsK0NBQStDO1FBQy9DLE9BQU8sZUFBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFXO1FBQ3BCLE9BQU8sR0FBRyxrQkFBTSxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNuQyxDQUFDOztBQXBnQkgsMENBcWdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBNb2RlbCxcbiAgTW9kZWxDb25zdHJ1Y3RvcixcbiAgUmVzZXJ2ZWRNb2RlbHMsXG4gIFZhbGlkYXRpb25LZXlzLFxuICBWYWxpZGF0aW9uTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIEhUTUw1RGF0ZUZvcm1hdCxcbiAgSFRNTDVJbnB1dFR5cGVzLFxuICBVSUtleXMsXG4gIFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUsXG4gIFZhbGlkYXRhYmxlQnlUeXBlLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEZpZWxkRGVmaW5pdGlvbixcbiAgRmllbGRQcm9wZXJ0aWVzLFxuICBVSUVsZW1lbnRNZXRhZGF0YSxcbiAgVUlMaXN0SXRlbUVsZW1lbnRNZXRhZGF0YSxcbiAgVUlMaXN0SXRlbU1vZGVsTWV0YWRhdGEsXG4gIFVJTW9kZWxNZXRhZGF0YSxcbiAgVUlQcm9wTWV0YWRhdGEsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBSZW5kZXJpbmdFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgRGVjb3JhdG9yTWV0YWRhdGEsIFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IGZvcm1hdEJ5VHlwZSwgZ2VuZXJhdGVVSU1vZGVsSUQgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBjbGFzcyBmb3IgcmVuZGVyaW5nIFVJIGNvbXBvbmVudHMgYmFzZWQgb24gbW9kZWwgbWV0YWRhdGEuXG4gKiBAc3VtbWFyeSBUaGUgUmVuZGVyaW5nRW5naW5lIGNsYXNzIHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBjb252ZXJ0aW5nIG1vZGVsIG1ldGFkYXRhIGludG8gVUkgZmllbGQgZGVmaW5pdGlvbnMuXG4gKiBJdCBoYW5kbGVzIHRoZSB0cmFuc2xhdGlvbiBvZiBtb2RlbCBwcm9wZXJ0aWVzIHRvIFVJIGVsZW1lbnRzLCBhcHBsaWVzIHZhbGlkYXRpb24gcnVsZXMsIGFuZCBtYW5hZ2VzIGRpZmZlcmVudCByZW5kZXJpbmcgZmxhdm9ycy5cbiAqIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gYmUgZXh0ZW5kZWQgYnkgc3BlY2lmaWMgcmVuZGVyaW5nIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgcmVuZGVyaW5nIHJlc3VsdCwgZGVmYXVsdHMgdG8gdm9pZFxuICogQHRlbXBsYXRlIFIgVGhlIHR5cGUgb2YgdGhlIGZpZWxkIGRlZmluaXRpb24sIGRlZmF1bHRzIHRvIEZpZWxkRGVmaW5pdGlvbjxUPlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGZsYXZvciBvZiB0aGUgcmVuZGVyaW5nIGVuZ2luZS5cbiAqXG4gKiBAY2xhc3MgUmVuZGVyaW5nRW5naW5lXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZW5kZXJpbmdFbmdpbmU8VCA9IHZvaWQsIFIgPSBGaWVsZERlZmluaXRpb248VD4+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDYWNoZSBmb3Igc3RvcmluZyByZW5kZXJpbmcgZW5naW5lIGluc3RhbmNlcyBvciBjb25zdHJ1Y3RvcnMuXG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGNhY2hlOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHwgQ29uc3RydWN0b3I8UmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+PlxuICAgIHwgUmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+XG4gID4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50bHkgYWN0aXZlIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGN1cnJlbnQ6XG4gICAgfCBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj4+XG4gICAgfCBSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByZW5kZXJpbmcgZW5naW5lIGhhcyBiZWVuIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGZsYXZvdXI6IHN0cmluZykge1xuICAgIFJlbmRlcmluZ0VuZ2luZS5yZWdpc3Rlcih0aGlzKTtcbiAgICBjb25zb2xlLmxvZyhgZGVjYWYncyAke2ZsYXZvdXJ9IHJlbmRlcmluZyBlbmdpbmUgbG9hZGVkYCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSByZW5kZXJpbmcgZW5naW5lLlxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyBmb3Igc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgbmVlZGVkIGZvciBpbml0aWFsaXphdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGUuXG4gICAqXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgYWJzdHJhY3QgaW5pdGlhbGl6ZSguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUcmFuc2xhdGVzIGJldHdlZW4gbW9kZWwgdHlwZXMgYW5kIEhUTUwgaW5wdXQgdHlwZXMuXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIG1vZGVsIGRhdGEgdHlwZXMgdG8gYXBwcm9wcmlhdGUgSFRNTCBpbnB1dCB0eXBlcyBhbmQgdmljZSB2ZXJzYS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgdG8gdHJhbnNsYXRlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt0b1ZpZXc9dHJ1ZV0gLSBEaXJlY3Rpb24gb2YgdHJhbnNsYXRpb24gKHRydWUgZm9yIG1vZGVsIHRvIHZpZXcsIGZhbHNlIGZvciB2aWV3IHRvIG1vZGVsKS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHRyYW5zbGF0ZWQgdHlwZS5cbiAgICovXG4gIHRyYW5zbGF0ZShrZXk6IHN0cmluZywgdG9WaWV3OiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgaWYgKHRvVmlldykge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBSZXNlcnZlZE1vZGVscy5TVFJJTkc6XG4gICAgICAgICAgcmV0dXJuIEhUTUw1SW5wdXRUeXBlcy5URVhUO1xuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLk5VTUJFUjpcbiAgICAgICAgY2FzZSBSZXNlcnZlZE1vZGVscy5CSUdJTlQ6XG4gICAgICAgICAgcmV0dXJuIEhUTUw1SW5wdXRUeXBlcy5OVU1CRVI7XG4gICAgICAgIGNhc2UgUmVzZXJ2ZWRNb2RlbHMuQk9PTEVBTjpcbiAgICAgICAgICByZXR1cm4gSFRNTDVJbnB1dFR5cGVzLkNIRUNLQk9YO1xuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLkRBVEU6XG4gICAgICAgICAgcmV0dXJuIEhUTUw1SW5wdXRUeXBlcy5EQVRFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5URVhUOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5FTUFJTDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuQ09MT1I6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlBBU1NXT1JEOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5URUw6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlVSTDpcbiAgICAgICAgICByZXR1cm4gUmVzZXJ2ZWRNb2RlbHMuU1RSSU5HO1xuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5OVU1CRVI6XG4gICAgICAgICAgcmV0dXJuIFJlc2VydmVkTW9kZWxzLk5VTUJFUjtcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuQ0hFQ0tCT1g6XG4gICAgICAgICAgcmV0dXJuIFJlc2VydmVkTW9kZWxzLkJPT0xFQU47XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkRBVEU6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkRBVEVUSU1FX0xPQ0FMOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5USU1FOlxuICAgICAgICAgIHJldHVybiBSZXNlcnZlZE1vZGVscy5EQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB0eXBlIGlzIHZhbGlkYXRhYmxlIGJ5IGl0cyBuYXR1cmUuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgYSBnaXZlbiBVSSBrZXkgcmVwcmVzZW50cyBhIHR5cGUgdGhhdCBpcyBpbmhlcmVudGx5IHZhbGlkYXRhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIFVJIGtleSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHR5cGUgaXMgdmFsaWRhdGFibGUsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHByb3RlY3RlZCBpc1ZhbGlkYXRhYmxlQnlUeXBlKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKFZhbGlkYXRhYmxlQnlUeXBlKS5pbmNsdWRlcyhrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB0eXBlIGlzIHZhbGlkYXRhYmxlIGJ5IGF0dHJpYnV0ZS5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIFVJIGtleSByZXByZXNlbnRzIGEgdmFsaWRhdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIGFzIGFuIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBVSSBrZXkgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB0eXBlIGlzIHZhbGlkYXRhYmxlIGJ5IGF0dHJpYnV0ZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzVmFsaWRhdGFibGVCeUF0dHJpYnV0ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhWYWxpZGF0YWJsZUJ5QXR0cmlidXRlKS5pbmNsdWRlcyhrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB2YWxpZGF0aW9uIG1ldGFkYXRhIHRvIGFuIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICogQHN1bW1hcnkgVHJhbnNmb3JtcyB2YWxpZGF0aW9uIG1ldGFkYXRhIGludG8gYSB2YWx1ZSBzdWl0YWJsZSBmb3IgdXNlIGFzIGFuIEhUTUwgYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHZhbGlkYXRpb24ga2V5LlxuICAgKiBAcGFyYW0ge1ZhbGlkYXRpb25NZXRhZGF0YX0gdmFsdWUgLSBUaGUgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bWJlciB8IGJvb2xlYW59IFRoZSBjb252ZXJ0ZWQgYXR0cmlidXRlIHZhbHVlLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIGtleSBpcyBub3QgdmFsaWRhdGFibGUgYnkgYXR0cmlidXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHRvQXR0cmlidXRlVmFsdWUoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IFZhbGlkYXRpb25NZXRhZGF0YVxuICApOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHtcbiAgICBpZiAoIU9iamVjdC5rZXlzKFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUpLmluY2x1ZGVzKGtleSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGF0dHJpYnV0ZSBrZXkgXCIke2tleX1cIi4gRXhwZWN0ZWQgb25lIG9mOiAke09iamVjdC5rZXlzKFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUpLmpvaW4oXCIsIFwiKX0uYFxuICAgICAgKTtcblxuICAgIHJldHVybiBrZXkgPT09IFVJS2V5cy5SRVFVSVJFRCA/IHRydWUgOiB2YWx1ZVtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIG1vZGVsIHRvIGEgZmllbGQgZGVmaW5pdGlvbi5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgbW9kZWwgaW5zdGFuY2UsIGV4dHJhY3RpbmcgVUktcmVsYXRlZCBtZXRhZGF0YSBhbmQgdmFsaWRhdGlvbiBydWxlcyB0byBjcmVhdGUgYSBmaWVsZCBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIHJlZmVyZW5jaW5nIHRoZSBzcGVjaWZpYyBSZW5kZXJpbmcgZW5naW5lIGZpZWxkIHByb3BlcnRpZXMvaW5wdXRzXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gY29udmVydC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gW2dsb2JhbFByb3BzPXt9XSAtIEdsb2JhbCBwcm9wZXJ0aWVzIHRvIGFwcGx5IHRvIGFsbCBjaGlsZCBlbGVtZW50cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZ2VuZXJhdGVJZD10cnVlXSAtIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHBvcHVsYXRlIHRoZSByZW5kZXJlcklkIHByb3BlcnR5LlxuICAgKiBAcmV0dXJucyB7RmllbGREZWZpbml0aW9uPFQ+fSBBIGZpZWxkIGRlZmluaXRpb24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgVUkgc3RydWN0dXJlIG9mIHRoZSBtb2RlbC5cbiAgICogQHRocm93cyB7UmVuZGVyaW5nRXJyb3J9IElmIG5vIFVJIGRlZmluaXRpb25zIGFyZSBzZXQgZm9yIHRoZSBtb2RlbCBvciBpZiB0aGVyZSBhcmUgaW52YWxpZCBkZWNvcmF0b3JzLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gICAqICBwYXJ0aWNpcGFudCBSRSBhcyBSZW5kZXJpbmdFbmdpbmVcbiAgICogIHBhcnRpY2lwYW50IFIgYXMgUmVmbGVjdGlvblxuICAgKiAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICAgKiAgQy0+PlJFOiB0b0ZpZWxkRGVmaW5pdGlvbihtb2RlbCwgZ2xvYmFsUHJvcHMpXG4gICAqICBSRS0+PlI6IGdldE1ldGFkYXRhKFVJS2V5cy5VSU1PREVMLCBtb2RlbC5jb25zdHJ1Y3RvcilcbiAgICogIFItLT4+UkU6IFVJTW9kZWxNZXRhZGF0YVxuICAgKiAgUkUtPj5SOiBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMobW9kZWwsIFVJS2V5cy5SRUZMRUNUKVxuICAgKiAgUi0tPj5SRTogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGFbXT5cbiAgICogIFJFLT4+UjogZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKG1vZGVsLCBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUKVxuICAgKiAgUi0tPj5SRTogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPltdPlxuICAgKiAgbG9vcCBGb3IgZWFjaCBwcm9wZXJ0eVxuICAgKiAgICBSRS0+PlJFOiBQcm9jZXNzIFVJIGRlY29yYXRvcnNcbiAgICogICAgUkUtPj5SRTogQXBwbHkgdmFsaWRhdGlvbiBydWxlc1xuICAgKiAgZW5kXG4gICAqICBSRS0tPj5DOiBGaWVsZERlZmluaXRpb248VD5cbiAgICovXG4gIHByb3RlY3RlZCB0b0ZpZWxkRGVmaW5pdGlvbjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIGdsb2JhbFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuICAgIGdlbmVyYXRlSWQ6IGJvb2xlYW4gPSB0cnVlXG4gICk6IEZpZWxkRGVmaW5pdGlvbjxUPiB7XG4gICAgY29uc3QgY2xhc3NEZWNvcmF0b3JzOiBVSU1vZGVsTWV0YWRhdGFbXSB8IFVJTGlzdEl0ZW1Nb2RlbE1ldGFkYXRhW10gPSBbXG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSU1PREVMKSxcbiAgICAgICAgbW9kZWwuY29uc3RydWN0b3JcbiAgICAgICkgfHxcbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSU1PREVMKSxcbiAgICAgICAgICBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSkgYXMgYW55XG4gICAgICAgICksXG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSUxJU1RJVEVNKSxcbiAgICAgICAgbW9kZWwuY29uc3RydWN0b3JcbiAgICAgICkgfHxcbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSUxJU1RJVEVNKSxcbiAgICAgICAgICBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSkgYXMgYW55XG4gICAgICAgICksXG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5IQU5ETEVSUyksXG4gICAgICAgIG1vZGVsLmNvbnN0cnVjdG9yXG4gICAgICApIHx8XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuSEFORExFUlMpLFxuICAgICAgICAgIE1vZGVsLmdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKSBhcyBhbnlcbiAgICAgICAgKVxuICAgIF07XG5cbiAgICBpZiAoIWNsYXNzRGVjb3JhdG9ycylcbiAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihcbiAgICAgICAgYE5vIHVpIGRlZmluaXRpb25zIHNldCBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfS4gRGlkIHlvdSB1c2UgQHVpbW9kZWw/YFxuICAgICAgKTtcblxuICAgIGNvbnN0IGNsYXNzRGVjb3JhdG9yID0gT2JqZWN0LmFzc2lnbih7fSwgLi4uY2xhc3NEZWNvcmF0b3JzKTtcbiAgICBjb25zdCB7IHRhZywgcHJvcHMsIGl0ZW0sIGhhbmRsZXJzfSA9IGNsYXNzRGVjb3JhdG9yO1xuXG4gICAgY29uc3QgdWlEZWNvcmF0b3JzOiBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YVtdPiA9XG4gICAgICBSZWZsZWN0aW9uLmdldEFsbFByb3BlcnR5RGVjb3JhdG9ycyhtb2RlbCwgVUlLZXlzLlJFRkxFQ1QpIGFzIFJlY29yZDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBEZWNvcmF0b3JNZXRhZGF0YVtdXG4gICAgICA+O1xuICAgIGxldCBjaGlsZHJlbjogRmllbGREZWZpbml0aW9uPFJlY29yZDxzdHJpbmcsIGFueT4+W10gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGNoaWxkUHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBpdGVtPy5wcm9wcyB8fCB7fTtcbiAgICBsZXQgbWFwcGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgY29uc3QgZ2V0UGF0aCA9IChwYXJlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgcHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gcGFyZW50ID8gW3BhcmVudCwgcHJvcF0uam9pbihcIi5cIikgOiBwcm9wO1xuICAgIH07XG5cbiAgICBpZiAodWlEZWNvcmF0b3JzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRGVjb3JhdG9yczogUmVjb3JkPFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIERlY29yYXRvck1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT5bXVxuICAgICAgPiA9IFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVFxuICAgICAgKSBhcyBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+W10+O1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB1aURlY29yYXRvcnMpIHtcbiAgICAgICAgY29uc3QgZGVjcyA9IHVpRGVjb3JhdG9yc1trZXldO1xuICAgICAgICBjb25zdCB0eXBlcyA9IE9iamVjdC52YWx1ZXMoZGVjcykuZmlsdGVyKFxuICAgICAgICAgIChpdGVtKSA9PiBpdGVtLmtleSA9PT0gVUlLZXlzLlBST1AgfHwgaXRlbS5rZXkgPT09IFVJS2V5cy5FTEVNRU5UXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlcz8ubGVuZ3RoID4gMSlcbiAgICAgICAgICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoXG4gICAgICAgICAgICBgT25seSBvbmUgdHlwZSBvZiBkZWNvcmF0aW9uIGlzIGFsbG93ZWQuIFBsZWFzZSBjaG9vc2UgYmV0d2VlbiBAdWlwcm9wIGFuZCBAdWllbGVtZW50YFxuICAgICAgICAgICk7XG4gICAgICAgIGRlY3Muc2hpZnQoKTtcbiAgICAgICAgZGVjcy5mb3JFYWNoKChkZWMpID0+IHtcbiAgICAgICAgICBpZiAoIWRlYykgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKGBObyBkZWNvcmF0b3IgZm91bmRgKTtcblxuICAgICAgICAgIHN3aXRjaCAoZGVjLmtleSkge1xuICAgICAgICAgICAgY2FzZSBVSUtleXMuUFJPUDoge1xuICAgICAgICAgICAgICBpZiAoIU1vZGVsLmlzUHJvcGVydHlNb2RlbChtb2RlbCwga2V5KSkge1xuICAgICAgICAgICAgICAgIGNoaWxkUHJvcHNba2V5XSA9IGRlYy5wcm9wcyBhcyBVSVByb3BNZXRhZGF0YTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGxldCBDbGF6ejtcbiAgICAgICAgICAgICAgY29uc3Qgc3VibW9kZWwgPSAobW9kZWwgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XSBhcyBNb2RlbDtcbiAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0YWJsZSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHN1Ym1vZGVsID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICAgICAgc3VibW9kZWwgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAhQXJyYXkuaXNBcnJheShzdWJtb2RlbCk7XG4gICAgICAgICAgICAgIGlmICghY29uc3RydWN0YWJsZSlcbiAgICAgICAgICAgICAgICBDbGF6eiA9IG5ldyAoTW9kZWwuZ2V0KFxuICAgICAgICAgICAgICAgICAgZGVjLnByb3BzPy5uYW1lIGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICkgYXMgTW9kZWxDb25zdHJ1Y3RvcjxNb2RlbD4pKCk7XG5cbiAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiB8fCBbXTtcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW5HbG9iYWxQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIGdsb2JhbFByb3BzIHx8IHt9LCB7XG4gICAgICAgICAgICAgICAgY2hpbGRPZjogZ2V0UGF0aChnbG9iYWxQcm9wcz8uY2hpbGRPZiBhcyBzdHJpbmcsIGtleSksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBjb25zdCBjaGlsZERlZmluaXRpb24gPSB0aGlzLnRvRmllbGREZWZpbml0aW9uKFxuICAgICAgICAgICAgICAgIHN1Ym1vZGVsIHx8IENsYXp6LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuR2xvYmFsUHJvcHMsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24gYXMgRmllbGREZWZpbml0aW9uPFJlY29yZDxzdHJpbmcsIGFueT4+XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBVSUtleXMuQ0hJTEQ6IHtcbiAgICAgICAgICAgICAgaWYgKCFNb2RlbC5pc1Byb3BlcnR5TW9kZWwobW9kZWwsIGtleSkpIHtcbiAgICAgICAgICAgICAgICBjaGlsZFByb3BzW2tleV0gPSBkZWMucHJvcHMgYXMgVUlQcm9wTWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBsZXQgQ2xheno7XG4gICAgICAgICAgICAgIGNvbnN0IHN1Ym1vZGVsID0gKG1vZGVsIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV0gYXMgTW9kZWw7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdGFibGUgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBzdWJtb2RlbCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgICAgIHN1Ym1vZGVsICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoc3VibW9kZWwpO1xuICAgICAgICAgICAgICBpZiAoIWNvbnN0cnVjdGFibGUpXG4gICAgICAgICAgICAgICAgQ2xhenogPSBuZXcgKE1vZGVsLmdldChcbiAgICAgICAgICAgICAgICAgIGRlYy5wcm9wcz8ubmFtZSBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICApIGFzIE1vZGVsQ29uc3RydWN0b3I8TW9kZWw+KSgpO1xuXG4gICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gfHwgW107XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuR2xvYmFsUHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBnbG9iYWxQcm9wcyB8fCB7fSwge1xuICAgICAgICAgICAgICAgIGluaGVyaXRzVGFnOiBkZWMucHJvcHMudGFnLFxuICAgICAgICAgICAgICAgIGNoaWxkT2Y6IGdldFBhdGgoZ2xvYmFsUHJvcHM/LmNoaWxkT2YgYXMgc3RyaW5nLCBrZXkpLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGREZWZpbml0aW9uID0gdGhpcy50b0ZpZWxkRGVmaW5pdGlvbihcbiAgICAgICAgICAgICAgICBzdWJtb2RlbCB8fCBDbGF6eixcbiAgICAgICAgICAgICAgICBjaGlsZHJlbkdsb2JhbFByb3BzLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXG4gICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uIGFzIEZpZWxkRGVmaW5pdGlvbjxSZWNvcmQ8c3RyaW5nLCBhbnk+PlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLlVJTElTVFBST1A6IHtcbiAgICAgICAgICAgICAgbWFwcGVyID0gbWFwcGVyIHx8IHt9O1xuICAgICAgICAgICAgICBtYXBwZXJbZGVjLnByb3BzPy5uYW1lIGFzIHN0cmluZ10gPSBrZXk7XG4gICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICBjbGFzc0RlY29yYXRvci5wcm9wcz8uaXRlbSB8fCB7fSxcbiAgICAgICAgICAgICAgICBpdGVtPy5wcm9wcyB8fCB7fSxcbiAgICAgICAgICAgICAgICBkZWMucHJvcHM/LnByb3BzIHx8IHt9LFxuICAgICAgICAgICAgICAgIGdsb2JhbFByb3BzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNoaWxkUHJvcHMgPSB7XG4gICAgICAgICAgICAgICAgdGFnOiBpdGVtPy50YWcgfHwgcHJvcHMucmVuZGVyIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgcHJvcHM6IE9iamVjdC5hc3NpZ24oe30sIGNoaWxkUHJvcHM/LnByb3BzLCB7IG1hcHBlciB9LCBwcm9wcyksXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5FTEVNRU5UOiB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gfHwgW107XG5cbiAgICAgICAgICAgICAgY29uc3QgdWlQcm9wczogVUlFbGVtZW50TWV0YWRhdGEgPSBkZWMucHJvcHMgYXMgVUlFbGVtZW50TWV0YWRhdGE7XG4gICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICB1aVByb3BzLnByb3BzIGFzIGFueSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBwYXRoOiBnZXRQYXRoKFxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxQcm9wcz8uY2hpbGRPZiBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHVpUHJvcHMucHJvcHMhLm5hbWVcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBjaGlsZE9mOiB1bmRlZmluZWQsIC8vIFRoZSBjaGlsZE9mIHByb3AgaXMgcGFzc2VkIGJ5IGdsb2JhbFByb3BzIHdoZW4gaXQgaXMgYSBuZXN0ZWQgcHJvcFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsUHJvcHNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgZGVsZXRlIHByb3BzW1wiaW5oZXJpdHNUYWdcIl07XG5cbiAgICAgICAgICAgICAgY29uc3QgY2hpbGREZWZpbml0aW9uOiBGaWVsZERlZmluaXRpb248UmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gICAgICAgICAgICAgICAgdGFnOiB1aVByb3BzLnRhZyxcbiAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uRGVjczogRGVjb3JhdG9yTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPltdID1cbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRGVjb3JhdG9yc1tcbiAgICAgICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgICAgIF0gYXMgRGVjb3JhdG9yTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPltdO1xuXG4gICAgICAgICAgICAgIGNvbnN0IHR5cGVEZWM6IERlY29yYXRvck1ldGFkYXRhT2JqZWN0ID1cbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRGVjcy5zaGlmdCgpIGFzIERlY29yYXRvck1ldGFkYXRhO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlYyBvZiB2YWxpZGF0aW9uRGVjcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWRhdGFibGVCeUF0dHJpYnV0ZShkZWMua2V5KSkge1xuICAgICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW3RoaXMudHJhbnNsYXRlKGRlYy5rZXkpXSA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9BdHRyaWJ1dGVWYWx1ZShkZWMua2V5LCBkZWMucHJvcHMpO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWRhdGFibGVCeVR5cGUoZGVjLmtleSkpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChkZWMua2V5ID09PSBIVE1MNUlucHV0VHlwZXMuREFURSkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLkZPUk1BVF0gPVxuICAgICAgICAgICAgICAgICAgICAgIGRlYy5wcm9wcy5mb3JtYXQgfHwgSFRNTDVEYXRlRm9ybWF0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5UWVBFXSA9IGRlYy5rZXk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoIWNoaWxkRGVmaW5pdGlvbi5wcm9wc1tVSUtleXMuVFlQRV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNpY1R5cGUgPSAodHlwZURlYy5wcm9wcyBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lO1xuICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wc1tVSUtleXMuVFlQRV0gPSB0aGlzLnRyYW5zbGF0ZShcbiAgICAgICAgICAgICAgICAgIGJhc2ljVHlwZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHMudmFsdWUgPSBmb3JtYXRCeVR5cGUoXG4gICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5UWVBFXSxcbiAgICAgICAgICAgICAgICBtb2RlbFtrZXkgYXMga2V5b2YgTV0sXG4gICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5GT1JNQVRdXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZERlZmluaXRpb24pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihgSW52YWxpZCBrZXk6ICR7ZGVjLmtleX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogRmllbGREZWZpbml0aW9uPFQ+ID0ge1xuICAgICAgdGFnOiAoZ2xvYmFsUHJvcHM/LmluaGVyaXRzVGFnIGFzIHN0cmluZykgfHwgdGFnLFxuICAgICAgaXRlbTogY2hpbGRQcm9wcyBhcyBVSUxpc3RJdGVtRWxlbWVudE1ldGFkYXRhLFxuICAgICAgcHJvcHM6IE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCBnbG9iYWxQcm9wcywge2hhbmRsZXJzOiBoYW5kbGVycyB8fCB7fX0pIGFzIFQgJiBGaWVsZFByb3BlcnRpZXMsXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW4gYXMgRmllbGREZWZpbml0aW9uPGFueT5bXSxcbiAgICB9O1xuXG4gICAgaWYgKGdlbmVyYXRlSWQpIHJlc3VsdC5yZW5kZXJlcklkID0gZ2VuZXJhdGVVSU1vZGVsSUQobW9kZWwpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVuZGVycyBhIG1vZGVsIHdpdGggZ2xvYmFsIHByb3BlcnRpZXMgYW5kIGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBkZWZpbmUgc3BlY2lmaWMgcmVuZGVyaW5nIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAdGVtcGxhdGUgUiBSZW5kZXJpbmcgZW5naW5lIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIG91dHB1dCB0eXBlXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gYmUgcmVuZGVyZWQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGdsb2JhbFByb3BzIC0gR2xvYmFsIHByb3BlcnRpZXMgdG8gYmUgYXBwbGllZCB0byBhbGwgZWxlbWVudHMgZHVyaW5nIHJlbmRlcmluZy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgbWF5IGJlIHJlcXVpcmVkIGZvciBzcGVjaWZpYyByZW5kZXJpbmcgaW1wbGVtZW50YXRpb25zLlxuICAgKiBAcmV0dXJucyB7Un0gVGhlIHJlbmRlcmVkIHJlc3VsdCwgdHlwZSBkZXBlbmRzIG9uIHRoZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBhYnN0cmFjdCByZW5kZXI8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBnbG9iYWxQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIHJlbmRlcmluZyBlbmdpbmUgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEFkZHMgYSByZW5kZXJpbmcgZW5naW5lIHRvIHRoZSBzdGF0aWMgY2FjaGUgYW5kIHNldHMgaXQgYXMgdGhlIGN1cnJlbnQgZW5naW5lLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPn0gZW5naW5lIC0gVGhlIHJlbmRlcmluZyBlbmdpbmUgdG8gcmVnaXN0ZXIuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGFuIGVuZ2luZSB3aXRoIHRoZSBzYW1lIGZsYXZvciBhbHJlYWR5IGV4aXN0cy5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyKGVuZ2luZTogUmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+KSB7XG4gICAgaWYgKGVuZ2luZS5mbGF2b3VyIGluIHRoaXMuY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFJlbmRlcmluZyBlbmdpbmUgdW5kZXIgJHtlbmdpbmUuZmxhdm91cn0gYWxyZWFkeSBleGlzdHNgXG4gICAgICApO1xuICAgIHRoaXMuY2FjaGVbZW5naW5lLmZsYXZvdXJdID0gZW5naW5lO1xuICAgIHRoaXMuY3VycmVudCA9IGVuZ2luZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG9yIGluaXRpYWxpemVzIGEgcmVuZGVyaW5nIGVuZ2luZS5cbiAgICogQHN1bW1hcnkgR2V0cyBhbiBleGlzdGluZyBlbmdpbmUgaW5zdGFuY2Ugb3IgY3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBuZXcgb25lIGlmIGdpdmVuIGEgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBPIFRoZSB0eXBlIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIG91dHB1dFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTxPPj4gfCBSZW5kZXJpbmdFbmdpbmU8Tz59IG9iaiAtIFRoZSBlbmdpbmUgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm5zIHtSZW5kZXJpbmdFbmdpbmU8Tz59IFRoZSBpbml0aWFsaXplZCByZW5kZXJpbmcgZW5naW5lLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRPckJvb3Q8Tz4oXG4gICAgb2JqOiBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8Tz4+IHwgUmVuZGVyaW5nRW5naW5lPE8+XG4gICk6IFJlbmRlcmluZ0VuZ2luZTxPPiB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlbmRlcmluZ0VuZ2luZSkgcmV0dXJuIG9iaiBhcyBSZW5kZXJpbmdFbmdpbmU8Tz47XG4gICAgY29uc3QgZW5naW5lOiBSZW5kZXJpbmdFbmdpbmU8Tz4gPSBuZXcgb2JqKCk7XG4gICAgZW5naW5lLmluaXRpYWxpemUoKTsgLy8gbWFrZSB0aGUgYm9vdGluZyBhc3luYy4gdXNlIHRoZSBpbml0aWFsaXplZCBmbGFnIHRvIGNvbnRyb2wgaXRcbiAgICByZXR1cm4gZW5naW5lIGFzIFJlbmRlcmluZ0VuZ2luZTxPPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVuZGVyaW5nIGVuZ2luZSBieSBmbGF2b3IuXG4gICAqIEBzdW1tYXJ5IEdldHMgdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGVuZ2luZSBvciBhIHNwZWNpZmljIG9uZSBieSBmbGF2b3IuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBPIFRoZSB0eXBlIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIG91dHB1dFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXJdIC0gVGhlIGZsYXZvciBvZiB0aGUgcmVuZGVyaW5nIGVuZ2luZSB0byByZXRyaWV2ZS5cbiAgICogQHJldHVybnMge1JlbmRlcmluZ0VuZ2luZTxPPn0gVGhlIHJlcXVlc3RlZCByZW5kZXJpbmcgZW5naW5lLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgcmVxdWVzdGVkIGZsYXZvciBkb2VzIG5vdCBleGlzdC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGdldDxPPihmbGF2b3VyPzogc3RyaW5nKTogUmVuZGVyaW5nRW5naW5lPE8+IHtcbiAgICBpZiAoIWZsYXZvdXIpXG4gICAgICByZXR1cm4gdGhpcy5nZXRPckJvb3Q8Tz4oXG4gICAgICAgIHRoaXMuY3VycmVudCBhcyBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8Tz4+IHwgUmVuZGVyaW5nRW5naW5lPE8+XG4gICAgICApO1xuICAgIGlmICghKGZsYXZvdXIgaW4gdGhpcy5jYWNoZSkpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFJlbmRlcmluZyBlbmdpbmUgdW5kZXIgJHtmbGF2b3VyfSBkb2VzIG5vdCBleGlzdGBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JCb290PE8+KFxuICAgICAgdGhpcy5jYWNoZVtmbGF2b3VyXSBhc1xuICAgICAgICB8IENvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTxPPj5cbiAgICAgICAgfCBSZW5kZXJpbmdFbmdpbmU8Tz5cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW5kZXJzIGEgbW9kZWwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgdGhlIGNvcnJlY3QgcmVuZGVyaW5nIGVuZ2luZSBmb3IgYSBtb2RlbCBhbmQgaW52b2tlcyBpdHMgcmVuZGVyIG1ldGhvZC5cbiAgICpcbiAgICogQHRlbXBsYXRlIE0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byByZW5kZXIuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSByZW5kZXIgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7YW55fSBUaGUgcmVzdWx0IG9mIHRoZSByZW5kZXJpbmcgcHJvY2Vzcy5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gcmVnaXN0ZXJlZCBtb2RlbCBpcyBmb3VuZC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHJlbmRlcjxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSkgfHwgTW9kZWwuZnJvbU9iamVjdChtb2RlbCk7XG4gICAgaWYgKCFjb25zdHJ1Y3RvcikgXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vIG1vZGVsIHJlZ2lzdGVyZWQgZm91bmRcIik7XG4gICAgY29uc3QgZmxhdm91ciA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5SRU5ERVJFRF9CWSksXG4gICAgICBjb25zdHJ1Y3RvciBhcyBNb2RlbENvbnN0cnVjdG9yPE1vZGVsPlxuICAgICk7XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGZvciB0aGUgdmFyIGFyZ3MgdHlwZSBjaGVja1xuICAgIHJldHVybiBSZW5kZXJpbmdFbmdpbmUuZ2V0KGZsYXZvdXIpLnJlbmRlcihtb2RlbCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIG1ldGFkYXRhIGtleSBmb3IgVUktcmVsYXRlZCBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBQcmVmaXhlcyBhIGdpdmVuIGtleSB3aXRoIHRoZSBVSSByZWZsZWN0aW9uIHByZWZpeC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgdG8gcHJlZml4LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcHJlZml4ZWQga2V5LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMga2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7VUlLZXlzLlJFRkxFQ1R9JHtrZXl9YDtcbiAgfVxufVxuIl19
|
|
358
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVuZGVyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL1JlbmRlcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyREFBd0Q7QUFDeEQseUVBT3dDO0FBQ3hDLCtDQU1xQjtBQVVyQix5Q0FBMEM7QUFDMUMscURBQXFFO0FBQ3JFLHVDQUEwRDtBQUUxRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFzQixlQUFlO0lBQ25DOzs7O09BSUc7YUFDWSxVQUFLLEdBSWhCLEVBQUUsQUFKYyxDQUliO0lBZ0JQLFlBQStCLE9BQWU7UUFBZixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBTDlDOztXQUVHO1FBQ08sZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFHckMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsT0FBTywwQkFBMEIsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFhRDs7Ozs7OztPQU9HO0lBQ0gsU0FBUyxDQUFDLEdBQVcsRUFBRSxTQUFrQixJQUFJO1FBQzNDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUNaLEtBQUsscUNBQWMsQ0FBQyxNQUFNO29CQUN4QixPQUFPLDJCQUFlLENBQUMsSUFBSSxDQUFDO2dCQUM5QixLQUFLLHFDQUFjLENBQUMsTUFBTSxDQUFDO2dCQUMzQixLQUFLLHFDQUFjLENBQUMsTUFBTTtvQkFDeEIsT0FBTywyQkFBZSxDQUFDLE1BQU0sQ0FBQztnQkFDaEMsS0FBSyxxQ0FBYyxDQUFDLE9BQU87b0JBQ3pCLE9BQU8sMkJBQWUsQ0FBQyxRQUFRLENBQUM7Z0JBQ2xDLEtBQUsscUNBQWMsQ0FBQyxJQUFJO29CQUN0QixPQUFPLDJCQUFlLENBQUMsSUFBSSxDQUFDO1lBQ2hDLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JB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LEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQVc7UUFDcEIsT0FBTyxHQUFHLGtCQUFNLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ25DLENBQUM7O0FBN2VILDBDQThlQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBNb2RlbCxcbiAgTW9kZWxDb25zdHJ1Y3RvcixcbiAgUmVzZXJ2ZWRNb2RlbHMsXG4gIFZhbGlkYXRpb25LZXlzLFxuICBWYWxpZGF0aW9uTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIEhUTUw1RGF0ZUZvcm1hdCxcbiAgSFRNTDVJbnB1dFR5cGVzLFxuICBVSUtleXMsXG4gIFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUsXG4gIFZhbGlkYXRhYmxlQnlUeXBlLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEZpZWxkRGVmaW5pdGlvbixcbiAgRmllbGRQcm9wZXJ0aWVzLFxuICBVSUVsZW1lbnRNZXRhZGF0YSxcbiAgVUlMaXN0SXRlbUVsZW1lbnRNZXRhZGF0YSxcbiAgVUlMaXN0SXRlbU1vZGVsTWV0YWRhdGEsXG4gIFVJTW9kZWxNZXRhZGF0YSxcbiAgVUlQcm9wTWV0YWRhdGEsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBSZW5kZXJpbmdFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgRGVjb3JhdG9yTWV0YWRhdGEsIFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IGZvcm1hdEJ5VHlwZSwgZ2VuZXJhdGVVSU1vZGVsSUQgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBjbGFzcyBmb3IgcmVuZGVyaW5nIFVJIGNvbXBvbmVudHMgYmFzZWQgb24gbW9kZWwgbWV0YWRhdGEuXG4gKiBAc3VtbWFyeSBUaGUgUmVuZGVyaW5nRW5naW5lIGNsYXNzIHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBjb252ZXJ0aW5nIG1vZGVsIG1ldGFkYXRhIGludG8gVUkgZmllbGQgZGVmaW5pdGlvbnMuXG4gKiBJdCBoYW5kbGVzIHRoZSB0cmFuc2xhdGlvbiBvZiBtb2RlbCBwcm9wZXJ0aWVzIHRvIFVJIGVsZW1lbnRzLCBhcHBsaWVzIHZhbGlkYXRpb24gcnVsZXMsIGFuZCBtYW5hZ2VzIGRpZmZlcmVudCByZW5kZXJpbmcgZmxhdm9ycy5cbiAqIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gYmUgZXh0ZW5kZWQgYnkgc3BlY2lmaWMgcmVuZGVyaW5nIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgcmVuZGVyaW5nIHJlc3VsdCwgZGVmYXVsdHMgdG8gdm9pZFxuICogQHRlbXBsYXRlIFIgVGhlIHR5cGUgb2YgdGhlIGZpZWxkIGRlZmluaXRpb24sIGRlZmF1bHRzIHRvIEZpZWxkRGVmaW5pdGlvbjxUPlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGZsYXZvciBvZiB0aGUgcmVuZGVyaW5nIGVuZ2luZS5cbiAqXG4gKiBAY2xhc3MgUmVuZGVyaW5nRW5naW5lXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZW5kZXJpbmdFbmdpbmU8VCA9IHZvaWQsIFIgPSBGaWVsZERlZmluaXRpb248VD4+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDYWNoZSBmb3Igc3RvcmluZyByZW5kZXJpbmcgZW5naW5lIGluc3RhbmNlcyBvciBjb25zdHJ1Y3RvcnMuXG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGNhY2hlOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHwgQ29uc3RydWN0b3I8UmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+PlxuICAgIHwgUmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+XG4gID4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50bHkgYWN0aXZlIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGN1cnJlbnQ6XG4gICAgfCBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj4+XG4gICAgfCBSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByZW5kZXJpbmcgZW5naW5lIGhhcyBiZWVuIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGZsYXZvdXI6IHN0cmluZykge1xuICAgIFJlbmRlcmluZ0VuZ2luZS5yZWdpc3Rlcih0aGlzKTtcbiAgICBjb25zb2xlLmxvZyhgZGVjYWYncyAke2ZsYXZvdXJ9IHJlbmRlcmluZyBlbmdpbmUgbG9hZGVkYCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSByZW5kZXJpbmcgZW5naW5lLlxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyBmb3Igc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgbmVlZGVkIGZvciBpbml0aWFsaXphdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGUuXG4gICAqXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgYWJzdHJhY3QgaW5pdGlhbGl6ZSguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUcmFuc2xhdGVzIGJldHdlZW4gbW9kZWwgdHlwZXMgYW5kIEhUTUwgaW5wdXQgdHlwZXMuXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIG1vZGVsIGRhdGEgdHlwZXMgdG8gYXBwcm9wcmlhdGUgSFRNTCBpbnB1dCB0eXBlcyBhbmQgdmljZSB2ZXJzYS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgdG8gdHJhbnNsYXRlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt0b1ZpZXc9dHJ1ZV0gLSBEaXJlY3Rpb24gb2YgdHJhbnNsYXRpb24gKHRydWUgZm9yIG1vZGVsIHRvIHZpZXcsIGZhbHNlIGZvciB2aWV3IHRvIG1vZGVsKS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHRyYW5zbGF0ZWQgdHlwZS5cbiAgICovXG4gIHRyYW5zbGF0ZShrZXk6IHN0cmluZywgdG9WaWV3OiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgaWYgKHRvVmlldykge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBSZXNlcnZlZE1vZGVscy5TVFJJTkc6XG4gICAgICAgICAgcmV0dXJuIEhUTUw1SW5wdXRUeXBlcy5URVhUO1xuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLk5VTUJFUjpcbiAgICAgICAgY2FzZSBSZXNlcnZlZE1vZGVscy5CSUdJTlQ6XG4gICAgICAgICAgcmV0dXJuIEhUTUw1SW5wdXRUeXBlcy5OVU1CRVI7XG4gICAgICAgIGNhc2UgUmVzZXJ2ZWRNb2RlbHMuQk9PTEVBTjpcbiAgICAgICAgICByZXR1cm4gSFRNTDVJbnB1dFR5cGVzLkNIRUNLQk9YO1xuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLkRBVEU6XG4gICAgICAgICAgcmV0dXJuIEhUTUw1SW5wdXRUeXBlcy5EQVRFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5URVhUOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5FTUFJTDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuQ09MT1I6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlBBU1NXT1JEOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5URUw6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlVSTDpcbiAgICAgICAgICByZXR1cm4gUmVzZXJ2ZWRNb2RlbHMuU1RSSU5HO1xuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5OVU1CRVI6XG4gICAgICAgICAgcmV0dXJuIFJlc2VydmVkTW9kZWxzLk5VTUJFUjtcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuQ0hFQ0tCT1g6XG4gICAgICAgICAgcmV0dXJuIFJlc2VydmVkTW9kZWxzLkJPT0xFQU47XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkRBVEU6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkRBVEVUSU1FX0xPQ0FMOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5USU1FOlxuICAgICAgICAgIHJldHVybiBSZXNlcnZlZE1vZGVscy5EQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB0eXBlIGlzIHZhbGlkYXRhYmxlIGJ5IGl0cyBuYXR1cmUuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgYSBnaXZlbiBVSSBrZXkgcmVwcmVzZW50cyBhIHR5cGUgdGhhdCBpcyBpbmhlcmVudGx5IHZhbGlkYXRhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIFVJIGtleSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHR5cGUgaXMgdmFsaWRhdGFibGUsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHByb3RlY3RlZCBpc1ZhbGlkYXRhYmxlQnlUeXBlKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKFZhbGlkYXRhYmxlQnlUeXBlKS5pbmNsdWRlcyhrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB0eXBlIGlzIHZhbGlkYXRhYmxlIGJ5IGF0dHJpYnV0ZS5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIFVJIGtleSByZXByZXNlbnRzIGEgdmFsaWRhdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIGFzIGFuIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBVSSBrZXkgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB0eXBlIGlzIHZhbGlkYXRhYmxlIGJ5IGF0dHJpYnV0ZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzVmFsaWRhdGFibGVCeUF0dHJpYnV0ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhWYWxpZGF0YWJsZUJ5QXR0cmlidXRlKS5pbmNsdWRlcyhrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB2YWxpZGF0aW9uIG1ldGFkYXRhIHRvIGFuIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICogQHN1bW1hcnkgVHJhbnNmb3JtcyB2YWxpZGF0aW9uIG1ldGFkYXRhIGludG8gYSB2YWx1ZSBzdWl0YWJsZSBmb3IgdXNlIGFzIGFuIEhUTUwgYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHZhbGlkYXRpb24ga2V5LlxuICAgKiBAcGFyYW0ge1ZhbGlkYXRpb25NZXRhZGF0YX0gdmFsdWUgLSBUaGUgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bWJlciB8IGJvb2xlYW59IFRoZSBjb252ZXJ0ZWQgYXR0cmlidXRlIHZhbHVlLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIGtleSBpcyBub3QgdmFsaWRhdGFibGUgYnkgYXR0cmlidXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHRvQXR0cmlidXRlVmFsdWUoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IFZhbGlkYXRpb25NZXRhZGF0YVxuICApOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHtcbiAgICBpZiAoIU9iamVjdC5rZXlzKFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUpLmluY2x1ZGVzKGtleSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGF0dHJpYnV0ZSBrZXkgXCIke2tleX1cIi4gRXhwZWN0ZWQgb25lIG9mOiAke09iamVjdC5rZXlzKFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUpLmpvaW4oXCIsIFwiKX0uYFxuICAgICAgKTtcblxuICAgIHJldHVybiBrZXkgPT09IFVJS2V5cy5SRVFVSVJFRCA/IHRydWUgOiB2YWx1ZVtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIG1vZGVsIHRvIGEgZmllbGQgZGVmaW5pdGlvbi5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgbW9kZWwgaW5zdGFuY2UsIGV4dHJhY3RpbmcgVUktcmVsYXRlZCBtZXRhZGF0YSBhbmQgdmFsaWRhdGlvbiBydWxlcyB0byBjcmVhdGUgYSBmaWVsZCBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIHJlZmVyZW5jaW5nIHRoZSBzcGVjaWZpYyBSZW5kZXJpbmcgZW5naW5lIGZpZWxkIHByb3BlcnRpZXMvaW5wdXRzXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gY29udmVydC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gW2dsb2JhbFByb3BzPXt9XSAtIEdsb2JhbCBwcm9wZXJ0aWVzIHRvIGFwcGx5IHRvIGFsbCBjaGlsZCBlbGVtZW50cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZ2VuZXJhdGVJZD10cnVlXSAtIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHBvcHVsYXRlIHRoZSByZW5kZXJlcklkIHByb3BlcnR5LlxuICAgKiBAcmV0dXJucyB7RmllbGREZWZpbml0aW9uPFQ+fSBBIGZpZWxkIGRlZmluaXRpb24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgVUkgc3RydWN0dXJlIG9mIHRoZSBtb2RlbC5cbiAgICogQHRocm93cyB7UmVuZGVyaW5nRXJyb3J9IElmIG5vIFVJIGRlZmluaXRpb25zIGFyZSBzZXQgZm9yIHRoZSBtb2RlbCBvciBpZiB0aGVyZSBhcmUgaW52YWxpZCBkZWNvcmF0b3JzLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gICAqICBwYXJ0aWNpcGFudCBSRSBhcyBSZW5kZXJpbmdFbmdpbmVcbiAgICogIHBhcnRpY2lwYW50IFIgYXMgUmVmbGVjdGlvblxuICAgKiAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICAgKiAgQy0+PlJFOiB0b0ZpZWxkRGVmaW5pdGlvbihtb2RlbCwgZ2xvYmFsUHJvcHMpXG4gICAqICBSRS0+PlI6IGdldE1ldGFkYXRhKFVJS2V5cy5VSU1PREVMLCBtb2RlbC5jb25zdHJ1Y3RvcilcbiAgICogIFItLT4+UkU6IFVJTW9kZWxNZXRhZGF0YVxuICAgKiAgUkUtPj5SOiBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMobW9kZWwsIFVJS2V5cy5SRUZMRUNUKVxuICAgKiAgUi0tPj5SRTogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGFbXT5cbiAgICogIFJFLT4+UjogZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKG1vZGVsLCBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUKVxuICAgKiAgUi0tPj5SRTogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPltdPlxuICAgKiAgbG9vcCBGb3IgZWFjaCBwcm9wZXJ0eVxuICAgKiAgICBSRS0+PlJFOiBQcm9jZXNzIFVJIGRlY29yYXRvcnNcbiAgICogICAgUkUtPj5SRTogQXBwbHkgdmFsaWRhdGlvbiBydWxlc1xuICAgKiAgZW5kXG4gICAqICBSRS0tPj5DOiBGaWVsZERlZmluaXRpb248VD5cbiAgICovXG4gIHByb3RlY3RlZCB0b0ZpZWxkRGVmaW5pdGlvbjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIGdsb2JhbFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuICAgIGdlbmVyYXRlSWQ6IGJvb2xlYW4gPSB0cnVlXG4gICk6IEZpZWxkRGVmaW5pdGlvbjxUPiB7XG4gICAgY29uc3QgeyBpbmhlcml0c1RhZywgLi4uZ2xvYmFsUHJvcHNXaXRob3V0SW5oZXJpdHMgfSA9IGdsb2JhbFByb3BzO1xuICAgIGdsb2JhbFByb3BzID0gZ2xvYmFsUHJvcHNXaXRob3V0SW5oZXJpdHM7XG5cbiAgICBjb25zdCBjbGFzc0RlY29yYXRvcnM6IFVJTW9kZWxNZXRhZGF0YVtdIHwgVUlMaXN0SXRlbU1vZGVsTWV0YWRhdGFbXSA9IFtcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTU9ERUwpLFxuICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvclxuICAgICAgKSB8fFxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTU9ERUwpLFxuICAgICAgICAgIE1vZGVsLmdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKSBhcyBhbnlcbiAgICAgICAgKSxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTElTVElURU0pLFxuICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvclxuICAgICAgKSB8fFxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTElTVElURU0pLFxuICAgICAgICAgIE1vZGVsLmdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKSBhcyBhbnlcbiAgICAgICAgKSxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLkhBTkRMRVJTKSxcbiAgICAgICAgbW9kZWwuY29uc3RydWN0b3JcbiAgICAgICkgfHxcbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5IQU5ETEVSUyksXG4gICAgICAgICAgTW9kZWwuZ2V0KG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpIGFzIGFueVxuICAgICAgICApLFxuICAgIF07XG5cbiAgICBpZiAoIWNsYXNzRGVjb3JhdG9ycylcbiAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihcbiAgICAgICAgYE5vIHVpIGRlZmluaXRpb25zIHNldCBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfS4gRGlkIHlvdSB1c2UgQHVpbW9kZWw/YFxuICAgICAgKTtcblxuICAgIGNvbnN0IGNsYXNzRGVjb3JhdG9yID0gT2JqZWN0LmFzc2lnbih7fSwgLi4uY2xhc3NEZWNvcmF0b3JzKTtcbiAgICBjb25zdCB7IHRhZywgcHJvcHMsIGl0ZW0sIGhhbmRsZXJzIH0gPSBjbGFzc0RlY29yYXRvcjtcblxuICAgIGNvbnN0IHVpRGVjb3JhdG9yczogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGFbXT4gPVxuICAgICAgUmVmbGVjdGlvbi5nZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMobW9kZWwsIFVJS2V5cy5SRUZMRUNUKSBhcyBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgRGVjb3JhdG9yTWV0YWRhdGFbXVxuICAgICAgPjtcbiAgICBsZXQgY2hpbGRyZW46IEZpZWxkRGVmaW5pdGlvbjxSZWNvcmQ8c3RyaW5nLCBhbnk+PltdIHwgdW5kZWZpbmVkO1xuICAgIGxldCBjaGlsZFByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gaXRlbT8ucHJvcHMgfHwge307XG4gICAgbGV0IG1hcHBlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGNvbnN0IGdldFBhdGggPSAocGFyZW50OiBzdHJpbmcgfCB1bmRlZmluZWQsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIHBhcmVudCA/IFtwYXJlbnQsIHByb3BdLmpvaW4oXCIuXCIpIDogcHJvcDtcbiAgICB9O1xuXG4gICAgaWYgKHVpRGVjb3JhdG9ycykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkRlY29yYXRvcnM6IFJlY29yZDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBEZWNvcmF0b3JNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+W11cbiAgICAgID4gPSBSZWZsZWN0aW9uLmdldEFsbFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIFZhbGlkYXRpb25LZXlzLlJFRkxFQ1RcbiAgICAgICkgYXMgUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPltdPjtcblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdWlEZWNvcmF0b3JzKSB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSB1aURlY29yYXRvcnNba2V5XTtcbiAgICAgICAgY29uc3QgdHlwZXMgPSBPYmplY3QudmFsdWVzKGRlY3MpLmZpbHRlcihcbiAgICAgICAgICAoaXRlbSkgPT4gaXRlbS5rZXkgPT09IFVJS2V5cy5QUk9QIHx8IGl0ZW0ua2V5ID09PSBVSUtleXMuRUxFTUVOVFxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZXM/Lmxlbmd0aCA+IDEpXG4gICAgICAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKFxuICAgICAgICAgICAgYE9ubHkgb25lIHR5cGUgb2YgZGVjb3JhdGlvbiBpcyBhbGxvd2VkLiBQbGVhc2UgY2hvb3NlIGJldHdlZW4gQHVpcHJvcCBhbmQgQHVpZWxlbWVudGBcbiAgICAgICAgICApO1xuICAgICAgICBkZWNzLnNoaWZ0KCk7XG4gICAgICAgIGRlY3MuZm9yRWFjaCgoZGVjKSA9PiB7XG4gICAgICAgICAgaWYgKCFkZWMpIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihgTm8gZGVjb3JhdG9yIGZvdW5kYCk7XG5cbiAgICAgICAgICBzd2l0Y2ggKGRlYy5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLlBST1A6IHtcbiAgICAgICAgICAgICAgY2hpbGRQcm9wc1trZXldID0gZGVjLnByb3BzIGFzIFVJUHJvcE1ldGFkYXRhO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLkNISUxEOiB7XG4gICAgICAgICAgICAgIGlmICghTW9kZWwuaXNQcm9wZXJ0eU1vZGVsKG1vZGVsLCBrZXkpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihgQ2hpbGQgXCIke2tleX1cIiBtdXN0IGJlIGEgbW9kZWwuYCk7XG5cbiAgICAgICAgICAgICAgbGV0IENsYXp6O1xuICAgICAgICAgICAgICBjb25zdCBzdWJtb2RlbCA9IChtb2RlbCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldIGFzIE1vZGVsO1xuICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RhYmxlID1cbiAgICAgICAgICAgICAgICB0eXBlb2Ygc3VibW9kZWwgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICAgICBzdWJtb2RlbCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICFBcnJheS5pc0FycmF5KHN1Ym1vZGVsKTtcbiAgICAgICAgICAgICAgLy8gY3JlYXRlIGluc3RhbmNlIGlmIHVuZGVmaW5lZFxuICAgICAgICAgICAgICBpZiAoIWNvbnN0cnVjdGFibGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGF6ek5hbWUgPSAoZGVjLnByb3BzLnByb3BzIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICAgICAgICAgICAgICA/Lm5hbWUgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgIENsYXp6ID0gbmV3IChNb2RlbC5nZXQoY2xhenpOYW1lKSBhcyBNb2RlbENvbnN0cnVjdG9yPE1vZGVsPikoKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gfHwgW107XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuR2xvYmFsUHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBnbG9iYWxQcm9wcyB8fCB7fSwge1xuICAgICAgICAgICAgICAgIGluaGVyaXRzVGFnOiBkZWMucHJvcHMudGFnLFxuICAgICAgICAgICAgICAgIGNoaWxkT2Y6IGdldFBhdGgoZ2xvYmFsUHJvcHM/LmNoaWxkT2YgYXMgc3RyaW5nLCBrZXkpLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGREZWZpbml0aW9uID0gdGhpcy50b0ZpZWxkRGVmaW5pdGlvbihcbiAgICAgICAgICAgICAgICBzdWJtb2RlbCB8fCBDbGF6eiwgLy8gTXVzdCBhdm9pZCB1bmRlZmluZWQgdmFsdWVzIOKAlCBhbiBpbnN0YW5jZSBpcyByZXF1aXJlZCB0byByZXRyaWV2ZSBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgICAgIGNoaWxkcmVuR2xvYmFsUHJvcHMsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24gYXMgRmllbGREZWZpbml0aW9uPFJlY29yZDxzdHJpbmcsIGFueT4+XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBVSUtleXMuVUlMSVNUUFJPUDoge1xuICAgICAgICAgICAgICBtYXBwZXIgPSBtYXBwZXIgfHwge307XG4gICAgICAgICAgICAgIG1hcHBlcltkZWMucHJvcHM/Lm5hbWUgYXMgc3RyaW5nXSA9IGtleTtcbiAgICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgIGNsYXNzRGVjb3JhdG9yLnByb3BzPy5pdGVtIHx8IHt9LFxuICAgICAgICAgICAgICAgIGl0ZW0/LnByb3BzIHx8IHt9LFxuICAgICAgICAgICAgICAgIGRlYy5wcm9wcz8ucHJvcHMgfHwge30sXG4gICAgICAgICAgICAgICAgZ2xvYmFsUHJvcHNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY2hpbGRQcm9wcyA9IHtcbiAgICAgICAgICAgICAgICB0YWc6IGl0ZW0/LnRhZyB8fCBwcm9wcy5yZW5kZXIgfHwgXCJcIixcbiAgICAgICAgICAgICAgICBwcm9wczogT2JqZWN0LmFzc2lnbih7fSwgY2hpbGRQcm9wcz8ucHJvcHMsIHsgbWFwcGVyIH0sIHByb3BzKSxcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLkVMRU1FTlQ6IHtcbiAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiB8fCBbXTtcblxuICAgICAgICAgICAgICBjb25zdCB1aVByb3BzOiBVSUVsZW1lbnRNZXRhZGF0YSA9IGRlYy5wcm9wcyBhcyBVSUVsZW1lbnRNZXRhZGF0YTtcbiAgICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgIHVpUHJvcHMucHJvcHMgYXMgYW55LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHBhdGg6IGdldFBhdGgoXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb3BzPy5jaGlsZE9mIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgdWlQcm9wcy5wcm9wcyEubmFtZVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGNoaWxkT2Y6IHVuZGVmaW5lZCwgLy8gVGhlIGNoaWxkT2YgcHJvcCBpcyBwYXNzZWQgYnkgZ2xvYmFsUHJvcHMgd2hlbiBpdCBpcyBhIG5lc3RlZCBwcm9wXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnbG9iYWxQcm9wc1xuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkRGVmaW5pdGlvbjogRmllbGREZWZpbml0aW9uPFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xuICAgICAgICAgICAgICAgIHRhZzogdWlQcm9wcy50YWcsXG4gICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbkRlY3M6IERlY29yYXRvck1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT5bXSA9XG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvbkRlY29yYXRvcnNbXG4gICAgICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICAgICBdIGFzIERlY29yYXRvck1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT5bXTtcblxuICAgICAgICAgICAgICBjb25zdCB0eXBlRGVjOiBEZWNvcmF0b3JNZXRhZGF0YU9iamVjdCA9XG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvbkRlY3Muc2hpZnQoKSBhcyBEZWNvcmF0b3JNZXRhZGF0YTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBkZWMgb2YgdmFsaWRhdGlvbkRlY3MpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUoZGVjLmtleSkpIHtcbiAgICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wc1t0aGlzLnRyYW5zbGF0ZShkZWMua2V5KV0gPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvQXR0cmlidXRlVmFsdWUoZGVjLmtleSwgZGVjLnByb3BzKTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkYXRhYmxlQnlUeXBlKGRlYy5rZXkpKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZGVjLmtleSA9PT0gSFRNTDVJbnB1dFR5cGVzLkRBVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5GT1JNQVRdID1cbiAgICAgICAgICAgICAgICAgICAgICBkZWMucHJvcHMuZm9ybWF0IHx8IEhUTUw1RGF0ZUZvcm1hdDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wc1tVSUtleXMuVFlQRV0gPSBkZWMua2V5O1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKCFjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLlRZUEVdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFzaWNUeXBlID0gKHR5cGVEZWMucHJvcHMgYXMgeyBuYW1lOiBzdHJpbmcgfSkubmFtZTtcbiAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLlRZUEVdID0gdGhpcy50cmFuc2xhdGUoXG4gICAgICAgICAgICAgICAgICBiYXNpY1R5cGUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzLnZhbHVlID0gZm9ybWF0QnlUeXBlKFxuICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wc1tVSUtleXMuVFlQRV0sXG4gICAgICAgICAgICAgICAgbW9kZWxba2V5IGFzIGtleW9mIE1dLFxuICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wc1tVSUtleXMuRk9STUFUXVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGREZWZpbml0aW9uKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoYEludmFsaWQga2V5OiAke2RlYy5rZXl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQ6IEZpZWxkRGVmaW5pdGlvbjxUPiA9IHtcbiAgICAgIHRhZzogaW5oZXJpdHNUYWcgfHwgdGFnLFxuICAgICAgaXRlbTogY2hpbGRQcm9wcyBhcyBVSUxpc3RJdGVtRWxlbWVudE1ldGFkYXRhLFxuICAgICAgcHJvcHM6IE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCBnbG9iYWxQcm9wcywge1xuICAgICAgICBoYW5kbGVyczogaGFuZGxlcnMgfHwge30sXG4gICAgICB9KSBhcyBUICYgRmllbGRQcm9wZXJ0aWVzLFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuIGFzIEZpZWxkRGVmaW5pdGlvbjxhbnk+W10sXG4gICAgfTtcblxuICAgIGlmIChnZW5lcmF0ZUlkKSByZXN1bHQucmVuZGVyZXJJZCA9IGdlbmVyYXRlVUlNb2RlbElEKG1vZGVsKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbmRlcnMgYSBtb2RlbCB3aXRoIGdsb2JhbCBwcm9wZXJ0aWVzIGFuZCBhZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRvIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gZGVmaW5lIHNwZWNpZmljIHJlbmRlcmluZyBiZWhhdmlvci5cbiAgICpcbiAgICogQHRlbXBsYXRlIE0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHRlbXBsYXRlIFIgUmVuZGVyaW5nIGVuZ2luZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBvdXRwdXQgdHlwZVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIGJlIHJlbmRlcmVkLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBnbG9iYWxQcm9wcyAtIEdsb2JhbCBwcm9wZXJ0aWVzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIGVsZW1lbnRzIGR1cmluZyByZW5kZXJpbmcuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IG1heSBiZSByZXF1aXJlZCBmb3Igc3BlY2lmaWMgcmVuZGVyaW5nIGltcGxlbWVudGF0aW9ucy5cbiAgICogQHJldHVybnMge1J9IFRoZSByZW5kZXJlZCByZXN1bHQsIHR5cGUgZGVwZW5kcyBvbiB0aGUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uXG4gICAqXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgYWJzdHJhY3QgcmVuZGVyPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgZ2xvYmFsUHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSByZW5kZXJpbmcgZW5naW5lIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBBZGRzIGEgcmVuZGVyaW5nIGVuZ2luZSB0byB0aGUgc3RhdGljIGNhY2hlIGFuZCBzZXRzIGl0IGFzIHRoZSBjdXJyZW50IGVuZ2luZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj59IGVuZ2luZSAtIFRoZSByZW5kZXJpbmcgZW5naW5lIHRvIHJlZ2lzdGVyLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBhbiBlbmdpbmUgd2l0aCB0aGUgc2FtZSBmbGF2b3IgYWxyZWFkeSBleGlzdHMuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcihlbmdpbmU6IFJlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPikge1xuICAgIGlmIChlbmdpbmUuZmxhdm91ciBpbiB0aGlzLmNhY2hlKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBSZW5kZXJpbmcgZW5naW5lIHVuZGVyICR7ZW5naW5lLmZsYXZvdXJ9IGFscmVhZHkgZXhpc3RzYFxuICAgICAgKTtcbiAgICB0aGlzLmNhY2hlW2VuZ2luZS5mbGF2b3VyXSA9IGVuZ2luZTtcbiAgICB0aGlzLmN1cnJlbnQgPSBlbmdpbmU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBvciBpbml0aWFsaXplcyBhIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEBzdW1tYXJ5IEdldHMgYW4gZXhpc3RpbmcgZW5naW5lIGluc3RhbmNlIG9yIGNyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgbmV3IG9uZSBpZiBnaXZlbiBhIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTyBUaGUgdHlwZSBvZiB0aGUgcmVuZGVyaW5nIGVuZ2luZSBvdXRwdXRcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8Tz4+IHwgUmVuZGVyaW5nRW5naW5lPE8+fSBvYmogLSBUaGUgZW5naW5lIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJucyB7UmVuZGVyaW5nRW5naW5lPE8+fSBUaGUgaW5pdGlhbGl6ZWQgcmVuZGVyaW5nIGVuZ2luZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0T3JCb290PE8+KFxuICAgIG9iajogQ29uc3RydWN0b3I8UmVuZGVyaW5nRW5naW5lPE8+PiB8IFJlbmRlcmluZ0VuZ2luZTxPPlxuICApOiBSZW5kZXJpbmdFbmdpbmU8Tz4ge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBSZW5kZXJpbmdFbmdpbmUpIHJldHVybiBvYmogYXMgUmVuZGVyaW5nRW5naW5lPE8+O1xuICAgIGNvbnN0IGVuZ2luZTogUmVuZGVyaW5nRW5naW5lPE8+ID0gbmV3IG9iaigpO1xuICAgIGVuZ2luZS5pbml0aWFsaXplKCk7IC8vIG1ha2UgdGhlIGJvb3RpbmcgYXN5bmMuIHVzZSB0aGUgaW5pdGlhbGl6ZWQgZmxhZyB0byBjb250cm9sIGl0XG4gICAgcmV0dXJuIGVuZ2luZSBhcyBSZW5kZXJpbmdFbmdpbmU8Tz47XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlbmRlcmluZyBlbmdpbmUgYnkgZmxhdm9yLlxuICAgKiBAc3VtbWFyeSBHZXRzIHRoZSBjdXJyZW50IHJlbmRlcmluZyBlbmdpbmUgb3IgYSBzcGVjaWZpYyBvbmUgYnkgZmxhdm9yLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTyBUaGUgdHlwZSBvZiB0aGUgcmVuZGVyaW5nIGVuZ2luZSBvdXRwdXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtmbGF2b3VyXSAtIFRoZSBmbGF2b3Igb2YgdGhlIHJlbmRlcmluZyBlbmdpbmUgdG8gcmV0cmlldmUuXG4gICAqIEByZXR1cm5zIHtSZW5kZXJpbmdFbmdpbmU8Tz59IFRoZSByZXF1ZXN0ZWQgcmVuZGVyaW5nIGVuZ2luZS5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIHJlcXVlc3RlZCBmbGF2b3IgZG9lcyBub3QgZXhpc3QuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBnZXQ8Tz4oZmxhdm91cj86IHN0cmluZyk6IFJlbmRlcmluZ0VuZ2luZTxPPiB7XG4gICAgaWYgKCFmbGF2b3VyKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0T3JCb290PE8+KFxuICAgICAgICB0aGlzLmN1cnJlbnQgYXMgQ29uc3RydWN0b3I8UmVuZGVyaW5nRW5naW5lPE8+PiB8IFJlbmRlcmluZ0VuZ2luZTxPPlxuICAgICAgKTtcbiAgICBpZiAoIShmbGF2b3VyIGluIHRoaXMuY2FjaGUpKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBSZW5kZXJpbmcgZW5naW5lIHVuZGVyICR7Zmxhdm91cn0gZG9lcyBub3QgZXhpc3RgXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmdldE9yQm9vdDxPPihcbiAgICAgIHRoaXMuY2FjaGVbZmxhdm91cl0gYXNcbiAgICAgICAgfCBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8Tz4+XG4gICAgICAgIHwgUmVuZGVyaW5nRW5naW5lPE8+XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVuZGVycyBhIG1vZGVsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSByZW5kZXJpbmcgZW5naW5lLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHRoZSBjb3JyZWN0IHJlbmRlcmluZyBlbmdpbmUgZm9yIGEgbW9kZWwgYW5kIGludm9rZXMgaXRzIHJlbmRlciBtZXRob2QuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gcmVuZGVyLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgcmVuZGVyIG1ldGhvZC5cbiAgICogQHJldHVybnMge2FueX0gVGhlIHJlc3VsdCBvZiB0aGUgcmVuZGVyaW5nIHByb2Nlc3MuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIG5vIHJlZ2lzdGVyZWQgbW9kZWwgaXMgZm91bmQuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyByZW5kZXI8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBhbnkge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID1cbiAgICAgIE1vZGVsLmdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKSB8fCBNb2RlbC5mcm9tT2JqZWN0KG1vZGVsKTtcbiAgICBpZiAoIWNvbnN0cnVjdG9yKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vIG1vZGVsIHJlZ2lzdGVyZWQgZm91bmRcIik7XG4gICAgY29uc3QgZmxhdm91ciA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5SRU5ERVJFRF9CWSksXG4gICAgICBjb25zdHJ1Y3RvciBhcyBNb2RlbENvbnN0cnVjdG9yPE1vZGVsPlxuICAgICk7XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGZvciB0aGUgdmFyIGFyZ3MgdHlwZSBjaGVja1xuICAgIHJldHVybiBSZW5kZXJpbmdFbmdpbmUuZ2V0KGZsYXZvdXIpLnJlbmRlcihtb2RlbCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIG1ldGFkYXRhIGtleSBmb3IgVUktcmVsYXRlZCBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBQcmVmaXhlcyBhIGdpdmVuIGtleSB3aXRoIHRoZSBVSSByZWZsZWN0aW9uIHByZWZpeC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgdG8gcHJlZml4LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcHJlZml4ZWQga2V5LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMga2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7VUlLZXlzLlJFRkxFQ1R9JHtrZXl9YDtcbiAgfVxufVxuIl19
|
package/lib/ui/decorators.cjs
CHANGED
|
@@ -194,54 +194,66 @@ function uiprop(propName = undefined, stringify = false) {
|
|
|
194
194
|
};
|
|
195
195
|
}
|
|
196
196
|
/**
|
|
197
|
-
* @description Decorator that maps a model property to a UI component property
|
|
198
|
-
* @summary
|
|
199
|
-
* This decorator allows you to define how a model property should be mapped to
|
|
200
|
-
* a property of the UI component when rendering. It requires the class to be
|
|
201
|
-
* decorated with @uimodel.
|
|
197
|
+
* @description Decorator that maps a nested model property to a UI component property.
|
|
198
|
+
* @summary Defines how a parent component should render the child model when nested.
|
|
202
199
|
*
|
|
203
|
-
*
|
|
204
|
-
*
|
|
205
|
-
*
|
|
200
|
+
* This decorator is used to decorate properties that are nested models.
|
|
201
|
+
* When applied, it allows overriding the default tag of the child model with the provided one,
|
|
202
|
+
* enabling different rendering behavior when the model acts as a child (nested)
|
|
203
|
+
* compared to when it is rendered as the parent model.
|
|
206
204
|
*
|
|
207
|
-
*
|
|
205
|
+
* It requires the class to be decorated with `@uimodel`.
|
|
206
|
+
*
|
|
207
|
+
* @param {string} clazz The model class name to pass to the component (defaults to the property key).
|
|
208
|
+
* @param {string} tag The HTML element or component tag name to override the UI tag of the nested model
|
|
209
|
+
* @param {Record<string, any>} [props] Additional properties to pass to the element
|
|
210
|
+
* @param {boolean} [serialize=false] Whether the property should be serialized
|
|
211
|
+
* @return {Function} A property decorator function.
|
|
212
|
+
*
|
|
213
|
+
* @function uichild
|
|
208
214
|
* @category Property Decorators
|
|
209
215
|
*
|
|
210
216
|
* @example
|
|
211
|
-
* // Map model
|
|
212
|
-
* @uimodel('
|
|
213
|
-
* class
|
|
217
|
+
* // Map a nested model to a component property with a different tag when nested
|
|
218
|
+
* @uimodel('address-component')
|
|
219
|
+
* class Address {
|
|
214
220
|
* @attribute()
|
|
215
|
-
*
|
|
216
|
-
* fullName: string;
|
|
221
|
+
* street: string;
|
|
217
222
|
*
|
|
218
223
|
* @attribute()
|
|
219
|
-
*
|
|
220
|
-
*
|
|
224
|
+
* city: string;
|
|
225
|
+
* }
|
|
221
226
|
*
|
|
227
|
+
* @uimodel('user-profile')
|
|
228
|
+
* class UserProfile {
|
|
222
229
|
* @attribute()
|
|
223
|
-
* @
|
|
224
|
-
*
|
|
230
|
+
* @uichild(Address.name, 'address-child-component')
|
|
231
|
+
* address: Address;
|
|
225
232
|
* }
|
|
226
233
|
*
|
|
234
|
+
* // In this example, the Address model has the default tag 'address-component' when rendered as a root component,
|
|
235
|
+
* // but when used inside UserProfile, it is rendered with the overridden tag 'address-child-component'
|
|
236
|
+
*
|
|
227
237
|
* @mermaid
|
|
228
238
|
* sequenceDiagram
|
|
229
239
|
* participant Model
|
|
230
|
-
* participant
|
|
240
|
+
* participant uichild
|
|
231
241
|
* participant RenderingEngine
|
|
232
242
|
* participant Component
|
|
233
|
-
* Model->>
|
|
234
|
-
*
|
|
235
|
-
* RenderingEngine->>Model: Get
|
|
236
|
-
* Model->>RenderingEngine: Return prop name and
|
|
237
|
-
* RenderingEngine->>Component: Pass property with specified name
|
|
243
|
+
* Model->>uichild: Apply to property
|
|
244
|
+
* uichild->>Model: Add child metadata
|
|
245
|
+
* RenderingEngine->>Model: Get child metadata
|
|
246
|
+
* Model->>RenderingEngine: Return prop name, stringify flag, and child tag override
|
|
247
|
+
* RenderingEngine->>Component: Pass property with specified name and render with overridden tag if nested
|
|
238
248
|
*/
|
|
239
|
-
function uichild(
|
|
249
|
+
function uichild(clazz, tag, props = {}, serialize = false) {
|
|
240
250
|
return (target, propertyKey) => {
|
|
241
251
|
const metadata = {
|
|
242
|
-
name: propName || propertyKey,
|
|
243
|
-
stringify: stringify,
|
|
244
252
|
tag: tag,
|
|
253
|
+
serialize: serialize,
|
|
254
|
+
props: Object.assign({}, props || {}, {
|
|
255
|
+
name: clazz || propertyKey,
|
|
256
|
+
}),
|
|
245
257
|
};
|
|
246
258
|
(0, decorator_validation_1.propMetadata)(Rendering_1.RenderingEngine.key(constants_1.UIKeys.CHILD), metadata)(target, propertyKey);
|
|
247
259
|
};
|
|
@@ -304,4 +316,4 @@ function uilistprop(propName = undefined, props) {
|
|
|
304
316
|
(0, decorator_validation_1.propMetadata)(Rendering_1.RenderingEngine.key(constants_1.UIKeys.UILISTPROP), metadata)(target, propertyKey);
|
|
305
317
|
};
|
|
306
318
|
}
|
|
307
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBK0NBLHdCQUtDO0FBcUNELHdCQU9DO0FBNENELDhCQW1CQztBQTZDRCx3QkFjQztBQTZDRCwwQkFnQkM7QUFtREQsZ0NBY0M7QUF4VkQsNEJBQTBCO0FBQzFCLCtDQUFxQztBQUNyQyx5RUFBOEQ7QUFPOUQsK0NBQThDO0FBQzlDLDJEQUF3RDtBQUV4RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtDRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxHQUFHLFVBQStCO0lBQ3ZELE9BQU8sSUFBQSxtQ0FBWSxFQUNqQiwyQkFBZSxDQUFDLEdBQUcsQ0FBQyxrQkFBTSxDQUFDLE1BQU0sQ0FBQyxFQUNsQyxVQUFVLENBQ1gsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtDRztBQUNILFNBQWdCLE1BQU07SUFDcEIsT0FBTyxNQUFNLENBQ1gsNkJBQWEsQ0FBQyxNQUFNLEVBQ3BCLDZCQUFhLENBQUMsSUFBSSxFQUNsQiw2QkFBYSxDQUFDLE1BQU0sRUFDcEIsNkJBQWEsQ0FBQyxNQUFNLENBQ3JCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUNHO0FBQ0gsU0FBZ0IsU0FBUyxDQUN2QixHQUFXLEVBQ1gsS0FBMkIsRUFDM0IsWUFBcUIsS0FBSztJQUUxQixPQUFPLENBQUMsUUFBYSxFQUFFLFdBQWlCLEVBQUUsRUFBRTtRQUMxQyxNQUFNLFFBQVEsR0FBc0I7WUFDbEMsR0FBRyxFQUFFLEdBQUc7WUFDUixTQUFTLEVBQUUsU0FBUztZQUNwQixLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUUsRUFBRTtnQkFDcEMsSUFBSSxFQUFFLFdBQVc7YUFDbEIsQ0FBQztTQUNILENBQUM7UUFFRixPQUFPLElBQUEsbUNBQVksRUFBQywyQkFBZSxDQUFDLEdBQUcsQ0FBQyxrQkFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUNoRSxRQUFRLEVBQ1IsV0FBVyxDQUNaLENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDRztBQUNILFNBQWdCLE1BQU0sQ0FDcEIsV0FBK0IsU0FBUyxFQUN4QyxZQUFxQixLQUFLO0lBRTFCLE9BQU8sQ0FBQyxNQUFXLEVBQUUsV0FBbUIsRUFBRSxFQUFFO1FBQzFDLE1BQU0sUUFBUSxHQUFtQjtZQUMvQixJQUFJLEVBQUUsUUFBUSxJQUFJLFdBQVc7WUFDN0IsU0FBUyxFQUFFLFNBQVM7U0FDckIsQ0FBQztRQUNGLElBQUEsbUNBQVksRUFBQywyQkFBZSxDQUFDLEdBQUcsQ0FBQyxrQkFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUN0RCxNQUFNLEVBQ04sV0FBVyxDQUNaLENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDRztBQUNILFNBQWdCLE9BQU8sQ0FDckIsV0FBK0IsU0FBUyxFQUN4QyxZQUFxQixLQUFLLEVBQzFCLEdBQVk7SUFFWixPQUFPLENBQUMsTUFBVyxFQUFFLFdBQW1CLEVBQUUsRUFBRTtRQUMxQyxNQUFNLFFBQVEsR0FBbUI7WUFDL0IsSUFBSSxFQUFFLFFBQVEsSUFBSSxXQUFXO1lBQzdCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLEdBQUcsRUFBRSxHQUFHO1NBQ0YsQ0FBQztRQUNULElBQUEsbUNBQVksRUFBQywyQkFBZSxDQUFDLEdBQUcsQ0FBQyxrQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUN2RCxNQUFNLEVBQ04sV0FBVyxDQUNaLENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdERztBQUNILFNBQWdCLFVBQVUsQ0FDeEIsV0FBK0IsU0FBUyxFQUN4QyxLQUEyQjtJQUUzQixPQUFPLENBQUMsTUFBVyxFQUFFLFdBQW1CLEVBQUUsRUFBRTtRQUMxQyxNQUFNLFFBQVEsR0FBZ0M7WUFDNUMsSUFBSSxFQUFFLFFBQVEsSUFBSSxXQUFXO1lBQzdCLEtBQUssRUFBRSxLQUFLLElBQUksRUFBRTtTQUNuQixDQUFDO1FBQ0YsSUFBQSxtQ0FBWSxFQUFDLDJCQUFlLENBQUMsR0FBRyxDQUFDLGtCQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQzVELE1BQU0sRUFDTixXQUFXLENBQ1osQ0FBQztJQUNKLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQgeyBVSUtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHByb3BNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIENydWRPcGVyYXRpb25LZXlzLFxuICBVSUVsZW1lbnRNZXRhZGF0YSxcbiAgVUlMaXN0UHJvcE1ldGFkYXRhLFxuICBVSVByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFJlbmRlcmluZ0VuZ2luZSB9IGZyb20gXCIuL1JlbmRlcmluZ1wiO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBoaWRlcyBhIHByb3BlcnR5IGR1cmluZyBzcGVjaWZpYyBDUlVEIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IENvbnRyb2xzIHByb3BlcnR5IHZpc2liaWxpdHkgYmFzZWQgb24gb3BlcmF0aW9uIHR5cGVcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB3aGljaCBDUlVEIG9wZXJhdGlvbnMgc2hvdWxkIGhpZGUgYSBwcm9wZXJ0eVxuICogaW4gdGhlIFVJLiBUaGUgcHJvcGVydHkgd2lsbCBvbmx5IGJlIHZpc2libGUgZHVyaW5nIG9wZXJhdGlvbnMgbm90IHNwZWNpZmllZC5cbiAqXG4gKiBAcGFyYW0gb3BlcmF0aW9ucyAtIFRoZSBDUlVEIG9wZXJhdGlvbnMgZHVyaW5nIHdoaWNoIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgaGlkZGVuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gaGlkZU9uXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIaWRlIHRoZSBwYXNzd29yZCBmaWVsZCBkdXJpbmcgUkVBRCBvcGVyYXRpb25zXG4gKiBjbGFzcyBVc2VyIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQGhpZGVPbihPcGVyYXRpb25LZXlzLlJFQUQpXG4gKiAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBoaWRlT25cbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IFVJXG4gKiAgIE1vZGVsLT4+aGlkZU9uOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICBoaWRlT24tPj5Nb2RlbDogQWRkIGhpZGRlbiBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogQ2hlY2sgaWYgcHJvcGVydHkgc2hvdWxkIGJlIGhpZGRlblxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIGhpZGRlbiBvcGVyYXRpb25zXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlVJOiBSZW5kZXIgb3IgaGlkZSBiYXNlZCBvbiBjdXJyZW50IG9wZXJhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlkZU9uKC4uLm9wZXJhdGlvbnM6IENydWRPcGVyYXRpb25LZXlzW10pIHtcbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxDcnVkT3BlcmF0aW9uS2V5c1tdPihcbiAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5ISURERU4pLFxuICAgIG9wZXJhdGlvbnNcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgY29tcGxldGVseSBoaWRlcyBhIHByb3BlcnR5IGluIGFsbCBVSSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBNYWtlcyBhIHByb3BlcnR5IGludmlzaWJsZSBpbiBhbGwgQ1JVRCBvcGVyYXRpb25zXG4gKiBUaGlzIGRlY29yYXRvciBpcyBhIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIGhpZGVPbiB0aGF0IGhpZGVzIGEgcHJvcGVydHlcbiAqIGR1cmluZyBhbGwgQ1JVRCBvcGVyYXRpb25zIChDUkVBVEUsIFJFQUQsIFVQREFURSwgREVMRVRFKS5cbiAqXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gaGlkZGVuXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb21wbGV0ZWx5IGhpZGUgdGhlIGludGVybmFsSWQgZmllbGQgaW4gdGhlIFVJXG4gKiBjbGFzcyBQcm9kdWN0IHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIG5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAaGlkZGVuKClcbiAqICAgaW50ZXJuYWxJZDogc3RyaW5nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgaGlkZGVuXG4gKiAgIHBhcnRpY2lwYW50IGhpZGVPblxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgTW9kZWwtPj5oaWRkZW46IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIGhpZGRlbi0+PmhpZGVPbjogQ2FsbCB3aXRoIGFsbCBvcGVyYXRpb25zXG4gKiAgIGhpZGVPbi0+Pk1vZGVsOiBBZGQgaGlkZGVuIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBDaGVjayBpZiBwcm9wZXJ0eSBzaG91bGQgYmUgaGlkZGVuXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gYWxsIG9wZXJhdGlvbnNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+VUk6IEFsd2F5cyBoaWRlIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoaWRkZW4oKSB7XG4gIHJldHVybiBoaWRlT24oXG4gICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgIE9wZXJhdGlvbktleXMuREVMRVRFXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IHNwZWNpZmllcyBob3cgYSBwcm9wZXJ0eSBzaG91bGQgYmUgcmVuZGVyZWQgYXMgYSBVSSBlbGVtZW50XG4gKiBAc3VtbWFyeSBNYXBzIGEgbW9kZWwgcHJvcGVydHkgdG8gYSBzcGVjaWZpYyBVSSBlbGVtZW50IHdpdGggY3VzdG9tIHByb3BlcnRpZXNcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIHdoaWNoIEhUTUwgZWxlbWVudCBvciBjb21wb25lbnQgc2hvdWxkIGJlIHVzZWRcbiAqIHRvIHJlbmRlciBhIHNwZWNpZmljIHByb3BlcnR5LCBhbG9uZyB3aXRoIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGF0IGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgSFRNTCBlbGVtZW50IG9yIGNvbXBvbmVudCB0YWcgbmFtZSB0byB1c2UgZm9yIHJlbmRlcmluZ1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtzZXJpYWxpemU9ZmFsc2VdIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBzZXJpYWxpemVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWllbGVtZW50XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZW5kZXIgYSBwcm9wZXJ0eSBhcyBhIHRleHQgaW5wdXRcbiAqIGNsYXNzIExvZ2luRm9ybSB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWllbGVtZW50KCdpbnB1dCcsIHsgdHlwZTogJ3RleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIHVzZXJuYW1lJyB9KVxuICogICB1c2VybmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWVsZW1lbnQoJ2lucHV0JywgeyB0eXBlOiAncGFzc3dvcmQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIHBhc3N3b3JkJyB9KVxuICogICBwYXNzd29yZDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWVsZW1lbnQoJ2J1dHRvbicsIHsgY2xhc3M6ICdidG4tcHJpbWFyeScgfSlcbiAqICAgc3VibWl0OiBzdHJpbmcgPSAnTG9naW4nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWllbGVtZW50XG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBVSVxuICogICBNb2RlbC0+PnVpZWxlbWVudDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWllbGVtZW50LT4+TW9kZWw6IEFkZCBlbGVtZW50IG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBHZXQgZWxlbWVudCBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHRhZyBhbmQgcHJvcHNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+VUk6IFJlbmRlciB3aXRoIHNwZWNpZmllZCBlbGVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aWVsZW1lbnQoXG4gIHRhZzogc3RyaW5nLFxuICBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHNlcmlhbGl6ZTogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgcmV0dXJuIChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBVSUVsZW1lbnRNZXRhZGF0YSA9IHtcbiAgICAgIHRhZzogdGFnLFxuICAgICAgc2VyaWFsaXplOiBzZXJpYWxpemUsXG4gICAgICBwcm9wczogT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMgfHwge30sIHtcbiAgICAgICAgbmFtZTogcHJvcGVydHlLZXksXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHByb3BNZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5FTEVNRU5UKSwgbWV0YWRhdGEpKFxuICAgICAgb3JpZ2luYWwsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcHMgYSBtb2RlbCBwcm9wZXJ0eSB0byBhIFVJIGNvbXBvbmVudCBwcm9wZXJ0eVxuICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyBhIHByb3BlcnR5IHNob3VsZCBiZSBwYXNzZWQgdG8gYSBVSSBjb21wb25lbnRcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIGhvdyBhIG1vZGVsIHByb3BlcnR5IHNob3VsZCBiZSBtYXBwZWQgdG9cbiAqIGEgcHJvcGVydHkgb2YgdGhlIFVJIGNvbXBvbmVudCB3aGVuIHJlbmRlcmluZy4gSXQgcmVxdWlyZXMgdGhlIGNsYXNzIHRvIGJlXG4gKiBkZWNvcmF0ZWQgd2l0aCBAdWltb2RlbC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BOYW1lXSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcGFzcyB0byB0aGUgY29tcG9uZW50IChkZWZhdWx0cyB0byB0aGUgcHJvcGVydHkga2V5KVxuICogQHBhcmFtIHtib29sZWFufSBbc3RyaW5naWZ5PWZhbHNlXSBXaGV0aGVyIHRvIHN0cmluZ2lmeSB0aGUgcHJvcGVydHkgdmFsdWVcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aXByb3BcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE1hcCBtb2RlbCBwcm9wZXJ0aWVzIHRvIGNvbXBvbmVudCBwcm9wZXJ0aWVzXG4gKiBAdWltb2RlbCgndXNlci1wcm9maWxlJylcbiAqIGNsYXNzIFVzZXJQcm9maWxlIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXByb3AoKSAvLyBXaWxsIGJlIHBhc3NlZCBhcyAnZnVsbE5hbWUnIHRvIHRoZSBjb21wb25lbnRcbiAqICAgZnVsbE5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwcm9wKCd1c2VyRW1haWwnKSAvLyBXaWxsIGJlIHBhc3NlZCBhcyAndXNlckVtYWlsJyB0byB0aGUgY29tcG9uZW50XG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcHJvcCgndXNlckRhdGEnLCB0cnVlKSAvLyBXaWxsIGJlIHBhc3NlZCBhcyBzdHJpbmdpZmllZCBKU09OXG4gKiAgIHVzZXJEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWlwcm9wXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBDb21wb25lbnRcbiAqICAgTW9kZWwtPj51aXByb3A6IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIHVpcHJvcC0+Pk1vZGVsOiBBZGQgcHJvcCBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IHByb3AgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBwcm9wIG5hbWUgYW5kIHN0cmluZ2lmeSBmbGFnXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PkNvbXBvbmVudDogUGFzcyBwcm9wZXJ0eSB3aXRoIHNwZWNpZmllZCBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aXByb3AoXG4gIHByb3BOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gIHN0cmluZ2lmeTogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBVSVByb3BNZXRhZGF0YSA9IHtcbiAgICAgIG5hbWU6IHByb3BOYW1lIHx8IHByb3BlcnR5S2V5LFxuICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnksXG4gICAgfTtcbiAgICBwcm9wTWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuUFJPUCksIG1ldGFkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFwcyBhIG1vZGVsIHByb3BlcnR5IHRvIGEgVUkgY29tcG9uZW50IHByb3BlcnR5XG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IGEgcHJvcGVydHkgc2hvdWxkIGJlIHBhc3NlZCB0byBhIFVJIGNvbXBvbmVudFxuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBkZWZpbmUgaG93IGEgbW9kZWwgcHJvcGVydHkgc2hvdWxkIGJlIG1hcHBlZCB0b1xuICogYSBwcm9wZXJ0eSBvZiB0aGUgVUkgY29tcG9uZW50IHdoZW4gcmVuZGVyaW5nLiBJdCByZXF1aXJlcyB0aGUgY2xhc3MgdG8gYmVcbiAqIGRlY29yYXRlZCB3aXRoIEB1aW1vZGVsLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcE5hbWVdIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBwYXNzIHRvIHRoZSBjb21wb25lbnQgKGRlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBrZXkpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtzdHJpbmdpZnk9ZmFsc2VdIFdoZXRoZXIgdG8gc3RyaW5naWZ5IHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpcHJvcFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTWFwIG1vZGVsIHByb3BlcnRpZXMgdG8gY29tcG9uZW50IHByb3BlcnRpZXNcbiAqIEB1aW1vZGVsKCd1c2VyLXByb2ZpbGUnKVxuICogY2xhc3MgVXNlclByb2ZpbGUge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcHJvcCgpIC8vIFdpbGwgYmUgcGFzc2VkIGFzICdmdWxsTmFtZScgdG8gdGhlIGNvbXBvbmVudFxuICogICBmdWxsTmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXByb3AoJ3VzZXJFbWFpbCcpIC8vIFdpbGwgYmUgcGFzc2VkIGFzICd1c2VyRW1haWwnIHRvIHRoZSBjb21wb25lbnRcbiAqICAgZW1haWw6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwcm9wKCd1c2VyRGF0YScsIHRydWUpIC8vIFdpbGwgYmUgcGFzc2VkIGFzIHN0cmluZ2lmaWVkIEpTT05cbiAqICAgdXNlckRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aXByb3BcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IENvbXBvbmVudFxuICogICBNb2RlbC0+PnVpcHJvcDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWlwcm9wLT4+TW9kZWw6IEFkZCBwcm9wIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBHZXQgcHJvcCBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHByb3AgbmFtZSBhbmQgc3RyaW5naWZ5IGZsYWdcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+Q29tcG9uZW50OiBQYXNzIHByb3BlcnR5IHdpdGggc3BlY2lmaWVkIG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpY2hpbGQoXG4gIHByb3BOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gIHN0cmluZ2lmeTogYm9vbGVhbiA9IGZhbHNlLFxuICB0YWc/OiBzdHJpbmdcbikge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFVJUHJvcE1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogcHJvcE5hbWUgfHwgcHJvcGVydHlLZXksXG4gICAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeSxcbiAgICAgIHRhZzogdGFnLFxuICAgIH0gYXMgYW55O1xuICAgIHByb3BNZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5DSElMRCksIG1ldGFkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFwcyBhIG1vZGVsIHByb3BlcnR5IHRvIGEgbGlzdCBpdGVtIGNvbXBvbmVudFxuICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyBhIHByb3BlcnR5IHNob3VsZCBiZSByZW5kZXJlZCBpbiBhIGxpc3QgY29udGV4dFxuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBkZWZpbmUgaG93IGEgbW9kZWwgcHJvcGVydHkgY29udGFpbmluZyBhIGxpc3RcbiAqIHNob3VsZCBiZSByZW5kZXJlZC4gSXQgcmVxdWlyZXMgdGhlIGNsYXNzIHRvIGJlIGRlY29yYXRlZCB3aXRoIEB1aWxpc3RpdGVtLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcE5hbWVdIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBwYXNzIHRvIHRoZSBsaXN0IGNvbXBvbmVudCAoZGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IGtleSlcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgbGlzdCBjb250YWluZXJcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aWxpc3Rwcm9wXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBEZWZpbmUgYSBsaXN0IHByb3BlcnR5IHdpdGggY3VzdG9tIHJlbmRlcmluZ1xuICogQHVpbW9kZWwoJ3RvZG8tbGlzdCcpXG4gKiBjbGFzcyBUb2RvTGlzdCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB0aXRsZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxpc3Rwcm9wKCdpdGVtcycsIHsgY2xhc3M6ICd0b2RvLWl0ZW1zLWNvbnRhaW5lcicgfSlcbiAqICAgaXRlbXM6IFRvZG9JdGVtW107XG4gKiB9XG4gKlxuICogQHVpbGlzdGl0ZW0oJ2xpJywgeyBjbGFzczogJ3RvZG8taXRlbScgfSlcbiAqIGNsYXNzIFRvZG9JdGVtIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdGV4dDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGNvbXBsZXRlZDogYm9vbGVhbjtcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHVpbGlzdHByb3BcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IExpc3RDb250YWluZXJcbiAqICAgcGFydGljaXBhbnQgTGlzdEl0ZW1zXG4gKiAgIE1vZGVsLT4+dWlsaXN0cHJvcDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWlsaXN0cHJvcC0+Pk1vZGVsOiBBZGQgbGlzdCBwcm9wIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBHZXQgbGlzdCBwcm9wIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gcHJvcCBuYW1lIGFuZCBjb250YWluZXIgcHJvcHNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TGlzdENvbnRhaW5lcjogQ3JlYXRlIGNvbnRhaW5lciB3aXRoIHByb3BzXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pkxpc3RJdGVtczogUmVuZGVyIGVhY2ggaXRlbSB1c2luZyBAdWlsaXN0aXRlbVxuICogICBMaXN0Q29udGFpbmVyLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gcmVuZGVyZWQgbGlzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdWlsaXN0cHJvcChcbiAgcHJvcE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBQYXJ0aWFsPFVJTGlzdFByb3BNZXRhZGF0YT4gPSB7XG4gICAgICBuYW1lOiBwcm9wTmFtZSB8fCBwcm9wZXJ0eUtleSxcbiAgICAgIHByb3BzOiBwcm9wcyB8fCB7fSxcbiAgICB9O1xuICAgIHByb3BNZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSUxJU1RQUk9QKSwgbWV0YWRhdGEpKFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuIl19
|
|
319
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBK0NBLHdCQUtDO0FBcUNELHdCQU9DO0FBNENELDhCQW1CQztBQTZDRCx3QkFjQztBQXdERCwwQkFvQkM7QUFtREQsZ0NBY0M7QUF2V0QsNEJBQTBCO0FBQzFCLCtDQUFxQztBQUNyQyx5RUFBOEQ7QUFPOUQsK0NBQThDO0FBQzlDLDJEQUF3RDtBQUV4RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtDRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxHQUFHLFVBQStCO0lBQ3ZELE9BQU8sSUFBQSxtQ0FBWSxFQUNqQiwyQkFBZSxDQUFDLEdBQUcsQ0FBQyxrQkFBTSxDQUFDLE1BQU0sQ0FBQyxFQUNsQyxVQUFVLENBQ1gsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtDRztBQUNILFNBQWdCLE1BQU07SUFDcEIsT0FBTyxNQUFNLENBQ1gsNkJBQWEsQ0FBQyxNQUFNLEVBQ3BCLDZCQUFhLENBQUMsSUFBSSxFQUNsQiw2QkFBYSxDQUFDLE1BQU0sRUFDcEIsNkJBQWEsQ0FBQyxNQUFNLENBQ3JCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUNHO0FBQ0gsU0FBZ0IsU0FBUyxDQUN2QixHQUFXLEVBQ1gsS0FBMkIsRUFDM0IsWUFBcUIsS0FBSztJQUUxQixPQUFPLENBQUMsUUFBYSxFQUFFLFdBQWlCLEVBQUUsRUFBRTtRQUMxQyxNQUFNLFFBQVEsR0FBc0I7WUFDbEMsR0FBRyxFQUFFLEdBQUc7WUFDUixTQUFTLEVBQUUsU0FBUztZQUNwQixLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUUsRUFBRTtnQkFDcEMsSUFBSSxFQUFFLFdBQVc7YUFDbEIsQ0FBQztTQUNILENBQUM7UUFFRixPQUFPLElBQUEsbUNBQVksRUFBQywyQkFBZSxDQUFDLEdBQUcsQ0FBQyxrQkFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUNoRSxRQUFRLEVBQ1IsV0FBVyxDQUNaLENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDRztBQUNILFNBQWdCLE1BQU0sQ0FDcEIsV0FBK0IsU0FBUyxFQUN4QyxZQUFxQixLQUFLO0lBRTFCLE9BQU8sQ0FBQyxNQUFXLEVBQUUsV0FBbUIsRUFBRSxFQUFFO1FBQzFDLE1BQU0sUUFBUSxHQUFtQjtZQUMvQixJQUFJLEVBQUUsUUFBUSxJQUFJLFdBQVc7WUFDN0IsU0FBUyxFQUFFLFNBQVM7U0FDckIsQ0FBQztRQUNGLElBQUEsbUNBQVksRUFBQywyQkFBZSxDQUFDLEdBQUcsQ0FBQyxrQkFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUN0RCxNQUFNLEVBQ04sV0FBVyxDQUNaLENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvREc7QUFFSCxTQUFnQixPQUFPLENBQ3JCLEtBQWEsRUFDYixHQUFXLEVBQ1gsUUFBNkIsRUFBRSxFQUMvQixZQUFxQixLQUFLO0lBRTFCLE9BQU8sQ0FBQyxNQUFXLEVBQUUsV0FBbUIsRUFBRSxFQUFFO1FBQzFDLE1BQU0sUUFBUSxHQUFzQjtZQUNsQyxHQUFHLEVBQUUsR0FBRztZQUNSLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRSxFQUFFO2dCQUNwQyxJQUFJLEVBQUUsS0FBSyxJQUFJLFdBQVc7YUFDM0IsQ0FBQztTQUNILENBQUM7UUFFRixJQUFBLG1DQUFZLEVBQUMsMkJBQWUsQ0FBQyxHQUFHLENBQUMsa0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FDdkQsTUFBTSxFQUNOLFdBQVcsQ0FDWixDQUFDO0lBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnREc7QUFDSCxTQUFnQixVQUFVLENBQ3hCLFdBQStCLFNBQVMsRUFDeEMsS0FBMkI7SUFFM0IsT0FBTyxDQUFDLE1BQVcsRUFBRSxXQUFtQixFQUFFLEVBQUU7UUFDMUMsTUFBTSxRQUFRLEdBQWdDO1lBQzVDLElBQUksRUFBRSxRQUFRLElBQUksV0FBVztZQUM3QixLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUU7U0FDbkIsQ0FBQztRQUNGLElBQUEsbUNBQVksRUFBQywyQkFBZSxDQUFDLEdBQUcsQ0FBQyxrQkFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUM1RCxNQUFNLEVBQ04sV0FBVyxDQUNaLENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHsgVUlLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBwcm9wTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBDcnVkT3BlcmF0aW9uS2V5cyxcbiAgVUlFbGVtZW50TWV0YWRhdGEsXG4gIFVJTGlzdFByb3BNZXRhZGF0YSxcbiAgVUlQcm9wTWV0YWRhdGEsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBSZW5kZXJpbmdFbmdpbmUgfSBmcm9tIFwiLi9SZW5kZXJpbmdcIjtcbmltcG9ydCB7IE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgaGlkZXMgYSBwcm9wZXJ0eSBkdXJpbmcgc3BlY2lmaWMgQ1JVRCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBDb250cm9scyBwcm9wZXJ0eSB2aXNpYmlsaXR5IGJhc2VkIG9uIG9wZXJhdGlvbiB0eXBlXG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIHNwZWNpZnkgd2hpY2ggQ1JVRCBvcGVyYXRpb25zIHNob3VsZCBoaWRlIGEgcHJvcGVydHlcbiAqIGluIHRoZSBVSS4gVGhlIHByb3BlcnR5IHdpbGwgb25seSBiZSB2aXNpYmxlIGR1cmluZyBvcGVyYXRpb25zIG5vdCBzcGVjaWZpZWQuXG4gKlxuICogQHBhcmFtIG9wZXJhdGlvbnMgLSBUaGUgQ1JVRCBvcGVyYXRpb25zIGR1cmluZyB3aGljaCB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGhpZGRlblxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIGhpZGVPblxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSGlkZSB0aGUgcGFzc3dvcmQgZmllbGQgZHVyaW5nIFJFQUQgb3BlcmF0aW9uc1xuICogY2xhc3MgVXNlciB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB1c2VybmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEBoaWRlT24oT3BlcmF0aW9uS2V5cy5SRUFEKVxuICogICBwYXNzd29yZDogc3RyaW5nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgaGlkZU9uXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBVSVxuICogICBNb2RlbC0+PmhpZGVPbjogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgaGlkZU9uLT4+TW9kZWw6IEFkZCBoaWRkZW4gbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IENoZWNrIGlmIHByb3BlcnR5IHNob3VsZCBiZSBoaWRkZW5cbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBoaWRkZW4gb3BlcmF0aW9uc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5VSTogUmVuZGVyIG9yIGhpZGUgYmFzZWQgb24gY3VycmVudCBvcGVyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhpZGVPbiguLi5vcGVyYXRpb25zOiBDcnVkT3BlcmF0aW9uS2V5c1tdKSB7XG4gIHJldHVybiBwcm9wTWV0YWRhdGE8Q3J1ZE9wZXJhdGlvbktleXNbXT4oXG4gICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuSElEREVOKSxcbiAgICBvcGVyYXRpb25zXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IGNvbXBsZXRlbHkgaGlkZXMgYSBwcm9wZXJ0eSBpbiBhbGwgVUkgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgTWFrZXMgYSBwcm9wZXJ0eSBpbnZpc2libGUgaW4gYWxsIENSVUQgb3BlcmF0aW9uc1xuICogVGhpcyBkZWNvcmF0b3IgaXMgYSBjb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCBoaWRlT24gdGhhdCBoaWRlcyBhIHByb3BlcnR5XG4gKiBkdXJpbmcgYWxsIENSVUQgb3BlcmF0aW9ucyAoQ1JFQVRFLCBSRUFELCBVUERBVEUsIERFTEVURSkuXG4gKlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIGhpZGRlblxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29tcGxldGVseSBoaWRlIHRoZSBpbnRlcm5hbElkIGZpZWxkIGluIHRoZSBVSVxuICogY2xhc3MgUHJvZHVjdCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBuYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQGhpZGRlbigpXG4gKiAgIGludGVybmFsSWQ6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IGhpZGRlblxuICogICBwYXJ0aWNpcGFudCBoaWRlT25cbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIE1vZGVsLT4+aGlkZGVuOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICBoaWRkZW4tPj5oaWRlT246IENhbGwgd2l0aCBhbGwgb3BlcmF0aW9uc1xuICogICBoaWRlT24tPj5Nb2RlbDogQWRkIGhpZGRlbiBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogQ2hlY2sgaWYgcHJvcGVydHkgc2hvdWxkIGJlIGhpZGRlblxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIGFsbCBvcGVyYXRpb25zXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlVJOiBBbHdheXMgaGlkZSBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlkZGVuKCkge1xuICByZXR1cm4gaGlkZU9uKFxuICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICBPcGVyYXRpb25LZXlzLkRFTEVURVxuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBzcGVjaWZpZXMgaG93IGEgcHJvcGVydHkgc2hvdWxkIGJlIHJlbmRlcmVkIGFzIGEgVUkgZWxlbWVudFxuICogQHN1bW1hcnkgTWFwcyBhIG1vZGVsIHByb3BlcnR5IHRvIGEgc3BlY2lmaWMgVUkgZWxlbWVudCB3aXRoIGN1c3RvbSBwcm9wZXJ0aWVzXG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIGRlZmluZSB3aGljaCBIVE1MIGVsZW1lbnQgb3IgY29tcG9uZW50IHNob3VsZCBiZSB1c2VkXG4gKiB0byByZW5kZXIgYSBzcGVjaWZpYyBwcm9wZXJ0eSwgYWxvbmcgd2l0aCBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhhdCBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIEhUTUwgZWxlbWVudCBvciBjb21wb25lbnQgdGFnIG5hbWUgdG8gdXNlIGZvciByZW5kZXJpbmdcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgZWxlbWVudFxuICogQHBhcmFtIHtib29sZWFufSBbc2VyaWFsaXplPWZhbHNlXSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgc2VyaWFsaXplZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpZWxlbWVudFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUmVuZGVyIGEgcHJvcGVydHkgYXMgYSB0ZXh0IGlucHV0XG4gKiBjbGFzcyBMb2dpbkZvcm0ge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpZWxlbWVudCgnaW5wdXQnLCB7IHR5cGU6ICd0ZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciB1c2VybmFtZScgfSlcbiAqICAgdXNlcm5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWllbGVtZW50KCdpbnB1dCcsIHsgdHlwZTogJ3Bhc3N3b3JkJywgcGxhY2Vob2xkZXI6ICdFbnRlciBwYXNzd29yZCcgfSlcbiAqICAgcGFzc3dvcmQ6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWllbGVtZW50KCdidXR0b24nLCB7IGNsYXNzOiAnYnRuLXByaW1hcnknIH0pXG4gKiAgIHN1Ym1pdDogc3RyaW5nID0gJ0xvZ2luJztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHVpZWxlbWVudFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgVUlcbiAqICAgTW9kZWwtPj51aWVsZW1lbnQ6IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIHVpZWxlbWVudC0+Pk1vZGVsOiBBZGQgZWxlbWVudCBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IGVsZW1lbnQgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiB0YWcgYW5kIHByb3BzXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlVJOiBSZW5kZXIgd2l0aCBzcGVjaWZpZWQgZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gdWllbGVtZW50KFxuICB0YWc6IHN0cmluZyxcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBzZXJpYWxpemU6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG4gIHJldHVybiAob3JpZ2luYWw6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YTogVUlFbGVtZW50TWV0YWRhdGEgPSB7XG4gICAgICB0YWc6IHRhZyxcbiAgICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplLFxuICAgICAgcHJvcHM6IE9iamVjdC5hc3NpZ24oe30sIHByb3BzIHx8IHt9LCB7XG4gICAgICAgIG5hbWU6IHByb3BlcnR5S2V5LFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIHJldHVybiBwcm9wTWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuRUxFTUVOVCksIG1ldGFkYXRhKShcbiAgICAgIG9yaWdpbmFsLFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXBzIGEgbW9kZWwgcHJvcGVydHkgdG8gYSBVSSBjb21wb25lbnQgcHJvcGVydHlcbiAqIEBzdW1tYXJ5IFNwZWNpZmllcyBob3cgYSBwcm9wZXJ0eSBzaG91bGQgYmUgcGFzc2VkIHRvIGEgVUkgY29tcG9uZW50XG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIGRlZmluZSBob3cgYSBtb2RlbCBwcm9wZXJ0eSBzaG91bGQgYmUgbWFwcGVkIHRvXG4gKiBhIHByb3BlcnR5IG9mIHRoZSBVSSBjb21wb25lbnQgd2hlbiByZW5kZXJpbmcuIEl0IHJlcXVpcmVzIHRoZSBjbGFzcyB0byBiZVxuICogZGVjb3JhdGVkIHdpdGggQHVpbW9kZWwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wTmFtZV0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHBhc3MgdG8gdGhlIGNvbXBvbmVudCAoZGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IGtleSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3N0cmluZ2lmeT1mYWxzZV0gV2hldGhlciB0byBzdHJpbmdpZnkgdGhlIHByb3BlcnR5IHZhbHVlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWlwcm9wXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNYXAgbW9kZWwgcHJvcGVydGllcyB0byBjb21wb25lbnQgcHJvcGVydGllc1xuICogQHVpbW9kZWwoJ3VzZXItcHJvZmlsZScpXG4gKiBjbGFzcyBVc2VyUHJvZmlsZSB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwcm9wKCkgLy8gV2lsbCBiZSBwYXNzZWQgYXMgJ2Z1bGxOYW1lJyB0byB0aGUgY29tcG9uZW50XG4gKiAgIGZ1bGxOYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcHJvcCgndXNlckVtYWlsJykgLy8gV2lsbCBiZSBwYXNzZWQgYXMgJ3VzZXJFbWFpbCcgdG8gdGhlIGNvbXBvbmVudFxuICogICBlbWFpbDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXByb3AoJ3VzZXJEYXRhJywgdHJ1ZSkgLy8gV2lsbCBiZSBwYXNzZWQgYXMgc3RyaW5naWZpZWQgSlNPTlxuICogICB1c2VyRGF0YTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHVpcHJvcFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgQ29tcG9uZW50XG4gKiAgIE1vZGVsLT4+dWlwcm9wOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICB1aXByb3AtPj5Nb2RlbDogQWRkIHByb3AgbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IEdldCBwcm9wIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gcHJvcCBuYW1lIGFuZCBzdHJpbmdpZnkgZmxhZ1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Db21wb25lbnQ6IFBhc3MgcHJvcGVydHkgd2l0aCBzcGVjaWZpZWQgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdWlwcm9wKFxuICBwcm9wTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICBzdHJpbmdpZnk6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YTogVUlQcm9wTWV0YWRhdGEgPSB7XG4gICAgICBuYW1lOiBwcm9wTmFtZSB8fCBwcm9wZXJ0eUtleSxcbiAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5LFxuICAgIH07XG4gICAgcHJvcE1ldGFkYXRhKFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlBST1ApLCBtZXRhZGF0YSkoXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcHMgYSBuZXN0ZWQgbW9kZWwgcHJvcGVydHkgdG8gYSBVSSBjb21wb25lbnQgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGhvdyBhIHBhcmVudCBjb21wb25lbnQgc2hvdWxkIHJlbmRlciB0aGUgY2hpbGQgbW9kZWwgd2hlbiBuZXN0ZWQuXG4gKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBkZWNvcmF0ZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5lc3RlZCBtb2RlbHMuXG4gKiBXaGVuIGFwcGxpZWQsIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IHRhZyBvZiB0aGUgY2hpbGQgbW9kZWwgd2l0aCB0aGUgcHJvdmlkZWQgb25lLFxuICogZW5hYmxpbmcgZGlmZmVyZW50IHJlbmRlcmluZyBiZWhhdmlvciB3aGVuIHRoZSBtb2RlbCBhY3RzIGFzIGEgY2hpbGQgKG5lc3RlZClcbiAqIGNvbXBhcmVkIHRvIHdoZW4gaXQgaXMgcmVuZGVyZWQgYXMgdGhlIHBhcmVudCBtb2RlbC5cbiAqXG4gKiBJdCByZXF1aXJlcyB0aGUgY2xhc3MgdG8gYmUgZGVjb3JhdGVkIHdpdGggYEB1aW1vZGVsYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhenogVGhlIG1vZGVsIGNsYXNzIG5hbWUgdG8gcGFzcyB0byB0aGUgY29tcG9uZW50IChkZWZhdWx0cyB0byB0aGUgcHJvcGVydHkga2V5KS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIEhUTUwgZWxlbWVudCBvciBjb21wb25lbnQgdGFnIG5hbWUgdG8gb3ZlcnJpZGUgdGhlIFVJIHRhZyBvZiB0aGUgbmVzdGVkIG1vZGVsXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wc10gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NlcmlhbGl6ZT1mYWxzZV0gV2hldGhlciB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIHNlcmlhbGl6ZWRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gdWljaGlsZFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTWFwIGEgbmVzdGVkIG1vZGVsIHRvIGEgY29tcG9uZW50IHByb3BlcnR5IHdpdGggYSBkaWZmZXJlbnQgdGFnIHdoZW4gbmVzdGVkXG4gKiBAdWltb2RlbCgnYWRkcmVzcy1jb21wb25lbnQnKVxuICogY2xhc3MgQWRkcmVzcyB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBzdHJlZXQ6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBjaXR5OiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQHVpbW9kZWwoJ3VzZXItcHJvZmlsZScpXG4gKiBjbGFzcyBVc2VyUHJvZmlsZSB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWljaGlsZChBZGRyZXNzLm5hbWUsICdhZGRyZXNzLWNoaWxkLWNvbXBvbmVudCcpXG4gKiAgIGFkZHJlc3M6IEFkZHJlc3M7XG4gKiB9XG4gKlxuICogLy8gSW4gdGhpcyBleGFtcGxlLCB0aGUgQWRkcmVzcyBtb2RlbCBoYXMgdGhlIGRlZmF1bHQgdGFnICdhZGRyZXNzLWNvbXBvbmVudCcgd2hlbiByZW5kZXJlZCBhcyBhIHJvb3QgY29tcG9uZW50LFxuICogLy8gYnV0IHdoZW4gdXNlZCBpbnNpZGUgVXNlclByb2ZpbGUsIGl0IGlzIHJlbmRlcmVkIHdpdGggdGhlIG92ZXJyaWRkZW4gdGFnICdhZGRyZXNzLWNoaWxkLWNvbXBvbmVudCdcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHVpY2hpbGRcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IENvbXBvbmVudFxuICogICBNb2RlbC0+PnVpY2hpbGQ6IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIHVpY2hpbGQtPj5Nb2RlbDogQWRkIGNoaWxkIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBHZXQgY2hpbGQgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBwcm9wIG5hbWUsIHN0cmluZ2lmeSBmbGFnLCBhbmQgY2hpbGQgdGFnIG92ZXJyaWRlXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PkNvbXBvbmVudDogUGFzcyBwcm9wZXJ0eSB3aXRoIHNwZWNpZmllZCBuYW1lIGFuZCByZW5kZXIgd2l0aCBvdmVycmlkZGVuIHRhZyBpZiBuZXN0ZWRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdWljaGlsZChcbiAgY2xheno6IHN0cmluZyxcbiAgdGFnOiBzdHJpbmcsXG4gIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gIHNlcmlhbGl6ZTogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBVSUVsZW1lbnRNZXRhZGF0YSA9IHtcbiAgICAgIHRhZzogdGFnLFxuICAgICAgc2VyaWFsaXplOiBzZXJpYWxpemUsXG4gICAgICBwcm9wczogT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMgfHwge30sIHtcbiAgICAgICAgbmFtZTogY2xhenogfHwgcHJvcGVydHlLZXksXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgcHJvcE1ldGFkYXRhKFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLkNISUxEKSwgbWV0YWRhdGEpKFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXBzIGEgbW9kZWwgcHJvcGVydHkgdG8gYSBsaXN0IGl0ZW0gY29tcG9uZW50XG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IGEgcHJvcGVydHkgc2hvdWxkIGJlIHJlbmRlcmVkIGluIGEgbGlzdCBjb250ZXh0XG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIGRlZmluZSBob3cgYSBtb2RlbCBwcm9wZXJ0eSBjb250YWluaW5nIGEgbGlzdFxuICogc2hvdWxkIGJlIHJlbmRlcmVkLiBJdCByZXF1aXJlcyB0aGUgY2xhc3MgdG8gYmUgZGVjb3JhdGVkIHdpdGggQHVpbGlzdGl0ZW0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wTmFtZV0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHBhc3MgdG8gdGhlIGxpc3QgY29tcG9uZW50IChkZWZhdWx0cyB0byB0aGUgcHJvcGVydHkga2V5KVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSBsaXN0IGNvbnRhaW5lclxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpbGlzdHByb3BcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIERlZmluZSBhIGxpc3QgcHJvcGVydHkgd2l0aCBjdXN0b20gcmVuZGVyaW5nXG4gKiBAdWltb2RlbCgndG9kby1saXN0JylcbiAqIGNsYXNzIFRvZG9MaXN0IHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHRpdGxlOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGlzdHByb3AoJ2l0ZW1zJywgeyBjbGFzczogJ3RvZG8taXRlbXMtY29udGFpbmVyJyB9KVxuICogICBpdGVtczogVG9kb0l0ZW1bXTtcbiAqIH1cbiAqXG4gKiBAdWlsaXN0aXRlbSgnbGknLCB7IGNsYXNzOiAndG9kby1pdGVtJyB9KVxuICogY2xhc3MgVG9kb0l0ZW0gZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB0ZXh0OiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgY29tcGxldGVkOiBib29sZWFuO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWlsaXN0cHJvcFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgTGlzdENvbnRhaW5lclxuICogICBwYXJ0aWNpcGFudCBMaXN0SXRlbXNcbiAqICAgTW9kZWwtPj51aWxpc3Rwcm9wOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICB1aWxpc3Rwcm9wLT4+TW9kZWw6IEFkZCBsaXN0IHByb3AgbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IEdldCBsaXN0IHByb3AgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBwcm9wIG5hbWUgYW5kIGNvbnRhaW5lciBwcm9wc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5MaXN0Q29udGFpbmVyOiBDcmVhdGUgY29udGFpbmVyIHdpdGggcHJvcHNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TGlzdEl0ZW1zOiBSZW5kZXIgZWFjaCBpdGVtIHVzaW5nIEB1aWxpc3RpdGVtXG4gKiAgIExpc3RDb250YWluZXItPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiByZW5kZXJlZCBsaXN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aWxpc3Rwcm9wKFxuICBwcm9wTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT5cbikge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFBhcnRpYWw8VUlMaXN0UHJvcE1ldGFkYXRhPiA9IHtcbiAgICAgIG5hbWU6IHByb3BOYW1lIHx8IHByb3BlcnR5S2V5LFxuICAgICAgcHJvcHM6IHByb3BzIHx8IHt9LFxuICAgIH07XG4gICAgcHJvcE1ldGFkYXRhKFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTElTVFBST1ApLCBtZXRhZGF0YSkoXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG4gIH07XG59XG4iXX0=
|
package/lib/ui/decorators.d.ts
CHANGED
|
@@ -160,49 +160,59 @@ export declare function uielement(tag: string, props?: Record<string, any>, seri
|
|
|
160
160
|
*/
|
|
161
161
|
export declare function uiprop(propName?: string | undefined, stringify?: boolean): (target: any, propertyKey: string) => void;
|
|
162
162
|
/**
|
|
163
|
-
* @description Decorator that maps a model property to a UI component property
|
|
164
|
-
* @summary
|
|
165
|
-
* This decorator allows you to define how a model property should be mapped to
|
|
166
|
-
* a property of the UI component when rendering. It requires the class to be
|
|
167
|
-
* decorated with @uimodel.
|
|
163
|
+
* @description Decorator that maps a nested model property to a UI component property.
|
|
164
|
+
* @summary Defines how a parent component should render the child model when nested.
|
|
168
165
|
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
166
|
+
* This decorator is used to decorate properties that are nested models.
|
|
167
|
+
* When applied, it allows overriding the default tag of the child model with the provided one,
|
|
168
|
+
* enabling different rendering behavior when the model acts as a child (nested)
|
|
169
|
+
* compared to when it is rendered as the parent model.
|
|
172
170
|
*
|
|
173
|
-
*
|
|
171
|
+
* It requires the class to be decorated with `@uimodel`.
|
|
172
|
+
*
|
|
173
|
+
* @param {string} clazz The model class name to pass to the component (defaults to the property key).
|
|
174
|
+
* @param {string} tag The HTML element or component tag name to override the UI tag of the nested model
|
|
175
|
+
* @param {Record<string, any>} [props] Additional properties to pass to the element
|
|
176
|
+
* @param {boolean} [serialize=false] Whether the property should be serialized
|
|
177
|
+
* @return {Function} A property decorator function.
|
|
178
|
+
*
|
|
179
|
+
* @function uichild
|
|
174
180
|
* @category Property Decorators
|
|
175
181
|
*
|
|
176
182
|
* @example
|
|
177
|
-
* // Map model
|
|
178
|
-
* @uimodel('
|
|
179
|
-
* class
|
|
183
|
+
* // Map a nested model to a component property with a different tag when nested
|
|
184
|
+
* @uimodel('address-component')
|
|
185
|
+
* class Address {
|
|
180
186
|
* @attribute()
|
|
181
|
-
*
|
|
182
|
-
* fullName: string;
|
|
187
|
+
* street: string;
|
|
183
188
|
*
|
|
184
189
|
* @attribute()
|
|
185
|
-
*
|
|
186
|
-
*
|
|
190
|
+
* city: string;
|
|
191
|
+
* }
|
|
187
192
|
*
|
|
193
|
+
* @uimodel('user-profile')
|
|
194
|
+
* class UserProfile {
|
|
188
195
|
* @attribute()
|
|
189
|
-
* @
|
|
190
|
-
*
|
|
196
|
+
* @uichild(Address.name, 'address-child-component')
|
|
197
|
+
* address: Address;
|
|
191
198
|
* }
|
|
192
199
|
*
|
|
200
|
+
* // In this example, the Address model has the default tag 'address-component' when rendered as a root component,
|
|
201
|
+
* // but when used inside UserProfile, it is rendered with the overridden tag 'address-child-component'
|
|
202
|
+
*
|
|
193
203
|
* @mermaid
|
|
194
204
|
* sequenceDiagram
|
|
195
205
|
* participant Model
|
|
196
|
-
* participant
|
|
206
|
+
* participant uichild
|
|
197
207
|
* participant RenderingEngine
|
|
198
208
|
* participant Component
|
|
199
|
-
* Model->>
|
|
200
|
-
*
|
|
201
|
-
* RenderingEngine->>Model: Get
|
|
202
|
-
* Model->>RenderingEngine: Return prop name and
|
|
203
|
-
* RenderingEngine->>Component: Pass property with specified name
|
|
209
|
+
* Model->>uichild: Apply to property
|
|
210
|
+
* uichild->>Model: Add child metadata
|
|
211
|
+
* RenderingEngine->>Model: Get child metadata
|
|
212
|
+
* Model->>RenderingEngine: Return prop name, stringify flag, and child tag override
|
|
213
|
+
* RenderingEngine->>Component: Pass property with specified name and render with overridden tag if nested
|
|
204
214
|
*/
|
|
205
|
-
export declare function uichild(
|
|
215
|
+
export declare function uichild(clazz: string, tag: string, props?: Record<string, any>, serialize?: boolean): (target: any, propertyKey: string) => void;
|
|
206
216
|
/**
|
|
207
217
|
* @description Decorator that maps a model property to a list item component
|
|
208
218
|
* @summary Specifies how a property should be rendered in a list context
|