@odigos/aws-cdk 0.0.19 → 0.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +33 -34
- package/README.md +111 -47
- package/lib/collector-config.d.ts +2 -0
- package/lib/collector-config.js +40 -17
- package/lib/fargate-recipes.js +3 -1
- package/lib/fargate.d.ts +3 -2
- package/lib/fargate.js +44 -10
- package/lib/generated/distributions.d.ts +1 -1
- package/lib/generated/distributions.js +2 -2
- package/lib/generated/fargate.d.ts +2 -2
- package/lib/generated/fargate.js +3 -3
- package/lib/generated/layers.d.ts +3 -3
- package/lib/generated/layers.js +292 -292
- package/lib/instrumentation.d.ts +5 -6
- package/lib/instrumentation.js +32 -13
- package/lib/layer-resolver.js +6 -2
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/types.d.ts +8 -10
- package/lib/types.js +5 -5
- package/package.json +1 -2
package/lib/fargate-recipes.js
CHANGED
|
@@ -10,6 +10,7 @@ exports.fargateResourceAttributes = fargateResourceAttributes;
|
|
|
10
10
|
exports.exportTargetFor = exportTargetFor;
|
|
11
11
|
exports.portProtocolMismatch = portProtocolMismatch;
|
|
12
12
|
const fargate_1 = require("./generated/fargate");
|
|
13
|
+
const collector_config_1 = require("./collector-config");
|
|
13
14
|
/**
|
|
14
15
|
* How a language's agent is staged into an ECS Fargate task and activated in a container.
|
|
15
16
|
*
|
|
@@ -170,6 +171,7 @@ function grpcEndpointURL(endpoint, insecure) {
|
|
|
170
171
|
* honours `OTEL_EXPORTER_OTLP_PROTOCOL` and falls back to whichever transport exists.
|
|
171
172
|
*/
|
|
172
173
|
function exportTargetFor(recipe, dest) {
|
|
174
|
+
(0, collector_config_1.validateDestination)(dest, true);
|
|
173
175
|
const grpcURL = grpcEndpointURL(dest.endpoint ?? '', dest.insecure);
|
|
174
176
|
const httpURL = dest.httpEndpoint ?? '';
|
|
175
177
|
if (recipe.otlpProtocol === exports.OTLP_PROTOCOL_HTTP && httpURL !== '') {
|
|
@@ -228,4 +230,4 @@ function portProtocolMismatch(endpoint, protocol) {
|
|
|
228
230
|
}
|
|
229
231
|
return '';
|
|
230
232
|
}
|
|
231
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFyZ2F0ZS1yZWNpcGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZhcmdhdGUtcmVjaXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE0REEsc0RBTUM7QUFZRCwwQ0FPQztBQW1CRCxzQ0FFQztBQVNELDhCQXNDQztBQVlELHdDQU9DO0FBVUQsOERBR0M7QUFtQ0QsMENBNkJDO0FBd0JELG9EQWdCQztBQWpTRCxpREFJNkI7QUFHN0I7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCwwR0FBMEc7QUFDMUcsTUFBTSw4QkFBOEIsR0FBRyx3QkFBd0IsQ0FBQztBQUVoRSxpRUFBaUU7QUFDakUsTUFBTSxzQkFBc0IsR0FBRyx1QkFBdUIsQ0FBQztBQUV2RDs7OztHQUlHO0FBQ0gsTUFBTSwyQkFBMkIsR0FBRyxrQ0FBa0MsQ0FBQztBQUV2RSwrRkFBK0Y7QUFDbEYsUUFBQSxrQkFBa0IsR0FBRyxNQUFNLENBQUM7QUFDNUIsUUFBQSxrQkFBa0IsR0FBRyxlQUFlLENBQUM7QUFFbEQsd0dBQXdHO0FBQ3hHLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxDQUFDO0FBQ3RDLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxDQUFDO0FBYXRDOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxPQUFlLEVBQUUsYUFBcUI7SUFDMUUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBa0IsQ0FBQyxDQUFDO0lBQy9FLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThC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Q0FBQztBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBGQVJHQVRFX0FHRU5UU19ESVIsXG4gIEZBUkdBVEVfSU1BR0VfQUdFTlRTX0RJUixcbiAgRkFSR0FURV9MQU5HVUFHRVMsXG59IGZyb20gJy4vZ2VuZXJhdGVkL2ZhcmdhdGUnO1xuaW1wb3J0IHsgT2RpZ29zRGVzdGluYXRpb24sIE9kaWdvc0ZhcmdhdGVMYW5ndWFnZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEhvdyBhIGxhbmd1YWdlJ3MgYWdlbnQgaXMgc3RhZ2VkIGludG8gYW4gRUNTIEZhcmdhdGUgdGFzayBhbmQgYWN0aXZhdGVkIGluIGEgY29udGFpbmVyLlxuICpcbiAqIEEgUE9SVCBvZiBgcmVjaXBlRm9yYCAvIGBhcHBseUluc3RydW1lbnRhdGlvbmAgaW4gdGhlIGNvbm5lY3RvcidzIEVDUyBpbnN0cnVtZW50b3JcbiAqIChjb25uZWN0b3JzL3Byb3ZpZGVycy9hd3MvcGtnL3dvcmtsb2FkL2luc3RydW1lbnRvci9lY3NfcmVjaXBlcy5nbywgZWNzX2luamVjdC5nbykuIFRoZSBkYXRhIGxpdmVzIGluXG4gKiAuLi8uLi9hcnRpZmFjdHMuanNvbiBhbmQgcmVhY2hlcyBoZXJlIHRocm91Z2ggdGhlIGdlbmVyYXRlZCBtb2R1bGU7IHRoZSBkZWNpc2lvbnMgbGl2ZSBoZXJlLlxuICpcbiAqIEVxdWl2YWxlbmNlIHdpdGggdGhlIGNvbm5lY3RvciBpcyBub3QgY29zbWV0aWMuIEl0cyBjb25mb3JtYW5jZSBvYnNlcnZlciByZWJ1aWxkcyBlYWNoIGNvbnRhaW5lcidzXG4gKiBkZXNpcmVkIGFjdGl2YXRpb24gZW52aXJvbm1lbnQgYW5kIGNvbXBhcmVzIGl0IGFnYWluc3Qgd2hhdCB0aGUgY29udGFpbmVyIGNhcnJpZXMsIGNvbXBvbmVudCBieVxuICogY29tcG9uZW50LCBzbyBhbnl0aGluZyByZW5kZXJlZCBkaWZmZXJlbnRseSBoZXJlIGlzIHJlcG9ydGVkIHRvIHRoZSBjdXN0b21lciBhcyBpbnN0cnVtZW50YXRpb24gZHJpZnRcbiAqIG9uIGEgc3RhY2sgdGhhdCBpcyBpbiBmYWN0IGRlcGxveWVkIGV4YWN0bHkgYXMgdGhleSB3cm90ZSBpdC5cbiAqL1xuXG4vKiogVGhlIGRpc3RybyBwbGFjZWhvbGRlciBmb3IgdGhlIGNvbnRhaW5lcidzIG93biBwcmUtT2RpZ29zIHZhbHVlIG9mIGFuIGFwcGVuZC1zdHlsZSBsb2FkZXIgdmFyaWFibGUuICovXG5jb25zdCBPUklHSU5BTF9FTlZfVkFMVUVfUExBQ0VIT0xERVIgPSAne3tPUklHSU5BTF9FTlZfVkFMVUV9fSc7XG5cbi8qKiBUaGUgZGlzdHJvIHBsYWNlaG9sZGVyIGZvciB0aGUgc2hhcmVkIHZvbHVtZSdzIG1vdW50IHBhdGguICovXG5jb25zdCBBR0VOVFNfRElSX1BMQUNFSE9MREVSID0gJ3t7T0RJR09TX0FHRU5UU19ESVJ9fSc7XG5cbi8qKlxuICogVGhlIGRpc3RybyBwYXJhbWV0ZXIgZm9yIHRoZSBhcHBsaWNhdGlvbidzIHJ1bnRpbWUgYG1ham9yLm1pbm9yYCwgYXMgYSBHbyB0ZXh0L3RlbXBsYXRlIGFjdGlvbiDigJRcbiAqIHZlcmJhdGltIGZyb20gdGhlIGRpc3RybyB5YW1sIHNvIC4uLy4uL2FydGlmYWN0cy5qc29uIGNhbiBiZSBkaWZmZWQgYWdhaW5zdCBpdCBieSBleWUuIE9ubHkgcGhwIGFuZFxuICogcnVieSBjYXJyeSBpdDogdGhlaXIgYWdlbnRzIGFyZSBsYWlkIGRvd24gcGVyIHJ1bnRpbWUgdmVyc2lvbi5cbiAqL1xuY29uc3QgUlVOVElNRV9WRVJTSU9OX1BMQUNFSE9MREVSID0gJ3t7LlJVTlRJTUVfVkVSU0lPTl9NQUpPUl9NSU5PUn19JztcblxuLyoqIGBPVEVMX0VYUE9SVEVSX09UTFBfUFJPVE9DT0xgIHZhbHVlcy4gRW5kcG9pbnQgYW5kIHByb3RvY29sIGFyZSBhbHdheXMgZGVjaWRlZCB0b2dldGhlci4gKi9cbmV4cG9ydCBjb25zdCBPVExQX1BST1RPQ09MX0dSUEMgPSAnZ3JwYyc7XG5leHBvcnQgY29uc3QgT1RMUF9QUk9UT0NPTF9IVFRQID0gJ2h0dHAvcHJvdG9idWYnO1xuXG4vKiogU3RhbmRhcmQgT1RMUCByZWNlaXZlciBwb3J0cywgdXNlZCBvbmx5IHRvIHdhcm4gYWJvdXQgYW4gZW5kcG9pbnQgcGFpcmVkIHdpdGggdGhlIG90aGVyIHByb3RvY29sLiAqL1xuY29uc3QgT1RMUF9ERUZBVUxUX0dSUENfUE9SVCA9ICc0MzE3JztcbmNvbnN0IE9UTFBfREVGQVVMVF9IVFRQX1BPUlQgPSAnNDMxOCc7XG5cbi8qKlxuICogQW4gYXBwZW5kLXN0eWxlIGxvYWRlciB2YXJpYWJsZSDigJQgYEpBVkFfVE9PTF9PUFRJT05TYCwgYE5PREVfT1BUSU9OU2AsIGBQWVRIT05QQVRIYCDigJQga2VwdCBhcyBpdHNcbiAqIHBhdHRlcm4gcmF0aGVyIHRoYW4gYSBmaW5pc2hlZCB2YWx1ZSwgYmVjYXVzZSB0aGUgdmFsdWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBjb250YWluZXIgYWxyZWFkeSBjYXJyaWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZhcmdhdGVBcHBlbmRFbnZWYXIge1xuICAvKiogVmFyaWFibGUgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKiogVGhlIGRpc3RybydzIFJlcGxhY2VQYXR0ZXJuLCBwbGFjZWhvbGRlcnMgdW5yZXNvbHZlZC4gKi9cbiAgcmVhZG9ubHkgcGF0dGVybjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGFuIGFwcGVuZCBwYXR0ZXJuIGZvciBhIGdpdmVuIHByZS1leGlzdGluZyB2YWx1ZS5cbiAqXG4gKiBQb3J0IG9mIGBkaXN0cm8uRXZhbHVhdGVSZXBsYWNlUGF0dGVybmAsIElOQ0xVRElORyB0aGUgZW1wdHktb3JpZ2luYWwgY2FzZTogd2l0aCBub3RoaW5nIHRvIGpvaW4gdG8sXG4gKiB0aGUgcGxhY2Vob2xkZXIgYW5kIGl0cyBhZGphY2VudCBkZWxpbWl0ZXIgYXJlIHN0cmlwcGVkLCBzbyB0aGUgcmVzdWx0IG5ldmVyIG9wZW5zIHdpdGggYSBzdHJheSBzcGFjZVxuICogb3IgY29sb24uIGBQWVRIT05QQVRIPVwiOi92YXIvb2RpZ29zL3B5dGhvblwiYCB3b3VsZCBwdXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgb24gYHN5cy5wYXRoYFxuICogYWhlYWQgb2YgdGhlIGFnZW50LCB3aGljaCBpcyBhIGRpZmZlcmVudCBwcm9ncmFtIHRoYW4gdGhlIG9uZSBpbnRlbmRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlQXBwZW5kUGF0dGVybihwYXR0ZXJuOiBzdHJpbmcsIG9yaWdpbmFsVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdpdGhEaXIgPSBwYXR0ZXJuLnNwbGl0KEFHRU5UU19ESVJfUExBQ0VIT0xERVIpLmpvaW4oRkFSR0FURV9BR0VOVFNfRElSKTtcbiAgaWYgKG9yaWdpbmFsVmFsdWUudHJpbSgpID09PSAnJykge1xuICAgIHJldHVybiB3aXRoRGlyLnNwbGl0KE9SSUdJTkFMX0VOVl9WQUxVRV9QTEFDRUhPTERFUikuam9pbignJykucmVwbGFjZSgvXlsgOl0rLywgJycpO1xuICB9XG4gIHJldHVybiB3aXRoRGlyLnNwbGl0KE9SSUdJTkFMX0VOVl9WQUxVRV9QTEFDRUhPTERFUikuam9pbihvcmlnaW5hbFZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGUgZGVsaW1pdGVyIGEgcGF0dGVybiBqb2lucyB0aGUgY29udGFpbmVyJ3Mgb3duIHZhbHVlIHRvIG91cnMgd2l0aDogdGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseSBhZnRlclxuICogdGhlIG9yaWdpbmFsLXZhbHVlIHBsYWNlaG9sZGVyLlxuICpcbiAqIERFUklWRUQgZnJvbSB0aGUgcGF0dGVybiByYXRoZXIgdGhhbiBkZWNsYXJlZCwgYmVjYXVzZSB0aGUgcGF0dGVybiBpcyB0aGUgYXV0aG9yaXR5IOKAlCBpdCBjb21lcyBmcm9tIHRoZVxuICogdXBzdHJlYW0gZGlzdHJvLCBkaWZmZXJzIGJ5IGxhbmd1YWdlIChhIHNwYWNlIGZvciBgSkFWQV9UT09MX09QVElPTlNgL2BOT0RFX09QVElPTlNgLCBhIGNvbG9uIGZvclxuICogYFBZVEhPTlBBVEhgKSBhbmQgY2FuIGNoYW5nZSBvbiBzb21lYm9keSBlbHNlJ3MgcmVsZWFzZS4gQXNzdW1pbmcgb25lIHdvdWxkIGJlIHNpbGVudGx5IGRlc3RydWN0aXZlIGluXG4gKiBhIHdheSBub3RoaW5nIGhlcmUgd291bGQgY2F0Y2g6IGEgc3BhY2Utam9pbmVkIGBQWVRIT05QQVRIYCBpcyBvbmUgdW51c2FibGUgcGF0aCByYXRoZXIgdGhhbiB0d28sIGFuZFxuICogdGhlIHByb2Nlc3Mgc3RpbGwgc3RhcnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kU2VwYXJhdG9yKHBhdHRlcm46IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGkgPSBwYXR0ZXJuLmluZGV4T2YoT1JJR0lOQUxfRU5WX1ZBTFVFX1BMQUNFSE9MREVSKTtcbiAgaWYgKGkgPCAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGNvbnN0IHJlc3QgPSBwYXR0ZXJuLnNsaWNlKGkgKyBPUklHSU5BTF9FTlZfVkFMVUVfUExBQ0VIT0xERVIubGVuZ3RoKTtcbiAgcmV0dXJuIHJlc3QgPT09ICcnID8gJycgOiByZXN0LmNoYXJBdCgwKTtcbn1cblxuLyoqIE9uZSBsYW5ndWFnZSdzIHN0YWdpbmcgYW5kIGFjdGl2YXRpb24sIHdpdGggZXZlcnkgcGxhdGZvcm0tc3VwcGxpZWQgcGFyYW1ldGVyIGFscmVhZHkgcmVuZGVyZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEZhcmdhdGVSZWNpcGUge1xuICAvKiogQ2Fub25pY2FsIGxhbmd1YWdlIGtleSwgYW5kIHRoZSB2YWx1ZSByZWNvcmRlZCBpbiB0aGUgYE9ESUdPU19JQUNgIG1hcmtlcidzIGBsYW5nYC4gKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2U6IHN0cmluZztcbiAgLyoqIERpcmVjdG9yaWVzIHVuZGVyIHRoZSBhZ2VudHMgaW1hZ2UgdGhlIHN0YWdpbmcgY29udGFpbmVyIGNvcGllcyBpbnRvIHRoZSBzaGFyZWQgdm9sdW1lLiAqL1xuICByZWFkb25seSBhZ2VudERpcnM6IHN0cmluZ1tdO1xuICAvKiogQWN0aXZhdGlvbiB2YXJpYWJsZXMgc2V0IG91dHJpZ2h0LiAqL1xuICByZWFkb25seSBzdGF0aWNFbnY6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKiBBY3RpdmF0aW9uIHZhcmlhYmxlcyBvdXIgZnJhZ21lbnQgaXMgYXBwZW5kZWQgdG8uICovXG4gIHJlYWRvbmx5IGFwcGVuZEVudjogRmFyZ2F0ZUFwcGVuZEVudlZhcltdO1xuICAvKiogVGhlIHRyYW5zcG9ydCB0aGlzIGFnZW50IHByZWZlcnMuICovXG4gIHJlYWRvbmx5IG90bHBQcm90b2NvbDogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGUgYWdlbnQgY2FuIHNwZWFrIG9ubHkgYG90bHBQcm90b2NvbGAgYW5kIGNhbm5vdCBiZSBzd2l0Y2hlZCB0byB0aGUgb3RoZXIgdHJhbnNwb3J0LiAqL1xuICByZWFkb25seSBwcm90b2NvbEZpeGVkOiBib29sZWFuO1xufVxuXG4vKiogVGhlIGNhbm9uaWNhbCBjb25uZWN0b3IgbGFuZ3VhZ2Uga2V5IGZvciBhbiBlbnVtIG1lbWJlci4gVGhlIGVudW0ncyB2YWx1ZXMgQVJFIHRob3NlIGtleXMuICovXG5leHBvcnQgZnVuY3Rpb24gbGFuZ3VhZ2VLZXlPZihsYW5ndWFnZTogT2RpZ29zRmFyZ2F0ZUxhbmd1YWdlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxhbmd1YWdlO1xufVxuXG4vKipcbiAqIFRoZSByZWNpcGUgZm9yIGEgbGFuZ3VhZ2UsIHdpdGggdGhlIHJ1bnRpbWUgdmVyc2lvbiByZW5kZXJlZCBpbnRvIHRoZSBhZ2VudHMnIHBhdGhzIHdoZXJlIHRoZSBsYW5ndWFnZVxuICogbmVlZHMgaXQuXG4gKlxuICogQHBhcmFtIHJ1bnRpbWVWZXJzaW9uIHRoZSBhcHBsaWNhdGlvbidzIHJ1bnRpbWUgYG1ham9yLm1pbm9yYC4gUmVxdWlyZWQgZm9yIHBocCBhbmQgcnVieSwgd2hvc2UgYWdlbnRcbiAqIGZpbGVzIGFyZSBsYWlkIGRvd24gcGVyIHZlcnNpb24sIGFuZCBpZ25vcmVkIGJ5IGV2ZXJ5IG90aGVyIGxhbmd1YWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjaXBlRm9yKGxhbmd1YWdlOiBPZGlnb3NGYXJnYXRlTGFuZ3VhZ2UsIHJ1bnRpbWVWZXJzaW9uPzogc3RyaW5nKTogRmFyZ2F0ZVJlY2lwZSB7XG4gIGNvbnN0IGtleSA9IGxhbmd1YWdlS2V5T2YobGFuZ3VhZ2UpO1xuICBjb25zdCBzcGVjID0gRkFSR0FURV9MQU5HVUFHRVNba2V5XTtcbiAgaWYgKCFzcGVjKSB7XG4gICAgLy8gVW5yZWFjaGFibGUgdGhyb3VnaCB0aGUgZW51bTsgcmVhY2hhYmxlIGlmIHRoZSBnZW5lcmF0ZWQgdGFibGUgYW5kIHRoZSBlbnVtIGV2ZXIgZGlzYWdyZWUuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBPZGlnb3M6IG5vIEVDUyBGYXJnYXRlIGFnZW50IHJlY2lwZSBmb3IgbGFuZ3VhZ2UgXCIke2tleX1cIi5gKTtcbiAgfVxuICBpZiAoc3BlYy5yZXF1aXJlc1J1bnRpbWVWZXJzaW9uICYmICFydW50aW1lVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBPZGlnb3M6IHRoZSAke2tleX0gYWdlbnQncyBmaWxlcyBhcmUgbGFpZCBkb3duIHBlciBydW50aW1lIHZlcnNpb24sIHNvIGluc3RydW1lbnRpbmcgYSAke2tleX0gYCArXG4gICAgICAgICdjb250YWluZXIgbmVlZHMgYHJ1bnRpbWVWZXJzaW9uYCBzZXQgdG8gdGhlIGFwcGxpY2F0aW9uXFwncyBtYWpvci5taW5vciAoZm9yIGV4YW1wbGUgXCI4LjNcIikuICcgK1xuICAgICAgICAnVGhlIHZhbHVlIHNlbGVjdHMgdGhlIGFnZW50IHBhdGggdGhlIGFjdGl2YXRpb24gZW52aXJvbm1lbnQgcG9pbnRzIGF0LCBzbyBhIHdyb25nIG9yIG1pc3NpbmcgJyArXG4gICAgICAgICdvbmUgbGVhdmVzIHRoZSBjb250YWluZXIgd2l0aCBhbiBhZ2VudCB0aGF0IGlzIG5ldmVyIGxvYWRlZC4nLFxuICAgICk7XG4gIH1cbiAgLy8gUmVqZWN0ZWQgaGVyZSByYXRoZXIgdGhhbiBwYXNzZWQgdGhyb3VnaDogYSBcIjguMy40XCIgb3IgXCJwaHA4LjNcIiB3b3VsZCBiZSByZW5kZXJlZCBzdHJhaWdodCBpbnRvXG4gIC8vIFBIUF9JTklfU0NBTl9ESVIgLyBSVUJZT1BUIGFzIGEgcGF0aCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBidW5kbGUsIGFuZCB0aGUgY29udGFpbmVyIHdvdWxkIHN0YXJ0XG4gIC8vIHdpdGggbm8gYWdlbnQgbG9hZGVkIGFuZCBubyBlcnJvciBhbnl3aGVyZSBuZWFyIHRoZSBjYXVzZS5cbiAgaWYgKHJ1bnRpbWVWZXJzaW9uICYmICEvXlxcZCtcXC5cXGQrJC8udGVzdChydW50aW1lVmVyc2lvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgT2RpZ29zOiBydW50aW1lVmVyc2lvbiBcIiR7cnVudGltZVZlcnNpb259XCIgbXVzdCBiZSBleGFjdGx5IG1ham9yLm1pbm9yIChmb3IgZXhhbXBsZSBcIjguM1wiKSDigJQgaXQgYCArXG4gICAgICAgICduYW1lcyBhIGRpcmVjdG9yeSBpbiB0aGUgYWdlbnRzIGJ1bmRsZSwgbm90IGEgZnVsbCB2ZXJzaW9uLicsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHN0YXRpY0VudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhzcGVjLnN0YXRpY0VudikpIHtcbiAgICBzdGF0aWNFbnZba10gPSBydW50aW1lVmVyc2lvbiA/IHYuc3BsaXQoUlVOVElNRV9WRVJTSU9OX1BMQUNFSE9MREVSKS5qb2luKHJ1bnRpbWVWZXJzaW9uKSA6IHY7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxhbmd1YWdlOiBrZXksXG4gICAgYWdlbnREaXJzOiBzcGVjLmFnZW50RGlycyxcbiAgICBzdGF0aWNFbnYsXG4gICAgYXBwZW5kRW52OiBzcGVjLmFwcGVuZEVudi5tYXAoKGEpID0+ICh7IG5hbWU6IGEubmFtZSwgcGF0dGVybjogYS5wYXR0ZXJuIH0pKSxcbiAgICBvdGxwUHJvdG9jb2w6IHNwZWMub3RscFByb3RvY29sLFxuICAgIHByb3RvY29sRml4ZWQ6IHNwZWMucHJvdG9jb2xGaXhlZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgc3RhZ2luZyBjb250YWluZXIncyBjb21tYW5kOiBjcmVhdGUgdGhlIHNoYXJlZCBkaXJlY3RvcnksIHRoZW4gY29weSBlYWNoIGxhbmd1YWdlJ3MgYWdlbnRcbiAqIGRpcmVjdG9yeSBvdXQgb2YgdGhlIGltYWdlIGludG8gaXQsIHRoZW4gZXhpdCAwLlxuICpcbiAqIE9SREVSIEFORCBTUEVMTElORyBBUkUgVEhFIENPTlRSQUNULiBUaGVyZSBpcyBPTkUgc3RhZ2luZyBjb250YWluZXIgcGVyIHRhc2sgZGVmaW5pdGlvbiBob3dldmVyIG1hbnlcbiAqIGxhbmd1YWdlcyBpdCBob2xkcywgYW5kIHRoZSBjb25uZWN0b3IgY29tcGFyZXMgaXRzIGNvbW1hbmQgYWdhaW5zdCB0aGUgdW5pb24gb2YgZXZlcnkgaW5zdHJ1bWVudGVkXG4gKiBjb250YWluZXIncyBhZ2VudCBkaXJlY3RvcmllcyBpbiBhc2NlbmRpbmcgb3JkZXIuIEEgY29tbWFuZCB0aGF0IGRpZmZlcnMgYnkgYSBzcGFjZSBpcyByZXBvcnRlZCBhc1xuICogZHJpZnQgb24gdGhlIHdob2xlIHRhc2sgZGVmaW5pdGlvbiwgc28gdGhpcyBpcyBzb3J0ZWQgYW5kIHJlbmRlcmVkIGV4YWN0bHkgYXMgYHNpZGVjYXJDb21tYW5kYCBpbiB0aGVcbiAqIGNvbm5lY3RvciBkb2VzIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lkZWNhckNvbW1hbmQoYWdlbnREaXJzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGlycyA9IFsuLi5uZXcgU2V0KGFnZW50RGlycyldLnNvcnQoKTtcbiAgbGV0IHNjcmlwdCA9IGBta2RpciAtcCAke0ZBUkdBVEVfQUdFTlRTX0RJUn1gO1xuICBmb3IgKGNvbnN0IGQgb2YgZGlycykge1xuICAgIHNjcmlwdCArPSBgICYmIGNwIC1yICR7RkFSR0FURV9JTUFHRV9BR0VOVFNfRElSfS8ke2R9ICR7RkFSR0FURV9BR0VOVFNfRElSfS8ke2R9YDtcbiAgfVxuICByZXR1cm4gWydzaCcsICctYycsIHNjcmlwdF07XG59XG5cbi8qKlxuICogVGhlIHJlc291cmNlIGF0dHJpYnV0ZXMgZXZlcnkgc3BhbiwgbWV0cmljIGFuZCBsb2cgZnJvbSBhbiBpbnN0cnVtZW50ZWQgdGFzayBjYXJyaWVzLiBgc2VydmljZS5uYW1lYCBpc1xuICogc2V0IHNlcGFyYXRlbHksIHRocm91Z2ggYE9URUxfU0VSVklDRV9OQU1FYC5cbiAqXG4gKiBUaGUgcmVnaW9uIG1heSBiZSBhbiB1bnJlc29sdmVkIHRva2VuIG9uIGFuIGVudmlyb25tZW50LWFnbm9zdGljIHN0YWNrLCB3aGljaCBpcyBmaW5lIGhlcmUgYW5kIHVubGlrZVxuICogdGhlIExhbWJkYSBsYXllciBsb29rdXA6IHRoaXMgdmFsdWUgaXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUsIHNvIHRoZSB0b2tlbiByZXNvbHZlcyB0byBhIGBSZWZgIHRvXG4gKiBgQVdTOjpSZWdpb25gIGFuZCBDbG91ZEZvcm1hdGlvbiBmaWxscyBpbiB0aGUgcmVhbCByZWdpb24gYXQgZGVwbG95IHRpbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXJnYXRlUmVzb3VyY2VBdHRyaWJ1dGVzKHJlZ2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYXR0cnMgPSAnY2xvdWQucHJvdmlkZXI9YXdzLGNsb3VkLnBsYXRmb3JtPWF3c19lY3MnO1xuICByZXR1cm4gcmVnaW9uID8gYCR7YXR0cnN9LGNsb3VkLnJlZ2lvbj0ke3JlZ2lvbn1gIDogYXR0cnM7XG59XG5cbi8qKiBXaGVyZSBhbiBpbnN0cnVtZW50ZWQgY29udGFpbmVyIGV4cG9ydHMgdG8sIGFuZCBvdmVyIHdoaWNoIHRyYW5zcG9ydC4gQWx3YXlzIGRlY2lkZWQgYXMgYSBwYWlyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGYXJnYXRlRXhwb3J0VGFyZ2V0IHtcbiAgLyoqIGBzY2hlbWU6Ly9ob3N0OnBvcnRgLiAqL1xuICByZWFkb25seSBlbmRwb2ludDogc3RyaW5nO1xuICAvKiogYGdycGNgIG9yIGBodHRwL3Byb3RvYnVmYC4gKi9cbiAgcmVhZG9ubHkgcHJvdG9jb2w6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUdXJucyBhIGRlc3RpbmF0aW9uJ3MgT1RMUC9nUlBDIHRhcmdldCAoYGhvc3Q6cG9ydGApIGludG8gdGhlIFVSTCB0aGUgT3BlblRlbGVtZXRyeSBTREsgZW52IGFjY2VwdHMsXG4gKiB0YWtpbmcgdGhlIHNjaGVtZSBmcm9tIHRoZSBkZXN0aW5hdGlvbidzIFRMUyBzZXR0aW5nLiBBIHZhbHVlIHRoYXQgaXMgYWxyZWFkeSBhIFVSTCBwYXNzZXMgdGhyb3VnaC5cbiAqL1xuZnVuY3Rpb24gZ3JwY0VuZHBvaW50VVJMKGVuZHBvaW50OiBzdHJpbmcsIGluc2VjdXJlPzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChlbmRwb2ludCA9PT0gJycpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgaWYgKGVuZHBvaW50LmluY2x1ZGVzKCc6Ly8nKSkge1xuICAgIHJldHVybiBlbmRwb2ludDtcbiAgfVxuICByZXR1cm4gYCR7aW5zZWN1cmUgPT09IHRydWUgPyAnaHR0cCcgOiAnaHR0cHMnfTovLyR7ZW5kcG9pbnR9YDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgZW5kcG9pbnQgYW5kIHByb3RvY29sIGZvciBvbmUgcmVjaXBlIGFnYWluc3Qgb25lIGRlc3RpbmF0aW9uLlxuICpcbiAqIFBvcnQgb2YgYGV4cG9ydFRhcmdldEZvcmAuIEEgRmFyZ2F0ZSB0YXNrIGhhcyBubyBub2RlLWxvY2FsIGNvbGxlY3RvciDigJQgdW5saWtlIExhbWJkYSwgd2hlcmUgdGhlIFNES1xuICogZXhwb3J0cyB0byBhIGNvbGxlY3RvciBpbiB0aGUgc2FtZSBzYW5kYm94IOKAlCBzbyB0aGUgYWdlbnQgZXhwb3J0cyBPVExQIHN0cmFpZ2h0IHRvIHRoZSBkZXN0aW5hdGlvbiwgYW5kXG4gKiB3aGljaCB0cmFuc3BvcnQgaXQgY2FuIHVzZSBpcyBhIHByb3BlcnR5IG9mIHRoZSBhZ2VudCBhcyBtdWNoIGFzIG9mIHRoZSBkZXN0aW5hdGlvbi5cbiAqXG4gKiBFYWNoIGFnZW50J3MgUFJFRkVSUkVEIHRyYW5zcG9ydCBpcyB0YWtlbiB3aGVuIHRoZSBkZXN0aW5hdGlvbiBvZmZlcnMgaXQuIFdoZW4gaXQgZG9lcyBub3QsIGFuIGFnZW50XG4gKiB3aG9zZSBjb21tdW5pdHkgU0RLIHBpbnMgdGhlIHByb3RvY29sIChwaHAsIHJ1YnkpIGNhbm5vdCBiZSBzd2l0Y2hlZCBhbmQgdGhyb3dzOyBldmVyeSBvdGhlciBhZ2VudFxuICogaG9ub3VycyBgT1RFTF9FWFBPUlRFUl9PVExQX1BST1RPQ09MYCBhbmQgZmFsbHMgYmFjayB0byB3aGljaGV2ZXIgdHJhbnNwb3J0IGV4aXN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydFRhcmdldEZvcihyZWNpcGU6IEZhcmdhdGVSZWNpcGUsIGRlc3Q6IE9kaWdvc0Rlc3RpbmF0aW9uKTogRmFyZ2F0ZUV4cG9ydFRhcmdldCB7XG4gIGNvbnN0IGdycGNVUkwgPSBncnBjRW5kcG9pbnRVUkwoZGVzdC5lbmRwb2ludCA/PyAnJywgZGVzdC5pbnNlY3VyZSk7XG4gIGNvbnN0IGh0dHBVUkwgPSBkZXN0Lmh0dHBFbmRwb2ludCA/PyAnJztcblxuICBpZiAocmVjaXBlLm90bHBQcm90b2NvbCA9PT0gT1RMUF9QUk9UT0NPTF9IVFRQICYmIGh0dHBVUkwgIT09ICcnKSB7XG4gICAgcmV0dXJuIHsgZW5kcG9pbnQ6IGh0dHBVUkwsIHByb3RvY29sOiBPVExQX1BST1RPQ09MX0hUVFAgfTtcbiAgfVxuICBpZiAocmVjaXBlLm90bHBQcm90b2NvbCA9PT0gT1RMUF9QUk9UT0NPTF9HUlBDICYmIGdycGNVUkwgIT09ICcnKSB7XG4gICAgcmV0dXJuIHsgZW5kcG9pbnQ6IGdycGNVUkwsIHByb3RvY29sOiBPVExQX1BST1RPQ09MX0dSUEMgfTtcbiAgfVxuICBpZiAocmVjaXBlLnByb3RvY29sRml4ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgT2RpZ29zOiB0aGUgJHtyZWNpcGUubGFuZ3VhZ2V9IGFnZW50IGV4cG9ydHMgT1RMUCBvdmVyICR7cmVjaXBlLm90bHBQcm90b2NvbH0gb25seSDigJQgaXRzIGNvbW11bml0eSBgICtcbiAgICAgICAgJ1NESyBjYW5ub3QgYmUgc3dpdGNoZWQgdG8gdGhlIG90aGVyIHRyYW5zcG9ydCDigJQgYnV0IHRoZSBkZXN0aW5hdGlvbiBjb25maWd1cmVzIG5vICcgK1xuICAgICAgICBgJHtyZWNpcGUub3RscFByb3RvY29sID09PSBPVExQX1BST1RPQ09MX0hUVFAgPyAnYGh0dHBFbmRwb2ludGAnIDogJ2BlbmRwb2ludGAnfS4gYCArXG4gICAgICAgICdDb25maWd1cmUgb25lLCBvciBsZWF2ZSB0aGlzIGNvbnRhaW5lciB1bmluc3RydW1lbnRlZC4nLFxuICAgICk7XG4gIH1cbiAgaWYgKGh0dHBVUkwgIT09ICcnKSB7XG4gICAgcmV0dXJuIHsgZW5kcG9pbnQ6IGh0dHBVUkwsIHByb3RvY29sOiBPVExQX1BST1RPQ09MX0hUVFAgfTtcbiAgfVxuICBpZiAoZ3JwY1VSTCAhPT0gJycpIHtcbiAgICByZXR1cm4geyBlbmRwb2ludDogZ3JwY1VSTCwgcHJvdG9jb2w6IE9UTFBfUFJPVE9DT0xfR1JQQyB9O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAnT2RpZ29zIGRlc3RpbmF0aW9uIGhhcyBuZWl0aGVyIGBlbmRwb2ludGAgKE9UTFAvZ1JQQykgbm9yIGBodHRwRW5kcG9pbnRgIChPVExQL0hUVFApLCBzbyBhbiAnICtcbiAgICAgICdpbnN0cnVtZW50ZWQgRmFyZ2F0ZSB0YXNrIHdvdWxkIGhhdmUgbm93aGVyZSB0byBleHBvcnQuIFVubGlrZSBMYW1iZGEsIGEgRmFyZ2F0ZSB0YXNrIGhhcyBubyAnICtcbiAgICAgICdpbi1zYW5kYm94IGNvbGxlY3RvciB0byBidWZmZXIgZm9yIGl0IOKAlCB0aGUgYWdlbnQgZXhwb3J0cyB0byB0aGlzIGRlc3RpbmF0aW9uIGRpcmVjdGx5LicsXG4gICk7XG59XG5cbi8qKiBUaGUgcG9ydCBvZiBhIGBzY2hlbWU6Ly9ob3N0OnBvcnRbL3BhdGhdYCBlbmRwb2ludCwgb3IgXCJcIiB3aGVuIGl0IG5hbWVzIG5vbmUuICovXG5mdW5jdGlvbiBlbmRwb2ludFBvcnQoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCByZXN0ID0gZW5kcG9pbnQ7XG4gIGNvbnN0IHNjaGVtZSA9IHJlc3QuaW5kZXhPZignOi8vJyk7XG4gIGlmIChzY2hlbWUgPj0gMCkge1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKHNjaGVtZSArIDMpO1xuICB9XG4gIGNvbnN0IHBhdGhTdGFydCA9IHJlc3Quc2VhcmNoKC9bLz9dLyk7XG4gIGlmIChwYXRoU3RhcnQgPj0gMCkge1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIHBhdGhTdGFydCk7XG4gIH1cbiAgY29uc3QgY29sb24gPSByZXN0Lmxhc3RJbmRleE9mKCc6Jyk7XG4gIHJldHVybiBjb2xvbiA8IDAgPyAnJyA6IHJlc3Quc2xpY2UoY29sb24gKyAxKTtcbn1cblxuLyoqXG4gKiBBIHdhcm5pbmcgd2hlbiBhbiBlbmRwb2ludCdzIHBvcnQgaXMgdGhlIHdlbGwta25vd24gcG9ydCBvZiB0aGUgT1RIRVIgT1RMUCBwcm90b2NvbCwgb3IgXCJcIiB3aGVuIHRoZVxuICogcGFpcmluZyBsb29rcyByaWdodCDigJQgaW5jbHVkaW5nIGEgbm9uLXN0YW5kYXJkIHBvcnQsIHdoaWNoIGNhbm5vdCBiZSBqdWRnZWQuXG4gKlxuICogV29ydGggYSBzeW50aC10aW1lIHdhcm5pbmcgYmVjYXVzZSB0aGUgcnVudGltZSBzeW1wdG9tIGlzIGEgY29ubmVjdGlvbiByZXNldCBtaWQtZXhwb3J0LCB3aGljaCBwb2ludHNcbiAqIG5vd2hlcmUgbmVhciB0aGUgY2F1c2U6IGFuIEhUVFAgcmVxdWVzdCBhZ2FpbnN0IGFuIEhUVFAvMiBnUlBDIGxpc3RlbmVyLCBvciB0aGUgcmV2ZXJzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvcnRQcm90b2NvbE1pc21hdGNoKGVuZHBvaW50OiBzdHJpbmcsIHByb3RvY29sOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwb3J0ID0gZW5kcG9pbnRQb3J0KGVuZHBvaW50KTtcbiAgaWYgKHByb3RvY29sID09PSBPVExQX1BST1RPQ09MX0hUVFAgJiYgcG9ydCA9PT0gT1RMUF9ERUZBVUxUX0dSUENfUE9SVCkge1xuICAgIHJldHVybiAoXG4gICAgICBgZW5kcG9pbnQgJHtlbmRwb2ludH0gaXMgb24gJHtPVExQX0RFRkFVTFRfR1JQQ19QT1JUfSwgdGhlIHN0YW5kYXJkIE9UTFAvZ1JQQyBwb3J0LCBidXQgdGhpcyBhZ2VudCBgICtcbiAgICAgIGBleHBvcnRzIG92ZXIgJHtPVExQX1BST1RPQ09MX0hUVFB9OyBleHBvcnRzIHdpbGwgZmFpbCBhcyBhIGNvbm5lY3Rpb24gcmVzZXQuIFBvaW50IGl0IGF0IHRoZSBgICtcbiAgICAgIGBPVExQL0hUVFAgcG9ydCAoJHtPVExQX0RFRkFVTFRfSFRUUF9QT1JUfSkuYFxuICAgICk7XG4gIH1cbiAgaWYgKHByb3RvY29sID09PSBPVExQX1BST1RPQ09MX0dSUEMgJiYgcG9ydCA9PT0gT1RMUF9ERUZBVUxUX0hUVFBfUE9SVCkge1xuICAgIHJldHVybiAoXG4gICAgICBgZW5kcG9pbnQgJHtlbmRwb2ludH0gaXMgb24gJHtPVExQX0RFRkFVTFRfSFRUUF9QT1JUfSwgdGhlIHN0YW5kYXJkIE9UTFAvSFRUUCBwb3J0LCBidXQgdGhpcyBhZ2VudCBgICtcbiAgICAgIGBleHBvcnRzIG92ZXIgZ1JQQzsgZXhwb3J0cyB3aWxsIGZhaWwuIFBvaW50IGl0IGF0IHRoZSBPVExQL2dSUEMgcG9ydCAoJHtPVExQX0RFRkFVTFRfR1JQQ19QT1JUfSkuYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuIl19
|
|
233
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFyZ2F0ZS1yZWNpcGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZhcmdhdGUtcmVjaXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2REEsc0RBTUM7QUFZRCwwQ0FPQztBQW1CRCxzQ0FFQztBQVNELDhCQXNDQztBQVlELHdDQU9DO0FBVUQsOERBR0M7QUFtQ0QsMENBOEJDO0FBd0JELG9EQWdCQztBQW5TRCxpREFJNkI7QUFFN0IseURBQXlEO0FBRXpEOzs7Ozs7Ozs7OztHQVdHO0FBRUgsMEdBQTBHO0FBQzFHLE1BQU0sOEJBQThCLEdBQUcsd0JBQXdCLENBQUM7QUFFaEUsaUVBQWlFO0FBQ2pFLE1BQU0sc0JBQXNCLEdBQUcsdUJBQXVCLENBQUM7QUFFdkQ7Ozs7R0FJRztBQUNILE1BQU0sMkJBQTJCLEdBQUcsa0NBQWtDLENBQUM7QUFFdkUsK0ZBQStGO0FBQ2xGLFFBQUEsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO0FBQzVCLFFBQUEsa0JBQWtCLEdBQUcsZUFBZSxDQUFDO0FBRWxELHdHQUF3RztBQUN4RyxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQztBQUN0QyxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQztBQWF0Qzs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IscUJBQXFCLENBQUMsT0FBZSxFQUFFLGFBQXFCO0lBQzFFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxJQUFJLENBQUMsNEJBQWtCLENBQUMsQ0FBQztJQUMvRSxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNoQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUMsS0FB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WUFDcEcseUVBQXlFLHNCQUFzQixJQUFJLENBQ3BHLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRkFSR0FURV9BR0VOVFNfRElSLFxuICBGQVJHQVRFX0lNQUdFX0FHRU5UU19ESVIsXG4gIEZBUkdBVEVfTEFOR1VBR0VTLFxufSBmcm9tICcuL2dlbmVyYXRlZC9mYXJnYXRlJztcbmltcG9ydCB7IE9kaWdvc0Rlc3RpbmF0aW9uLCBPZGlnb3NGYXJnYXRlTGFuZ3VhZ2UgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHZhbGlkYXRlRGVzdGluYXRpb24gfSBmcm9tICcuL2NvbGxlY3Rvci1jb25maWcnO1xuXG4vKipcbiAqIEhvdyBhIGxhbmd1YWdlJ3MgYWdlbnQgaXMgc3RhZ2VkIGludG8gYW4gRUNTIEZhcmdhdGUgdGFzayBhbmQgYWN0aXZhdGVkIGluIGEgY29udGFpbmVyLlxuICpcbiAqIEEgUE9SVCBvZiBgcmVjaXBlRm9yYCAvIGBhcHBseUluc3RydW1lbnRhdGlvbmAgaW4gdGhlIGNvbm5lY3RvcidzIEVDUyBpbnN0cnVtZW50b3JcbiAqIChjb25uZWN0b3JzL3Byb3ZpZGVycy9hd3MvcGtnL3dvcmtsb2FkL2luc3RydW1lbnRvci9lY3NfcmVjaXBlcy5nbywgZWNzX2luamVjdC5nbykuIFRoZSBkYXRhIGxpdmVzIGluXG4gKiAuLi8uLi9hcnRpZmFjdHMuanNvbiBhbmQgcmVhY2hlcyBoZXJlIHRocm91Z2ggdGhlIGdlbmVyYXRlZCBtb2R1bGU7IHRoZSBkZWNpc2lvbnMgbGl2ZSBoZXJlLlxuICpcbiAqIEVxdWl2YWxlbmNlIHdpdGggdGhlIGNvbm5lY3RvciBpcyBub3QgY29zbWV0aWMuIEl0cyBjb25mb3JtYW5jZSBvYnNlcnZlciByZWJ1aWxkcyBlYWNoIGNvbnRhaW5lcidzXG4gKiBkZXNpcmVkIGFjdGl2YXRpb24gZW52aXJvbm1lbnQgYW5kIGNvbXBhcmVzIGl0IGFnYWluc3Qgd2hhdCB0aGUgY29udGFpbmVyIGNhcnJpZXMsIGNvbXBvbmVudCBieVxuICogY29tcG9uZW50LCBzbyBhbnl0aGluZyByZW5kZXJlZCBkaWZmZXJlbnRseSBoZXJlIGlzIHJlcG9ydGVkIHRvIHRoZSBjdXN0b21lciBhcyBpbnN0cnVtZW50YXRpb24gZHJpZnRcbiAqIG9uIGEgc3RhY2sgdGhhdCBpcyBpbiBmYWN0IGRlcGxveWVkIGV4YWN0bHkgYXMgdGhleSB3cm90ZSBpdC5cbiAqL1xuXG4vKiogVGhlIGRpc3RybyBwbGFjZWhvbGRlciBmb3IgdGhlIGNvbnRhaW5lcidzIG93biBwcmUtT2RpZ29zIHZhbHVlIG9mIGFuIGFwcGVuZC1zdHlsZSBsb2FkZXIgdmFyaWFibGUuICovXG5jb25zdCBPUklHSU5BTF9FTlZfVkFMVUVfUExBQ0VIT0xERVIgPSAne3tPUklHSU5BTF9FTlZfVkFMVUV9fSc7XG5cbi8qKiBUaGUgZGlzdHJvIHBsYWNlaG9sZGVyIGZvciB0aGUgc2hhcmVkIHZvbHVtZSdzIG1vdW50IHBhdGguICovXG5jb25zdCBBR0VOVFNfRElSX1BMQUNFSE9MREVSID0gJ3t7T0RJR09TX0FHRU5UU19ESVJ9fSc7XG5cbi8qKlxuICogVGhlIGRpc3RybyBwYXJhbWV0ZXIgZm9yIHRoZSBhcHBsaWNhdGlvbidzIHJ1bnRpbWUgYG1ham9yLm1pbm9yYCwgYXMgYSBHbyB0ZXh0L3RlbXBsYXRlIGFjdGlvbiDigJRcbiAqIHZlcmJhdGltIGZyb20gdGhlIGRpc3RybyB5YW1sIHNvIC4uLy4uL2FydGlmYWN0cy5qc29uIGNhbiBiZSBkaWZmZWQgYWdhaW5zdCBpdCBieSBleWUuIE9ubHkgcGhwIGFuZFxuICogcnVieSBjYXJyeSBpdDogdGhlaXIgYWdlbnRzIGFyZSBsYWlkIGRvd24gcGVyIHJ1bnRpbWUgdmVyc2lvbi5cbiAqL1xuY29uc3QgUlVOVElNRV9WRVJTSU9OX1BMQUNFSE9MREVSID0gJ3t7LlJVTlRJTUVfVkVSU0lPTl9NQUpPUl9NSU5PUn19JztcblxuLyoqIGBPVEVMX0VYUE9SVEVSX09UTFBfUFJPVE9DT0xgIHZhbHVlcy4gRW5kcG9pbnQgYW5kIHByb3RvY29sIGFyZSBhbHdheXMgZGVjaWRlZCB0b2dldGhlci4gKi9cbmV4cG9ydCBjb25zdCBPVExQX1BST1RPQ09MX0dSUEMgPSAnZ3JwYyc7XG5leHBvcnQgY29uc3QgT1RMUF9QUk9UT0NPTF9IVFRQID0gJ2h0dHAvcHJvdG9idWYnO1xuXG4vKiogU3RhbmRhcmQgT1RMUCByZWNlaXZlciBwb3J0cywgdXNlZCBvbmx5IHRvIHdhcm4gYWJvdXQgYW4gZW5kcG9pbnQgcGFpcmVkIHdpdGggdGhlIG90aGVyIHByb3RvY29sLiAqL1xuY29uc3QgT1RMUF9ERUZBVUxUX0dSUENfUE9SVCA9ICc0MzE3JztcbmNvbnN0IE9UTFBfREVGQVVMVF9IVFRQX1BPUlQgPSAnNDMxOCc7XG5cbi8qKlxuICogQW4gYXBwZW5kLXN0eWxlIGxvYWRlciB2YXJpYWJsZSDigJQgYEpBVkFfVE9PTF9PUFRJT05TYCwgYE5PREVfT1BUSU9OU2AsIGBQWVRIT05QQVRIYCDigJQga2VwdCBhcyBpdHNcbiAqIHBhdHRlcm4gcmF0aGVyIHRoYW4gYSBmaW5pc2hlZCB2YWx1ZSwgYmVjYXVzZSB0aGUgdmFsdWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBjb250YWluZXIgYWxyZWFkeSBjYXJyaWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZhcmdhdGVBcHBlbmRFbnZWYXIge1xuICAvKiogVmFyaWFibGUgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKiogVGhlIGRpc3RybydzIFJlcGxhY2VQYXR0ZXJuLCBwbGFjZWhvbGRlcnMgdW5yZXNvbHZlZC4gKi9cbiAgcmVhZG9ubHkgcGF0dGVybjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGFuIGFwcGVuZCBwYXR0ZXJuIGZvciBhIGdpdmVuIHByZS1leGlzdGluZyB2YWx1ZS5cbiAqXG4gKiBQb3J0IG9mIGBkaXN0cm8uRXZhbHVhdGVSZXBsYWNlUGF0dGVybmAsIElOQ0xVRElORyB0aGUgZW1wdHktb3JpZ2luYWwgY2FzZTogd2l0aCBub3RoaW5nIHRvIGpvaW4gdG8sXG4gKiB0aGUgcGxhY2Vob2xkZXIgYW5kIGl0cyBhZGphY2VudCBkZWxpbWl0ZXIgYXJlIHN0cmlwcGVkLCBzbyB0aGUgcmVzdWx0IG5ldmVyIG9wZW5zIHdpdGggYSBzdHJheSBzcGFjZVxuICogb3IgY29sb24uIGBQWVRIT05QQVRIPVwiOi92YXIvb2RpZ29zL3B5dGhvblwiYCB3b3VsZCBwdXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgb24gYHN5cy5wYXRoYFxuICogYWhlYWQgb2YgdGhlIGFnZW50LCB3aGljaCBpcyBhIGRpZmZlcmVudCBwcm9ncmFtIHRoYW4gdGhlIG9uZSBpbnRlbmRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlQXBwZW5kUGF0dGVybihwYXR0ZXJuOiBzdHJpbmcsIG9yaWdpbmFsVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdpdGhEaXIgPSBwYXR0ZXJuLnNwbGl0KEFHRU5UU19ESVJfUExBQ0VIT0xERVIpLmpvaW4oRkFSR0FURV9BR0VOVFNfRElSKTtcbiAgaWYgKG9yaWdpbmFsVmFsdWUudHJpbSgpID09PSAnJykge1xuICAgIHJldHVybiB3aXRoRGlyLnNwbGl0KE9SSUdJTkFMX0VOVl9WQUxVRV9QTEFDRUhPTERFUikuam9pbignJykucmVwbGFjZSgvXlsgOl0rLywgJycpO1xuICB9XG4gIHJldHVybiB3aXRoRGlyLnNwbGl0KE9SSUdJTkFMX0VOVl9WQUxVRV9QTEFDRUhPTERFUikuam9pbihvcmlnaW5hbFZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGUgZGVsaW1pdGVyIGEgcGF0dGVybiBqb2lucyB0aGUgY29udGFpbmVyJ3Mgb3duIHZhbHVlIHRvIG91cnMgd2l0aDogdGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseSBhZnRlclxuICogdGhlIG9yaWdpbmFsLXZhbHVlIHBsYWNlaG9sZGVyLlxuICpcbiAqIERFUklWRUQgZnJvbSB0aGUgcGF0dGVybiByYXRoZXIgdGhhbiBkZWNsYXJlZCwgYmVjYXVzZSB0aGUgcGF0dGVybiBpcyB0aGUgYXV0aG9yaXR5IOKAlCBpdCBjb21lcyBmcm9tIHRoZVxuICogdXBzdHJlYW0gZGlzdHJvLCBkaWZmZXJzIGJ5IGxhbmd1YWdlIChhIHNwYWNlIGZvciBgSkFWQV9UT09MX09QVElPTlNgL2BOT0RFX09QVElPTlNgLCBhIGNvbG9uIGZvclxuICogYFBZVEhPTlBBVEhgKSBhbmQgY2FuIGNoYW5nZSBvbiBzb21lYm9keSBlbHNlJ3MgcmVsZWFzZS4gQXNzdW1pbmcgb25lIHdvdWxkIGJlIHNpbGVudGx5IGRlc3RydWN0aXZlIGluXG4gKiBhIHdheSBub3RoaW5nIGhlcmUgd291bGQgY2F0Y2g6IGEgc3BhY2Utam9pbmVkIGBQWVRIT05QQVRIYCBpcyBvbmUgdW51c2FibGUgcGF0aCByYXRoZXIgdGhhbiB0d28sIGFuZFxuICogdGhlIHByb2Nlc3Mgc3RpbGwgc3RhcnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kU2VwYXJhdG9yKHBhdHRlcm46IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGkgPSBwYXR0ZXJuLmluZGV4T2YoT1JJR0lOQUxfRU5WX1ZBTFVFX1BMQUNFSE9MREVSKTtcbiAgaWYgKGkgPCAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGNvbnN0IHJlc3QgPSBwYXR0ZXJuLnNsaWNlKGkgKyBPUklHSU5BTF9FTlZfVkFMVUVfUExBQ0VIT0xERVIubGVuZ3RoKTtcbiAgcmV0dXJuIHJlc3QgPT09ICcnID8gJycgOiByZXN0LmNoYXJBdCgwKTtcbn1cblxuLyoqIE9uZSBsYW5ndWFnZSdzIHN0YWdpbmcgYW5kIGFjdGl2YXRpb24sIHdpdGggZXZlcnkgcGxhdGZvcm0tc3VwcGxpZWQgcGFyYW1ldGVyIGFscmVhZHkgcmVuZGVyZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEZhcmdhdGVSZWNpcGUge1xuICAvKiogQ2Fub25pY2FsIGxhbmd1YWdlIGtleSwgYW5kIHRoZSB2YWx1ZSByZWNvcmRlZCBpbiB0aGUgYE9ESUdPU19JQUNgIG1hcmtlcidzIGBsYW5nYC4gKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2U6IHN0cmluZztcbiAgLyoqIERpcmVjdG9yaWVzIHVuZGVyIHRoZSBhZ2VudHMgaW1hZ2UgdGhlIHN0YWdpbmcgY29udGFpbmVyIGNvcGllcyBpbnRvIHRoZSBzaGFyZWQgdm9sdW1lLiAqL1xuICByZWFkb25seSBhZ2VudERpcnM6IHN0cmluZ1tdO1xuICAvKiogQWN0aXZhdGlvbiB2YXJpYWJsZXMgc2V0IG91dHJpZ2h0LiAqL1xuICByZWFkb25seSBzdGF0aWNFbnY6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKiBBY3RpdmF0aW9uIHZhcmlhYmxlcyBvdXIgZnJhZ21lbnQgaXMgYXBwZW5kZWQgdG8uICovXG4gIHJlYWRvbmx5IGFwcGVuZEVudjogRmFyZ2F0ZUFwcGVuZEVudlZhcltdO1xuICAvKiogVGhlIHRyYW5zcG9ydCB0aGlzIGFnZW50IHByZWZlcnMuICovXG4gIHJlYWRvbmx5IG90bHBQcm90b2NvbDogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGUgYWdlbnQgY2FuIHNwZWFrIG9ubHkgYG90bHBQcm90b2NvbGAgYW5kIGNhbm5vdCBiZSBzd2l0Y2hlZCB0byB0aGUgb3RoZXIgdHJhbnNwb3J0LiAqL1xuICByZWFkb25seSBwcm90b2NvbEZpeGVkOiBib29sZWFuO1xufVxuXG4vKiogVGhlIGNhbm9uaWNhbCBjb25uZWN0b3IgbGFuZ3VhZ2Uga2V5IGZvciBhbiBlbnVtIG1lbWJlci4gVGhlIGVudW0ncyB2YWx1ZXMgQVJFIHRob3NlIGtleXMuICovXG5leHBvcnQgZnVuY3Rpb24gbGFuZ3VhZ2VLZXlPZihsYW5ndWFnZTogT2RpZ29zRmFyZ2F0ZUxhbmd1YWdlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxhbmd1YWdlO1xufVxuXG4vKipcbiAqIFRoZSByZWNpcGUgZm9yIGEgbGFuZ3VhZ2UsIHdpdGggdGhlIHJ1bnRpbWUgdmVyc2lvbiByZW5kZXJlZCBpbnRvIHRoZSBhZ2VudHMnIHBhdGhzIHdoZXJlIHRoZSBsYW5ndWFnZVxuICogbmVlZHMgaXQuXG4gKlxuICogQHBhcmFtIHJ1bnRpbWVWZXJzaW9uIHRoZSBhcHBsaWNhdGlvbidzIHJ1bnRpbWUgYG1ham9yLm1pbm9yYC4gUmVxdWlyZWQgZm9yIHBocCBhbmQgcnVieSwgd2hvc2UgYWdlbnRcbiAqIGZpbGVzIGFyZSBsYWlkIGRvd24gcGVyIHZlcnNpb24sIGFuZCBpZ25vcmVkIGJ5IGV2ZXJ5IG90aGVyIGxhbmd1YWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjaXBlRm9yKGxhbmd1YWdlOiBPZGlnb3NGYXJnYXRlTGFuZ3VhZ2UsIHJ1bnRpbWVWZXJzaW9uPzogc3RyaW5nKTogRmFyZ2F0ZVJlY2lwZSB7XG4gIGNvbnN0IGtleSA9IGxhbmd1YWdlS2V5T2YobGFuZ3VhZ2UpO1xuICBjb25zdCBzcGVjID0gRkFSR0FURV9MQU5HVUFHRVNba2V5XTtcbiAgaWYgKCFzcGVjKSB7XG4gICAgLy8gVW5yZWFjaGFibGUgdGhyb3VnaCB0aGUgZW51bTsgcmVhY2hhYmxlIGlmIHRoZSBnZW5lcmF0ZWQgdGFibGUgYW5kIHRoZSBlbnVtIGV2ZXIgZGlzYWdyZWUuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBPZGlnb3M6IG5vIEVDUyBGYXJnYXRlIGFnZW50IHJlY2lwZSBmb3IgbGFuZ3VhZ2UgXCIke2tleX1cIi5gKTtcbiAgfVxuICBpZiAoc3BlYy5yZXF1aXJlc1J1bnRpbWVWZXJzaW9uICYmICFydW50aW1lVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBPZGlnb3M6IHRoZSAke2tleX0gYWdlbnQncyBmaWxlcyBhcmUgbGFpZCBkb3duIHBlciBydW50aW1lIHZlcnNpb24sIHNvIGluc3RydW1lbnRpbmcgYSAke2tleX0gYCArXG4gICAgICAgICdjb250YWluZXIgbmVlZHMgYHJ1bnRpbWVWZXJzaW9uYCBzZXQgdG8gdGhlIGFwcGxpY2F0aW9uXFwncyBtYWpvci5taW5vciAoZm9yIGV4YW1wbGUgXCI4LjNcIikuICcgK1xuICAgICAgICAnVGhlIHZhbHVlIHNlbGVjdHMgdGhlIGFnZW50IHBhdGggdGhlIGFjdGl2YXRpb24gZW52aXJvbm1lbnQgcG9pbnRzIGF0LCBzbyBhIHdyb25nIG9yIG1pc3NpbmcgJyArXG4gICAgICAgICdvbmUgbGVhdmVzIHRoZSBjb250YWluZXIgd2l0aCBhbiBhZ2VudCB0aGF0IGlzIG5ldmVyIGxvYWRlZC4nLFxuICAgICk7XG4gIH1cbiAgLy8gUmVqZWN0ZWQgaGVyZSByYXRoZXIgdGhhbiBwYXNzZWQgdGhyb3VnaDogYSBcIjguMy40XCIgb3IgXCJwaHA4LjNcIiB3b3VsZCBiZSByZW5kZXJlZCBzdHJhaWdodCBpbnRvXG4gIC8vIFBIUF9JTklfU0NBTl9ESVIgLyBSVUJZT1BUIGFzIGEgcGF0aCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBidW5kbGUsIGFuZCB0aGUgY29udGFpbmVyIHdvdWxkIHN0YXJ0XG4gIC8vIHdpdGggbm8gYWdlbnQgbG9hZGVkIGFuZCBubyBlcnJvciBhbnl3aGVyZSBuZWFyIHRoZSBjYXVzZS5cbiAgaWYgKHJ1bnRpbWVWZXJzaW9uICYmICEvXlxcZCtcXC5cXGQrJC8udGVzdChydW50aW1lVmVyc2lvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgT2RpZ29zOiBydW50aW1lVmVyc2lvbiBcIiR7cnVudGltZVZlcnNpb259XCIgbXVzdCBiZSBleGFjdGx5IG1ham9yLm1pbm9yIChmb3IgZXhhbXBsZSBcIjguM1wiKSDigJQgaXQgYCArXG4gICAgICAgICduYW1lcyBhIGRpcmVjdG9yeSBpbiB0aGUgYWdlbnRzIGJ1bmRsZSwgbm90IGEgZnVsbCB2ZXJzaW9uLicsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHN0YXRpY0VudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhzcGVjLnN0YXRpY0VudikpIHtcbiAgICBzdGF0aWNFbnZba10gPSBydW50aW1lVmVyc2lvbiA/IHYuc3BsaXQoUlVOVElNRV9WRVJTSU9OX1BMQUNFSE9MREVSKS5qb2luKHJ1bnRpbWVWZXJzaW9uKSA6IHY7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxhbmd1YWdlOiBrZXksXG4gICAgYWdlbnREaXJzOiBzcGVjLmFnZW50RGlycyxcbiAgICBzdGF0aWNFbnYsXG4gICAgYXBwZW5kRW52OiBzcGVjLmFwcGVuZEVudi5tYXAoKGEpID0+ICh7IG5hbWU6IGEubmFtZSwgcGF0dGVybjogYS5wYXR0ZXJuIH0pKSxcbiAgICBvdGxwUHJvdG9jb2w6IHNwZWMub3RscFByb3RvY29sLFxuICAgIHByb3RvY29sRml4ZWQ6IHNwZWMucHJvdG9jb2xGaXhlZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgc3RhZ2luZyBjb250YWluZXIncyBjb21tYW5kOiBjcmVhdGUgdGhlIHNoYXJlZCBkaXJlY3RvcnksIHRoZW4gY29weSBlYWNoIGxhbmd1YWdlJ3MgYWdlbnRcbiAqIGRpcmVjdG9yeSBvdXQgb2YgdGhlIGltYWdlIGludG8gaXQsIHRoZW4gZXhpdCAwLlxuICpcbiAqIE9SREVSIEFORCBTUEVMTElORyBBUkUgVEhFIENPTlRSQUNULiBUaGVyZSBpcyBPTkUgc3RhZ2luZyBjb250YWluZXIgcGVyIHRhc2sgZGVmaW5pdGlvbiBob3dldmVyIG1hbnlcbiAqIGxhbmd1YWdlcyBpdCBob2xkcywgYW5kIHRoZSBjb25uZWN0b3IgY29tcGFyZXMgaXRzIGNvbW1hbmQgYWdhaW5zdCB0aGUgdW5pb24gb2YgZXZlcnkgaW5zdHJ1bWVudGVkXG4gKiBjb250YWluZXIncyBhZ2VudCBkaXJlY3RvcmllcyBpbiBhc2NlbmRpbmcgb3JkZXIuIEEgY29tbWFuZCB0aGF0IGRpZmZlcnMgYnkgYSBzcGFjZSBpcyByZXBvcnRlZCBhc1xuICogZHJpZnQgb24gdGhlIHdob2xlIHRhc2sgZGVmaW5pdGlvbiwgc28gdGhpcyBpcyBzb3J0ZWQgYW5kIHJlbmRlcmVkIGV4YWN0bHkgYXMgYHNpZGVjYXJDb21tYW5kYCBpbiB0aGVcbiAqIGNvbm5lY3RvciBkb2VzIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lkZWNhckNvbW1hbmQoYWdlbnREaXJzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGlycyA9IFsuLi5uZXcgU2V0KGFnZW50RGlycyldLnNvcnQoKTtcbiAgbGV0IHNjcmlwdCA9IGBta2RpciAtcCAke0ZBUkdBVEVfQUdFTlRTX0RJUn1gO1xuICBmb3IgKGNvbnN0IGQgb2YgZGlycykge1xuICAgIHNjcmlwdCArPSBgICYmIGNwIC1yICR7RkFSR0FURV9JTUFHRV9BR0VOVFNfRElSfS8ke2R9ICR7RkFSR0FURV9BR0VOVFNfRElSfS8ke2R9YDtcbiAgfVxuICByZXR1cm4gWydzaCcsICctYycsIHNjcmlwdF07XG59XG5cbi8qKlxuICogVGhlIHJlc291cmNlIGF0dHJpYnV0ZXMgZXZlcnkgc3BhbiwgbWV0cmljIGFuZCBsb2cgZnJvbSBhbiBpbnN0cnVtZW50ZWQgdGFzayBjYXJyaWVzLiBgc2VydmljZS5uYW1lYCBpc1xuICogc2V0IHNlcGFyYXRlbHksIHRocm91Z2ggYE9URUxfU0VSVklDRV9OQU1FYC5cbiAqXG4gKiBUaGUgcmVnaW9uIG1heSBiZSBhbiB1bnJlc29sdmVkIHRva2VuIG9uIGFuIGVudmlyb25tZW50LWFnbm9zdGljIHN0YWNrLCB3aGljaCBpcyBmaW5lIGhlcmUgYW5kIHVubGlrZVxuICogdGhlIExhbWJkYSBsYXllciBsb29rdXA6IHRoaXMgdmFsdWUgaXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUsIHNvIHRoZSB0b2tlbiByZXNvbHZlcyB0byBhIGBSZWZgIHRvXG4gKiBgQVdTOjpSZWdpb25gIGFuZCBDbG91ZEZvcm1hdGlvbiBmaWxscyBpbiB0aGUgcmVhbCByZWdpb24gYXQgZGVwbG95IHRpbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXJnYXRlUmVzb3VyY2VBdHRyaWJ1dGVzKHJlZ2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYXR0cnMgPSAnY2xvdWQucHJvdmlkZXI9YXdzLGNsb3VkLnBsYXRmb3JtPWF3c19lY3MnO1xuICByZXR1cm4gcmVnaW9uID8gYCR7YXR0cnN9LGNsb3VkLnJlZ2lvbj0ke3JlZ2lvbn1gIDogYXR0cnM7XG59XG5cbi8qKiBXaGVyZSBhbiBpbnN0cnVtZW50ZWQgY29udGFpbmVyIGV4cG9ydHMgdG8sIGFuZCBvdmVyIHdoaWNoIHRyYW5zcG9ydC4gQWx3YXlzIGRlY2lkZWQgYXMgYSBwYWlyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGYXJnYXRlRXhwb3J0VGFyZ2V0IHtcbiAgLyoqIGBzY2hlbWU6Ly9ob3N0OnBvcnRgLiAqL1xuICByZWFkb25seSBlbmRwb2ludDogc3RyaW5nO1xuICAvKiogYGdycGNgIG9yIGBodHRwL3Byb3RvYnVmYC4gKi9cbiAgcmVhZG9ubHkgcHJvdG9jb2w6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUdXJucyBhIGRlc3RpbmF0aW9uJ3MgT1RMUC9nUlBDIHRhcmdldCAoYGhvc3Q6cG9ydGApIGludG8gdGhlIFVSTCB0aGUgT3BlblRlbGVtZXRyeSBTREsgZW52IGFjY2VwdHMsXG4gKiB0YWtpbmcgdGhlIHNjaGVtZSBmcm9tIHRoZSBkZXN0aW5hdGlvbidzIFRMUyBzZXR0aW5nLiBBIHZhbHVlIHRoYXQgaXMgYWxyZWFkeSBhIFVSTCBwYXNzZXMgdGhyb3VnaC5cbiAqL1xuZnVuY3Rpb24gZ3JwY0VuZHBvaW50VVJMKGVuZHBvaW50OiBzdHJpbmcsIGluc2VjdXJlPzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChlbmRwb2ludCA9PT0gJycpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgaWYgKGVuZHBvaW50LmluY2x1ZGVzKCc6Ly8nKSkge1xuICAgIHJldHVybiBlbmRwb2ludDtcbiAgfVxuICByZXR1cm4gYCR7aW5zZWN1cmUgPT09IHRydWUgPyAnaHR0cCcgOiAnaHR0cHMnfTovLyR7ZW5kcG9pbnR9YDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgZW5kcG9pbnQgYW5kIHByb3RvY29sIGZvciBvbmUgcmVjaXBlIGFnYWluc3Qgb25lIGRlc3RpbmF0aW9uLlxuICpcbiAqIFBvcnQgb2YgYGV4cG9ydFRhcmdldEZvcmAuIEEgRmFyZ2F0ZSB0YXNrIGhhcyBubyBub2RlLWxvY2FsIGNvbGxlY3RvciDigJQgdW5saWtlIExhbWJkYSwgd2hlcmUgdGhlIFNES1xuICogZXhwb3J0cyB0byBhIGNvbGxlY3RvciBpbiB0aGUgc2FtZSBzYW5kYm94IOKAlCBzbyB0aGUgYWdlbnQgZXhwb3J0cyBPVExQIHN0cmFpZ2h0IHRvIHRoZSBkZXN0aW5hdGlvbiwgYW5kXG4gKiB3aGljaCB0cmFuc3BvcnQgaXQgY2FuIHVzZSBpcyBhIHByb3BlcnR5IG9mIHRoZSBhZ2VudCBhcyBtdWNoIGFzIG9mIHRoZSBkZXN0aW5hdGlvbi5cbiAqXG4gKiBFYWNoIGFnZW50J3MgUFJFRkVSUkVEIHRyYW5zcG9ydCBpcyB0YWtlbiB3aGVuIHRoZSBkZXN0aW5hdGlvbiBvZmZlcnMgaXQuIFdoZW4gaXQgZG9lcyBub3QsIGFuIGFnZW50XG4gKiB3aG9zZSBjb21tdW5pdHkgU0RLIHBpbnMgdGhlIHByb3RvY29sIChwaHAsIHJ1YnkpIGNhbm5vdCBiZSBzd2l0Y2hlZCBhbmQgdGhyb3dzOyBldmVyeSBvdGhlciBhZ2VudFxuICogaG9ub3VycyBgT1RFTF9FWFBPUlRFUl9PVExQX1BST1RPQ09MYCBhbmQgZmFsbHMgYmFjayB0byB3aGljaGV2ZXIgdHJhbnNwb3J0IGV4aXN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydFRhcmdldEZvcihyZWNpcGU6IEZhcmdhdGVSZWNpcGUsIGRlc3Q6IE9kaWdvc0Rlc3RpbmF0aW9uKTogRmFyZ2F0ZUV4cG9ydFRhcmdldCB7XG4gIHZhbGlkYXRlRGVzdGluYXRpb24oZGVzdCwgdHJ1ZSk7XG4gIGNvbnN0IGdycGNVUkwgPSBncnBjRW5kcG9pbnRVUkwoZGVzdC5lbmRwb2ludCA/PyAnJywgZGVzdC5pbnNlY3VyZSk7XG4gIGNvbnN0IGh0dHBVUkwgPSBkZXN0Lmh0dHBFbmRwb2ludCA/PyAnJztcblxuICBpZiAocmVjaXBlLm90bHBQcm90b2NvbCA9PT0gT1RMUF9QUk9UT0NPTF9IVFRQICYmIGh0dHBVUkwgIT09ICcnKSB7XG4gICAgcmV0dXJuIHsgZW5kcG9pbnQ6IGh0dHBVUkwsIHByb3RvY29sOiBPVExQX1BST1RPQ09MX0hUVFAgfTtcbiAgfVxuICBpZiAocmVjaXBlLm90bHBQcm90b2NvbCA9PT0gT1RMUF9QUk9UT0NPTF9HUlBDICYmIGdycGNVUkwgIT09ICcnKSB7XG4gICAgcmV0dXJuIHsgZW5kcG9pbnQ6IGdycGNVUkwsIHByb3RvY29sOiBPVExQX1BST1RPQ09MX0dSUEMgfTtcbiAgfVxuICBpZiAocmVjaXBlLnByb3RvY29sRml4ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgT2RpZ29zOiB0aGUgJHtyZWNpcGUubGFuZ3VhZ2V9IGFnZW50IGV4cG9ydHMgT1RMUCBvdmVyICR7cmVjaXBlLm90bHBQcm90b2NvbH0gb25seSDigJQgaXRzIGNvbW11bml0eSBgICtcbiAgICAgICAgJ1NESyBjYW5ub3QgYmUgc3dpdGNoZWQgdG8gdGhlIG90aGVyIHRyYW5zcG9ydCDigJQgYnV0IHRoZSBkZXN0aW5hdGlvbiBjb25maWd1cmVzIG5vICcgK1xuICAgICAgICBgJHtyZWNpcGUub3RscFByb3RvY29sID09PSBPVExQX1BST1RPQ09MX0hUVFAgPyAnYGh0dHBFbmRwb2ludGAnIDogJ2BlbmRwb2ludGAnfS4gYCArXG4gICAgICAgICdDb25maWd1cmUgb25lLCBvciBsZWF2ZSB0aGlzIGNvbnRhaW5lciB1bmluc3RydW1lbnRlZC4nLFxuICAgICk7XG4gIH1cbiAgaWYgKGh0dHBVUkwgIT09ICcnKSB7XG4gICAgcmV0dXJuIHsgZW5kcG9pbnQ6IGh0dHBVUkwsIHByb3RvY29sOiBPVExQX1BST1RPQ09MX0hUVFAgfTtcbiAgfVxuICBpZiAoZ3JwY1VSTCAhPT0gJycpIHtcbiAgICByZXR1cm4geyBlbmRwb2ludDogZ3JwY1VSTCwgcHJvdG9jb2w6IE9UTFBfUFJPVE9DT0xfR1JQQyB9O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAnT2RpZ29zIGRlc3RpbmF0aW9uIGhhcyBuZWl0aGVyIGBlbmRwb2ludGAgKE9UTFAvZ1JQQykgbm9yIGBodHRwRW5kcG9pbnRgIChPVExQL0hUVFApLCBzbyBhbiAnICtcbiAgICAgICdpbnN0cnVtZW50ZWQgRmFyZ2F0ZSB0YXNrIHdvdWxkIGhhdmUgbm93aGVyZSB0byBleHBvcnQuIFVubGlrZSBMYW1iZGEsIGEgRmFyZ2F0ZSB0YXNrIGhhcyBubyAnICtcbiAgICAgICdpbi1zYW5kYm94IGNvbGxlY3RvciB0byBidWZmZXIgZm9yIGl0IOKAlCB0aGUgYWdlbnQgZXhwb3J0cyB0byB0aGlzIGRlc3RpbmF0aW9uIGRpcmVjdGx5LicsXG4gICk7XG59XG5cbi8qKiBUaGUgcG9ydCBvZiBhIGBzY2hlbWU6Ly9ob3N0OnBvcnRbL3BhdGhdYCBlbmRwb2ludCwgb3IgXCJcIiB3aGVuIGl0IG5hbWVzIG5vbmUuICovXG5mdW5jdGlvbiBlbmRwb2ludFBvcnQoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCByZXN0ID0gZW5kcG9pbnQ7XG4gIGNvbnN0IHNjaGVtZSA9IHJlc3QuaW5kZXhPZignOi8vJyk7XG4gIGlmIChzY2hlbWUgPj0gMCkge1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKHNjaGVtZSArIDMpO1xuICB9XG4gIGNvbnN0IHBhdGhTdGFydCA9IHJlc3Quc2VhcmNoKC9bLz9dLyk7XG4gIGlmIChwYXRoU3RhcnQgPj0gMCkge1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIHBhdGhTdGFydCk7XG4gIH1cbiAgY29uc3QgY29sb24gPSByZXN0Lmxhc3RJbmRleE9mKCc6Jyk7XG4gIHJldHVybiBjb2xvbiA8IDAgPyAnJyA6IHJlc3Quc2xpY2UoY29sb24gKyAxKTtcbn1cblxuLyoqXG4gKiBBIHdhcm5pbmcgd2hlbiBhbiBlbmRwb2ludCdzIHBvcnQgaXMgdGhlIHdlbGwta25vd24gcG9ydCBvZiB0aGUgT1RIRVIgT1RMUCBwcm90b2NvbCwgb3IgXCJcIiB3aGVuIHRoZVxuICogcGFpcmluZyBsb29rcyByaWdodCDigJQgaW5jbHVkaW5nIGEgbm9uLXN0YW5kYXJkIHBvcnQsIHdoaWNoIGNhbm5vdCBiZSBqdWRnZWQuXG4gKlxuICogV29ydGggYSBzeW50aC10aW1lIHdhcm5pbmcgYmVjYXVzZSB0aGUgcnVudGltZSBzeW1wdG9tIGlzIGEgY29ubmVjdGlvbiByZXNldCBtaWQtZXhwb3J0LCB3aGljaCBwb2ludHNcbiAqIG5vd2hlcmUgbmVhciB0aGUgY2F1c2U6IGFuIEhUVFAgcmVxdWVzdCBhZ2FpbnN0IGFuIEhUVFAvMiBnUlBDIGxpc3RlbmVyLCBvciB0aGUgcmV2ZXJzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvcnRQcm90b2NvbE1pc21hdGNoKGVuZHBvaW50OiBzdHJpbmcsIHByb3RvY29sOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwb3J0ID0gZW5kcG9pbnRQb3J0KGVuZHBvaW50KTtcbiAgaWYgKHByb3RvY29sID09PSBPVExQX1BST1RPQ09MX0hUVFAgJiYgcG9ydCA9PT0gT1RMUF9ERUZBVUxUX0dSUENfUE9SVCkge1xuICAgIHJldHVybiAoXG4gICAgICBgZW5kcG9pbnQgJHtlbmRwb2ludH0gaXMgb24gJHtPVExQX0RFRkFVTFRfR1JQQ19QT1JUfSwgdGhlIHN0YW5kYXJkIE9UTFAvZ1JQQyBwb3J0LCBidXQgdGhpcyBhZ2VudCBgICtcbiAgICAgIGBleHBvcnRzIG92ZXIgJHtPVExQX1BST1RPQ09MX0hUVFB9OyBleHBvcnRzIHdpbGwgZmFpbCBhcyBhIGNvbm5lY3Rpb24gcmVzZXQuIFBvaW50IGl0IGF0IHRoZSBgICtcbiAgICAgIGBPVExQL0hUVFAgcG9ydCAoJHtPVExQX0RFRkFVTFRfSFRUUF9QT1JUfSkuYFxuICAgICk7XG4gIH1cbiAgaWYgKHByb3RvY29sID09PSBPVExQX1BST1RPQ09MX0dSUEMgJiYgcG9ydCA9PT0gT1RMUF9ERUZBVUxUX0hUVFBfUE9SVCkge1xuICAgIHJldHVybiAoXG4gICAgICBgZW5kcG9pbnQgJHtlbmRwb2ludH0gaXMgb24gJHtPVExQX0RFRkFVTFRfSFRUUF9QT1JUfSwgdGhlIHN0YW5kYXJkIE9UTFAvSFRUUCBwb3J0LCBidXQgdGhpcyBhZ2VudCBgICtcbiAgICAgIGBleHBvcnRzIG92ZXIgZ1JQQzsgZXhwb3J0cyB3aWxsIGZhaWwuIFBvaW50IGl0IGF0IHRoZSBPVExQL2dSUEMgcG9ydCAoJHtPVExQX0RFRkFVTFRfR1JQQ19QT1JUfSkuYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuIl19
|
package/lib/fargate.d.ts
CHANGED
|
@@ -96,7 +96,7 @@ export interface OdigosFargateTarget {
|
|
|
96
96
|
* Only needed as an OVERRIDE. The construct reads the value the container was created with and appends
|
|
97
97
|
* to it, so a container that sets its own `JAVA_TOOL_OPTIONS` in `addContainer` keeps it. Pass this when
|
|
98
98
|
* the value is not visible at synth — set by an `environmentFiles` entry, injected by the image's own
|
|
99
|
-
* `ENV`, or supplied
|
|
99
|
+
* `ENV`, or move secret-supplied loader settings to ordinary configuration first.
|
|
100
100
|
*
|
|
101
101
|
* @default - read from the container's own environment
|
|
102
102
|
*/
|
|
@@ -171,7 +171,8 @@ export interface OdigosFargateInstrumentationProps extends OdigosFargateInstrume
|
|
|
171
171
|
export declare class OdigosFargateInstrumentation extends Construct {
|
|
172
172
|
private readonly options;
|
|
173
173
|
private readonly agentsImage;
|
|
174
|
-
private readonly taskDefinitions;
|
|
174
|
+
private static readonly taskDefinitions;
|
|
175
|
+
private static readonly owners;
|
|
175
176
|
private readonly instrumented;
|
|
176
177
|
constructor(scope: Construct, id: string, props: OdigosFargateInstrumentationProps);
|
|
177
178
|
/**
|
package/lib/fargate.js
CHANGED
|
@@ -10,6 +10,7 @@ const collector_config_1 = require("./collector-config");
|
|
|
10
10
|
const fargate_1 = require("./generated/fargate");
|
|
11
11
|
const layers_1 = require("./generated/layers");
|
|
12
12
|
const fargate_recipes_1 = require("./fargate-recipes");
|
|
13
|
+
const types_1 = require("./types");
|
|
13
14
|
/** Service name reported on every span, metric and log record. */
|
|
14
15
|
const ENV_SERVICE_NAME = 'OTEL_SERVICE_NAME';
|
|
15
16
|
/** Resource attributes added to every record: cloud provider, platform and region. */
|
|
@@ -122,7 +123,6 @@ const SIDECAR_EC2_MEMORY_MIB = 64;
|
|
|
122
123
|
class OdigosFargateInstrumentation extends constructs_1.Construct {
|
|
123
124
|
constructor(scope, id, props) {
|
|
124
125
|
super(scope, id);
|
|
125
|
-
this.taskDefinitions = new Map();
|
|
126
126
|
this.instrumented = new Set();
|
|
127
127
|
this.options = props;
|
|
128
128
|
const image = props.agentsImage ?? fargate_1.FARGATE_AGENTS_IMAGE;
|
|
@@ -144,16 +144,33 @@ class OdigosFargateInstrumentation extends constructs_1.Construct {
|
|
|
144
144
|
* a doubled loader value.
|
|
145
145
|
*/
|
|
146
146
|
instrument(target) {
|
|
147
|
+
if (target.language === types_1.OdigosFargateLanguage.DOTNET && /alpine|musl/i.test(target.container.imageName)) {
|
|
148
|
+
throw new Error('Odigos .NET Fargate instrumentation requires glibc; Alpine/musl images are unsupported.');
|
|
149
|
+
}
|
|
147
150
|
const container = target.container;
|
|
148
151
|
const key = container.node.path;
|
|
149
152
|
if (this.instrumented.has(key)) {
|
|
150
153
|
return;
|
|
151
154
|
}
|
|
155
|
+
const owner = OdigosFargateInstrumentation.owners.get(container);
|
|
156
|
+
if (owner && owner !== this) {
|
|
157
|
+
throw new Error(`Odigos: container "${container.containerName}" is already instrumented. Reuse its original instrumentation construct.`);
|
|
158
|
+
}
|
|
152
159
|
const taskDefinition = container.taskDefinition;
|
|
153
160
|
const recipe = (0, fargate_recipes_1.recipeFor)(target.language, target.runtimeVersion);
|
|
154
161
|
const serviceName = this.resolveServiceName(target);
|
|
155
162
|
this.checkTaskDefinition(taskDefinition, container);
|
|
156
|
-
|
|
163
|
+
// Validate the destination, signals and existing configuration before adding any task resources.
|
|
164
|
+
const environment = this.environmentFor(target, recipe, serviceName);
|
|
165
|
+
const secrets = container.renderContainerDefinition(taskDefinition).secrets;
|
|
166
|
+
const secretNames = Array.isArray(secrets) ? secrets.flatMap(secret => 'name' in secret ? [secret.name] : []) : [];
|
|
167
|
+
const conflicts = secretNames.filter(name => name in environment || (0, collector_config_1.signalTransportOverrides)().includes(name));
|
|
168
|
+
if (conflicts.length) {
|
|
169
|
+
throw new Error(`Odigos: remove conflicting secret environment variables before instrumentation: ${conflicts.join(', ')}. ECS cannot safely combine these with the generated instrumentation environment.`);
|
|
170
|
+
}
|
|
171
|
+
if (container.mountPoints.some(mount => mount.containerPath === fargate_1.FARGATE_AGENTS_DIR || mount.sourceVolume === fargate_1.FARGATE_VOLUME_NAME)) {
|
|
172
|
+
throw new Error(`Odigos: container "${container.containerName}" already mounts ${fargate_1.FARGATE_AGENTS_DIR} or ${fargate_1.FARGATE_VOLUME_NAME}; remove that mount before applying the construct.`);
|
|
173
|
+
}
|
|
157
174
|
const state = this.taskDefinitionState(taskDefinition);
|
|
158
175
|
for (const dir of recipe.agentDirs) {
|
|
159
176
|
state.agentDirs.add(dir);
|
|
@@ -170,9 +187,11 @@ class OdigosFargateInstrumentation extends constructs_1.Construct {
|
|
|
170
187
|
container: state.sidecar,
|
|
171
188
|
condition: ecs.ContainerDependencyCondition.SUCCESS,
|
|
172
189
|
});
|
|
173
|
-
for (const [name, value] of Object.entries(
|
|
190
|
+
for (const [name, value] of Object.entries(environment)) {
|
|
174
191
|
container.addEnvironment(name, value);
|
|
175
192
|
}
|
|
193
|
+
this.instrumented.add(key);
|
|
194
|
+
OdigosFargateInstrumentation.owners.set(container, this);
|
|
176
195
|
}
|
|
177
196
|
/** Instruments every target in the list. */
|
|
178
197
|
instrumentAll(targets) {
|
|
@@ -190,11 +209,22 @@ class OdigosFargateInstrumentation extends constructs_1.Construct {
|
|
|
190
209
|
* and leaves one of the containers with no agent on disk.
|
|
191
210
|
*/
|
|
192
211
|
taskDefinitionState(taskDefinition) {
|
|
193
|
-
const
|
|
194
|
-
const existing = this.taskDefinitions.get(key);
|
|
212
|
+
const existing = OdigosFargateInstrumentation.taskDefinitions.get(taskDefinition);
|
|
195
213
|
if (existing) {
|
|
214
|
+
if (existing.agentsImage !== this.agentsImage) {
|
|
215
|
+
throw new Error('Odigos: all instrumented containers in one task definition must use the same agentsImage.');
|
|
216
|
+
}
|
|
196
217
|
return existing;
|
|
197
218
|
}
|
|
219
|
+
if (taskDefinition.findContainer(fargate_1.FARGATE_SIDECAR_CONTAINER_NAME) || taskDefinition.node.tryFindChild(SIDECAR_CONSTRUCT_ID)) {
|
|
220
|
+
throw new Error('Odigos: the task already defines an odigos-agent staging container. Remove the manual staging resources before applying this construct.');
|
|
221
|
+
}
|
|
222
|
+
// Do not resolve the L1's lazy volumes here: that caches an empty list before addVolume runs.
|
|
223
|
+
// CDK exposes addVolume but no reader, as with ContainerDefinition.environment below.
|
|
224
|
+
const volumes = taskDefinition.volumes;
|
|
225
|
+
if (volumes?.some(volume => volume.name === fargate_1.FARGATE_VOLUME_NAME)) {
|
|
226
|
+
throw new Error('Odigos: the task already defines an odigos-agent volume. Remove the manual staging resources before applying this construct.');
|
|
227
|
+
}
|
|
198
228
|
// A bare-name volume — no host, docker or EFS configuration — is a Fargate ephemeral-storage bind
|
|
199
229
|
// mount scoped to the task, which is exactly the shared staging area needed and the only kind Fargate
|
|
200
230
|
// offers (there is no tmpfs).
|
|
@@ -238,8 +268,8 @@ class OdigosFargateInstrumentation extends constructs_1.Construct {
|
|
|
238
268
|
: [];
|
|
239
269
|
},
|
|
240
270
|
});
|
|
241
|
-
const state = { sidecar, agentDirs };
|
|
242
|
-
|
|
271
|
+
const state = { sidecar, agentDirs, agentsImage: this.agentsImage };
|
|
272
|
+
OdigosFargateInstrumentation.taskDefinitions.set(taskDefinition, state);
|
|
243
273
|
return state;
|
|
244
274
|
}
|
|
245
275
|
/**
|
|
@@ -376,7 +406,10 @@ class OdigosFargateInstrumentation extends constructs_1.Construct {
|
|
|
376
406
|
}
|
|
377
407
|
exports.OdigosFargateInstrumentation = OdigosFargateInstrumentation;
|
|
378
408
|
_a = JSII_RTTI_SYMBOL_1;
|
|
379
|
-
OdigosFargateInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosFargateInstrumentation", version: "0.0.
|
|
409
|
+
OdigosFargateInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosFargateInstrumentation", version: "0.0.20" };
|
|
410
|
+
// A task can contain targets configured by several instrumentation constructs.
|
|
411
|
+
OdigosFargateInstrumentation.taskDefinitions = new WeakMap();
|
|
412
|
+
OdigosFargateInstrumentation.owners = new WeakMap();
|
|
380
413
|
/**
|
|
381
414
|
* The value the container was created with for an environment variable, or undefined.
|
|
382
415
|
*
|
|
@@ -404,6 +437,7 @@ function renderOtlpHeaders(headers) {
|
|
|
404
437
|
return '';
|
|
405
438
|
}
|
|
406
439
|
const keys = Object.keys(headers).sort();
|
|
407
|
-
|
|
440
|
+
const encode = (value) => encodeURIComponent(value).replace(/[!'()*]/g, character => `%${character.charCodeAt(0).toString(16).toUpperCase()}`).replace(/%20/g, '+');
|
|
441
|
+
return keys.map((k) => `${encode(k)}=${encode(headers[k])}`).join(',');
|
|
408
442
|
}
|
|
409
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFyZ2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYXJnYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQThEO0FBQzlELDJDQUEyQztBQUMzQywyQ0FBdUM7QUFDdkMseURBQWlHO0FBQ2pHLGlEQU02QjtBQUM3QiwrQ0FBb0Q7QUFDcEQsdURBUzJCO0FBRzNCLGtFQUFrRTtBQUNsRSxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDO0FBQzdDLHNGQUFzRjtBQUN0RixNQUFNLHVCQUF1QixHQUFHLDBCQUEwQixDQUFDO0FBQzNELHdHQUF3RztBQUN4RyxNQUFNLGlCQUFpQixHQUFHLDZCQUE2QixDQUFDO0FBQ3hELHNFQUFzRTtBQUN0RSxNQUFNLGlCQUFpQixHQUFHLDZCQUE2QixDQUFDO0FBQ3hELHFFQUFxRTtBQUNyRSxNQUFNLGdCQUFnQixHQUFHLDRCQUE0QixDQUFDO0FBQ3RELDhEQUE4RDtBQUM5RCxNQUFNLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDO0FBQzVDLDhDQUE4QztBQUM5QyxxREFBcUQ7QUFHckQ7OztHQUdHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBRXpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDO0FBRXBDLGdGQUFnRjtBQUNoRixNQUFNLG9CQUFvQixHQUFHLGFBQWEsQ0FBQztBQUUzQzs7OztHQUlHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7QUFrSWxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzREc7QUFDSCxNQUFhLDRCQUE2QixTQUFRLHNCQUFTO0lBTXpELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBd0M7UUFDaEYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUpGLG9CQUFlLEdB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QUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMsIExhenksIFN0YWNrLCBUb2tlbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGVjcyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgcmVzb2x2ZWRTaWduYWxzLCBzaWduYWxBY3RpdmF0aW9uLCBzaWduYWxUcmFuc3BvcnRPdmVycmlkZXMgfSBmcm9tICcuL2NvbGxlY3Rvci1jb25maWcnO1xuaW1wb3J0IHtcbiAgRkFSR0FURV9BR0VOVFNfRElSLFxuICBGQVJHQVRFX0FHRU5UU19JTUFHRSxcbiAgRkFSR0FURV9NQVhfQ09OVEFJTkVSUyxcbiAgRkFSR0FURV9TSURFQ0FSX0NPTlRBSU5FUl9OQU1FLFxuICBGQVJHQVRFX1ZPTFVNRV9OQU1FLFxufSBmcm9tICcuL2dlbmVyYXRlZC9mYXJnYXRlJztcbmltcG9ydCB7IE9ESUdPU19WRVJTSU9OIH0gZnJvbSAnLi9nZW5lcmF0ZWQvbGF5ZXJzJztcbmltcG9ydCB7XG4gIEZhcmdhdGVSZWNpcGUsXG4gIGV2YWx1YXRlQXBwZW5kUGF0dGVybixcbiAgZXhwb3J0VGFyZ2V0Rm9yLFxuICBmYXJnYXRlUmVzb3VyY2VBdHRyaWJ1dGVzLFxuICBsYW5ndWFnZUtleU9mLFxuICBwb3J0UHJvdG9jb2xNaXNtYXRjaCxcbiAgcmVjaXBlRm9yLFxuICBzaWRlY2FyQ29tbWFuZCxcbn0gZnJvbSAnLi9mYXJnYXRlLXJlY2lwZXMnO1xuaW1wb3J0IHsgT2RpZ29zRGVzdGluYXRpb24sIE9kaWdvc0ZhcmdhdGVMYW5ndWFnZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKiogU2VydmljZSBuYW1lIHJlcG9ydGVkIG9uIGV2ZXJ5IHNwYW4sIG1ldHJpYyBhbmQgbG9nIHJlY29yZC4gKi9cbmNvbnN0IEVOVl9TRVJWSUNFX05BTUUgPSAnT1RFTF9TRVJWSUNFX05BTUUnO1xuLyoqIFJlc291cmNlIGF0dHJpYnV0ZXMgYWRkZWQgdG8gZXZlcnkgcmVjb3JkOiBjbG91ZCBwcm92aWRlciwgcGxhdGZvcm0gYW5kIHJlZ2lvbi4gKi9cbmNvbnN0IEVOVl9SRVNPVVJDRV9BVFRSSUJVVEVTID0gJ09URUxfUkVTT1VSQ0VfQVRUUklCVVRFUyc7XG4vKiogV2hlcmUgdGhlIGFnZW50IGV4cG9ydHMgT1RMUC4gT24gRmFyZ2F0ZSB0aGlzIGlzIHRoZSByZWFsIGRlc3RpbmF0aW9uLCBub3QgYSBsb2NhbGhvc3QgY29sbGVjdG9yLiAqL1xuY29uc3QgRU5WX09UTFBfRU5EUE9JTlQgPSAnT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UJztcbi8qKiBUaGUgdHJhbnNwb3J0IGZvciB0aGUgZW5kcG9pbnQgYWJvdmUuIFRoZSB0d28gYXJlIG9uZSBkZWNpc2lvbi4gKi9cbmNvbnN0IEVOVl9PVExQX1BST1RPQ09MID0gJ09URUxfRVhQT1JURVJfT1RMUF9QUk9UT0NPTCc7XG4vKiogUGVyLXJlcXVlc3QgaGVhZGVycywgaW4gcHJhY3RpY2UgdGhlIGRlc3RpbmF0aW9uJ3MgY3JlZGVudGlhbC4gKi9cbmNvbnN0IEVOVl9PVExQX0hFQURFUlMgPSAnT1RFTF9FWFBPUlRFUl9PVExQX0hFQURFUlMnO1xuLyoqIFJhaXNlcyBhZ2VudCB2ZXJib3NpdHkgaW50byB0aGUgY29udGFpbmVyJ3MgbG9nIHN0cmVhbS4gKi9cbmNvbnN0IEVOVl9PVEVMX0xPR19MRVZFTCA9ICdPVEVMX0xPR19MRVZFTCc7XG4vKiogVGhlIHRocmVlIHBlci1zaWduYWwgZXhwb3J0ZXIgc3dpdGNoZXMuICovXG4vKiogVmFsdWUgYSBzdXBwb3J0ZWQgc2lnbmFsJ3MgZXhwb3J0ZXIgaXMgc2V0IHRvLiAqL1xuXG5cbi8qKlxuICogU2NoZW1hIHZlcnNpb24gb2YgdGhlIG1hcmtlciBwYXlsb2FkLiBNdXN0IG1hdGNoIGBhcGkuSWFDTWFya2VyVmVyc2lvbmAgaW4gdGhlIGNvbm5lY3RvciDigJQgaXQgaXMgd2hhdFxuICogdGVsbHMgdGhlIGNvbm5lY3RvciBob3cgdG8gcmVhZCB0aGUgcmVzdCBvZiB0aGUgb2JqZWN0LCBzbyBhIGJ1bXBlZCB2ZXJzaW9uIHRoZXJlIGlzIGEgY2hhbmdlIGhlcmUuXG4gKi9cbmNvbnN0IE1BUktFUl9WRVJTSU9OID0gMTtcblxuLyoqXG4gKiBgT0RJR09TX0lBQ2Ag4oCUIHRoZSBtYXJrZXIgcmVjb3JkaW5nIHRoYXQgdGhpcyBjb250YWluZXIgd2FzIGluc3RydW1lbnRlZCBieSBPZGlnb3MgSWFDIHRvb2xpbmcsIGJ5XG4gKiB3aGljaCBwYWNrYWdlIHZlcnNpb24sIGFuZCBmb3Igd2hpY2ggbGFuZ3VhZ2UuXG4gKlxuICogSXQgaXMgUEVSIENPTlRBSU5FUiwgYW5kIGl0IGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgbWFrZXMgT2RpZ29zIHJlcG9ydCBhIGNvbnRhaW5lciBhcyBpbnN0cnVtZW50ZWRcbiAqIHJhdGhlciB0aGFuIFwiYXdhaXRpbmcgeW91ciBkZXBsb3ltZW50XCIg4oCUIGhvd2V2ZXIgY29tcGxldGVseSB0aGUgcmVzdCBvZiB0aGUgd2lyaW5nIGlzIGFwcGxpZWQuIEEgdGFza1xuICogZGVmaW5pdGlvbiBob2xkaW5nIHR3byBhcHBsaWNhdGlvbnMgbmVlZHMgaXQgb24gYm90aC5cbiAqXG4gKiBUaGUgYGxhbmdgIGZpZWxkIGlzIGxvYWQtYmVhcmluZy4gVGhlIGNvbm5lY3RvcidzIGNvbmZvcm1hbmNlIGNoZWNrIHJlY29uc3RydWN0cyB0aGUgY29udGFpbmVyJ3NcbiAqIGV4cGVjdGVkIGFjdGl2YXRpb24gZW52aXJvbm1lbnQgZnJvbSB0aGUgcmVjb3JkZWQgbGFuZ3VhZ2UsIHNvIGl0IGlzIHdoYXQgbWFrZXMgXCJpcyB0aGlzIGNvbnRhaW5lclxuICogY29ycmVjdGx5IGluc3RydW1lbnRlZFwiIGFuc3dlcmFibGUgYXQgYWxsIOKAlCBhbmQgaXQgaXMgY3Jvc3MtY2hlY2tlZCBhZ2FpbnN0IHRoZSBsYW5ndWFnZSB0aGUgY29ubmVjdG9yXG4gKiByZXNvbHZlcyBpbmRlcGVuZGVudGx5LCB3aGljaCBpcyBob3cgYW4gaW1hZ2Ugc3dhcHBlZCB1bmRlcm5lYXRoIHRoZSBpbnN0cnVtZW50YXRpb24gaXMgY2F1Z2h0LlxuICpcbiAqIGBpbWFnZWAgaXMgdGhlIG90aGVyIG9uZSwgYW5kIGl0IGlzIHRoZSBGYXJnYXRlIGNvdW50ZXJwYXJ0IG9mIHdoYXQgTGFtYmRhIHJlY29yZHMgYXMgYGxheWVyYC4gVGhlXG4gKiBjb25uZWN0b3IgY29tcGFyZXMgdGhlIHN0YWdpbmcgY29udGFpbmVyJ3MgaW1hZ2UgYWdhaW5zdCB0aGUgb25lIHJlY29yZGVkIEhFUkUgcmF0aGVyIHRoYW4gYWdhaW5zdCB0aGVcbiAqIGJ1bmRsZSBpdHMgb3duIGJ1aWxkIGhhcHBlbnMgdG8gcGluLCBzbyBhIHBhY2thZ2UgcmVsZWFzZWQgYWhlYWQgb2YgdGhlIGNvbm5lY3RvciBpcyBub3QgcmVwb3J0ZWQgYXNcbiAqIGRyaWZ0IG9uIGV2ZXJ5IHRhc2sgaW4gdGhlIGFjY291bnQgdGhlIGRheSBpdCBsYW5kcy4gUmVjb3JkaW5nIGl0IGlzIGFsc28gd2hhdCBtYWtlcyBgYWdlbnRzSW1hZ2VgXG4gKiBzYWZlOiBhIG1pcnJvcmVkIGltYWdlIGlzIGp1ZGdlZCBhZ2FpbnN0IGl0c2VsZiBpbnN0ZWFkIG9mIGFnYWluc3QgYSByZWdpc3RyeSB0aGUgY3VzdG9tZXIgZGVsaWJlcmF0ZWx5XG4gKiBtb3ZlZCBhd2F5IGZyb20uXG4gKlxuICogSXQgaXMgTk9UIGBPRElHT1NfTUFOQUdFRGAsIGFuZCB0aGlzIGNvbnN0cnVjdCBuZXZlciB3cml0ZXMgdGhhdCBvbmUuIFRoYXQgaXMgdGhlIGNvbm5lY3RvcidzIG93blxuICogcmVjb3JkIG9mIGEgbXV0YXRpb24gSVQgcGVyZm9ybWVkLCB3aG9zZSBwYXlsb2FkIGlzIHRoZSBzbmFwc2hvdCBpdCByZXN0b3JlcyBmcm9tIG9uIHJvbGxiYWNrLiBBIENES1xuICogc3RhY2sgaGFzIG5vIHN1Y2ggc25hcHNob3QgdG8gb2ZmZXIsIGJlY2F1c2Ugbm90aGluZyB3YXMgbXV0YXRlZCDigJQgdGhlIGNvbnRhaW5lciBkZWZpbml0aW9uIGJlbG93IElTXG4gKiB0aGUgY29udGFpbmVyJ3MgZGVmaW5pdGlvbi4gV3JpdGluZyBpdCBieSBoYW5kIHdvdWxkIGNsYWltIGEgcm9sbGJhY2sgbm9ib2R5IHJlY29yZGVkLCBhbmQgdGhlXG4gKiBjb25uZWN0b3Igd291bGQgdGhlbiBqdWRnZSB0aGUgY29udGFpbmVyIGFnYWluc3QgdmFsdWVzIHRoYXQgZG8gbm90IGV4aXN0LlxuICovXG5jb25zdCBFTlZfSUFDX01BUktFUiA9ICdPRElHT1NfSUFDJztcblxuLyoqIENvbnN0cnVjdCBpZCBvZiB0aGUgc3RhZ2luZyBjb250YWluZXIgaW5zaWRlIHRoZSB0YXNrIGRlZmluaXRpb24ncyBzY29wZS4gKi9cbmNvbnN0IFNJREVDQVJfQ09OU1RSVUNUX0lEID0gJ09kaWdvc0FnZW50JztcblxuLyoqXG4gKiBNZW1vcnkgcmVzZXJ2YXRpb24gZm9yIHRoZSBzdGFnaW5nIGNvbnRhaW5lciBvbiBhbiBFQzItb25seSB0YXNrIGRlZmluaXRpb24sIHdoZXJlIEVDUyByZXF1aXJlcyBldmVyeVxuICogY29udGFpbmVyIHRvIGRlY2xhcmUgaXRzIG93biBpZiB0aGUgdGFzayBkb2VzIG5vdC4gTmV2ZXIgc2V0IG9uIGEgRmFyZ2F0ZSB0YXNrIGRlZmluaXRpb24g4oCUIHNlZSB0aGVcbiAqIGNhbGwgc2l0ZS5cbiAqL1xuY29uc3QgU0lERUNBUl9FQzJfTUVNT1JZX01JQiA9IDY0O1xuXG4vKipcbiAqIE9wdGlvbnMgc2hhcmVkIGJ5IGV2ZXJ5IGNvbnRhaW5lciB0aGlzIGNvbnN0cnVjdCBpbnN0cnVtZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NGYXJnYXRlSW5zdHJ1bWVudGF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgaW5zdHJ1bWVudGVkIGNvbnRhaW5lcnMgZXhwb3J0IHRlbGVtZXRyeSB0by5cbiAgICpcbiAgICogVW5saWtlIExhbWJkYSwgQk9USCB0cmFuc3BvcnRzIG1heSBiZSBzZXQgYW5kIG9mdGVuIHNob3VsZCBiZTogYSBGYXJnYXRlIHRhc2sgaGFzIG5vIGNvbGxlY3RvciBvZiBpdHNcbiAgICogb3duLCBzbyBlYWNoIGxhbmd1YWdlJ3MgYWdlbnQgZXhwb3J0cyB0byB0aGlzIGRlc3RpbmF0aW9uIGl0c2VsZiBhbmQgdGFrZXMgdGhlIHRyYW5zcG9ydCBpdCBwcmVmZXJzLlxuICAgKiBwaHAgYW5kIHJ1YnkgY2FuIG9ubHkgc3BlYWsgT1RMUC9IVFRQIGF0IGFsbC5cbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uOiBPZGlnb3NEZXN0aW5hdGlvbjtcblxuICAvKipcbiAgICogVGhlIGFnZW50cyBidW5kbGUgdGhlIHN0YWdpbmcgY29udGFpbmVyIGNvcGllcyB0aGUgbGFuZ3VhZ2UgYWdlbnRzIG91dCBvZi5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdGhlIG11bHRpLWFyY2ggaW1hZ2UgdGhpcyBwYWNrYWdlJ3MgcmVsZWFzZSBwdWJsaXNoZWQsIGF0IHRoYXQgcmVsZWFzZSdzIGltbXV0YWJsZSB0YWcuXG4gICAqIE92ZXJyaWRlIGl0IHRvIG1pcnJvciB0aGUgaW1hZ2UgaW50byBhIHJlZ2lzdHJ5IHlvdXIgdGFza3MgY2FuIHJlYWNoIOKAlCB0aGUgaW1hZ2UgaXMgcHVsbGVkIGJ5IFlPVVJcbiAgICogdGFzaydzIGV4ZWN1dGlvbiByb2xlIGF0IGV2ZXJ5IHRhc2sgc3RhcnQsIHNvIGEgdGFzayBpbiBhIHByaXZhdGUgc3VibmV0IHdpdGggbm8gTkFUIGFuZCBub1xuICAgKiBpbnRlcmZhY2UgZW5kcG9pbnQgY2Fubm90IHB1bGwgdGhlIGRlZmF1bHQuXG4gICAqXG4gICAqIEEgbWlycm9yIG11c3QgYmUgdGhlIHNhbWUgYnVuZGxlOiB0aGUgYWN0aXZhdGlvbiBlbnZpcm9ubWVudCBzZXQgYmVsb3cgbmFtZXMgZXhhY3QgcGF0aHMgaW5zaWRlIGl0LlxuICAgKlxuICAgKiBXaGF0ZXZlciB5b3UgcGFzcyBpcyBSRUNPUkRFRCBpbiB0aGUgYE9ESUdPU19JQUNgIG1hcmtlciwgYW5kIHRoZSBjb25uZWN0b3IgaG9sZHMgdGhlIHRhc2sgZGVmaW5pdGlvblxuICAgKiB0byB0aGUgcmVjb3JkZWQgaW1hZ2UgcmF0aGVyIHRoYW4gdG8gdGhlIGJ1bmRsZSBpdHMgb3duIGJ1aWxkIHBpbnMg4oCUIHNvIGEgbWlycm9yIGlzIGp1ZGdlZCBhZ2FpbnN0XG4gICAqIGl0c2VsZiwgYW5kIHRoaXMgZG9lcyBub3QgaGF2ZSB0byBiZSBrZXB0IGluIHN0ZXAgd2l0aCB0aGUgY29ubmVjdG9yJ3MgdmVyc2lvbiB0byBzdGF5IGNvbmZvcm1hbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIHJlbGVhc2VkIGByZWdpc3RyeS5vZGlnb3MuaW8vb2RpZ29zLWZhcmdhdGUtYWdlbnRzYCBpbWFnZSBmb3IgdGhpcyBwYWNrYWdlIHZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IGFnZW50c0ltYWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSYWlzZSBhZ2VudCB2ZXJib3NpdHkgKGBPVEVMX0xPR19MRVZFTD1kZWJ1Z2ApIG9uIGV2ZXJ5IGluc3RydW1lbnRlZCBjb250YWluZXIuXG4gICAqXG4gICAqIFVzZWZ1bCB3aGlsZSB3aXJpbmcgdXAgYSBkZXN0aW5hdGlvbiwgZXhwZW5zaXZlIHRvIGxlYXZlIG9uIOKAlCBhbmQgaXQgaXMgY29tcGFyZWQ6IHRoZSBjb25uZWN0b3JcbiAgICogZXhwZWN0cyB0aGUgdmFyaWFibGUgQUJTRU5UIHVubGVzcyBkZWJ1ZyB0ZWxlbWV0cnkgaXMgZW5hYmxlZCBmb3IgdGhlIGNvbm5lY3RvciB0b28sIHNvIGxlYXZpbmcgdGhpc1xuICAgKiBvbiBjYW4gaXRzZWxmIGJlIHJlcG9ydGVkIGFzIGRyaWZ0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9uZSBjb250YWluZXIgdG8gaW5zdHJ1bWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NGYXJnYXRlVGFyZ2V0IHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBjb250YWluZXIuIEl0cyB0YXNrIGRlZmluaXRpb24gaXMgdGFrZW4gZnJvbSBpdCwgc28gdGhlIHN0YWdpbmcgY29udGFpbmVyLCB0aGUgc2hhcmVkXG4gICAqIHZvbHVtZSBhbmQgdGhlIHN0YXJ0dXAgZGVwZW5kZW5jeSBhcmUgYWRkZWQgdG8gdGhlIHJpZ2h0IG9uZSBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyOiBlY3MuQ29udGFpbmVyRGVmaW5pdGlvbjtcblxuICAvKipcbiAgICogVGhlIGxhbmd1YWdlIHdob3NlIGFnZW50IHRvIHN0YWdlIGFuZCBhY3RpdmF0ZS5cbiAgICpcbiAgICogU3RhdGVkIHJhdGhlciB0aGFuIGRldGVjdGVkIOKAlCBhIGNvbnRhaW5lciBkZWNsYXJlcyBhbiBpbWFnZSwgbm90IGEgcnVudGltZSwgYW5kIHJlc29sdmluZyBhIGxhbmd1YWdlXG4gICAqIGZyb20gYW4gaW1hZ2UgbWVhbnMgcHVsbGluZyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlOiBPZGlnb3NGYXJnYXRlTGFuZ3VhZ2U7XG5cbiAgLyoqXG4gICAqIGBPVEVMX1NFUlZJQ0VfTkFNRWAgZm9yIHRoaXMgY29udGFpbmVyLlxuICAgKlxuICAgKiBUSElTIE1VU1QgTUFUQ0ggVEhFIFdPUktMT0FEJ1MgTkFNRSBJTiBPRElHT1MsIHdoaWNoIGZvciBhIEZhcmdhdGUgd29ya2xvYWQgaXMgdGhlIEVDUyBTRVJWSUNFIG5hbWUg4oCUXG4gICAqIG5vdCB0aGUgdGFzayBkZWZpbml0aW9uIGZhbWlseSBhbmQgbm90IHRoZSBjb250YWluZXIgbmFtZS4gQSBkaWZmZXJlbnQgdmFsdWUgaXMgcmVwb3J0ZWQgYXNcbiAgICogaW5zdHJ1bWVudGF0aW9uIGRyaWZ0IHJhdGhlciB0aGFuIHRyZWF0ZWQgYXMgYSBuYW1pbmcgcHJlZmVyZW5jZS5cbiAgICpcbiAgICogUGFzcyBgc2VydmljZWAgaW5zdGVhZCB0byByZWFkIGl0IG9mZiB0aGUgc2VydmljZSwgb3Igc2V0IHRoaXMgd2hlbiB0aGUgc2VydmljZSBpcyBkZWZpbmVkIGVsc2V3aGVyZVxuICAgKiAoYSBkaWZmZXJlbnQgc3RhY2ssIFRlcnJhZm9ybSwgdGhlIGNvbnNvbGUpLiBPbmUgb2YgdGhlIHR3byBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0YWtlbiBmcm9tIGBzZXJ2aWNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBFQ1Mgc2VydmljZSB0aGF0IHJ1bnMgdGhpcyB0YXNrIGRlZmluaXRpb24sIHVzZWQgb25seSB0byByZWFkIGl0cyBuYW1lLlxuICAgKlxuICAgKiBJdHMgcGh5c2ljYWwgbmFtZSBoYXMgdG8gYmUgb25lIHlvdXIgc3RhY2sgU0VULCBub3Qgb25lIENsb3VkRm9ybWF0aW9uIGdlbmVyYXRlczogYSBnZW5lcmF0ZWQgbmFtZSBpc1xuICAgKiBhIGBSZWZgIHRvIHRoZSBzZXJ2aWNlLCBhbmQgYSBzZXJ2aWNlJ3Mgb3duIHRhc2sgZGVmaW5pdGlvbiByZWZlcmVuY2luZyBpdCBpcyBhIGRlcGVuZGVuY3kgY3ljbGVcbiAgICogQ2xvdWRGb3JtYXRpb24gcmVqZWN0cyBhdCBkZXBsb3kgdGltZS4gQSBnZW5lcmF0ZWQgbmFtZSB0aHJvd3MgYXQgc3ludGggcG9pbnRpbmcgYXQgYHNlcnZpY2VOYW1lYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgc2VydmljZU5hbWVgIG11c3QgYmUgZ2l2ZW4gaW5zdGVhZFxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZT86IGVjcy5CYXNlU2VydmljZTtcblxuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uJ3MgcnVudGltZSB2ZXJzaW9uIGFzIGBtYWpvci5taW5vcmAg4oCUIGZvciBleGFtcGxlIGBcIjguM1wiYC5cbiAgICpcbiAgICogUmVxdWlyZWQgZm9yIHBocCBhbmQgcnVieSwgd2hvc2UgYWdlbnRzIGFyZSBsYWlkIGRvd24gcGVyIHJ1bnRpbWUgdmVyc2lvbiBpbiB0aGUgYnVuZGxlLCBhbmQgdGhlXG4gICAqIHZlcnNpb24gc2VsZWN0cyB0aGUgcGF0aCB0aGVpciBhY3RpdmF0aW9uIHZhcmlhYmxlcyBwb2ludCBhdC4gSWdub3JlZCBieSBldmVyeSBvdGhlciBsYW5ndWFnZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lOyByZXF1aXJlZCBmb3IgcGhwIGFuZCBydWJ5XG4gICAqL1xuICByZWFkb25seSBydW50aW1lVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoaXMgY29udGFpbmVyIGFscmVhZHkgbmVlZHMgaW4gaXRzIGxvYWRlciB2YXJpYWJsZSAoYEpBVkFfVE9PTF9PUFRJT05TYCwgYE5PREVfT1BUSU9OU2Agb3JcbiAgICogYFBZVEhPTlBBVEhgKSwgd2hpY2ggdGhlIE9kaWdvcyBmcmFnbWVudCBpcyBqb2luZWQgdG8gcmF0aGVyIHRoYW4gcmVwbGFjaW5nLlxuICAgKlxuICAgKiBPbmx5IG5lZWRlZCBhcyBhbiBPVkVSUklERS4gVGhlIGNvbnN0cnVjdCByZWFkcyB0aGUgdmFsdWUgdGhlIGNvbnRhaW5lciB3YXMgY3JlYXRlZCB3aXRoIGFuZCBhcHBlbmRzXG4gICAqIHRvIGl0LCBzbyBhIGNvbnRhaW5lciB0aGF0IHNldHMgaXRzIG93biBgSkFWQV9UT09MX09QVElPTlNgIGluIGBhZGRDb250YWluZXJgIGtlZXBzIGl0LiBQYXNzIHRoaXMgd2hlblxuICAgKiB0aGUgdmFsdWUgaXMgbm90IHZpc2libGUgYXQgc3ludGgg4oCUIHNldCBieSBhbiBgZW52aXJvbm1lbnRGaWxlc2AgZW50cnksIGluamVjdGVkIGJ5IHRoZSBpbWFnZSdzIG93blxuICAgKiBgRU5WYCwgb3Igc3VwcGxpZWQgdGhyb3VnaCBgc2VjcmV0c2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcmVhZCBmcm9tIHRoZSBjb250YWluZXIncyBvd24gZW52aXJvbm1lbnRcbiAgICovXG4gIHJlYWRvbmx5IGV4aXN0aW5nTG9hZGVyVmFsdWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcHMgZm9yIHtAbGluayBPZGlnb3NGYXJnYXRlSW5zdHJ1bWVudGF0aW9ufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NGYXJnYXRlSW5zdHJ1bWVudGF0aW9uUHJvcHMgZXh0ZW5kcyBPZGlnb3NGYXJnYXRlSW5zdHJ1bWVudGF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDb250YWluZXJzIHRvIGluc3RydW1lbnQgb24gY29uc3RydWN0aW9uLiBNb3JlIGNhbiBiZSBhZGRlZCB3aXRoIGBpbnN0cnVtZW50KClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldHM/OiBPZGlnb3NGYXJnYXRlVGFyZ2V0W107XG59XG5cbi8qKiBQZXItdGFzay1kZWZpbml0aW9uIHN0YXRlOiB0aGUgc3RhZ2luZyBjb250YWluZXIsIGFuZCB3aGF0IGl0IGhhcyBiZWVuIGFza2VkIHRvIHN0YWdlLiAqL1xuaW50ZXJmYWNlIFRhc2tEZWZpbml0aW9uU3RhdGUge1xuICByZWFkb25seSBzaWRlY2FyOiBlY3MuQ29udGFpbmVyRGVmaW5pdGlvbjtcbiAgcmVhZG9ubHkgYWdlbnREaXJzOiBTZXQ8c3RyaW5nPjtcbn1cblxuLyoqXG4gKiBJbnN0cnVtZW50cyBFQ1MgRmFyZ2F0ZSBjb250YWluZXJzIHdpdGggdGhlIE9kaWdvcyBPcGVuVGVsZW1ldHJ5IGFnZW50cy5cbiAqXG4gKiBgYGB0c1xuICogY29uc3Qgb2RpZ29zID0gbmV3IE9kaWdvc0ZhcmdhdGVJbnN0cnVtZW50YXRpb24odGhpcywgJ09kaWdvcycsIHtcbiAqICAgZGVzdGluYXRpb246IHsgaHR0cEVuZHBvaW50OiAnaHR0cHM6Ly9vdGxwLmV4YW1wbGUuY29tOjQzMTgnIH0sXG4gKiB9KTtcbiAqIG9kaWdvcy5pbnN0cnVtZW50KHtcbiAqICAgY29udGFpbmVyOiBhcGlDb250YWluZXIsXG4gKiAgIGxhbmd1YWdlOiBPZGlnb3NGYXJnYXRlTGFuZ3VhZ2UuSkFWQSxcbiAqICAgc2VydmljZTogYXBpU2VydmljZSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogIyMgV2hhdCBpdCBkb2VzIHRvIHRoZSB0YXNrIGRlZmluaXRpb25cbiAqXG4gKiBGb3VyIG1vdmVzLCB3aGljaCBhcmUgb25lIG1lY2hhbmlzbSBhbmQgb25seSB3b3JrIHRvZ2V0aGVyIOKAlCB0aGUgRUNTIGFkYXB0YXRpb24gb2YgdGhlIE9kaWtvc1xuICogaW5pdC1jb250YWluZXIgbW91bnQgbWV0aG9kOlxuICpcbiAqICAxLiBhIGJhcmUtbmFtZSB0YXNrIHZvbHVtZSAoYG9kaWdvcy1hZ2VudGApLCB3aGljaCBvbiBGYXJnYXRlIGlzIGFuIGVwaGVtZXJhbC1zdG9yYWdlIGJpbmQgbW91bnRcbiAqICAgICBzY29wZWQgdG8gdGhlIHRhc2s7XG4gKiAgMi4gYSBOT04tRVNTRU5USUFMIGBvZGlnb3MtYWdlbnRgIGNvbnRhaW5lciB0aGF0IGNvcGllcyB0aGUgbGFuZ3VhZ2UgYWdlbnRzIG91dCBvZiB0aGUgYWdlbnRzIGJ1bmRsZVxuICogICAgIGludG8gdGhhdCB2b2x1bWUgYW5kIGV4aXRzIDA7XG4gKiAgMy4gdGhlIHZvbHVtZSBtb3VudGVkIHJlYWQtb25seSBhdCBgL3Zhci9vZGlnb3NgIGluIGVhY2ggaW5zdHJ1bWVudGVkIGNvbnRhaW5lciwgd2hpY2ggZGVwZW5kcyBvbiB0aGVcbiAqICAgICBzdGFnaW5nIGNvbnRhaW5lciB3aXRoIGNvbmRpdGlvbiBgU1VDQ0VTU2Ag4oCUIG9ubHkgdmFsaWQgYWdhaW5zdCBhIG5vbi1lc3NlbnRpYWwgY29udGFpbmVyLCB3aGljaCBpc1xuICogICAgIHdoeSAoMikgaXMgbm9uLWVzc2VudGlhbDtcbiAqICA0LiB0aGUgbGFuZ3VhZ2UncyBhY3RpdmF0aW9uIGVudmlyb25tZW50LCB0aGUgT1RMUCBleHBvcnQgZW52aXJvbm1lbnQsIGFuZCB0aGUgYE9ESUdPU19JQUNgIG1hcmtlciBvblxuICogICAgIGVhY2ggaW5zdHJ1bWVudGVkIGNvbnRhaW5lci5cbiAqXG4gKiBUaGVyZSBpcyBPTkUgc3RhZ2luZyBjb250YWluZXIgcGVyIHRhc2sgZGVmaW5pdGlvbiBob3dldmVyIG1hbnkgbGFuZ3VhZ2VzIHRoZSB0YXNrIGhvbGRzOyBpdHMgY29tbWFuZFxuICogaXMgdGhlIHVuaW9uIG9mIGV2ZXJ5IGluc3RydW1lbnRlZCBjb250YWluZXIncyBhZ2VudCBkaXJlY3RvcmllcywgYW5kIGl0IGlzIGJ1aWx0IGxhemlseSBzbyBjb250YWluZXJzXG4gKiBpbnN0cnVtZW50ZWQgbGF0ZXIgYXJlIGluY2x1ZGVkLlxuICpcbiAqICMjIFdoZXJlIHRoZSB0ZWxlbWV0cnkgZ29lc1xuICpcbiAqIFN0cmFpZ2h0IHRvIHlvdXIgZGVzdGluYXRpb24sIGZyb20gaW5zaWRlIHRoZSBhcHBsaWNhdGlvbiBwcm9jZXNzLiBUaGlzIGlzIHRoZSBzdWJzdGFudGl2ZSBkaWZmZXJlbmNlXG4gKiBmcm9tIExhbWJkYTogdGhlcmUgaXMgbm8gY29sbGVjdG9yIGluIHRoZSB0YXNrIHRvIGhhbmQgYSBiYXRjaCB0bywgc28gYSBzbG93IG9yIHVucmVhY2hhYmxlIGRlc3RpbmF0aW9uXG4gKiBpcyBmZWx0IGJ5IHRoZSBhcHBsaWNhdGlvbidzIG93biBleHBvcnRlciByYXRoZXIgdGhhbiBhYnNvcmJlZCBhZnRlciBhIHJlc3BvbnNlIGhhcyBiZWVuIHJldHVybmVkLlxuICpcbiAqICMjIFdoYXQgaXQgZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIGRvXG4gKlxuICogVGhlcmUgaXMgbm8gYXNwZWN0IHRoYXQgc3dlZXBzIGEgc2NvcGUsIGFzIHRoZXJlIGlzIGZvciBMYW1iZGEuIEFuIGFzcGVjdCB0aGVyZSB3b3JrcyBiZWNhdXNlIGFcbiAqIGZ1bmN0aW9uIERFQ0xBUkVTIGl0cyBydW50aW1lOyBhIGNvbnRhaW5lciBkZWNsYXJlcyBhbiBpbWFnZSwgYW5kIGEgbGFuZ3VhZ2UgZ3Vlc3NlZCBmcm9tIGFuIGltYWdlIG5hbWVcbiAqIHdvdWxkIHNpbGVudGx5IG1pcy1pbnN0cnVtZW50IHRoZSBvbmVzIGl0IGdvdCB3cm9uZyDigJQgc3RhZ2luZyBhIEphdmEgYWdlbnQgaW50byBhIFB5dGhvbiBjb250YWluZXJcbiAqIGxlYXZlcyBpdCB1bmluc3RydW1lbnRlZCwgYW5kIGEgYEpBVkFfVE9PTF9PUFRJT05TYCBvbiBhIEpWTS1sZXNzIGltYWdlIGlzIHNpbXBseSBpZ25vcmVkLCBzbyBub3RoaW5nXG4gKiBmYWlscyBsb3VkbHkgZW5vdWdoIHRvIG5vdGljZS5cbiAqXG4gKiAjIyBEbyBub3QgYWxzbyBpbnN0cnVtZW50IHRoZXNlIHNlcnZpY2VzIHdpdGggdGhlIGNvbm5lY3RvclxuICpcbiAqIFRoZSBjb25uZWN0b3IgaW5zdHJ1bWVudHMgbGl2ZSBzZXJ2aWNlcyBieSByZWdpc3RlcmluZyBhIG5ldyB0YXNrLWRlZmluaXRpb24gcmV2aXNpb24gYW5kIHVwZGF0aW5nIHRoZVxuICogc2VydmljZSB0byBpdCwgcmVjb25jaWxpbmcgdG8gaXRzIG93biBkZXNpcmVkIHN0YXRlIG9uIGV2ZXJ5IHBhc3MuIEEgc2VydmljZSBpbnN0cnVtZW50ZWQgaGVyZSBhbmQgYWxzb1xuICogZW5hYmxlZCBhcyBhIGNvbm5lY3RvciBzb3VyY2UgZW5kcyB1cCBvd25lZCBieSBib3RoOiBlYWNoIGBjZGsgZGVwbG95YCByZWFzc2VydHMgdGhlIHN0YWNrJ3NcbiAqIGRlZmluaXRpb24sIGVhY2ggcmVjb25jaWxlIHJlYXNzZXJ0cyB0aGUgY29ubmVjdG9yJ3MsIGFuZCBldmVyeSByb3VuZCB0cmlwIHJlZ2lzdGVycyBhIHJldmlzaW9uIGFuZFxuICogcm9sbHMgdGhlIHNlcnZpY2UuIENob29zZSBvbmUgcGVyIHNlcnZpY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBPZGlnb3NGYXJnYXRlSW5zdHJ1bWVudGF0aW9uIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBPZGlnb3NGYXJnYXRlSW5zdHJ1bWVudGF0aW9uT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBhZ2VudHNJbWFnZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHRhc2tEZWZpbml0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBUYXNrRGVmaW5pdGlvblN0YXRlPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RydW1lbnRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBPZGlnb3NGYXJnYXRlSW5zdHJ1bWVudGF0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMub3B0aW9ucyA9IHByb3BzO1xuXG4gICAgY29uc3QgaW1hZ2UgPSBwcm9wcy5hZ2VudHNJbWFnZSA/PyBGQVJHQVRFX0FHRU5UU19JTUFHRTtcbiAgICBpZiAoIWltYWdlKSB7XG4gICAgICAvLyBFbXB0eSBvbmx5IGluIGEgY2hlY2tvdXQgYnVpbHQgYmVmb3JlIHRoZSBmaXJzdCByZWxlYXNlLiBGYWlsaW5nIGhlcmUgaXMgdGhlIHBvaW50OiB0aGVcbiAgICAgIC8vIGFsdGVybmF0aXZlIGlzIGEgdGFzayBkZWZpbml0aW9uIHdob3NlIHN0YWdpbmcgY29udGFpbmVyIG5hbWVzIGEgdGFnIHRoYXQgZG9lcyBub3QgZXhpc3QsIHdoaWNoXG4gICAgICAvLyBzdXJmYWNlcyBhcyBhIHRhc2sgdGhhdCB3aWxsIG5vdCBzdGFydCwgYXQgZGVwbG95IHRpbWUsIGluIGEgcGxhY2UgdGhhdCBzYXlzIG5vdGhpbmcgYWJvdXQgd2h5LlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnT2RpZ29zOiB0aGlzIGJ1aWxkIG9mIEBvZGlnb3MvYXdzLWNkayBoYXMgbm8gRmFyZ2F0ZSBhZ2VudHMgaW1hZ2UgYmFrZWQgaW4g4oCUIGl0IHdhcyBidWlsdCAnICtcbiAgICAgICAgICAnYmVmb3JlIHRoZSBmaXJzdCByZWxlYXNlLiBVc2UgYSByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlLCBvciBwYXNzIGBhZ2VudHNJbWFnZWAgJyArXG4gICAgICAgICAgJ2V4cGxpY2l0bHkuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuYWdlbnRzSW1hZ2UgPSBpbWFnZTtcblxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHByb3BzLnRhcmdldHMgPz8gW10pIHtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudCh0YXJnZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0cnVtZW50cyBvbmUgY29udGFpbmVyLiBJZGVtcG90ZW50IOKAlCBpbnN0cnVtZW50aW5nIHRoZSBzYW1lIGNvbnRhaW5lciB0d2ljZSBpcyBhIG5vLW9wIHJhdGhlciB0aGFuXG4gICAqIGEgZG91YmxlZCBsb2FkZXIgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgaW5zdHJ1bWVudCh0YXJnZXQ6IE9kaWdvc0ZhcmdhdGVUYXJnZXQpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0YXJnZXQuY29udGFpbmVyO1xuICAgIGNvbnN0IGtleSA9IGNvbnRhaW5lci5ub2RlLnBhdGg7XG4gICAgaWYgKHRoaXMuaW5zdHJ1bWVudGVkLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFza0RlZmluaXRpb24gPSBjb250YWluZXIudGFza0RlZmluaXRpb247XG4gICAgY29uc3QgcmVjaXBlID0gcmVjaXBlRm9yKHRhcmdldC5sYW5ndWFnZSwgdGFyZ2V0LnJ1bnRpbWVWZXJzaW9uKTtcbiAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHRoaXMucmVzb2x2ZVNlcnZpY2VOYW1lKHRhcmdldCk7XG5cbiAgICB0aGlzLmNoZWNrVGFza0RlZmluaXRpb24odGFza0RlZmluaXRpb24sIGNvbnRhaW5lcik7XG4gICAgdGhpcy5pbnN0cnVtZW50ZWQuYWRkKGtleSk7XG5cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMudGFza0RlZmluaXRpb25TdGF0ZSh0YXNrRGVmaW5pdGlvbik7XG4gICAgZm9yIChjb25zdCBkaXIgb2YgcmVjaXBlLmFnZW50RGlycykge1xuICAgICAgc3RhdGUuYWdlbnREaXJzLmFkZChkaXIpO1xuICAgIH1cblxuICAgIC8vIFJlYWQtb25seTogdGhlIGFnZW50cyBhcmUgb25seSByZWFkIGhlcmUsIGFuZCB0aGUgc3RhZ2luZyBjb250YWluZXIgb3ducyB0aGUgd3JpdGVzLlxuICAgIGNvbnRhaW5lci5hZGRNb3VudFBvaW50cyh7XG4gICAgICBzb3VyY2VWb2x1bWU6IEZBUkdBVEVfVk9MVU1FX05BTUUsXG4gICAgICBjb250YWluZXJQYXRoOiBGQVJHQVRFX0FHRU5UU19ESVIsXG4gICAgICByZWFkT25seTogdHJ1ZSxcbiAgICB9KTtcbiAgICAvLyBTVUNDRVNTLCBub3QgU1RBUlQ6IHRoZSBhZ2VudCBmaWxlcyBoYXZlIHRvIGJlIG9uIGRpc2sgYmVmb3JlIHRoZSBhcHBsaWNhdGlvbiBwcm9jZXNzIGJlZ2lucywgYW5kXG4gICAgLy8gdGhlIHN0YWdpbmcgY29udGFpbmVyIGV4aXRzIGFzIHNvb24gYXMgdGhleSBhcmUuXG4gICAgY29udGFpbmVyLmFkZENvbnRhaW5lckRlcGVuZGVuY2llcyh7XG4gICAgICBjb250YWluZXI6IHN0YXRlLnNpZGVjYXIsXG4gICAgICBjb25kaXRpb246IGVjcy5Db250YWluZXJEZXBlbmRlbmN5Q29uZGl0aW9uLlNVQ0NFU1MsXG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5lbnZpcm9ubWVudEZvcih0YXJnZXQsIHJlY2lwZSwgc2VydmljZU5hbWUpKSkge1xuICAgICAgY29udGFpbmVyLmFkZEVudmlyb25tZW50KG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogSW5zdHJ1bWVudHMgZXZlcnkgdGFyZ2V0IGluIHRoZSBsaXN0LiAqL1xuICBwdWJsaWMgaW5zdHJ1bWVudEFsbCh0YXJnZXRzOiBPZGlnb3NGYXJnYXRlVGFyZ2V0W10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICB0aGlzLmluc3RydW1lbnQodGFyZ2V0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRhc2sgZGVmaW5pdGlvbidzIHN0YWdpbmcgY29udGFpbmVyIGFuZCB2b2x1bWUsIGNyZWF0ZWQgb25jZSBhbmQgc2hhcmVkIGJ5IGV2ZXJ5IGNvbnRhaW5lciBpbiBpdC5cbiAgICpcbiAgICogVGhlIGNvbW1hbmQgaXMgYSBsYXp5IGxpc3QgcmF0aGVyIHRoYW4gYSBsaXRlcmFsIGJlY2F1c2UgdGhlIHVuaW9uIGl0IHJlbmRlcnMgaXMgbm90IGtub3duIHVudGlsXG4gICAqIHN5bnRoZXNpczogYSB0YXNrIGRlZmluaXRpb24gaG9sZGluZyBhIEphdmEgYW5kIGEgUHl0aG9uIGFwcGxpY2F0aW9uIGlzIGluc3RydW1lbnRlZCBieSB0d29cbiAgICogYGluc3RydW1lbnQoKWAgY2FsbHMsIGFuZCB0aGUgc2luZ2xlIHN0YWdpbmcgY29udGFpbmVyIGhhcyB0byBzdGFnZSBib3RoLiBUaGUgY29ubmVjdG9yIGNvbXBhcmVzIHRoaXNcbiAgICogY29tbWFuZCBhZ2FpbnN0IGV4YWN0bHkgdGhhdCB1bmlvbiwgc28gYSBzdGFsZSBvbmUgaXMgcmVwb3J0ZWQgYXMgZHJpZnQgb24gdGhlIHdob2xlIHRhc2sgZGVmaW5pdGlvblxuICAgKiBhbmQgbGVhdmVzIG9uZSBvZiB0aGUgY29udGFpbmVycyB3aXRoIG5vIGFnZW50IG9uIGRpc2suXG4gICAqL1xuICBwcml2YXRlIHRhc2tEZWZpbml0aW9uU3RhdGUodGFza0RlZmluaXRpb246IGVjcy5UYXNrRGVmaW5pdGlvbik6IFRhc2tEZWZpbml0aW9uU3RhdGUge1xuICAgIGNvbnN0IGtleSA9IHRhc2tEZWZpbml0aW9uLm5vZGUucGF0aDtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMudGFza0RlZmluaXRpb25zLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cblxuICAgIC8vIEEgYmFyZS1uYW1lIHZvbHVtZSDigJQgbm8gaG9zdCwgZG9ja2VyIG9yIEVGUyBjb25maWd1cmF0aW9uIOKAlCBpcyBhIEZhcmdhdGUgZXBoZW1lcmFsLXN0b3JhZ2UgYmluZFxuICAgIC8vIG1vdW50IHNjb3BlZCB0byB0aGUgdGFzaywgd2hpY2ggaXMgZXhhY3RseSB0aGUgc2hhcmVkIHN0YWdpbmcgYXJlYSBuZWVkZWQgYW5kIHRoZSBvbmx5IGtpbmQgRmFyZ2F0ZVxuICAgIC8vIG9mZmVycyAodGhlcmUgaXMgbm8gdG1wZnMpLlxuICAgIHRhc2tEZWZpbml0aW9uLmFkZFZvbHVtZSh7IG5hbWU6IEZBUkdBVEVfVk9MVU1FX05BTUUgfSk7XG5cbiAgICBjb25zdCBhZ2VudERpcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBzaWRlY2FyID0gdGFza0RlZmluaXRpb24uYWRkQ29udGFpbmVyKFNJREVDQVJfQ09OU1RSVUNUX0lELCB7XG4gICAgICBjb250YWluZXJOYW1lOiBGQVJHQVRFX1NJREVDQVJfQ09OVEFJTkVSX05BTUUsXG4gICAgICBpbWFnZTogZWNzLkNvbnRhaW5lckltYWdlLmZyb21SZWdpc3RyeSh0aGlzLmFnZW50c0ltYWdlKSxcbiAgICAgIC8vIE5vbi1lc3NlbnRpYWwgaXMgbm90IGEgcHJlZmVyZW5jZTogaXQgaXMgd2hhdCBtYWtlcyB0aGUgU1VDQ0VTUyBkZXBlbmRlbmN5IGFib3ZlIGxlZ2FsLCBhbmQgaXQgaXNcbiAgICAgIC8vIHdoYXQgc3RvcHMgYSBjb3BpZXIgdGhhdCBoYXMgZmluaXNoZWQgaXRzIGpvYiBmcm9tIGZhaWxpbmcgdGhlIHdob2xlIHRhc2sgYnkgZXhpdGluZy5cbiAgICAgIGVzc2VudGlhbDogZmFsc2UsXG4gICAgICBjb21tYW5kOiBMYXp5Lmxpc3QoeyBwcm9kdWNlOiAoKSA9PiBzaWRlY2FyQ29tbWFuZChbLi4uYWdlbnREaXJzXSkgfSksXG4gICAgICAvLyBGYXJnYXRlIGFsbG9jYXRlcyBtZW1vcnkgYXQgdGhlIHRhc2sgbGV2ZWwsIHNvIHRoZSBzdGFnaW5nIGNvbnRhaW5lciBkZWNsYXJlcyBub25lIHRoZXJlIOKAlCB3aGljaFxuICAgICAgLy8ga2VlcHMgdGhlIHJlbmRlcmVkIGNvbnRhaW5lciBieXRlLWlkZW50aWNhbCB0byB3aGF0IHRoZSBjb25uZWN0b3Igd3JpdGVzLiBBbiBFQzItb25seSB0YXNrXG4gICAgICAvLyBkZWZpbml0aW9uIHdpdGhvdXQgdGFzay1sZXZlbCBtZW1vcnkgcmVxdWlyZXMgZXZlcnkgY29udGFpbmVyIHRvIGRlY2xhcmUgaXRzIG93biwgc28gb25lIGlzIHNldFxuICAgICAgLy8gZm9yIHRoYXQgY2FzZSBhbG9uZS4gQSBzb2Z0IHJlc2VydmF0aW9uLCBhbmQgZ2VuZXJvdXM6IHRoZSBjb250YWluZXIgaXMgYnVzeWJveCBydW5uaW5nIGBjcGAuXG4gICAgICBtZW1vcnlSZXNlcnZhdGlvbk1pQjogdGFza0RlZmluaXRpb24uaXNGYXJnYXRlQ29tcGF0aWJsZSA/IHVuZGVmaW5lZCA6IFNJREVDQVJfRUMyX01FTU9SWV9NSUIsXG4gICAgfSk7XG4gICAgLy8gV3JpdGFibGUgaGVyZSDigJQgdGhpcyBpcyB0aGUgY29udGFpbmVyIHRoYXQgcHV0cyB0aGUgZmlsZXMgdGhlcmUuIGByZWFkT25seWAgaXMgcmVxdWlyZWQgYnkgQ0RLJ3NcbiAgICAvLyBNb3VudFBvaW50IHN0cnVjdCB3aGVyZSB0aGUgY29ubmVjdG9yIHNpbXBseSBvbWl0cyBpdDsgZmFsc2UgaXMgd2hhdCBhbiBvbWl0dGVkIHZhbHVlIG1lYW5zLCBhbmQgdGhlXG4gICAgLy8gY29ubmVjdG9yJ3MgdGFzay1sZXZlbCBjaGVjayBjb21wYXJlcyB0aGUgc3RhZ2luZyBjb250YWluZXIncyBpbWFnZSwgZXNzZW50aWFsaXR5IGFuZCBjb21tYW5kLCBub3RcbiAgICAvLyBpdHMgbW91bnRzLCBzbyBzcGVsbGluZyBvdXQgdGhlIGRlZmF1bHQgaXMgbm90IGRyaWZ0LlxuICAgIHNpZGVjYXIuYWRkTW91bnRQb2ludHMoe1xuICAgICAgc291cmNlVm9sdW1lOiBGQVJHQVRFX1ZPTFVNRV9OQU1FLFxuICAgICAgY29udGFpbmVyUGF0aDogRkFSR0FURV9BR0VOVFNfRElSLFxuICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gUmVnaXN0ZXJlZCBoZXJlLCB3aXRoIHRoZSBzdGFnaW5nIGNvbnRhaW5lciwgc28gaXQgaXMgYWRkZWQgb25jZSBwZXIgdGFzayBkZWZpbml0aW9uIGhvd2V2ZXIgbWFueVxuICAgIC8vIGNvbnRhaW5lcnMgYXJlIGluc3RydW1lbnRlZCBpbiBpdCDigJQgYW5kIGNvdW50ZWQgYXQgc3ludGgsIHNvIGNvbnRhaW5lcnMgYWRkZWQgYWZ0ZXIgdGhpcyBjYWxsIGFyZVxuICAgIC8vIGluY2x1ZGVkLiBBV1MgcmVqZWN0cyBhIFJlZ2lzdGVyVGFza0RlZmluaXRpb24gb3ZlciB0aGUgbGltaXQsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBzdXJmYWNlIGFzIGFcbiAgICAvLyBkZXBsb3kgZmFpbHVyZSBhYm91dCBhIGNvbnRhaW5lciBjb3VudCB3aXRoIG5vdGhpbmcgdG8gc2F5IGFib3V0IHdoaWNoIGNvbnRhaW5lciBpcyB0aGUgZXh0cmEgb25lLlxuICAgIHRhc2tEZWZpbml0aW9uLm5vZGUuYWRkVmFsaWRhdGlvbih7XG4gICAgICB2YWxpZGF0ZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250YWluZXJzID0gdGFza0RlZmluaXRpb24ubm9kZS5jaGlsZHJlbi5maWx0ZXIoKGMpID0+IGMgaW5zdGFuY2VvZiBlY3MuQ29udGFpbmVyRGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiBjb250YWluZXJzLmxlbmd0aCA+IEZBUkdBVEVfTUFYX0NPTlRBSU5FUlNcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgIGBPZGlnb3M6IHRhc2sgZGVmaW5pdGlvbiAke3Rhc2tEZWZpbml0aW9uLm5vZGUuaWR9IHdvdWxkIGhhdmUgJHtjb250YWluZXJzLmxlbmd0aH0gYCArXG4gICAgICAgICAgICAgICAgYGNvbnRhaW5lcnMsIG92ZXIgdGhlIEFXUyBtYXhpbXVtIG9mICR7RkFSR0FURV9NQVhfQ09OVEFJTkVSU30uIE9uZSBvZiB0aGVtIGlzIHRoZSBgICtcbiAgICAgICAgICAgICAgICAnb2RpZ29zLWFnZW50IHN0YWdpbmcgY29udGFpbmVyIHRoaXMgaW5zdHJ1bWVudGF0aW9uIGFkZHMuJyxcbiAgICAgICAgICBdXG4gICAgICAgICAgOiBbXTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdGF0ZTogVGFza0RlZmluaXRpb25TdGF0ZSA9IHsgc2lkZWNhciwgYWdlbnREaXJzIH07XG4gICAgdGhpcy50YXNrRGVmaW5pdGlvbnMuc2V0KGtleSwgc3RhdGUpO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgT1RFTF9TRVJWSUNFX05BTUVgIGZvciBhIHRhcmdldCwgYW5kIHRoZSBvbmUgdmFsdWUgYSBjYWxsZXIgY2Fubm90IGJlIGFsbG93ZWQgdG8gbGVhdmUgdG8gYSBkZWZhdWx0LlxuICAgKlxuICAgKiBUaGUgY29ubmVjdG9yIGNvbXBhcmVzIGl0IGFnYWluc3QgdGhlIHdvcmtsb2FkJ3MgbmFtZSBpbiBPZGlnb3MsIHdoaWNoIGlzIHRoZSBFQ1MgU0VSVklDRSBuYW1lLCBzb1xuICAgKiBndWVzc2luZyDigJQgdGhlIHRhc2sgZGVmaW5pdGlvbiBmYW1pbHksIHRoZSBjb250YWluZXIgbmFtZSwgdGhlIGNvbnN0cnVjdCBpZCDigJQgd291bGQgcHJvZHVjZSBhIHN0YWNrXG4gICAqIHRoYXQgZGVwbG95cyBjbGVhbmx5IGFuZCB0aGVuIHJlcG9ydHMgYXMgZHJpZnRlZCBvbiBhIGNvbXBvbmVudCBub3RoaW5nIGluIHRoZSBzdGFjayBtYWtlcyB2aXNpYmxlLlxuICAgKlxuICAgKiBSZWFkIGZyb20gdGhlIEwxLCBub3QgZnJvbSBgc2VydmljZS5zZXJ2aWNlTmFtZWA6IHRoZSBMMiBwcm9wZXJ0eSBpcyBhIHRva2VuIHRoYXQgcmVzb2x2ZXMgdG8gYSBgUmVmYFxuICAgKiB0byB0aGUgc2VydmljZSBldmVuIHdoZW4gdGhlIHN0YWNrIHNldCB0aGUgbmFtZSBleHBsaWNpdGx5LCBhbmQgYSBgUmVmYCBoZXJlIGlzIHdvcnNlIHRoYW4gdXNlbGVzcyDigJRcbiAgICogdGhlIHRhc2sgZGVmaW5pdGlvbiB3b3VsZCByZWZlcmVuY2UgdGhlIHNlcnZpY2UgdGhhdCByZWZlcmVuY2VzIGl0LCB3aGljaCBDbG91ZEZvcm1hdGlvbiByZWplY3RzIGFzIGFcbiAgICogZGVwZW5kZW5jeSBjeWNsZSBhdCBkZXBsb3kgdGltZS5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVNlcnZpY2VOYW1lKHRhcmdldDogT2RpZ29zRmFyZ2F0ZVRhcmdldCk6IHN0cmluZyB7XG4gICAgaWYgKHRhcmdldC5zZXJ2aWNlTmFtZSkge1xuICAgICAgcmV0dXJuIHRhcmdldC5zZXJ2aWNlTmFtZTtcbiAgICB9XG4gICAgaWYgKCF0YXJnZXQuc2VydmljZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgT2RpZ29zOiBpbnN0cnVtZW50aW5nIGNvbnRhaW5lciBcIiR7dGFyZ2V0LmNvbnRhaW5lci5jb250YWluZXJOYW1lfVwiIG5lZWRzIGEgc2VydmljZSBuYW1lLiBgICtcbiAgICAgICAgICAnT1RFTF9TRVJWSUNFX05BTUUgbXVzdCBlcXVhbCB0aGUgd29ya2xvYWRcXCdzIG5hbWUgaW4gT2RpZ29zLCB3aGljaCBmb3IgYSBGYXJnYXRlIHdvcmtsb2FkIGlzICcgK1xuICAgICAgICAgICd0aGUgRUNTIFNFUlZJQ0UgbmFtZSDigJQgbm90IHRoZSB0YXNrIGRlZmluaXRpb24gZmFtaWx5LiBQYXNzIGBzZXJ2aWNlYCB0byByZWFkIGl0IG9mZiB0aGUgJyArXG4gICAgICAgICAgJ3NlcnZpY2UsIG9yIGBzZXJ2aWNlTmFtZWAgd2hlbiB0aGUgc2VydmljZSBsaXZlcyBvdXRzaWRlIHRoaXMgc3RhY2suJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGNmbiA9IHRhcmdldC5zZXJ2aWNlLm5vZGUuZGVmYXVsdENoaWxkIGFzIGVjcy5DZm5TZXJ2aWNlIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlc29sdmVkID0gY2ZuID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdGFjay5vZih0YXJnZXQuc2VydmljZSkucmVzb2x2ZShjZm4uc2VydmljZU5hbWUpO1xuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09ICdzdHJpbmcnICYmIHJlc29sdmVkICE9PSAnJyAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHJlc29sdmVkKSkge1xuICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgT2RpZ29zOiB0aGUgc2VydmljZSBmb3IgY29udGFpbmVyIFwiJHt0YXJnZXQuY29udGFpbmVyLmNvbnRhaW5lck5hbWV9XCIgaGFzIG5vIGV4cGxpY2l0IHBoeXNpY2FsIGAgK1xuICAgICAgICAnbmFtZSwgc28gQ2xvdWRGb3JtYXRpb24gZ2VuZXJhdGVzIG9uZSDigJQgYW5kIGEgZ2VuZXJhdGVkIG5hbWUgaXMgYSBgUmVmYCB0byB0aGUgc2VydmljZSwgd2hpY2ggJyArXG4gICAgICAgICdjYW5ub3QgZ28gaW50byB0aGUgdGFzayBkZWZpbml0aW9uIHRoYXQgc2VydmljZSBydW5zIChDbG91ZEZvcm1hdGlvbiByZWplY3RzIHRoZSBjeWNsZSkuIFNldCAnICtcbiAgICAgICAgJ2BzZXJ2aWNlTmFtZWAgb24gdGhlIEVDUyBzZXJ2aWNlLCBvciBwYXNzIGBzZXJ2aWNlTmFtZWAgaGVyZSB0byBzdGF0ZSB0aGUgbmFtZSBPZGlnb3Mga25vd3MgJyArXG4gICAgICAgICd0aGUgd29ya2xvYWQgYnkuJyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB0aGUgdGFzayBkZWZpbml0aW9uIGNhbiBjYXJyeSB0aGUgc3RhZ2VkLWFnZW50IG1ldGhvZCBhdCBhbGwsIGFuZCB3YXJucyBhYm91dCB0aGUgdGhpbmdzIHRoYXRcbiAgICogYXJlIGxlZ2FsIGJ1dCBhbG1vc3QgY2VydGFpbmx5IGEgbWlzdGFrZS5cbiAgICovXG4gIHByaXZhdGUgY2hlY2tUYXNrRGVmaW5pdGlvbih0YXNrRGVmaW5pdGlvbjogZWNzLlRhc2tEZWZpbml0aW9uLCBjb250YWluZXI6IGVjcy5Db250YWluZXJEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0YXNrRGVmaW5pdGlvbi5pc0ZhcmdhdGVDb21wYXRpYmxlKSB7XG4gICAgICAvLyBOb3QgZmF0YWwg4oCUIHRoZSBtZWNoYW5pc20gaXMgYSB2b2x1bWUgYW5kIGEgY29waWVyLCB3aGljaCB3b3JrIG9uIHRoZSBFQzIgbGF1bmNoIHR5cGUgdG9vLiBCdXRcbiAgICAgIC8vIHRoZSBjb25uZWN0b3IgZGlzY292ZXJzIGFuZCBqdWRnZXMgYGF3cy5mYXJnYXRlLXRhc2tgIHdvcmtsb2Fkcywgc28gYW4gRUMyLW9ubHkgdGFzayBkZWZpbml0aW9uXG4gICAgICAvLyBpcyBpbnN0cnVtZW50ZWQgaGVyZSBhbmQgaW52aXNpYmxlIHRoZXJlLlxuICAgICAgQW5ub3RhdGlvbnMub2YoY29udGFpbmVyKS5hZGRXYXJuaW5nVjIoXG4gICAgICAgICdAb2RpZ29zL2F3cy1jZGs6bm90RmFyZ2F0ZUNvbXBhdGlibGUnLFxuICAgICAgICBgT2RpZ29zOiB0YXNrIGRlZmluaXRpb24gJHt0YXNrRGVmaW5pdGlvbi5ub2RlLmlkfSBpcyBub3QgRmFyZ2F0ZS1jb21wYXRpYmxlLiBUaGUgc3RhZ2luZyBgICtcbiAgICAgICAgICAnY29udGFpbmVyIGFuZCBzaGFyZWQgdm9sdW1lIHdpbGwgc3RpbGwgd29yayBvbiB0aGUgRUMyIGxhdW5jaCB0eXBlLCBidXQgT2RpZ29zIGRpc2NvdmVycyAnICtcbiAgICAgICAgICAndGhlc2UgYXMgYGF3cy5mYXJnYXRlLXRhc2tgIHdvcmtsb2FkcyBhbmQgd2lsbCBub3QgcmVwb3J0IG9uIGFuIEVDMi1vbmx5IHRhc2suJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY2ZuID0gdGFza0RlZmluaXRpb24ubm9kZS5kZWZhdWx0Q2hpbGQgYXMgZWNzLkNmblRhc2tEZWZpbml0aW9uIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBsYXRmb3JtID0gY2ZuPy5ydW50aW1lUGxhdGZvcm0gYXMgZWNzLkNmblRhc2tEZWZpbml0aW9uLlJ1bnRpbWVQbGF0Zm9ybVByb3BlcnR5IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IG9zRmFtaWx5ID0gcGxhdGZvcm0/Lm9wZXJhdGluZ1N5c3RlbUZhbWlseTtcbiAgICBpZiAodHlwZW9mIG9zRmFtaWx5ID09PSAnc3RyaW5nJyAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKG9zRmFtaWx5KSAmJiAhb3NGYW1pbHkuc3RhcnRzV2l0aCgnTElOVVgnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgT2RpZ29zOiB0YXNrIGRlZmluaXRpb24gJHt0YXNrRGVmaW5pdGlvbi5ub2RlLmlkfSBkZWNsYXJlcyBvcGVyYXRpbmdTeXN0ZW1GYW1pbHkgYCArXG4gICAgICAgICAgYFwiJHtvc0ZhbWlseX1cIi4gVGhlIE9kaWdvcyBGYXJnYXRlIGFnZW50cyBidW5kbGUgaXMgTGludXgtb25seSBhbmQgZ2xpYmMtYmFzZWQsIHNvIGEgV2luZG93cyBgICtcbiAgICAgICAgICAndGFzayBkZWZpbml0aW9uIGNhbm5vdCBiZSBpbnN0cnVtZW50ZWQgYXQgYWxsLicsXG4gICAgICApO1xuICAgIH1cblxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBlbnZpcm9ubWVudCBhcHBsaWVkIHRvIG9uZSBpbnN0cnVtZW50ZWQgY29udGFpbmVyLlxuICAgKlxuICAgKiBNaXJyb3JzIGBpbnN0cnVtZW50Q29udGFpbmVyYCBpbiB0aGUgY29ubmVjdG9yLCBpbmNsdWRpbmcgdGhlIE9SREVSIG9mIGRlY2lzaW9uczogdGhlIGFnZW50J3Mgb3duXG4gICAqIGFjdGl2YXRpb24gdmFyaWFibGVzIGZpcnN0LCB0aGVuIGlkZW50aXR5LCB0aGVuIGV4cG9ydCwgdGhlbiB0aGUgbWFya2VyLiBFdmVyeSB2YXJpYWJsZSBoZXJlIGhhcyBhXG4gICAqIGNvdW50ZXJwYXJ0IGluIHRoZSBjb25uZWN0b3IncyBgY29udGFpbmVyRGlmZmAsIHdoaWNoIGlzIHdoYXQgYSBjdXN0b21lcidzIGNvbmZvcm1hbmNlIHJlcG9ydCBpc1xuICAgKiBidWlsdCBmcm9tIOKAlCBzbyBvbmUgdGhhdCBpcyBhYnNlbnQsIG9yIHNwZWxsZWQgZGlmZmVyZW50bHksIGlzIHJlcG9ydGVkIGFzIGEgbmFtZWQgYnJva2VuIGNvbXBvbmVudFxuICAgKiByYXRoZXIgdGhhbiBwYXNzaW5nIHF1aWV0bHkuXG4gICAqL1xuICBwcml2YXRlIGVudmlyb25tZW50Rm9yKFxuICAgIHRhcmdldDogT2RpZ29zRmFyZ2F0ZVRhcmdldCxcbiAgICByZWNpcGU6IEZhcmdhdGVSZWNpcGUsXG4gICAgc2VydmljZU5hbWU6IHN0cmluZyxcbiAgKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgeyBkZXN0aW5hdGlvbiwgZGVidWcgfSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCBjb250YWluZXIgPSB0YXJnZXQuY29udGFpbmVyO1xuICAgIGNvbnN0IGVudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMocmVjaXBlLnN0YXRpY0VudikpIHtcbiAgICAgIC8vIFRoZXNlIGFyZSBzZXQgb3V0cmlnaHQsIG5vdCBtZXJnZWQg4oCUIFBIUF9JTklfU0NBTl9ESVIgYW5kIFJVQllPUFQgYXJlIGNvbXBhcmVkIGV4YWN0bHksIHNvIHRoZXJlXG4gICAgICAvLyBpcyBubyByb29tIHRvIGZvbGQgYSBjb250YWluZXIncyBvd24gdmFsdWUgaW4uIFNpbGVudGx5IGRpc2NhcmRpbmcgb25lIGlzIHRoZSBmYWlsdXJlIHdvcnRoXG4gICAgICAvLyBuYW1pbmc6IFJVQllPUFQgY29tbW9ubHkgY2FycmllcyBmbGFncyBhbiBhcHBsaWNhdGlvbiBuZWVkcyB0byBib290LlxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBjb250YWluZXJFbnZWYWx1ZShjb250YWluZXIsIGspO1xuICAgICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQgJiYgZXhpc3RpbmcgIT09IHYpIHtcbiAgICAgICAgQW5ub3RhdGlvbnMub2YoY29udGFpbmVyKS5hZGRXYXJuaW5nVjIoXG4gICAgICAgICAgJ0BvZGlnb3MvYXdzLWNkazpzdGF0aWNFbnZPdmVyd3JpdHRlbicsXG4gICAgICAgICAgYE9kaWdvczogY29udGFpbmVyIFwiJHtjb250YWluZXIuY29udGFpbmVyTmFtZX1cIiBhbHJlYWR5IHNldHMgJHtrfT1cIiR7ZXhpc3Rpbmd9XCIsIHdoaWNoIHRoZSBgICtcbiAgICAgICAgICAgIGAke3JlY2lwZS5sYW5ndWFnZX0gYWdlbnQncyBhY3RpdmF0aW9uIHJlcGxhY2VzIHdpdGggXCIke3Z9XCIuIE9kaWdvcyBjb21wYXJlcyB0aGlzIHZhcmlhYmxlIGAgK1xuICAgICAgICAgICAgJ2V4YWN0bHksIHNvIGl0IGNhbm5vdCBtZXJnZSB0aGUgdHdvIOKAlCBmb2xkIHdoYXQgeW91ciBhcHBsaWNhdGlvbiBuZWVkcyBpbnRvIHRoZSB2YWx1ZSAnICtcbiAgICAgICAgICAgICdPZGlnb3Mgc2V0cywgb3IgbGVhdmUgdGhpcyBjb250YWluZXIgdW5pbnN0cnVtZW50ZWQuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGVudltrXSA9IHY7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhcHBlbmQgb2YgcmVjaXBlLmFwcGVuZEVudikge1xuICAgICAgLy8gUmVidWlsdCBmcm9tIHRoZSBjb250YWluZXIncyBPUklHSU5BTCB2YWx1ZSBzbyBvdXJzIGlzIGpvaW5lZCByYXRoZXIgdGhhbiBhc3NpZ25lZCBvdmVyIGl0IOKAlCBhbmRcbiAgICAgIC8vIHNvIHRoYXQgYSByZS1zeW50aCBuZXZlciBhY2N1bXVsYXRlcyBvdXIgZnJhZ21lbnQgdHdpY2UuIFRoZSBzZXBhcmF0b3IgY29tZXMgZnJvbSB0aGUgcGF0dGVybixcbiAgICAgIC8vIG5vdCBmcm9tIGFuIGFzc3VtcHRpb246IGEgc3BhY2UgZm9yIHRoZSAqX09QVElPTlMgdmFyaWFibGVzLCBhIGNvbG9uIGZvciBQWVRIT05QQVRILlxuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0YXJnZXQuZXhpc3RpbmdMb2FkZXJWYWx1ZSA/PyBjb250YWluZXJFbnZWYWx1ZShjb250YWluZXIsIGFwcGVuZC5uYW1lKSA/PyAnJztcbiAgICAgIGVudlthcHBlbmQubmFtZV0gPSBldmFsdWF0ZUFwcGVuZFBhdHRlcm4oYXBwZW5kLnBhdHRlcm4sIGV4aXN0aW5nKTtcbiAgICB9XG5cbiAgICBlbnZbRU5WX1NFUlZJQ0VfTkFNRV0gPSBzZXJ2aWNlTmFtZTtcbiAgICBlbnZbRU5WX1JFU09VUkNFX0FUVFJJQlVURVNdID0gZmFyZ2F0ZVJlc291cmNlQXR0cmlidXRlcyhTdGFjay5vZihjb250YWluZXIpLnJlZ2lvbik7XG5cbiAgICBjb25zdCBleHBvcnRUYXJnZXQgPSBleHBvcnRUYXJnZXRGb3IocmVjaXBlLCBkZXN0aW5hdGlvbik7XG4gICAgZW52W0VOVl9PVExQX0VORFBPSU5UXSA9IGV4cG9ydFRhcmdldC5lbmRwb2ludDtcbiAgICBlbnZbRU5WX09UTFBfUFJPVE9DT0xdID0gZXhwb3J0VGFyZ2V0LnByb3RvY29sO1xuICAgIGNvbnN0IG1pc21hdGNoID0gcG9ydFByb3RvY29sTWlzbWF0Y2goZXhwb3J0VGFyZ2V0LmVuZHBvaW50LCBleHBvcnRUYXJnZXQucHJvdG9jb2wpO1xuICAgIGlmIChtaXNtYXRjaCkge1xuICAgICAgQW5ub3RhdGlvbnMub2YoY29udGFpbmVyKS5hZGRXYXJuaW5nVjIoJ0BvZGlnb3MvYXdzLWNkazpwb3J0UHJvdG9jb2xNaXNtYXRjaCcsIGBPZGlnb3M6ICR7bWlzbWF0Y2h9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5hYmxlZCA9IHJlc29sdmVkU2lnbmFscyhkZXN0aW5hdGlvbik7XG4gICAgaWYgKCFlbmFibGVkLnRyYWNlcyAmJiAhZW5hYmxlZC5tZXRyaWNzICYmICFlbmFibGVkLmxvZ3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ09kaWdvcyBkZXN0aW5hdGlvbiBhY2NlcHRzIG5vIHRlbGVtZXRyeSBzaWduYWxzLCBzbyB0aGUgYWdlbnQgd291bGQgYmUgbG9hZGVkIGFuZCBwcm9kdWNlICcgK1xuICAgICAgICAgICdub3RoaW5nLiBOb3RlIHRoYXQgbWV0cmljcyBhbmQgbG9ncyBhcmUgT0ZGIGJ5IGRlZmF1bHQg4oCUIHdpdGggYHRyYWNlczogZmFsc2VgIHRoZSBkZXN0aW5hdGlvbiAnICtcbiAgICAgICAgICAnaGFzIG5vdGhpbmcgbGVmdCB1bmxlc3MgeW91IGFsc28gcGFzcyBgbWV0cmljczogdHJ1ZWAgb3IgYGxvZ3M6IHRydWVgLicsXG4gICAgICApO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKGVudiwgc2lnbmFsQWN0aXZhdGlvbihyZWNpcGUubGFuZ3VhZ2UsIGRlc3RpbmF0aW9uKSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHNpZ25hbFRyYW5zcG9ydE92ZXJyaWRlcygpKSB7XG4gICAgICBpZiAoY29udGFpbmVyRW52VmFsdWUoY29udGFpbmVyLCBuYW1lKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgT2RpZ29zOiByZW1vdmUgJHtuYW1lfTsgaXQgb3ZlcnJpZGVzIHRoZSBjb25maWd1cmVkIGRlc3RpbmF0aW9uLmApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVjaXBlLmxhbmd1YWdlID09PSAncnVieScgJiYgKGVudi5PVEVMX01FVFJJQ1NfRVhQT1JURVIgPT09ICdvdGxwJyB8fCBlbnYuT1RFTF9MT0dTX0VYUE9SVEVSID09PSAnb3RscCcpKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZihjb250YWluZXIpLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOnJ1YnlTaWduYWxzVW5zdXBwb3J0ZWQnLFxuICAgICAgICAnVGhlIGJ1bmRsZWQgUnVieSBGYXJnYXRlIGFnZW50IGNvbnRhaW5zIHRoZSB0cmFjZSBTREsgb25seTsgaXQgY2Fubm90IGdlbmVyYXRlIE9UTFAgbWV0cmljcyBvciBsb2dzLicpO1xuICAgIH1cbiAgICBpZiAoZGVzdGluYXRpb24ucHJvZmlsZXMpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKGNvbnRhaW5lcikuYWRkV2FybmluZ1YyKCdAb2RpZ29zL2F3cy1jZGs6cHJvZmlsZXNVbnN1cHBvcnRlZCcsXG4gICAgICAgICdUaGUgYnVuZGxlZCBGYXJnYXRlIGxhbmd1YWdlIGFnZW50cyBkbyBub3QgZ2VuZXJhdGUgT1RMUCBwcm9maWxlcy4gT3RoZXIgc2VsZWN0ZWQgc2lnbmFscyByZW1haW4gZW5hYmxlZC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzID0gcmVuZGVyT3RscEhlYWRlcnMoZGVzdGluYXRpb24uaGVhZGVycyk7XG4gICAgaWYgKGhlYWRlcnMpIHtcbiAgICAgIGVudltFTlZfT1RMUF9IRUFERVJTXSA9IGhlYWRlcnM7XG4gICAgfVxuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICBlbnZbRU5WX09URUxfTE9HX0xFVkVMXSA9ICdkZWJ1Zyc7XG4gICAgfVxuXG4gICAgZW52W0VOVl9JQUNfTUFSS0VSXSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHY6IE1BUktFUl9WRVJTSU9OLFxuICAgICAgc291cmNlOiAnY2RrJyxcbiAgICAgIHZlcnNpb246IE9ESUdPU19WRVJTSU9OIHx8ICd1bnJlbGVhc2VkJyxcbiAgICAgIGxhbmc6IGxhbmd1YWdlS2V5T2YodGFyZ2V0Lmxhbmd1YWdlKSxcbiAgICAgIGltYWdlOiB0aGlzLmFnZW50c0ltYWdlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVudjtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB2YWx1ZSB0aGUgY29udGFpbmVyIHdhcyBjcmVhdGVkIHdpdGggZm9yIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLCBvciB1bmRlZmluZWQuXG4gKlxuICogYENvbnRhaW5lckRlZmluaXRpb25gIGtlZXBzIGl0cyBlbnZpcm9ubWVudCBwcml2YXRlIGFuZCBvZmZlcnMgYGFkZEVudmlyb25tZW50YCBidXQgbm8gcmVhZGVyLCBzbyB0aGlzXG4gKiByZWFjaGVzIGZvciB0aGUgZmllbGQuIFRoYXQgaXMgYSBjb250YWluZWQgaGFjayB3aXRoIGEgc3BlY2lmaWMgYWx0ZXJuYXRpdmU6IHdpdGhvdXQgaXQsIGFwcGVuZGluZyB0byBhXG4gKiBsb2FkZXIgdmFyaWFibGUgd291bGQgbWVhbiBBU1NJR05JTkcgb3ZlciBpdCwgYW5kIGEgY29udGFpbmVyIHdob3NlIGBOT0RFX09QVElPTlNgIGNhcnJpZXMgYSBmbGFnIGl0c1xuICogYXBwbGljYXRpb24gbmVlZHMgdG8gYm9vdCB3b3VsZCBzdG9wIGJvb3RpbmcgdGhlIG1vbWVudCBpdCB3YXMgaW5zdHJ1bWVudGVkLiBgZXhpc3RpbmdMb2FkZXJWYWx1ZWAgb25cbiAqIHRoZSB0YXJnZXQgaXMgdGhlIGRvY3VtZW50ZWQgZXNjYXBlIGhhdGNoIGlmIHRoaXMgZXZlciBzdG9wcyB3b3JraW5nOyBhIHNoYXBlIHRoYXQgaXMgbm90IGEgcGxhaW4gb2JqZWN0XG4gKiBkZWdyYWRlcyB0byBcIm5vdGhpbmcgdGhlcmVcIiwgd2hpY2ggaXMgdGhlIHNhbWUgYW5zd2VyIGFzIGFuIHVuaW5zdHJ1bWVudGVkIGNvbnRhaW5lci5cbiAqL1xuZnVuY3Rpb24gY29udGFpbmVyRW52VmFsdWUoY29udGFpbmVyOiBlY3MuQ29udGFpbmVyRGVmaW5pdGlvbiwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW52ID0gKGNvbnRhaW5lciBhcyB1bmtub3duIGFzIHsgZW52aXJvbm1lbnQ/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IH0pLmVudmlyb25tZW50O1xuICBpZiAoIWVudiB8fCB0eXBlb2YgZW52ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBlbnZbbmFtZV07XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVuZGVycyBgT1RFTF9FWFBPUlRFUl9PVExQX0hFQURFUlNgIOKAlCBhIGNvbW1hLXNlcGFyYXRlZCBga2V5PXZhbHVlYCBsaXN0LCBrZXlzIHNvcnRlZCBzbyB0aGUgcmVuZGVyZWRcbiAqIHZhbHVlIGlzIGJ5dGUtc3RhYmxlIGFjcm9zcyBzeW50aHMgYW5kIGFuIHVuY2hhbmdlZCBkZXN0aW5hdGlvbiBuZXZlciBsb29rcyBsaWtlIGEgY2hhbmdlLlxuICovXG5mdW5jdGlvbiByZW5kZXJPdGxwSGVhZGVycyhoZWFkZXJzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gIGlmICghaGVhZGVycykge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVycykuc29ydCgpO1xuICByZXR1cm4ga2V5cy5tYXAoKGspID0+IGAke2t9PSR7aGVhZGVyc1trXX1gKS5qb2luKCcsJyk7XG59XG4iXX0=
|
|
443
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFyZ2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYXJnYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQThEO0FBQzlELDJDQUEyQztBQUMzQywyQ0FBdUM7QUFDdkMseURBQWlHO0FBQ2pHLGlEQU02QjtBQUM3QiwrQ0FBb0Q7QUFDcEQsdURBUzJCO0FBQzNCLG1DQUFtRTtBQUVuRSxrRUFBa0U7QUFDbEUsTUFBTSxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQztBQUM3QyxzRkFBc0Y7QUFDdEYsTUFBTSx1QkFBdUIsR0FBRywwQkFBMEIsQ0FBQztBQUMzRCx3R0FBd0c7QUFDeEcsTUFBTSxpQkFBaUIsR0FBRyw2QkFBNkIsQ0FBQztBQUN4RCxzRUFBc0U7QUFDdEUsTUFBTSxpQkFBaUIsR0FBRyw2QkFBNkIsQ0FBQztBQUN4RCxxRUFBcUU7QUFDckUsTUFBTSxnQkFBZ0IsR0FBRyw0QkFBNEIsQ0FBQztBQUN0RCw4REFBOEQ7QUFDOUQsTUFBTSxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUM1Qyw4Q0FBOEM7QUFDOUMscURBQXFEO0FBR3JEOzs7R0FHRztBQUNILE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUV6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQztBQUVwQyxnRkFBZ0Y7QUFDaEYsTUFBTSxvQkFBb0IsR0FBRyxhQUFhLENBQUM7QUFFM0M7Ozs7R0FJRztBQUNILE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0FBbUlsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0RHO0FBQ0gsTUFBYSw0QkFBNkIsU0FBUSxzQkFBUztJQVF6RCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXdDO1FBQ2hGLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7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QixDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3BMLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBMYXp5LCBTdGFjaywgVG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBlY3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IHJlc29sdmVkU2lnbmFscywgc2lnbmFsQWN0aXZhdGlvbiwgc2lnbmFsVHJhbnNwb3J0T3ZlcnJpZGVzIH0gZnJvbSAnLi9jb2xsZWN0b3ItY29uZmlnJztcbmltcG9ydCB7XG4gIEZBUkdBVEVfQUdFTlRTX0RJUixcbiAgRkFSR0FURV9BR0VOVFNfSU1BR0UsXG4gIEZBUkdBVEVfTUFYX0NPTlRBSU5FUlMsXG4gIEZBUkdBVEVfU0lERUNBUl9DT05UQUlORVJfTkFNRSxcbiAgRkFSR0FURV9WT0xVTUVfTkFNRSxcbn0gZnJvbSAnLi9nZW5lcmF0ZWQvZmFyZ2F0ZSc7XG5pbXBvcnQgeyBPRElHT1NfVkVSU0lPTiB9IGZyb20gJy4vZ2VuZXJhdGVkL2xheWVycyc7XG5pbXBvcnQge1xuICBGYXJnYXRlUmVjaXBlLFxuICBldmFsdWF0ZUFwcGVuZFBhdHRlcm4sXG4gIGV4cG9ydFRhcmdldEZvcixcbiAgZmFyZ2F0ZVJlc291cmNlQXR0cmlidXRlcyxcbiAgbGFuZ3VhZ2VLZXlPZixcbiAgcG9ydFByb3RvY29sTWlzbWF0Y2gsXG4gIHJlY2lwZUZvcixcbiAgc2lkZWNhckNvbW1hbmQsXG59IGZyb20gJy4vZmFyZ2F0ZS1yZWNpcGVzJztcbmltcG9ydCB7IE9kaWdvc0Rlc3RpbmF0aW9uLCBPZGlnb3NGYXJnYXRlTGFuZ3VhZ2UgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqIFNlcnZpY2UgbmFtZSByZXBvcnRlZCBvbiBldmVyeSBzcGFuLCBtZXRyaWMgYW5kIGxvZyByZWNvcmQuICovXG5jb25zdCBFTlZfU0VSVklDRV9OQU1FID0gJ09URUxfU0VSVklDRV9OQU1FJztcbi8qKiBSZXNvdXJjZSBhdHRyaWJ1dGVzIGFkZGVkIHRvIGV2ZXJ5IHJlY29yZDogY2xvdWQgcHJvdmlkZXIsIHBsYXRmb3JtIGFuZCByZWdpb24uICovXG5jb25zdCBFTlZfUkVTT1VSQ0VfQVRUUklCVVRFUyA9ICdPVEVMX1JFU09VUkNFX0FUVFJJQlVURVMnO1xuLyoqIFdoZXJlIHRoZSBhZ2VudCBleHBvcnRzIE9UTFAuIE9uIEZhcmdhdGUgdGhpcyBpcyB0aGUgcmVhbCBkZXN0aW5hdGlvbiwgbm90IGEgbG9jYWxob3N0IGNvbGxlY3Rvci4gKi9cbmNvbnN0IEVOVl9PVExQX0VORFBPSU5UID0gJ09URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVCc7XG4vKiogVGhlIHRyYW5zcG9ydCBmb3IgdGhlIGVuZHBvaW50IGFib3ZlLiBUaGUgdHdvIGFyZSBvbmUgZGVjaXNpb24uICovXG5jb25zdCBFTlZfT1RMUF9QUk9UT0NPTCA9ICdPVEVMX0VYUE9SVEVSX09UTFBfUFJPVE9DT0wnO1xuLyoqIFBlci1yZXF1ZXN0IGhlYWRlcnMsIGluIHByYWN0aWNlIHRoZSBkZXN0aW5hdGlvbidzIGNyZWRlbnRpYWwuICovXG5jb25zdCBFTlZfT1RMUF9IRUFERVJTID0gJ09URUxfRVhQT1JURVJfT1RMUF9IRUFERVJTJztcbi8qKiBSYWlzZXMgYWdlbnQgdmVyYm9zaXR5IGludG8gdGhlIGNvbnRhaW5lcidzIGxvZyBzdHJlYW0uICovXG5jb25zdCBFTlZfT1RFTF9MT0dfTEVWRUwgPSAnT1RFTF9MT0dfTEVWRUwnO1xuLyoqIFRoZSB0aHJlZSBwZXItc2lnbmFsIGV4cG9ydGVyIHN3aXRjaGVzLiAqL1xuLyoqIFZhbHVlIGEgc3VwcG9ydGVkIHNpZ25hbCdzIGV4cG9ydGVyIGlzIHNldCB0by4gKi9cblxuXG4vKipcbiAqIFNjaGVtYSB2ZXJzaW9uIG9mIHRoZSBtYXJrZXIgcGF5bG9hZC4gTXVzdCBtYXRjaCBgYXBpLklhQ01hcmtlclZlcnNpb25gIGluIHRoZSBjb25uZWN0b3Ig4oCUIGl0IGlzIHdoYXRcbiAqIHRlbGxzIHRoZSBjb25uZWN0b3IgaG93IHRvIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIG9iamVjdCwgc28gYSBidW1wZWQgdmVyc2lvbiB0aGVyZSBpcyBhIGNoYW5nZSBoZXJlLlxuICovXG5jb25zdCBNQVJLRVJfVkVSU0lPTiA9IDE7XG5cbi8qKlxuICogYE9ESUdPU19JQUNgIOKAlCB0aGUgbWFya2VyIHJlY29yZGluZyB0aGF0IHRoaXMgY29udGFpbmVyIHdhcyBpbnN0cnVtZW50ZWQgYnkgT2RpZ29zIElhQyB0b29saW5nLCBieVxuICogd2hpY2ggcGFja2FnZSB2ZXJzaW9uLCBhbmQgZm9yIHdoaWNoIGxhbmd1YWdlLlxuICpcbiAqIEl0IGlzIFBFUiBDT05UQUlORVIsIGFuZCBpdCBpcyB0aGUgb25seSB0aGluZyB0aGF0IG1ha2VzIE9kaWdvcyByZXBvcnQgYSBjb250YWluZXIgYXMgaW5zdHJ1bWVudGVkXG4gKiByYXRoZXIgdGhhbiBcImF3YWl0aW5nIHlvdXIgZGVwbG95bWVudFwiIOKAlCBob3dldmVyIGNvbXBsZXRlbHkgdGhlIHJlc3Qgb2YgdGhlIHdpcmluZyBpcyBhcHBsaWVkLiBBIHRhc2tcbiAqIGRlZmluaXRpb24gaG9sZGluZyB0d28gYXBwbGljYXRpb25zIG5lZWRzIGl0IG9uIGJvdGguXG4gKlxuICogVGhlIGBsYW5nYCBmaWVsZCBpcyBsb2FkLWJlYXJpbmcuIFRoZSBjb25uZWN0b3IncyBjb25mb3JtYW5jZSBjaGVjayByZWNvbnN0cnVjdHMgdGhlIGNvbnRhaW5lcidzXG4gKiBleHBlY3RlZCBhY3RpdmF0aW9uIGVudmlyb25tZW50IGZyb20gdGhlIHJlY29yZGVkIGxhbmd1YWdlLCBzbyBpdCBpcyB3aGF0IG1ha2VzIFwiaXMgdGhpcyBjb250YWluZXJcbiAqIGNvcnJlY3RseSBpbnN0cnVtZW50ZWRcIiBhbnN3ZXJhYmxlIGF0IGFsbCDigJQgYW5kIGl0IGlzIGNyb3NzLWNoZWNrZWQgYWdhaW5zdCB0aGUgbGFuZ3VhZ2UgdGhlIGNvbm5lY3RvclxuICogcmVzb2x2ZXMgaW5kZXBlbmRlbnRseSwgd2hpY2ggaXMgaG93IGFuIGltYWdlIHN3YXBwZWQgdW5kZXJuZWF0aCB0aGUgaW5zdHJ1bWVudGF0aW9uIGlzIGNhdWdodC5cbiAqXG4gKiBgaW1hZ2VgIGlzIHRoZSBvdGhlciBvbmUsIGFuZCBpdCBpcyB0aGUgRmFyZ2F0ZSBjb3VudGVycGFydCBvZiB3aGF0IExhbWJkYSByZWNvcmRzIGFzIGBsYXllcmAuIFRoZVxuICogY29ubmVjdG9yIGNvbXBhcmVzIHRoZSBzdGFnaW5nIGNvbnRhaW5lcidzIGltYWdlIGFnYWluc3QgdGhlIG9uZSByZWNvcmRlZCBIRVJFIHJhdGhlciB0aGFuIGFnYWluc3QgdGhlXG4gKiBidW5kbGUgaXRzIG93biBidWlsZCBoYXBwZW5zIHRvIHBpbiwgc28gYSBwYWNrYWdlIHJlbGVhc2VkIGFoZWFkIG9mIHRoZSBjb25uZWN0b3IgaXMgbm90IHJlcG9ydGVkIGFzXG4gKiBkcmlmdCBvbiBldmVyeSB0YXNrIGluIHRoZSBhY2NvdW50IHRoZSBkYXkgaXQgbGFuZHMuIFJlY29yZGluZyBpdCBpcyBhbHNvIHdoYXQgbWFrZXMgYGFnZW50c0ltYWdlYFxuICogc2FmZTogYSBtaXJyb3JlZCBpbWFnZSBpcyBqdWRnZWQgYWdhaW5zdCBpdHNlbGYgaW5zdGVhZCBvZiBhZ2FpbnN0IGEgcmVnaXN0cnkgdGhlIGN1c3RvbWVyIGRlbGliZXJhdGVseVxuICogbW92ZWQgYXdheSBmcm9tLlxuICpcbiAqIEl0IGlzIE5PVCBgT0RJR09TX01BTkFHRURgLCBhbmQgdGhpcyBjb25zdHJ1Y3QgbmV2ZXIgd3JpdGVzIHRoYXQgb25lLiBUaGF0IGlzIHRoZSBjb25uZWN0b3IncyBvd25cbiAqIHJlY29yZCBvZiBhIG11dGF0aW9uIElUIHBlcmZvcm1lZCwgd2hvc2UgcGF5bG9hZCBpcyB0aGUgc25hcHNob3QgaXQgcmVzdG9yZXMgZnJvbSBvbiByb2xsYmFjay4gQSBDREtcbiAqIHN0YWNrIGhhcyBubyBzdWNoIHNuYXBzaG90IHRvIG9mZmVyLCBiZWNhdXNlIG5vdGhpbmcgd2FzIG11dGF0ZWQg4oCUIHRoZSBjb250YWluZXIgZGVmaW5pdGlvbiBiZWxvdyBJU1xuICogdGhlIGNvbnRhaW5lcidzIGRlZmluaXRpb24uIFdyaXRpbmcgaXQgYnkgaGFuZCB3b3VsZCBjbGFpbSBhIHJvbGxiYWNrIG5vYm9keSByZWNvcmRlZCwgYW5kIHRoZVxuICogY29ubmVjdG9yIHdvdWxkIHRoZW4ganVkZ2UgdGhlIGNvbnRhaW5lciBhZ2FpbnN0IHZhbHVlcyB0aGF0IGRvIG5vdCBleGlzdC5cbiAqL1xuY29uc3QgRU5WX0lBQ19NQVJLRVIgPSAnT0RJR09TX0lBQyc7XG5cbi8qKiBDb25zdHJ1Y3QgaWQgb2YgdGhlIHN0YWdpbmcgY29udGFpbmVyIGluc2lkZSB0aGUgdGFzayBkZWZpbml0aW9uJ3Mgc2NvcGUuICovXG5jb25zdCBTSURFQ0FSX0NPTlNUUlVDVF9JRCA9ICdPZGlnb3NBZ2VudCc7XG5cbi8qKlxuICogTWVtb3J5IHJlc2VydmF0aW9uIGZvciB0aGUgc3RhZ2luZyBjb250YWluZXIgb24gYW4gRUMyLW9ubHkgdGFzayBkZWZpbml0aW9uLCB3aGVyZSBFQ1MgcmVxdWlyZXMgZXZlcnlcbiAqIGNvbnRhaW5lciB0byBkZWNsYXJlIGl0cyBvd24gaWYgdGhlIHRhc2sgZG9lcyBub3QuIE5ldmVyIHNldCBvbiBhIEZhcmdhdGUgdGFzayBkZWZpbml0aW9uIOKAlCBzZWUgdGhlXG4gKiBjYWxsIHNpdGUuXG4gKi9cbmNvbnN0IFNJREVDQVJfRUMyX01FTU9SWV9NSUIgPSA2NDtcblxuLyoqXG4gKiBPcHRpb25zIHNoYXJlZCBieSBldmVyeSBjb250YWluZXIgdGhpcyBjb25zdHJ1Y3QgaW5zdHJ1bWVudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zRmFyZ2F0ZUluc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogV2hlcmUgdGhlIGluc3RydW1lbnRlZCBjb250YWluZXJzIGV4cG9ydCB0ZWxlbWV0cnkgdG8uXG4gICAqXG4gICAqIFVubGlrZSBMYW1iZGEsIEJPVEggdHJhbnNwb3J0cyBtYXkgYmUgc2V0IGFuZCBvZnRlbiBzaG91bGQgYmU6IGEgRmFyZ2F0ZSB0YXNrIGhhcyBubyBjb2xsZWN0b3Igb2YgaXRzXG4gICAqIG93biwgc28gZWFjaCBsYW5ndWFnZSdzIGFnZW50IGV4cG9ydHMgdG8gdGhpcyBkZXN0aW5hdGlvbiBpdHNlbGYgYW5kIHRha2VzIHRoZSB0cmFuc3BvcnQgaXQgcHJlZmVycy5cbiAgICogcGhwIGFuZCBydWJ5IGNhbiBvbmx5IHNwZWFrIE9UTFAvSFRUUCBhdCBhbGwuXG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbjogT2RpZ29zRGVzdGluYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBhZ2VudHMgYnVuZGxlIHRoZSBzdGFnaW5nIGNvbnRhaW5lciBjb3BpZXMgdGhlIGxhbmd1YWdlIGFnZW50cyBvdXQgb2YuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBtdWx0aS1hcmNoIGltYWdlIHRoaXMgcGFja2FnZSdzIHJlbGVhc2UgcHVibGlzaGVkLCBhdCB0aGF0IHJlbGVhc2UncyBpbW11dGFibGUgdGFnLlxuICAgKiBPdmVycmlkZSBpdCB0byBtaXJyb3IgdGhlIGltYWdlIGludG8gYSByZWdpc3RyeSB5b3VyIHRhc2tzIGNhbiByZWFjaCDigJQgdGhlIGltYWdlIGlzIHB1bGxlZCBieSBZT1VSXG4gICAqIHRhc2sncyBleGVjdXRpb24gcm9sZSBhdCBldmVyeSB0YXNrIHN0YXJ0LCBzbyBhIHRhc2sgaW4gYSBwcml2YXRlIHN1Ym5ldCB3aXRoIG5vIE5BVCBhbmQgbm9cbiAgICogaW50ZXJmYWNlIGVuZHBvaW50IGNhbm5vdCBwdWxsIHRoZSBkZWZhdWx0LlxuICAgKlxuICAgKiBBIG1pcnJvciBtdXN0IGJlIHRoZSBzYW1lIGJ1bmRsZTogdGhlIGFjdGl2YXRpb24gZW52aXJvbm1lbnQgc2V0IGJlbG93IG5hbWVzIGV4YWN0IHBhdGhzIGluc2lkZSBpdC5cbiAgICpcbiAgICogV2hhdGV2ZXIgeW91IHBhc3MgaXMgUkVDT1JERUQgaW4gdGhlIGBPRElHT1NfSUFDYCBtYXJrZXIsIGFuZCB0aGUgY29ubmVjdG9yIGhvbGRzIHRoZSB0YXNrIGRlZmluaXRpb25cbiAgICogdG8gdGhlIHJlY29yZGVkIGltYWdlIHJhdGhlciB0aGFuIHRvIHRoZSBidW5kbGUgaXRzIG93biBidWlsZCBwaW5zIOKAlCBzbyBhIG1pcnJvciBpcyBqdWRnZWQgYWdhaW5zdFxuICAgKiBpdHNlbGYsIGFuZCB0aGlzIGRvZXMgbm90IGhhdmUgdG8gYmUga2VwdCBpbiBzdGVwIHdpdGggdGhlIGNvbm5lY3RvcidzIHZlcnNpb24gdG8gc3RheSBjb25mb3JtYW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSByZWxlYXNlZCBgcmVnaXN0cnkub2RpZ29zLmlvL29kaWdvcy1mYXJnYXRlLWFnZW50c2AgaW1hZ2UgZm9yIHRoaXMgcGFja2FnZSB2ZXJzaW9uXG4gICAqL1xuICByZWFkb25seSBhZ2VudHNJbWFnZT86IHN0cmluZztcblxuICAvKipcbiAgICogUmFpc2UgYWdlbnQgdmVyYm9zaXR5IChgT1RFTF9MT0dfTEVWRUw9ZGVidWdgKSBvbiBldmVyeSBpbnN0cnVtZW50ZWQgY29udGFpbmVyLlxuICAgKlxuICAgKiBVc2VmdWwgd2hpbGUgd2lyaW5nIHVwIGEgZGVzdGluYXRpb24sIGV4cGVuc2l2ZSB0byBsZWF2ZSBvbiDigJQgYW5kIGl0IGlzIGNvbXBhcmVkOiB0aGUgY29ubmVjdG9yXG4gICAqIGV4cGVjdHMgdGhlIHZhcmlhYmxlIEFCU0VOVCB1bmxlc3MgZGVidWcgdGVsZW1ldHJ5IGlzIGVuYWJsZWQgZm9yIHRoZSBjb25uZWN0b3IgdG9vLCBzbyBsZWF2aW5nIHRoaXNcbiAgICogb24gY2FuIGl0c2VsZiBiZSByZXBvcnRlZCBhcyBkcmlmdC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRlYnVnPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPbmUgY29udGFpbmVyIHRvIGluc3RydW1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zRmFyZ2F0ZVRhcmdldCB7XG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24gY29udGFpbmVyLiBJdHMgdGFzayBkZWZpbml0aW9uIGlzIHRha2VuIGZyb20gaXQsIHNvIHRoZSBzdGFnaW5nIGNvbnRhaW5lciwgdGhlIHNoYXJlZFxuICAgKiB2b2x1bWUgYW5kIHRoZSBzdGFydHVwIGRlcGVuZGVuY3kgYXJlIGFkZGVkIHRvIHRoZSByaWdodCBvbmUgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lcjogZWNzLkNvbnRhaW5lckRlZmluaXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSB3aG9zZSBhZ2VudCB0byBzdGFnZSBhbmQgYWN0aXZhdGUuXG4gICAqXG4gICAqIFN0YXRlZCByYXRoZXIgdGhhbiBkZXRlY3RlZCDigJQgYSBjb250YWluZXIgZGVjbGFyZXMgYW4gaW1hZ2UsIG5vdCBhIHJ1bnRpbWUsIGFuZCByZXNvbHZpbmcgYSBsYW5ndWFnZVxuICAgKiBmcm9tIGFuIGltYWdlIG1lYW5zIHB1bGxpbmcgaXQuXG4gICAqL1xuICByZWFkb25seSBsYW5ndWFnZTogT2RpZ29zRmFyZ2F0ZUxhbmd1YWdlO1xuXG4gIC8qKlxuICAgKiBgT1RFTF9TRVJWSUNFX05BTUVgIGZvciB0aGlzIGNvbnRhaW5lci5cbiAgICpcbiAgICogVEhJUyBNVVNUIE1BVENIIFRIRSBXT1JLTE9BRCdTIE5BTUUgSU4gT0RJR09TLCB3aGljaCBmb3IgYSBGYXJnYXRlIHdvcmtsb2FkIGlzIHRoZSBFQ1MgU0VSVklDRSBuYW1lIOKAlFxuICAgKiBub3QgdGhlIHRhc2sgZGVmaW5pdGlvbiBmYW1pbHkgYW5kIG5vdCB0aGUgY29udGFpbmVyIG5hbWUuIEEgZGlmZmVyZW50IHZhbHVlIGlzIHJlcG9ydGVkIGFzXG4gICAqIGluc3RydW1lbnRhdGlvbiBkcmlmdCByYXRoZXIgdGhhbiB0cmVhdGVkIGFzIGEgbmFtaW5nIHByZWZlcmVuY2UuXG4gICAqXG4gICAqIFBhc3MgYHNlcnZpY2VgIGluc3RlYWQgdG8gcmVhZCBpdCBvZmYgdGhlIHNlcnZpY2UsIG9yIHNldCB0aGlzIHdoZW4gdGhlIHNlcnZpY2UgaXMgZGVmaW5lZCBlbHNld2hlcmVcbiAgICogKGEgZGlmZmVyZW50IHN0YWNrLCBUZXJyYWZvcm0sIHRoZSBjb25zb2xlKS4gT25lIG9mIHRoZSB0d28gaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGFrZW4gZnJvbSBgc2VydmljZWBcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRUNTIHNlcnZpY2UgdGhhdCBydW5zIHRoaXMgdGFzayBkZWZpbml0aW9uLCB1c2VkIG9ubHkgdG8gcmVhZCBpdHMgbmFtZS5cbiAgICpcbiAgICogSXRzIHBoeXNpY2FsIG5hbWUgaGFzIHRvIGJlIG9uZSB5b3VyIHN0YWNrIFNFVCwgbm90IG9uZSBDbG91ZEZvcm1hdGlvbiBnZW5lcmF0ZXM6IGEgZ2VuZXJhdGVkIG5hbWUgaXNcbiAgICogYSBgUmVmYCB0byB0aGUgc2VydmljZSwgYW5kIGEgc2VydmljZSdzIG93biB0YXNrIGRlZmluaXRpb24gcmVmZXJlbmNpbmcgaXQgaXMgYSBkZXBlbmRlbmN5IGN5Y2xlXG4gICAqIENsb3VkRm9ybWF0aW9uIHJlamVjdHMgYXQgZGVwbG95IHRpbWUuIEEgZ2VuZXJhdGVkIG5hbWUgdGhyb3dzIGF0IHN5bnRoIHBvaW50aW5nIGF0IGBzZXJ2aWNlTmFtZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYHNlcnZpY2VOYW1lYCBtdXN0IGJlIGdpdmVuIGluc3RlYWRcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2U/OiBlY3MuQmFzZVNlcnZpY2U7XG5cbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbidzIHJ1bnRpbWUgdmVyc2lvbiBhcyBgbWFqb3IubWlub3JgIOKAlCBmb3IgZXhhbXBsZSBgXCI4LjNcImAuXG4gICAqXG4gICAqIFJlcXVpcmVkIGZvciBwaHAgYW5kIHJ1YnksIHdob3NlIGFnZW50cyBhcmUgbGFpZCBkb3duIHBlciBydW50aW1lIHZlcnNpb24gaW4gdGhlIGJ1bmRsZSwgYW5kIHRoZVxuICAgKiB2ZXJzaW9uIHNlbGVjdHMgdGhlIHBhdGggdGhlaXIgYWN0aXZhdGlvbiB2YXJpYWJsZXMgcG9pbnQgYXQuIElnbm9yZWQgYnkgZXZlcnkgb3RoZXIgbGFuZ3VhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZTsgcmVxdWlyZWQgZm9yIHBocCBhbmQgcnVieVxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0aGlzIGNvbnRhaW5lciBhbHJlYWR5IG5lZWRzIGluIGl0cyBsb2FkZXIgdmFyaWFibGUgKGBKQVZBX1RPT0xfT1BUSU9OU2AsIGBOT0RFX09QVElPTlNgIG9yXG4gICAqIGBQWVRIT05QQVRIYCksIHdoaWNoIHRoZSBPZGlnb3MgZnJhZ21lbnQgaXMgam9pbmVkIHRvIHJhdGhlciB0aGFuIHJlcGxhY2luZy5cbiAgICpcbiAgICogT25seSBuZWVkZWQgYXMgYW4gT1ZFUlJJREUuIFRoZSBjb25zdHJ1Y3QgcmVhZHMgdGhlIHZhbHVlIHRoZSBjb250YWluZXIgd2FzIGNyZWF0ZWQgd2l0aCBhbmQgYXBwZW5kc1xuICAgKiB0byBpdCwgc28gYSBjb250YWluZXIgdGhhdCBzZXRzIGl0cyBvd24gYEpBVkFfVE9PTF9PUFRJT05TYCBpbiBgYWRkQ29udGFpbmVyYCBrZWVwcyBpdC4gUGFzcyB0aGlzIHdoZW5cbiAgICogdGhlIHZhbHVlIGlzIG5vdCB2aXNpYmxlIGF0IHN5bnRoIOKAlCBzZXQgYnkgYW4gYGVudmlyb25tZW50RmlsZXNgIGVudHJ5LCBpbmplY3RlZCBieSB0aGUgaW1hZ2UncyBvd25cbiAgICogYEVOVmAsIG9yIG1vdmUgc2VjcmV0LXN1cHBsaWVkIGxvYWRlciBzZXR0aW5ncyB0byBvcmRpbmFyeSBjb25maWd1cmF0aW9uIGZpcnN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHJlYWQgZnJvbSB0aGUgY29udGFpbmVyJ3Mgb3duIGVudmlyb25tZW50XG4gICAqL1xuICByZWFkb25seSBleGlzdGluZ0xvYWRlclZhbHVlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciB7QGxpbmsgT2RpZ29zRmFyZ2F0ZUluc3RydW1lbnRhdGlvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zRmFyZ2F0ZUluc3RydW1lbnRhdGlvblByb3BzIGV4dGVuZHMgT2RpZ29zRmFyZ2F0ZUluc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogQ29udGFpbmVycyB0byBpbnN0cnVtZW50IG9uIGNvbnN0cnVjdGlvbi4gTW9yZSBjYW4gYmUgYWRkZWQgd2l0aCBgaW5zdHJ1bWVudCgpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRzPzogT2RpZ29zRmFyZ2F0ZVRhcmdldFtdO1xufVxuXG4vKiogUGVyLXRhc2stZGVmaW5pdGlvbiBzdGF0ZTogdGhlIHN0YWdpbmcgY29udGFpbmVyLCBhbmQgd2hhdCBpdCBoYXMgYmVlbiBhc2tlZCB0byBzdGFnZS4gKi9cbmludGVyZmFjZSBUYXNrRGVmaW5pdGlvblN0YXRlIHtcbiAgcmVhZG9ubHkgc2lkZWNhcjogZWNzLkNvbnRhaW5lckRlZmluaXRpb247XG4gIHJlYWRvbmx5IGFnZW50c0ltYWdlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFnZW50RGlyczogU2V0PHN0cmluZz47XG59XG5cbi8qKlxuICogSW5zdHJ1bWVudHMgRUNTIEZhcmdhdGUgY29udGFpbmVycyB3aXRoIHRoZSBPZGlnb3MgT3BlblRlbGVtZXRyeSBhZ2VudHMuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IG9kaWdvcyA9IG5ldyBPZGlnb3NGYXJnYXRlSW5zdHJ1bWVudGF0aW9uKHRoaXMsICdPZGlnb3MnLCB7XG4gKiAgIGRlc3RpbmF0aW9uOiB7IGh0dHBFbmRwb2ludDogJ2h0dHBzOi8vb3RscC5leGFtcGxlLmNvbTo0MzE4JyB9LFxuICogfSk7XG4gKiBvZGlnb3MuaW5zdHJ1bWVudCh7XG4gKiAgIGNvbnRhaW5lcjogYXBpQ29udGFpbmVyLFxuICogICBsYW5ndWFnZTogT2RpZ29zRmFyZ2F0ZUxhbmd1YWdlLkpBVkEsXG4gKiAgIHNlcnZpY2U6IGFwaVNlcnZpY2UsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqICMjIFdoYXQgaXQgZG9lcyB0byB0aGUgdGFzayBkZWZpbml0aW9uXG4gKlxuICogRm91ciBtb3Zlcywgd2hpY2ggYXJlIG9uZSBtZWNoYW5pc20gYW5kIG9ubHkgd29yayB0b2dldGhlciDigJQgdGhlIEVDUyBhZGFwdGF0aW9uIG9mIHRoZSBPZGlrb3NcbiAqIGluaXQtY29udGFpbmVyIG1vdW50IG1ldGhvZDpcbiAqXG4gKiAgMS4gYSBiYXJlLW5hbWUgdGFzayB2b2x1bWUgKGBvZGlnb3MtYWdlbnRgKSwgd2hpY2ggb24gRmFyZ2F0ZSBpcyBhbiBlcGhlbWVyYWwtc3RvcmFnZSBiaW5kIG1vdW50XG4gKiAgICAgc2NvcGVkIHRvIHRoZSB0YXNrO1xuICogIDIuIGEgTk9OLUVTU0VOVElBTCBgb2RpZ29zLWFnZW50YCBjb250YWluZXIgdGhhdCBjb3BpZXMgdGhlIGxhbmd1YWdlIGFnZW50cyBvdXQgb2YgdGhlIGFnZW50cyBidW5kbGVcbiAqICAgICBpbnRvIHRoYXQgdm9sdW1lIGFuZCBleGl0cyAwO1xuICogIDMuIHRoZSB2b2x1bWUgbW91bnRlZCByZWFkLW9ubHkgYXQgYC92YXIvb2RpZ29zYCBpbiBlYWNoIGluc3RydW1lbnRlZCBjb250YWluZXIsIHdoaWNoIGRlcGVuZHMgb24gdGhlXG4gKiAgICAgc3RhZ2luZyBjb250YWluZXIgd2l0aCBjb25kaXRpb24gYFNVQ0NFU1NgIOKAlCBvbmx5IHZhbGlkIGFnYWluc3QgYSBub24tZXNzZW50aWFsIGNvbnRhaW5lciwgd2hpY2ggaXNcbiAqICAgICB3aHkgKDIpIGlzIG5vbi1lc3NlbnRpYWw7XG4gKiAgNC4gdGhlIGxhbmd1YWdlJ3MgYWN0aXZhdGlvbiBlbnZpcm9ubWVudCwgdGhlIE9UTFAgZXhwb3J0IGVudmlyb25tZW50LCBhbmQgdGhlIGBPRElHT1NfSUFDYCBtYXJrZXIgb25cbiAqICAgICBlYWNoIGluc3RydW1lbnRlZCBjb250YWluZXIuXG4gKlxuICogVGhlcmUgaXMgT05FIHN0YWdpbmcgY29udGFpbmVyIHBlciB0YXNrIGRlZmluaXRpb24gaG93ZXZlciBtYW55IGxhbmd1YWdlcyB0aGUgdGFzayBob2xkczsgaXRzIGNvbW1hbmRcbiAqIGlzIHRoZSB1bmlvbiBvZiBldmVyeSBpbnN0cnVtZW50ZWQgY29udGFpbmVyJ3MgYWdlbnQgZGlyZWN0b3JpZXMsIGFuZCBpdCBpcyBidWlsdCBsYXppbHkgc28gY29udGFpbmVyc1xuICogaW5zdHJ1bWVudGVkIGxhdGVyIGFyZSBpbmNsdWRlZC5cbiAqXG4gKiAjIyBXaGVyZSB0aGUgdGVsZW1ldHJ5IGdvZXNcbiAqXG4gKiBTdHJhaWdodCB0byB5b3VyIGRlc3RpbmF0aW9uLCBmcm9tIGluc2lkZSB0aGUgYXBwbGljYXRpb24gcHJvY2Vzcy4gVGhpcyBpcyB0aGUgc3Vic3RhbnRpdmUgZGlmZmVyZW5jZVxuICogZnJvbSBMYW1iZGE6IHRoZXJlIGlzIG5vIGNvbGxlY3RvciBpbiB0aGUgdGFzayB0byBoYW5kIGEgYmF0Y2ggdG8sIHNvIGEgc2xvdyBvciB1bnJlYWNoYWJsZSBkZXN0aW5hdGlvblxuICogaXMgZmVsdCBieSB0aGUgYXBwbGljYXRpb24ncyBvd24gZXhwb3J0ZXIgcmF0aGVyIHRoYW4gYWJzb3JiZWQgYWZ0ZXIgYSByZXNwb25zZSBoYXMgYmVlbiByZXR1cm5lZC5cbiAqXG4gKiAjIyBXaGF0IGl0IGRlbGliZXJhdGVseSBkb2VzIE5PVCBkb1xuICpcbiAqIFRoZXJlIGlzIG5vIGFzcGVjdCB0aGF0IHN3ZWVwcyBhIHNjb3BlLCBhcyB0aGVyZSBpcyBmb3IgTGFtYmRhLiBBbiBhc3BlY3QgdGhlcmUgd29ya3MgYmVjYXVzZSBhXG4gKiBmdW5jdGlvbiBERUNMQVJFUyBpdHMgcnVudGltZTsgYSBjb250YWluZXIgZGVjbGFyZXMgYW4gaW1hZ2UsIGFuZCBhIGxhbmd1YWdlIGd1ZXNzZWQgZnJvbSBhbiBpbWFnZSBuYW1lXG4gKiB3b3VsZCBzaWxlbnRseSBtaXMtaW5zdHJ1bWVudCB0aGUgb25lcyBpdCBnb3Qgd3Jvbmcg4oCUIHN0YWdpbmcgYSBKYXZhIGFnZW50IGludG8gYSBQeXRob24gY29udGFpbmVyXG4gKiBsZWF2ZXMgaXQgdW5pbnN0cnVtZW50ZWQsIGFuZCBhIGBKQVZBX1RPT0xfT1BUSU9OU2Agb24gYSBKVk0tbGVzcyBpbWFnZSBpcyBzaW1wbHkgaWdub3JlZCwgc28gbm90aGluZ1xuICogZmFpbHMgbG91ZGx5IGVub3VnaCB0byBub3RpY2UuXG4gKlxuICogIyMgRG8gbm90IGFsc28gaW5zdHJ1bWVudCB0aGVzZSBzZXJ2aWNlcyB3aXRoIHRoZSBjb25uZWN0b3JcbiAqXG4gKiBUaGUgY29ubmVjdG9yIGluc3RydW1lbnRzIGxpdmUgc2VydmljZXMgYnkgcmVnaXN0ZXJpbmcgYSBuZXcgdGFzay1kZWZpbml0aW9uIHJldmlzaW9uIGFuZCB1cGRhdGluZyB0aGVcbiAqIHNlcnZpY2UgdG8gaXQsIHJlY29uY2lsaW5nIHRvIGl0cyBvd24gZGVzaXJlZCBzdGF0ZSBvbiBldmVyeSBwYXNzLiBBIHNlcnZpY2UgaW5zdHJ1bWVudGVkIGhlcmUgYW5kIGFsc29cbiAqIGVuYWJsZWQgYXMgYSBjb25uZWN0b3Igc291cmNlIGVuZHMgdXAgb3duZWQgYnkgYm90aDogZWFjaCBgY2RrIGRlcGxveWAgcmVhc3NlcnRzIHRoZSBzdGFjaydzXG4gKiBkZWZpbml0aW9uLCBlYWNoIHJlY29uY2lsZSByZWFzc2VydHMgdGhlIGNvbm5lY3RvcidzLCBhbmQgZXZlcnkgcm91bmQgdHJpcCByZWdpc3RlcnMgYSByZXZpc2lvbiBhbmRcbiAqIHJvbGxzIHRoZSBzZXJ2aWNlLiBDaG9vc2Ugb25lIHBlciBzZXJ2aWNlLlxuICovXG5leHBvcnQgY2xhc3MgT2RpZ29zRmFyZ2F0ZUluc3RydW1lbnRhdGlvbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogT2RpZ29zRmFyZ2F0ZUluc3RydW1lbnRhdGlvbk9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWdlbnRzSW1hZ2U6IHN0cmluZztcbiAgLy8gQSB0YXNrIGNhbiBjb250YWluIHRhcmdldHMgY29uZmlndXJlZCBieSBzZXZlcmFsIGluc3RydW1lbnRhdGlvbiBjb25zdHJ1Y3RzLlxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB0YXNrRGVmaW5pdGlvbnMgPSBuZXcgV2Vha01hcDxlY3MuVGFza0RlZmluaXRpb24sIFRhc2tEZWZpbml0aW9uU3RhdGU+KCk7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IG93bmVycyA9IG5ldyBXZWFrTWFwPGVjcy5Db250YWluZXJEZWZpbml0aW9uLCBPZGlnb3NGYXJnYXRlSW5zdHJ1bWVudGF0aW9uPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RydW1lbnRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBPZGlnb3NGYXJnYXRlSW5zdHJ1bWVudGF0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMub3B0aW9ucyA9IHByb3BzO1xuXG4gICAgY29uc3QgaW1hZ2UgPSBwcm9wcy5hZ2VudHNJbWFnZSA/PyBGQVJHQVRFX0FHRU5UU19JTUFHRTtcbiAgICBpZiAoIWltYWdlKSB7XG4gICAgICAvLyBFbXB0eSBvbmx5IGluIGEgY2hlY2tvdXQgYnVpbHQgYmVmb3JlIHRoZSBmaXJzdCByZWxlYXNlLiBGYWlsaW5nIGhlcmUgaXMgdGhlIHBvaW50OiB0aGVcbiAgICAgIC8vIGFsdGVybmF0aXZlIGlzIGEgdGFzayBkZWZpbml0aW9uIHdob3NlIHN0YWdpbmcgY29udGFpbmVyIG5hbWVzIGEgdGFnIHRoYXQgZG9lcyBub3QgZXhpc3QsIHdoaWNoXG4gICAgICAvLyBzdXJmYWNlcyBhcyBhIHRhc2sgdGhhdCB3aWxsIG5vdCBzdGFydCwgYXQgZGVwbG95IHRpbWUsIGluIGEgcGxhY2UgdGhhdCBzYXlzIG5vdGhpbmcgYWJvdXQgd2h5LlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnT2RpZ29zOiB0aGlzIGJ1aWxkIG9mIEBvZGlnb3MvYXdzLWNkayBoYXMgbm8gRmFyZ2F0ZSBhZ2VudHMgaW1hZ2UgYmFrZWQgaW4g4oCUIGl0IHdhcyBidWlsdCAnICtcbiAgICAgICAgICAnYmVmb3JlIHRoZSBmaXJzdCByZWxlYXNlLiBVc2UgYSByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlLCBvciBwYXNzIGBhZ2VudHNJbWFnZWAgJyArXG4gICAgICAgICAgJ2V4cGxpY2l0bHkuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuYWdlbnRzSW1hZ2UgPSBpbWFnZTtcblxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHByb3BzLnRhcmdldHMgPz8gW10pIHtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudCh0YXJnZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0cnVtZW50cyBvbmUgY29udGFpbmVyLiBJZGVtcG90ZW50IOKAlCBpbnN0cnVtZW50aW5nIHRoZSBzYW1lIGNvbnRhaW5lciB0d2ljZSBpcyBhIG5vLW9wIHJhdGhlciB0aGFuXG4gICAqIGEgZG91YmxlZCBsb2FkZXIgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgaW5zdHJ1bWVudCh0YXJnZXQ6IE9kaWdvc0ZhcmdhdGVUYXJnZXQpOiB2b2lkIHtcbiAgICBpZiAodGFyZ2V0Lmxhbmd1YWdlID09PSBPZGlnb3NGYXJnYXRlTGFuZ3VhZ2UuRE9UTkVUICYmIC9hbHBpbmV8bXVzbC9pLnRlc3QodGFyZ2V0LmNvbnRhaW5lci5pbWFnZU5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09kaWdvcyAuTkVUIEZhcmdhdGUgaW5zdHJ1bWVudGF0aW9uIHJlcXVpcmVzIGdsaWJjOyBBbHBpbmUvbXVzbCBpbWFnZXMgYXJlIHVuc3VwcG9ydGVkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRhcmdldC5jb250YWluZXI7XG4gICAgY29uc3Qga2V5ID0gY29udGFpbmVyLm5vZGUucGF0aDtcbiAgICBpZiAodGhpcy5pbnN0cnVtZW50ZWQuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvd25lciA9IE9kaWdvc0ZhcmdhdGVJbnN0cnVtZW50YXRpb24ub3duZXJzLmdldChjb250YWluZXIpO1xuICAgIGlmIChvd25lciAmJiBvd25lciAhPT0gdGhpcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBPZGlnb3M6IGNvbnRhaW5lciBcIiR7Y29udGFpbmVyLmNvbnRhaW5lck5hbWV9XCIgaXMgYWxyZWFkeSBpbnN0cnVtZW50ZWQuIFJldXNlIGl0cyBvcmlnaW5hbCBpbnN0cnVtZW50YXRpb24gY29uc3RydWN0LmApO1xuICAgIH1cbiAgICBjb25zdCB0YXNrRGVmaW5pdGlvbiA9IGNvbnRhaW5lci50YXNrRGVmaW5pdGlvbjtcbiAgICBjb25zdCByZWNpcGUgPSByZWNpcGVGb3IodGFyZ2V0Lmxhbmd1YWdlLCB0YXJnZXQucnVudGltZVZlcnNpb24pO1xuICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gdGhpcy5yZXNvbHZlU2VydmljZU5hbWUodGFyZ2V0KTtcblxuICAgIHRoaXMuY2hlY2tUYXNrRGVmaW5pdGlvbih0YXNrRGVmaW5pdGlvbiwgY29udGFpbmVyKTtcbiAgICAvLyBWYWxpZGF0ZSB0aGUgZGVzdGluYXRpb24sIHNpZ25hbHMgYW5kIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24gYmVmb3JlIGFkZGluZyBhbnkgdGFzayByZXNvdXJjZXMuXG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSB0aGlzLmVudmlyb25tZW50Rm9yKHRhcmdldCwgcmVjaXBlLCBzZXJ2aWNlTmFtZSk7XG4gICAgY29uc3Qgc2VjcmV0cyA9IGNvbnRhaW5lci5yZW5kZXJDb250YWluZXJEZWZpbml0aW9uKHRhc2tEZWZpbml0aW9uKS5zZWNyZXRzO1xuICAgIGNvbnN0IHNlY3JldE5hbWVzID0gQXJyYXkuaXNBcnJheShzZWNyZXRzKSA/IHNlY3JldHMuZmxhdE1hcChzZWNyZXQgPT4gJ25hbWUnIGluIHNlY3JldCA/IFtzZWNyZXQubmFtZV0gOiBbXSkgOiBbXTtcbiAgICBjb25zdCBjb25mbGljdHMgPSBzZWNyZXROYW1lcy5maWx0ZXIobmFtZSA9PiBuYW1lIGluIGVudmlyb25tZW50IHx8IHNpZ25hbFRyYW5zcG9ydE92ZXJyaWRlcygpLmluY2x1ZGVzKG5hbWUpKTtcbiAgICBpZiAoY29uZmxpY3RzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBPZGlnb3M6IHJlbW92ZSBjb25mbGljdGluZyBzZWNyZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlZm9yZSBpbnN0cnVtZW50YXRpb246ICR7Y29uZmxpY3RzLmpvaW4oJywgJyl9LiBFQ1MgY2Fubm90IHNhZmVseSBjb21iaW5lIHRoZXNlIHdpdGggdGhlIGdlbmVyYXRlZCBpbnN0cnVtZW50YXRpb24gZW52aXJvbm1lbnQuYCk7XG4gICAgfVxuICAgIGlmIChjb250YWluZXIubW91bnRQb2ludHMuc29tZShtb3VudCA9PiBtb3VudC5jb250YWluZXJQYXRoID09PSBGQVJHQVRFX0FHRU5UU19ESVIgfHwgbW91bnQuc291cmNlVm9sdW1lID09PSBGQVJHQVRFX1ZPTFVNRV9OQU1FKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBPZGlnb3M6IGNvbnRhaW5lciBcIiR7Y29udGFpbmVyLmNvbnRhaW5lck5hbWV9XCIgYWxyZWFkeSBtb3VudHMgJHtGQVJHQVRFX0FHRU5UU19ESVJ9IG9yICR7RkFSR0FURV9WT0xVTUVfTkFNRX07IHJlbW92ZSB0aGF0IG1vdW50IGJlZm9yZSBhcHBseWluZyB0aGUgY29uc3RydWN0LmApO1xuICAgIH1cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMudGFza0RlZmluaXRpb25TdGF0ZSh0YXNrRGVmaW5pdGlvbik7XG4gICAgZm9yIChjb25zdCBkaXIgb2YgcmVjaXBlLmFnZW50RGlycykge1xuICAgICAgc3RhdGUuYWdlbnREaXJzLmFkZChkaXIpO1xuICAgIH1cblxuICAgIC8vIFJlYWQtb25seTogdGhlIGFnZW50cyBhcmUgb25seSByZWFkIGhlcmUsIGFuZCB0aGUgc3RhZ2luZyBjb250YWluZXIgb3ducyB0aGUgd3JpdGVzLlxuICAgIGNvbnRhaW5lci5hZGRNb3VudFBvaW50cyh7XG4gICAgICBzb3VyY2VWb2x1bWU6IEZBUkdBVEVfVk9MVU1FX05BTUUsXG4gICAgICBjb250YWluZXJQYXRoOiBGQVJHQVRFX0FHRU5UU19ESVIsXG4gICAgICByZWFkT25seTogdHJ1ZSxcbiAgICB9KTtcbiAgICAvLyBTVUNDRVNTLCBub3QgU1RBUlQ6IHRoZSBhZ2VudCBmaWxlcyBoYXZlIHRvIGJlIG9uIGRpc2sgYmVmb3JlIHRoZSBhcHBsaWNhdGlvbiBwcm9jZXNzIGJlZ2lucywgYW5kXG4gICAgLy8gdGhlIHN0YWdpbmcgY29udGFpbmVyIGV4aXRzIGFzIHNvb24gYXMgdGhleSBhcmUuXG4gICAgY29udGFpbmVyLmFkZENvbnRhaW5lckRlcGVuZGVuY2llcyh7XG4gICAgICBjb250YWluZXI6IHN0YXRlLnNpZGVjYXIsXG4gICAgICBjb25kaXRpb246IGVjcy5Db250YWluZXJEZXBlbmRlbmN5Q29uZGl0aW9uLlNVQ0NFU1MsXG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52aXJvbm1lbnQpKSB7XG4gICAgICBjb250YWluZXIuYWRkRW52aXJvbm1lbnQobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLmluc3RydW1lbnRlZC5hZGQoa2V5KTtcbiAgICBPZGlnb3NGYXJnYXRlSW5zdHJ1bWVudGF0aW9uLm93bmVycy5zZXQoY29udGFpbmVyLCB0aGlzKTtcbiAgfVxuXG4gIC8qKiBJbnN0cnVtZW50cyBldmVyeSB0YXJnZXQgaW4gdGhlIGxpc3QuICovXG4gIHB1YmxpYyBpbnN0cnVtZW50QWxsKHRhcmdldHM6IE9kaWdvc0ZhcmdhdGVUYXJnZXRbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudCh0YXJnZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGFzayBkZWZpbml0aW9uJ3Mgc3RhZ2luZyBjb250YWluZXIgYW5kIHZvbHVtZSwgY3JlYXRlZCBvbmNlIGFuZCBzaGFyZWQgYnkgZXZlcnkgY29udGFpbmVyIGluIGl0LlxuICAgKlxuICAgKiBUaGUgY29tbWFuZCBpcyBhIGxhenkgbGlzdCByYXRoZXIgdGhhbiBhIGxpdGVyYWwgYmVjYXVzZSB0aGUgdW5pb24gaXQgcmVuZGVycyBpcyBub3Qga25vd24gdW50aWxcbiAgICogc3ludGhlc2lzOiBhIHRhc2sgZGVmaW5pdGlvbiBob2xkaW5nIGEgSmF2YSBhbmQgYSBQeXRob24gYXBwbGljYXRpb24gaXMgaW5zdHJ1bWVudGVkIGJ5IHR3b1xuICAgKiBgaW5zdHJ1bWVudCgpYCBjYWxscywgYW5kIHRoZSBzaW5nbGUgc3RhZ2luZyBjb250YWluZXIgaGFzIHRvIHN0YWdlIGJvdGguIFRoZSBjb25uZWN0b3IgY29tcGFyZXMgdGhpc1xuICAgKiBjb21tYW5kIGFnYWluc3QgZXhhY3RseSB0aGF0IHVuaW9uLCBzbyBhIHN0YWxlIG9uZSBpcyByZXBvcnRlZCBhcyBkcmlmdCBvbiB0aGUgd2hvbGUgdGFzayBkZWZpbml0aW9uXG4gICAqIGFuZCBsZWF2ZXMgb25lIG9mIHRoZSBjb250YWluZXJzIHdpdGggbm8gYWdlbnQgb24gZGlzay5cbiAgICovXG4gIHByaXZhdGUgdGFza0RlZmluaXRpb25TdGF0ZSh0YXNrRGVmaW5pdGlvbjogZWNzLlRhc2tEZWZpbml0aW9uKTogVGFza0RlZmluaXRpb25TdGF0ZSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBPZGlnb3NGYXJnYXRlSW5zdHJ1bWVudGF0aW9uLnRhc2tEZWZpbml0aW9ucy5nZXQodGFza0RlZmluaXRpb24pO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgaWYgKGV4aXN0aW5nLmFnZW50c0ltYWdlICE9PSB0aGlzLmFnZW50c0ltYWdlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignT2RpZ29zOiBhbGwgaW5zdHJ1bWVudGVkIGNvbnRhaW5lcnMgaW4gb25lIHRhc2sgZGVmaW5pdGlvbiBtdXN0IHVzZSB0aGUgc2FtZSBhZ2VudHNJbWFnZS4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gICAgaWYgKHRhc2tEZWZpbml0aW9uLmZpbmRDb250YWluZXIoRkFSR0FURV9TSURFQ0FSX0NPTlRBSU5FUl9OQU1FKSB8fCB0YXNrRGVmaW5pdGlvbi5ub2RlLnRyeUZpbmRDaGlsZChTSURFQ0FSX0NPTlNUUlVDVF9JRCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT2RpZ29zOiB0aGUgdGFzayBhbHJlYWR5IGRlZmluZXMgYW4gb2RpZ29zLWFnZW50IHN0YWdpbmcgY29udGFpbmVyLiBSZW1vdmUgdGhlIG1hbnVhbCBzdGFnaW5nIHJlc291cmNlcyBiZWZvcmUgYXBwbHlpbmcgdGhpcyBjb25zdHJ1Y3QuJyk7XG4gICAgfVxuXG4gICAgLy8gRG8gbm90IHJlc29sdmUgdGhlIEwxJ3MgbGF6eSB2b2x1bWVzIGhlcmU6IHRoYXQgY2FjaGVzIGFuIGVtcHR5IGxpc3QgYmVmb3JlIGFkZFZvbHVtZSBydW5zLlxuICAgIC8vIENESyBleHBvc2VzIGFkZFZvbHVtZSBidXQgbm8gcmVhZGVyLCBhcyB3aXRoIENvbnRhaW5lckRlZmluaXRpb24uZW52aXJvbm1lbnQgYmVsb3cuXG4gICAgY29uc3Qgdm9sdW1lcyA9ICh0YXNrRGVmaW5pdGlvbiBhcyB1bmtub3duIGFzIHsgdm9sdW1lcz86IGVjcy5Wb2x1bWVbXSB9KS52b2x1bWVzO1xuICAgIGlmICh2b2x1bWVzPy5zb21lKHZvbHVtZSA9PiB2b2x1bWUubmFtZSA9PT0gRkFSR0FURV9WT0xVTUVfTkFNRSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT2RpZ29zOiB0aGUgdGFzayBhbHJlYWR5IGRlZmluZXMgYW4gb2RpZ29zLWFnZW50IHZvbHVtZS4gUmVtb3ZlIHRoZSBtYW51YWwgc3RhZ2luZyByZXNvdXJjZXMgYmVmb3JlIGFwcGx5aW5nIHRoaXMgY29uc3RydWN0LicpO1xuICAgIH1cbiAgICAvLyBBIGJhcmUtbmFtZSB2b2x1bWUg4oCUIG5vIGhvc3QsIGRvY2tlciBvciBFRlMgY29uZmlndXJhdGlvbiDigJQgaXMgYSBGYXJnYXRlIGVwaGVtZXJhbC1zdG9yYWdlIGJpbmRcbiAgICAvLyBtb3VudCBzY29wZWQgdG8gdGhlIHRhc2ssIHdoaWNoIGlzIGV4YWN0bHkgdGhlIHNoYXJlZCBzdGFnaW5nIGFyZWEgbmVlZGVkIGFuZCB0aGUgb25seSBraW5kIEZhcmdhdGVcbiAgICAvLyBvZmZlcnMgKHRoZXJlIGlzIG5vIHRtcGZzKS5cbiAgICB0YXNrRGVmaW5pdGlvbi5hZGRWb2x1bWUoeyBuYW1lOiBGQVJHQVRFX1ZPTFVNRV9OQU1FIH0pO1xuXG4gICAgY29uc3QgYWdlbnREaXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qgc2lkZWNhciA9IHRhc2tEZWZpbml0aW9uLmFkZENvbnRhaW5lcihTSURFQ0FSX0NPTlNUUlVDVF9JRCwge1xuICAgICAgY29udGFpbmVyTmFtZTogRkFSR0FURV9TSURFQ0FSX0NPTlRBSU5FUl9OQU1FLFxuICAgICAgaW1hZ2U6IGVjcy5Db250YWluZXJJbWFnZS5mcm9tUmVnaXN0cnkodGhpcy5hZ2VudHNJbWFnZSksXG4gICAgICAvLyBOb24tZXNzZW50aWFsIGlzIG5vdCBhIHByZWZlcmVuY2U6IGl0IGlzIHdoYXQgbWFrZXMgdGhlIFNVQ0NFU1MgZGVwZW5kZW5jeSBhYm92ZSBsZWdhbCwgYW5kIGl0IGlzXG4gICAgICAvLyB3aGF0IHN0b3BzIGEgY29waWVyIHRoYXQgaGFzIGZpbmlzaGVkIGl0cyBqb2IgZnJvbSBmYWlsaW5nIHRoZSB3aG9sZSB0YXNrIGJ5IGV4aXRpbmcuXG4gICAgICBlc3NlbnRpYWw6IGZhbHNlLFxuICAgICAgY29tbWFuZDogTGF6eS5saXN0KHsgcHJvZHVjZTogKCkgPT4gc2lkZWNhckNvbW1hbmQoWy4uLmFnZW50RGlyc10pIH0pLFxuICAgICAgLy8gRmFyZ2F0ZSBhbGxvY2F0ZXMgbWVtb3J5IGF0IHRoZSB0YXNrIGxldmVsLCBzbyB0aGUgc3RhZ2luZyBjb250YWluZXIgZGVjbGFyZXMgbm9uZSB0aGVyZSDigJQgd2hpY2hcbiAgICAgIC8vIGtlZXBzIHRoZSByZW5kZXJlZCBjb250YWluZXIgYnl0ZS1pZGVudGljYWwgdG8gd2hhdCB0aGUgY29ubmVjdG9yIHdyaXRlcy4gQW4gRUMyLW9ubHkgdGFza1xuICAgICAgLy8gZGVmaW5pdGlvbiB3aXRob3V0IHRhc2stbGV2ZWwgbWVtb3J5IHJlcXVpcmVzIGV2ZXJ5IGNvbnRhaW5lciB0byBkZWNsYXJlIGl0cyBvd24sIHNvIG9uZSBpcyBzZXRcbiAgICAgIC8vIGZvciB0aGF0IGNhc2UgYWxvbmUuIEEgc29mdCByZXNlcnZhdGlvbiwgYW5kIGdlbmVyb3VzOiB0aGUgY29udGFpbmVyIGlzIGJ1c3lib3ggcnVubmluZyBgY3BgLlxuICAgICAgbWVtb3J5UmVzZXJ2YXRpb25NaUI6IHRhc2tEZWZpbml0aW9uLmlzRmFyZ2F0ZUNvbXBhdGlibGUgPyB1bmRlZmluZWQgOiBTSURFQ0FSX0VDMl9NRU1PUllfTUlCLFxuICAgIH0pO1xuICAgIC8vIFdyaXRhYmxlIGhlcmUg4oCUIHRoaXMgaXMgdGhlIGNvbnRhaW5lciB0aGF0IHB1dHMgdGhlIGZpbGVzIHRoZXJlLiBgcmVhZE9ubHlgIGlzIHJlcXVpcmVkIGJ5IENESydzXG4gICAgLy8gTW91bnRQb2ludCBzdHJ1Y3Qgd2hlcmUgdGhlIGNvbm5lY3RvciBzaW1wbHkgb21pdHMgaXQ7IGZhbHNlIGlzIHdoYXQgYW4gb21pdHRlZCB2YWx1ZSBtZWFucywgYW5kIHRoZVxuICAgIC8vIGNvbm5lY3RvcidzIHRhc2stbGV2ZWwgY2hlY2sgY29tcGFyZXMgdGhlIHN0YWdpbmcgY29udGFpbmVyJ3MgaW1hZ2UsIGVzc2VudGlhbGl0eSBhbmQgY29tbWFuZCwgbm90XG4gICAgLy8gaXRzIG1vdW50cywgc28gc3BlbGxpbmcgb3V0IHRoZSBkZWZhdWx0IGlzIG5vdCBkcmlmdC5cbiAgICBzaWRlY2FyLmFkZE1vdW50UG9pbnRzKHtcbiAgICAgIHNvdXJjZVZvbHVtZTogRkFSR0FURV9WT0xVTUVfTkFNRSxcbiAgICAgIGNvbnRhaW5lclBhdGg6IEZBUkdBVEVfQUdFTlRTX0RJUixcbiAgICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICB9KTtcblxuICAgIC8vIFJlZ2lzdGVyZWQgaGVyZSwgd2l0aCB0aGUgc3RhZ2luZyBjb250YWluZXIsIHNvIGl0IGlzIGFkZGVkIG9uY2UgcGVyIHRhc2sgZGVmaW5pdGlvbiBob3dldmVyIG1hbnlcbiAgICAvLyBjb250YWluZXJzIGFyZSBpbnN0cnVtZW50ZWQgaW4gaXQg4oCUIGFuZCBjb3VudGVkIGF0IHN5bnRoLCBzbyBjb250YWluZXJzIGFkZGVkIGFmdGVyIHRoaXMgY2FsbCBhcmVcbiAgICAvLyBpbmNsdWRlZC4gQVdTIHJlamVjdHMgYSBSZWdpc3RlclRhc2tEZWZpbml0aW9uIG92ZXIgdGhlIGxpbWl0LCB3aGljaCB3b3VsZCBvdGhlcndpc2Ugc3VyZmFjZSBhcyBhXG4gICAgLy8gZGVwbG95IGZhaWx1cmUgYWJvdXQgYSBjb250YWluZXIgY291bnQgd2l0aCBub3RoaW5nIHRvIHNheSBhYm91dCB3aGljaCBjb250YWluZXIgaXMgdGhlIGV4dHJhIG9uZS5cbiAgICB0YXNrRGVmaW5pdGlvbi5ub2RlLmFkZFZhbGlkYXRpb24oe1xuICAgICAgdmFsaWRhdGU6ICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGFpbmVycyA9IHRhc2tEZWZpbml0aW9uLm5vZGUuY2hpbGRyZW4uZmlsdGVyKChjKSA9PiBjIGluc3RhbmNlb2YgZWNzLkNvbnRhaW5lckRlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gY29udGFpbmVycy5sZW5ndGggPiBGQVJHQVRFX01BWF9DT05UQUlORVJTXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICBgT2RpZ29zOiB0YXNrIGRlZmluaXRpb24gJHt0YXNrRGVmaW5pdGlvbi5ub2RlLmlkfSB3b3VsZCBoYXZlICR7Y29udGFpbmVycy5sZW5ndGh9IGAgK1xuICAgICAgICAgICAgICAgIGBjb250YWluZXJzLCBvdmVyIHRoZSBBV1MgbWF4aW11bSBvZiAke0ZBUkdBVEVfTUFYX0NPTlRBSU5FUlN9LiBPbmUgb2YgdGhlbSBpcyB0aGUgYCArXG4gICAgICAgICAgICAgICAgJ29kaWdvcy1hZ2VudCBzdGFnaW5nIGNvbnRhaW5lciB0aGlzIGluc3RydW1lbnRhdGlvbiBhZGRzLicsXG4gICAgICAgICAgXVxuICAgICAgICAgIDogW107XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RhdGU6IFRhc2tEZWZpbml0aW9uU3RhdGUgPSB7IHNpZGVjYXIsIGFnZW50RGlycywgYWdlbnRzSW1hZ2U6IHRoaXMuYWdlbnRzSW1hZ2UgfTtcbiAgICBPZGlnb3NGYXJnYXRlSW5zdHJ1bWVudGF0aW9uLnRhc2tEZWZpbml0aW9ucy5zZXQodGFza0RlZmluaXRpb24sIHN0YXRlKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogYE9URUxfU0VSVklDRV9OQU1FYCBmb3IgYSB0YXJnZXQsIGFuZCB0aGUgb25lIHZhbHVlIGEgY2FsbGVyIGNhbm5vdCBiZSBhbGxvd2VkIHRvIGxlYXZlIHRvIGEgZGVmYXVsdC5cbiAgICpcbiAgICogVGhlIGNvbm5lY3RvciBjb21wYXJlcyBpdCBhZ2FpbnN0IHRoZSB3b3JrbG9hZCdzIG5hbWUgaW4gT2RpZ29zLCB3aGljaCBpcyB0aGUgRUNTIFNFUlZJQ0UgbmFtZSwgc29cbiAgICogZ3Vlc3Npbmcg4oCUIHRoZSB0YXNrIGRlZmluaXRpb24gZmFtaWx5LCB0aGUgY29udGFpbmVyIG5hbWUsIHRoZSBjb25zdHJ1Y3QgaWQg4oCUIHdvdWxkIHByb2R1Y2UgYSBzdGFja1xuICAgKiB0aGF0IGRlcGxveXMgY2xlYW5seSBhbmQgdGhlbiByZXBvcnRzIGFzIGRyaWZ0ZWQgb24gYSBjb21wb25lbnQgbm90aGluZyBpbiB0aGUgc3RhY2sgbWFrZXMgdmlzaWJsZS5cbiAgICpcbiAgICogUmVhZCBmcm9tIHRoZSBMMSwgbm90IGZyb20gYHNlcnZpY2Uuc2VydmljZU5hbWVgOiB0aGUgTDIgcHJvcGVydHkgaXMgYSB0b2tlbiB0aGF0IHJlc29sdmVzIHRvIGEgYFJlZmBcbiAgICogdG8gdGhlIHNlcnZpY2UgZXZlbiB3aGVuIHRoZSBzdGFjayBzZXQgdGhlIG5hbWUgZXhwbGljaXRseSwgYW5kIGEgYFJlZmAgaGVyZSBpcyB3b3JzZSB0aGFuIHVzZWxlc3Mg4oCUXG4gICAqIHRoZSB0YXNrIGRlZmluaXRpb24gd291bGQgcmVmZXJlbmNlIHRoZSBzZXJ2aWNlIHRoYXQgcmVmZXJlbmNlcyBpdCwgd2hpY2ggQ2xvdWRGb3JtYXRpb24gcmVqZWN0cyBhcyBhXG4gICAqIGRlcGVuZGVuY3kgY3ljbGUgYXQgZGVwbG95IHRpbWUuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVTZXJ2aWNlTmFtZSh0YXJnZXQ6IE9kaWdvc0ZhcmdhdGVUYXJnZXQpOiBzdHJpbmcge1xuICAgIGlmICh0YXJnZXQuc2VydmljZU5hbWUpIHtcbiAgICAgIHJldHVybiB0YXJnZXQuc2VydmljZU5hbWU7XG4gICAgfVxuICAgIGlmICghdGFyZ2V0LnNlcnZpY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE9kaWdvczogaW5zdHJ1bWVudGluZyBjb250YWluZXIgXCIke3RhcmdldC5jb250YWluZXIuY29udGFpbmVyTmFtZX1cIiBuZWVkcyBhIHNlcnZpY2UgbmFtZS4gYCArXG4gICAgICAgICAgJ09URUxfU0VSVklDRV9OQU1FIG11c3QgZXF1YWwgdGhlIHdvcmtsb2FkXFwncyBuYW1lIGluIE9kaWdvcywgd2hpY2ggZm9yIGEgRmFyZ2F0ZSB3b3JrbG9hZCBpcyAnICtcbiAgICAgICAgICAndGhlIEVDUyBTRVJWSUNFIG5hbWUg4oCUIG5vdCB0aGUgdGFzayBkZWZpbml0aW9uIGZhbWlseS4gUGFzcyBgc2VydmljZWAgdG8gcmVhZCBpdCBvZmYgdGhlICcgK1xuICAgICAgICAgICdzZXJ2aWNlLCBvciBgc2VydmljZU5hbWVgIHdoZW4gdGhlIHNlcnZpY2UgbGl2ZXMgb3V0c2lkZSB0aGlzIHN0YWNrLicsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBjZm4gPSB0YXJnZXQuc2VydmljZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBlY3MuQ2ZuU2VydmljZSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXNvbHZlZCA9IGNmbiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU3RhY2sub2YodGFyZ2V0LnNlcnZpY2UpLnJlc29sdmUoY2ZuLnNlcnZpY2VOYW1lKTtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkID09PSAnc3RyaW5nJyAmJiByZXNvbHZlZCAhPT0gJycgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChyZXNvbHZlZCkpIHtcbiAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE9kaWdvczogdGhlIHNlcnZpY2UgZm9yIGNvbnRhaW5lciBcIiR7dGFyZ2V0LmNvbnRhaW5lci5jb250YWluZXJOYW1lfVwiIGhhcyBubyBleHBsaWNpdCBwaHlzaWNhbCBgICtcbiAgICAgICAgJ25hbWUsIHNvIENsb3VkRm9ybWF0aW9uIGdlbmVyYXRlcyBvbmUg4oCUIGFuZCBhIGdlbmVyYXRlZCBuYW1lIGlzIGEgYFJlZmAgdG8gdGhlIHNlcnZpY2UsIHdoaWNoICcgK1xuICAgICAgICAnY2Fubm90IGdvIGludG8gdGhlIHRhc2sgZGVmaW5pdGlvbiB0aGF0IHNlcnZpY2UgcnVucyAoQ2xvdWRGb3JtYXRpb24gcmVqZWN0cyB0aGUgY3ljbGUpLiBTZXQgJyArXG4gICAgICAgICdgc2VydmljZU5hbWVgIG9uIHRoZSBFQ1Mgc2VydmljZSwgb3IgcGFzcyBgc2VydmljZU5hbWVgIGhlcmUgdG8gc3RhdGUgdGhlIG5hbWUgT2RpZ29zIGtub3dzICcgK1xuICAgICAgICAndGhlIHdvcmtsb2FkIGJ5LicsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhlIHRhc2sgZGVmaW5pdGlvbiBjYW4gY2FycnkgdGhlIHN0YWdlZC1hZ2VudCBtZXRob2QgYXQgYWxsLCBhbmQgd2FybnMgYWJvdXQgdGhlIHRoaW5ncyB0aGF0XG4gICAqIGFyZSBsZWdhbCBidXQgYWxtb3N0IGNlcnRhaW5seSBhIG1pc3Rha2UuXG4gICAqL1xuICBwcml2YXRlIGNoZWNrVGFza0RlZmluaXRpb24odGFza0RlZmluaXRpb246IGVjcy5UYXNrRGVmaW5pdGlvbiwgY29udGFpbmVyOiBlY3MuQ29udGFpbmVyRGVmaW5pdGlvbik6IHZvaWQge1xuICAgIGlmICghdGFza0RlZmluaXRpb24uaXNGYXJnYXRlQ29tcGF0aWJsZSkge1xuICAgICAgLy8gTm90IGZhdGFsIOKAlCB0aGUgbWVjaGFuaXNtIGlzIGEgdm9sdW1lIGFuZCBhIGNvcGllciwgd2hpY2ggd29yayBvbiB0aGUgRUMyIGxhdW5jaCB0eXBlIHRvby4gQnV0XG4gICAgICAvLyB0aGUgY29ubmVjdG9yIGRpc2NvdmVycyBhbmQganVkZ2VzIGBhd3MuZmFyZ2F0ZS10YXNrYCB3b3JrbG9hZHMsIHNvIGFuIEVDMi1vbmx5IHRhc2sgZGVmaW5pdGlvblxuICAgICAgLy8gaXMgaW5zdHJ1bWVudGVkIGhlcmUgYW5kIGludmlzaWJsZSB0aGVyZS5cbiAgICAgIEFubm90YXRpb25zLm9mKGNvbnRhaW5lcikuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQG9kaWdvcy9hd3MtY2RrOm5vdEZhcmdhdGVDb21wYXRpYmxlJyxcbiAgICAgICAgYE9kaWdvczogdGFzayBkZWZpbml0aW9uICR7dGFza0RlZmluaXRpb24ubm9kZS5pZH0gaXMgbm90IEZhcmdhdGUtY29tcGF0aWJsZS4gVGhlIHN0YWdpbmcgYCArXG4gICAgICAgICAgJ2NvbnRhaW5lciBhbmQgc2hhcmVkIHZvbHVtZSB3aWxsIHN0aWxsIHdvcmsgb24gdGhlIEVDMiBsYXVuY2ggdHlwZSwgYnV0IE9kaWdvcyBkaXNjb3ZlcnMgJyArXG4gICAgICAgICAgJ3RoZXNlIGFzIGBhd3MuZmFyZ2F0ZS10YXNrYCB3b3JrbG9hZHMgYW5kIHdpbGwgbm90IHJlcG9ydCBvbiBhbiBFQzItb25seSB0YXNrLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNmbiA9IHRhc2tEZWZpbml0aW9uLm5vZGUuZGVmYXVsdENoaWxkIGFzIGVjcy5DZm5UYXNrRGVmaW5pdGlvbiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGNmbj8ucnVudGltZVBsYXRmb3JtIGFzIGVjcy5DZm5UYXNrRGVmaW5pdGlvbi5SdW50aW1lUGxhdGZvcm1Qcm9wZXJ0eSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvc0ZhbWlseSA9IHBsYXRmb3JtPy5vcGVyYXRpbmdTeXN0ZW1GYW1pbHk7XG4gICAgaWYgKHR5cGVvZiBvc0ZhbWlseSA9PT0gJ3N0cmluZycgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChvc0ZhbWlseSkgJiYgIW9zRmFtaWx5LnN0YXJ0c1dpdGgoJ0xJTlVYJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE9kaWdvczogdGFzayBkZWZpbml0aW9uICR7dGFza0RlZmluaXRpb24ubm9kZS5pZH0gZGVjbGFyZXMgb3BlcmF0aW5nU3lzdGVtRmFtaWx5IGAgK1xuICAgICAgICAgIGBcIiR7b3NGYW1pbHl9XCIuIFRoZSBPZGlnb3MgRmFyZ2F0ZSBhZ2VudHMgYnVuZGxlIGlzIExpbnV4LW9ubHkgYW5kIGdsaWJjLWJhc2VkLCBzbyBhIFdpbmRvd3MgYCArXG4gICAgICAgICAgJ3Rhc2sgZGVmaW5pdGlvbiBjYW5ub3QgYmUgaW5zdHJ1bWVudGVkIGF0IGFsbC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZW52aXJvbm1lbnQgYXBwbGllZCB0byBvbmUgaW5zdHJ1bWVudGVkIGNvbnRhaW5lci5cbiAgICpcbiAgICogTWlycm9ycyBgaW5zdHJ1bWVudENvbnRhaW5lcmAgaW4gdGhlIGNvbm5lY3RvciwgaW5jbHVkaW5nIHRoZSBPUkRFUiBvZiBkZWNpc2lvbnM6IHRoZSBhZ2VudCdzIG93blxuICAgKiBhY3RpdmF0aW9uIHZhcmlhYmxlcyBmaXJzdCwgdGhlbiBpZGVudGl0eSwgdGhlbiBleHBvcnQsIHRoZW4gdGhlIG1hcmtlci4gRXZlcnkgdmFyaWFibGUgaGVyZSBoYXMgYVxuICAgKiBjb3VudGVycGFydCBpbiB0aGUgY29ubmVjdG9yJ3MgYGNvbnRhaW5lckRpZmZgLCB3aGljaCBpcyB3aGF0IGEgY3VzdG9tZXIncyBjb25mb3JtYW5jZSByZXBvcnQgaXNcbiAgICogYnVpbHQgZnJvbSDigJQgc28gb25lIHRoYXQgaXMgYWJzZW50LCBvciBzcGVsbGVkIGRpZmZlcmVudGx5LCBpcyByZXBvcnRlZCBhcyBhIG5hbWVkIGJyb2tlbiBjb21wb25lbnRcbiAgICogcmF0aGVyIHRoYW4gcGFzc2luZyBxdWlldGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBlbnZpcm9ubWVudEZvcihcbiAgICB0YXJnZXQ6IE9kaWdvc0ZhcmdhdGVUYXJnZXQsXG4gICAgcmVjaXBlOiBGYXJnYXRlUmVjaXBlLFxuICAgIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHsgZGVzdGluYXRpb24sIGRlYnVnIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGFyZ2V0LmNvbnRhaW5lcjtcbiAgICBjb25zdCBlbnY6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHJlY2lwZS5zdGF0aWNFbnYpKSB7XG4gICAgICAvLyBUaGVzZSBhcmUgc2V0IG91dHJpZ2h0LCBub3QgbWVyZ2VkIOKAlCBQSFBfSU5JX1NDQU5fRElSIGFuZCBSVUJZT1BUIGFyZSBjb21wYXJlZCBleGFjdGx5LCBzbyB0aGVyZVxuICAgICAgLy8gaXMgbm8gcm9vbSB0byBmb2xkIGEgY29udGFpbmVyJ3Mgb3duIHZhbHVlIGluLiBTaWxlbnRseSBkaXNjYXJkaW5nIG9uZSBpcyB0aGUgZmFpbHVyZSB3b3J0aFxuICAgICAgLy8gbmFtaW5nOiBSVUJZT1BUIGNvbW1vbmx5IGNhcnJpZXMgZmxhZ3MgYW4gYXBwbGljYXRpb24gbmVlZHMgdG8gYm9vdC5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gY29udGFpbmVyRW52VmFsdWUoY29udGFpbmVyLCBrKTtcbiAgICAgIGlmIChleGlzdGluZyAhPT0gdW5kZWZpbmVkICYmIGV4aXN0aW5nICE9PSB2KSB7XG4gICAgICAgIEFubm90YXRpb25zLm9mKGNvbnRhaW5lcikuYWRkV2FybmluZ1YyKFxuICAgICAgICAgICdAb2RpZ29zL2F3cy1jZGs6c3RhdGljRW52T3ZlcndyaXR0ZW4nLFxuICAgICAgICAgIGBPZGlnb3M6IGNvbnRhaW5lciBcIiR7Y29udGFpbmVyLmNvbnRhaW5lck5hbWV9XCIgYWxyZWFkeSBzZXRzICR7a309XCIke2V4aXN0aW5nfVwiLCB3aGljaCB0aGUgYCArXG4gICAgICAgICAgICBgJHtyZWNpcGUubGFuZ3VhZ2V9IGFnZW50J3MgYWN0aXZhdGlvbiByZXBsYWNlcyB3aXRoIFwiJHt2fVwiLiBPZGlnb3MgY29tcGFyZXMgdGhpcyB2YXJpYWJsZSBgICtcbiAgICAgICAgICAgICdleGFjdGx5LCBzbyBpdCBjYW5ub3QgbWVyZ2UgdGhlIHR3byDigJQgZm9sZCB3aGF0IHlvdXIgYXBwbGljYXRpb24gbmVlZHMgaW50byB0aGUgdmFsdWUgJyArXG4gICAgICAgICAgICAnT2RpZ29zIHNldHMsIG9yIGxlYXZlIHRoaXMgY29udGFpbmVyIHVuaW5zdHJ1bWVudGVkLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBlbnZba10gPSB2O1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgYXBwZW5kIG9mIHJlY2lwZS5hcHBlbmRFbnYpIHtcbiAgICAgIC8vIFJlYnVpbHQgZnJvbSB0aGUgY29udGFpbmVyJ3MgT1JJR0lOQUwgdmFsdWUgc28gb3VycyBpcyBqb2luZWQgcmF0aGVyIHRoYW4gYXNzaWduZWQgb3ZlciBpdCDigJQgYW5kXG4gICAgICAvLyBzbyB0aGF0IGEgcmUtc3ludGggbmV2ZXIgYWNjdW11bGF0ZXMgb3VyIGZyYWdtZW50IHR3aWNlLiBUaGUgc2VwYXJhdG9yIGNvbWVzIGZyb20gdGhlIHBhdHRlcm4sXG4gICAgICAvLyBub3QgZnJvbSBhbiBhc3N1bXB0aW9uOiBhIHNwYWNlIGZvciB0aGUgKl9PUFRJT05TIHZhcmlhYmxlcywgYSBjb2xvbiBmb3IgUFlUSE9OUEFUSC5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGFyZ2V0LmV4aXN0aW5nTG9hZGVyVmFsdWUgPz8gY29udGFpbmVyRW52VmFsdWUoY29udGFpbmVyLCBhcHBlbmQubmFtZSkgPz8gJyc7XG4gICAgICBlbnZbYXBwZW5kLm5hbWVdID0gZXZhbHVhdGVBcHBlbmRQYXR0ZXJuKGFwcGVuZC5wYXR0ZXJuLCBleGlzdGluZyk7XG4gICAgfVxuXG4gICAgZW52W0VOVl9TRVJWSUNFX05BTUVdID0gc2VydmljZU5hbWU7XG4gICAgZW52W0VOVl9SRVNPVVJDRV9BVFRSSUJVVEVTXSA9IGZhcmdhdGVSZXNvdXJjZUF0dHJpYnV0ZXMoU3RhY2sub2YoY29udGFpbmVyKS5yZWdpb24pO1xuXG4gICAgY29uc3QgZXhwb3J0VGFyZ2V0ID0gZXhwb3J0VGFyZ2V0Rm9yKHJlY2lwZSwgZGVzdGluYXRpb24pO1xuICAgIGVudltFTlZfT1RMUF9FTkRQT0lOVF0gPSBleHBvcnRUYXJnZXQuZW5kcG9pbnQ7XG4gICAgZW52W0VOVl9PVExQX1BST1RPQ09MXSA9IGV4cG9ydFRhcmdldC5wcm90b2NvbDtcbiAgICBjb25zdCBtaXNtYXRjaCA9IHBvcnRQcm90b2NvbE1pc21hdGNoKGV4cG9ydFRhcmdldC5lbmRwb2ludCwgZXhwb3J0VGFyZ2V0LnByb3RvY29sKTtcbiAgICBpZiAobWlzbWF0Y2gpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKGNvbnRhaW5lcikuYWRkV2FybmluZ1YyKCdAb2RpZ29zL2F3cy1jZGs6cG9ydFByb3RvY29sTWlzbWF0Y2gnLCBgT2RpZ29zOiAke21pc21hdGNofWApO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZWQgPSByZXNvbHZlZFNpZ25hbHMoZGVzdGluYXRpb24pO1xuICAgIGlmICghZW5hYmxlZC50cmFjZXMgJiYgIWVuYWJsZWQubWV0cmljcyAmJiAhZW5hYmxlZC5sb2dzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdPZGlnb3MgZGVzdGluYXRpb24gYWNjZXB0cyBubyB0ZWxlbWV0cnkgc2lnbmFscywgc28gdGhlIGFnZW50IHdvdWxkIGJlIGxvYWRlZCBhbmQgcHJvZHVjZSAnICtcbiAgICAgICAgICAnbm90aGluZy4gTm90ZSB0aGF0IG1ldHJpY3MgYW5kIGxvZ3MgYXJlIE9GRiBieSBkZWZhdWx0IOKAlCB3aXRoIGB0cmFjZXM6IGZhbHNlYCB0aGUgZGVzdGluYXRpb24gJyArXG4gICAgICAgICAgJ2hhcyBub3RoaW5nIGxlZnQgdW5sZXNzIHlvdSBhbHNvIHBhc3MgYG1ldHJpY3M6IHRydWVgIG9yIGBsb2dzOiB0cnVlYC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbihlbnYsIHNpZ25hbEFjdGl2YXRpb24ocmVjaXBlLmxhbmd1YWdlLCBkZXN0aW5hdGlvbikpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBzaWduYWxUcmFuc3BvcnRPdmVycmlkZXMoKSkge1xuICAgICAgaWYgKGNvbnRhaW5lckVudlZhbHVlKGNvbnRhaW5lciwgbmFtZSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9kaWdvczogcmVtb3ZlICR7bmFtZX07IGl0IG92ZXJyaWRlcyB0aGUgY29uZmlndXJlZCBkZXN0aW5hdGlvbi5gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlY2lwZS5sYW5ndWFnZSA9PT0gJ3J1YnknICYmIChlbnYuT1RFTF9NRVRSSUNTX0VYUE9SVEVSID09PSAnb3RscCcgfHwgZW52Lk9URUxfTE9HU19FWFBPUlRFUiA9PT0gJ290bHAnKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YoY29udGFpbmVyKS5hZGRXYXJuaW5nVjIoJ0BvZGlnb3MvYXdzLWNkazpydWJ5U2lnbmFsc1Vuc3VwcG9ydGVkJyxcbiAgICAgICAgJ1RoZSBidW5kbGVkIFJ1YnkgRmFyZ2F0ZSBhZ2VudCBjb250YWlucyB0aGUgdHJhY2UgU0RLIG9ubHk7IGl0IGNhbm5vdCBnZW5lcmF0ZSBPVExQIG1ldHJpY3Mgb3IgbG9ncy4nKTtcbiAgICB9XG4gICAgaWYgKGRlc3RpbmF0aW9uLnByb2ZpbGVzKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZihjb250YWluZXIpLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOnByb2ZpbGVzVW5zdXBwb3J0ZWQnLFxuICAgICAgICAnVGhlIGJ1bmRsZWQgRmFyZ2F0ZSBsYW5ndWFnZSBhZ2VudHMgZG8gbm90IGdlbmVyYXRlIE9UTFAgcHJvZmlsZXMuIE90aGVyIHNlbGVjdGVkIHNpZ25hbHMgcmVtYWluIGVuYWJsZWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVycyA9IHJlbmRlck90bHBIZWFkZXJzKGRlc3RpbmF0aW9uLmhlYWRlcnMpO1xuICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICBlbnZbRU5WX09UTFBfSEVBREVSU10gPSBoZWFkZXJzO1xuICAgIH1cblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgZW52W0VOVl9PVEVMX0xPR19MRVZFTF0gPSAnZGVidWcnO1xuICAgIH1cblxuICAgIGVudltFTlZfSUFDX01BUktFUl0gPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB2OiBNQVJLRVJfVkVSU0lPTixcbiAgICAgIHNvdXJjZTogJ2NkaycsXG4gICAgICB2ZXJzaW9uOiBPRElHT1NfVkVSU0lPTiB8fCAndW5yZWxlYXNlZCcsXG4gICAgICBsYW5nOiBsYW5ndWFnZUtleU9mKHRhcmdldC5sYW5ndWFnZSksXG4gICAgICBpbWFnZTogdGhpcy5hZ2VudHNJbWFnZSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlbnY7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgdmFsdWUgdGhlIGNvbnRhaW5lciB3YXMgY3JlYXRlZCB3aXRoIGZvciBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgdW5kZWZpbmVkLlxuICpcbiAqIGBDb250YWluZXJEZWZpbml0aW9uYCBrZWVwcyBpdHMgZW52aXJvbm1lbnQgcHJpdmF0ZSBhbmQgb2ZmZXJzIGBhZGRFbnZpcm9ubWVudGAgYnV0IG5vIHJlYWRlciwgc28gdGhpc1xuICogcmVhY2hlcyBmb3IgdGhlIGZpZWxkLiBUaGF0IGlzIGEgY29udGFpbmVkIGhhY2sgd2l0aCBhIHNwZWNpZmljIGFsdGVybmF0aXZlOiB3aXRob3V0IGl0LCBhcHBlbmRpbmcgdG8gYVxuICogbG9hZGVyIHZhcmlhYmxlIHdvdWxkIG1lYW4gQVNTSUdOSU5HIG92ZXIgaXQsIGFuZCBhIGNvbnRhaW5lciB3aG9zZSBgTk9ERV9PUFRJT05TYCBjYXJyaWVzIGEgZmxhZyBpdHNcbiAqIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGJvb3Qgd291bGQgc3RvcCBib290aW5nIHRoZSBtb21lbnQgaXQgd2FzIGluc3RydW1lbnRlZC4gYGV4aXN0aW5nTG9hZGVyVmFsdWVgIG9uXG4gKiB0aGUgdGFyZ2V0IGlzIHRoZSBkb2N1bWVudGVkIGVzY2FwZSBoYXRjaCBpZiB0aGlzIGV2ZXIgc3RvcHMgd29ya2luZzsgYSBzaGFwZSB0aGF0IGlzIG5vdCBhIHBsYWluIG9iamVjdFxuICogZGVncmFkZXMgdG8gXCJub3RoaW5nIHRoZXJlXCIsIHdoaWNoIGlzIHRoZSBzYW1lIGFuc3dlciBhcyBhbiB1bmluc3RydW1lbnRlZCBjb250YWluZXIuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5lckVudlZhbHVlKGNvbnRhaW5lcjogZWNzLkNvbnRhaW5lckRlZmluaXRpb24sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGVudiA9IChjb250YWluZXIgYXMgdW5rbm93biBhcyB7IGVudmlyb25tZW50PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB9KS5lbnZpcm9ubWVudDtcbiAgaWYgKCFlbnYgfHwgdHlwZW9mIGVudiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHZhbHVlID0gZW52W25hbWVdO1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYE9URUxfRVhQT1JURVJfT1RMUF9IRUFERVJTYCDigJQgYSBjb21tYS1zZXBhcmF0ZWQgYGtleT12YWx1ZWAgbGlzdCwga2V5cyBzb3J0ZWQgc28gdGhlIHJlbmRlcmVkXG4gKiB2YWx1ZSBpcyBieXRlLXN0YWJsZSBhY3Jvc3Mgc3ludGhzIGFuZCBhbiB1bmNoYW5nZWQgZGVzdGluYXRpb24gbmV2ZXIgbG9va3MgbGlrZSBhIGNoYW5nZS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyT3RscEhlYWRlcnMoaGVhZGVycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiBzdHJpbmcge1xuICBpZiAoIWhlYWRlcnMpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGhlYWRlcnMpLnNvcnQoKTtcbiAgY29uc3QgZW5jb2RlID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKS5yZXBsYWNlKC9bIScoKSpdL2csIGNoYXJhY3RlciA9PiBgJSR7Y2hhcmFjdGVyLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9YCkucmVwbGFjZSgvJTIwL2csICcrJyk7XG4gIHJldHVybiBrZXlzLm1hcCgoaykgPT4gYCR7ZW5jb2RlKGspfT0ke2VuY29kZShoZWFkZXJzW2tdKX1gKS5qb2luKCcsJyk7XG59XG4iXX0=
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Produced by cdk/scripts/generate.ts from ../artifacts.json and ../versions.env.
|
|
5
5
|
* Run `npm run generate` (or `npm run build`) to refresh it.
|
|
6
6
|
*
|
|
7
|
-
* Odigos artifact version: v0.0.
|
|
7
|
+
* Odigos artifact version: v0.0.20
|
|
8
8
|
*/
|
|
9
9
|
export interface LambdaDistribution {
|
|
10
10
|
readonly name: string;
|