@decaf-ts/for-nest 0.11.2-refactor.5 → 0.11.2-refactor.6

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.
@@ -11,31 +11,67 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
11
11
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
12
12
  return c > 3 && r && Object.defineProperty(target, key, r), r;
13
13
  };
14
+ var __metadata = (this && this.__metadata) || function (k, v) {
15
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
16
+ return Reflect.metadata(k, v);
17
+ };
18
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
19
+ return function (target, key) { decorator(target, key, paramIndex); };
20
+ };
14
21
  const common_1 = require("@nestjs/common");
22
+ const core_1 = require("@nestjs/core");
15
23
  const db_decorators_1 = require("@decaf-ts/db-decorators");
16
24
  const logging_1 = require("@decaf-ts/logging");
17
- const core_1 = require("@decaf-ts/core");
25
+ const core_2 = require("@decaf-ts/core");
18
26
  const throttling_js_1 = require("./../errors/throttling.cjs");
27
+ const DecafRequestContext_js_1 = require("./../../request/DecafRequestContext.cjs");
28
+ /**
29
+ * @description Maps well-known NestJS `HttpException` subclasses (as guards, pipes, or
30
+ * other framework-level code would throw them) onto the equivalent decaf-ts `BaseError`.
31
+ * @summary Only `BaseError` instances carry the `.code` the response body relies on, so
32
+ * without this map every non-decaf exception — including perfectly legitimate ones like a
33
+ * guard's `ForbiddenException` — would be flattened into a generic 500 `InternalError`.
34
+ */
35
+ const HTTP_EXCEPTION_TO_DECAF_ERROR = new Map([
36
+ [common_1.UnauthorizedException, (msg) => new core_2.AuthorizationError(msg)],
37
+ [common_1.ForbiddenException, (msg) => new core_2.ForbiddenError(msg)],
38
+ [common_1.BadRequestException, (msg) => new db_decorators_1.BadRequestError(msg)],
39
+ [common_1.ConflictException, (msg) => new db_decorators_1.ConflictError(msg)],
40
+ [common_1.UnprocessableEntityException, (msg) => new db_decorators_1.ValidationError(msg)],
41
+ ]);
19
42
  let DecafExceptionFilter = class DecafExceptionFilter {
20
- catch(exception, host) {
43
+ constructor(moduleRef) {
44
+ this.moduleRef = moduleRef;
45
+ }
46
+ async catch(exception, host) {
21
47
  const ctx = host.switchToHttp();
22
48
  const response = ctx.getResponse();
23
49
  const request = ctx.getRequest();
24
50
  const isProduction = logging_1.LoggedEnvironment.env === "production";
25
51
  let statusCode;
26
52
  if (exception instanceof common_1.NotFoundException ||
27
- exception instanceof core_1.UnsupportedError) {
53
+ exception instanceof core_2.UnsupportedError) {
28
54
  exception = new common_1.NotAcceptableException(exception.message);
29
55
  statusCode = exception.getStatus();
30
56
  }
31
57
  else if (!(exception instanceof db_decorators_1.BaseError)) {
32
- if (exception.status === 429) {
58
+ const toDecafError = this.decafErrorFor(exception);
59
+ if (toDecafError) {
60
+ exception = toDecafError(exception.message);
61
+ }
62
+ else if (exception.status === 429) {
33
63
  exception = new throttling_js_1.ToManyRequestsError(exception.message);
34
64
  }
65
+ else if (exception instanceof common_1.HttpException) {
66
+ // A recognized but unmapped HttpException (e.g. thrown by a guard or
67
+ // pipe) — preserve its real status instead of flattening it to 500.
68
+ statusCode = exception.getStatus();
69
+ }
35
70
  else {
36
71
  exception = new db_decorators_1.InternalError(exception.message);
37
72
  }
38
73
  }
74
+ await this.logError(request, exception);
39
75
  response.status(exception.code || statusCode).json({
40
76
  status: exception.code || statusCode,
41
77
  error: isProduction ? exception.name : exception.message,
@@ -44,10 +80,73 @@ let DecafExceptionFilter = class DecafExceptionFilter {
44
80
  method: request.method,
45
81
  });
46
82
  }
83
+ /**
84
+ * @description Finds the decaf-ts `BaseError` constructor mapped to this exception's type, if any.
85
+ * @summary Walks `HTTP_EXCEPTION_TO_DECAF_ERROR` with `instanceof` (rather than a straight
86
+ * `Map.get`) so subclasses of a mapped exception are matched too.
87
+ */
88
+ decafErrorFor(exception) {
89
+ for (const [type, factory] of HTTP_EXCEPTION_TO_DECAF_ERROR) {
90
+ if (exception instanceof type)
91
+ return factory;
92
+ }
93
+ return undefined;
94
+ }
95
+ /**
96
+ * @description Logs the exception without ever letting logging failures block the response.
97
+ * @summary A guard (or middleware/CORS check) can throw before any decaf-aware provider ran,
98
+ * so the request-bound Context may not exist yet — or the resolved logger's `.error()` itself
99
+ * could throw (broken transport, formatter bug, etc.). Either way the client-facing error
100
+ * response below must still go out, so every failure mode here is swallowed, falling back to
101
+ * the plain `Logging.get()` logger and, as a last resort, doing nothing at all.
102
+ */
103
+ async logError(request, exception) {
104
+ const message = `Unhandled error on ${request?.method} ${request?.url}`;
105
+ try {
106
+ const log = await this.resolveLogger(request);
107
+ log.error(message, exception);
108
+ }
109
+ catch {
110
+ try {
111
+ logging_1.Logging.get().error(message, exception);
112
+ }
113
+ catch {
114
+ // logging is unavailable — the response is still sent below
115
+ }
116
+ }
117
+ }
118
+ /**
119
+ * @description Resolves the logger bound to the originating request's decaf-ts Context.
120
+ * @summary Global filters are singletons, so the request-scoped {@link DecafRequestContext}
121
+ * (and the client/user-bound logger it carries) can't be constructor-injected. Instead, this
122
+ * looks up the same request's context id and re-resolves the already-accumulated instance
123
+ * through `ModuleRef`. Falls back to the generic `Logging.get()` logger when the filter wasn't
124
+ * constructed with a `ModuleRef` (e.g. manually `new`'d) or no request-scoped context exists
125
+ * for this request (e.g. the error happened before any decaf-aware provider ran, as is the
126
+ * case when a guard rejects the request before interceptors get to bind the client-scoped
127
+ * logger onto the Context).
128
+ */
129
+ async resolveLogger(request) {
130
+ if (this.moduleRef) {
131
+ try {
132
+ const contextId = core_1.ContextIdFactory.getByRequest(request);
133
+ const requestContext = await this.moduleRef.resolve(DecafRequestContext_js_1.DecafRequestContext, contextId, { strict: false });
134
+ if (requestContext?.logger)
135
+ return requestContext.logger;
136
+ }
137
+ catch {
138
+ // no request-scoped context bound for this request — fall back below
139
+ }
140
+ }
141
+ return logging_1.Logging.get();
142
+ }
47
143
  };
48
144
  exports.DecafExceptionFilter = DecafExceptionFilter;
49
145
  exports.DecafExceptionFilter = DecafExceptionFilter = __decorate([
50
- (0, common_1.Catch)()
146
+ (0, common_1.Catch)(),
147
+ (0, common_1.Injectable)(),
148
+ __param(0, (0, common_1.Optional)()),
149
+ __metadata("design:paramtypes", [core_1.ModuleRef])
51
150
  ], DecafExceptionFilter);
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVjYWZFcnJvckZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9mYWN0b3J5L2V4Y2VwdGlvbnMvRGVjYWZFcnJvckZpbHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBRUwsS0FBSyxFQUVMLHNCQUFzQixFQUN0QixpQkFBaUIsR0FDbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQ0FBNkI7QUFHcEQsSUFBTSxvQkFBb0IsR0FBMUIsTUFBTSxvQkFBb0I7SUFDL0IsS0FBSyxDQUFDLFNBQWdCLEVBQUUsSUFBbUI7UUFDekMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2hDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFakMsTUFBTSxZQUFZLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxLQUFLLFlBQVksQ0FBQztRQUM1RCxJQUFJLFVBQVUsQ0FBQztRQUVmLElBQ0UsU0FBUyxZQUFZLGlCQUFpQjtZQUN0QyxTQUFTLFlBQVksZ0JBQWdCLEVBQ3JDLENBQUM7WUFDRCxTQUFTLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUQsVUFBVSxHQUFJLFNBQW9DLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakUsQ0FBQzthQUFNLElBQUksQ0FBQyxDQUFDLFNBQVMsWUFBWSxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzdDLElBQUksU0FBaUIsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFDLENBQUM7Z0JBQ3BDLFNBQVMsR0FBRyxJQUFJLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6RCxDQUFDO2lCQUFJLENBQUM7Z0JBQ0osU0FBUyxHQUFHLElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuRCxDQUFDO1FBQ0gsQ0FBQztRQUVELFFBQVEsQ0FBQyxNQUFNLENBQUUsU0FBdUIsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ2hFLE1BQU0sRUFBRyxTQUF1QixDQUFDLElBQUksSUFBSSxVQUFVO1lBQ25ELEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPO1lBQ3hELFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNuQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDakIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1NBQ3ZCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRixDQUFBO0FBL0JZLG9CQUFvQjtJQURoQyxLQUFLLEVBQUU7R0FDSyxvQkFBb0IsQ0ErQmhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXJndW1lbnRzSG9zdCxcbiAgQ2F0Y2gsXG4gIEV4Y2VwdGlvbkZpbHRlcixcbiAgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQmFzZUVycm9yLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBMb2dnZWRFbnZpcm9ubWVudCB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVG9NYW55UmVxdWVzdHNFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvdGhyb3R0bGluZ1wiO1xuXG5AQ2F0Y2goKVxuZXhwb3J0IGNsYXNzIERlY2FmRXhjZXB0aW9uRmlsdGVyIGltcGxlbWVudHMgRXhjZXB0aW9uRmlsdGVyIHtcbiAgY2F0Y2goZXhjZXB0aW9uOiBFcnJvciwgaG9zdDogQXJndW1lbnRzSG9zdCkge1xuICAgIGNvbnN0IGN0eCA9IGhvc3Quc3dpdGNoVG9IdHRwKCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBjdHguZ2V0UmVzcG9uc2UoKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gY3R4LmdldFJlcXVlc3QoKTtcblxuICAgIGNvbnN0IGlzUHJvZHVjdGlvbiA9IExvZ2dlZEVudmlyb25tZW50LmVudiA9PT0gXCJwcm9kdWN0aW9uXCI7XG4gICAgbGV0IHN0YXR1c0NvZGU7XG5cbiAgICBpZiAoXG4gICAgICBleGNlcHRpb24gaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fFxuICAgICAgZXhjZXB0aW9uIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRFcnJvclxuICAgICkge1xuICAgICAgZXhjZXB0aW9uID0gbmV3IE5vdEFjY2VwdGFibGVFeGNlcHRpb24oZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgc3RhdHVzQ29kZSA9IChleGNlcHRpb24gYXMgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbikuZ2V0U3RhdHVzKCk7XG4gICAgfSBlbHNlIGlmICghKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIEJhc2VFcnJvcikpIHtcbiAgICAgIGlmKChleGNlcHRpb24gYXMgYW55KS5zdGF0dXMgPT09IDQyOSl7XG4gICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBUb01hbnlSZXF1ZXN0c0Vycm9yKGV4Y2VwdGlvbi5tZXNzYWdlKTtcbiAgICAgIH1lbHNle1xuICAgICAgICBleGNlcHRpb24gPSBuZXcgSW50ZXJuYWxFcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzcG9uc2Uuc3RhdHVzKChleGNlcHRpb24gYXMgQmFzZUVycm9yKS5jb2RlIHx8IHN0YXR1c0NvZGUpLmpzb24oe1xuICAgICAgc3RhdHVzOiAoZXhjZXB0aW9uIGFzIEJhc2VFcnJvcikuY29kZSB8fCBzdGF0dXNDb2RlLFxuICAgICAgZXJyb3I6IGlzUHJvZHVjdGlvbiA/IGV4Y2VwdGlvbi5uYW1lIDogZXhjZXB0aW9uLm1lc3NhZ2UsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHBhdGg6IHJlcXVlc3QudXJsLFxuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICB9KTtcbiAgfVxufVxuIl19
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVjYWZFcnJvckZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkRlY2FmRXJyb3JGaWx0ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBSSxVQUFVLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSTtJQUNqRixJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzdILElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxVQUFVO1FBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7O1FBQzFILEtBQUssSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFBRSxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEosT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xFLENBQUMsQ0FBQztBQUNGLDJDQUFtRjtBQUNuRiwyREFBbUU7QUFDbkUsK0NBQXNEO0FBQ3RELHlDQUFrRDtBQUNsRCw2REFBZ0U7QUFDaEUsSUFBSSxvQkFBb0IsR0FBRyxNQUFNLG9CQUFvQjtJQUNqRCxLQUFLLENBQUMsU0FBUyxFQUFFLElBQUk7UUFDakIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2hDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDakMsTUFBTSxZQUFZLEdBQUcsMkJBQWlCLENBQUMsR0FBRyxLQUFLLFlBQVksQ0FBQztRQUM1RCxJQUFJLFVBQVUsQ0FBQztRQUNmLElBQUksU0FBUyxZQUFZLDBCQUFpQjtZQUN0QyxTQUFTLFlBQVksdUJBQWdCLEVBQUUsQ0FBQztZQUN4QyxTQUFTLEdBQUcsSUFBSSwrQkFBc0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUQsVUFBVSxHQUFHLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN2QyxDQUFDO2FBQ0ksSUFBSSxDQUFDLENBQUMsU0FBUyxZQUFZLHlCQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3pDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDM0IsU0FBUyxHQUFHLElBQUksbUNBQW1CLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNELENBQUM7aUJBQ0ksQ0FBQztnQkFDRixTQUFTLEdBQUcsSUFBSSw2QkFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyRCxDQUFDO1FBQ0wsQ0FBQztRQUNELFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDL0MsTUFBTSxFQUFFLFNBQVMsQ0FBQyxJQUFJLElBQUksVUFBVTtZQUNwQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTztZQUN4RCxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDbkMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxHQUFHO1lBQ2pCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtTQUN6QixDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0osQ0FBQztBQUlPLG9EQUFvQjtBQUg3QiwrQkFBQSxvQkFBb0IsR0FBRyxVQUFVLENBQUM7SUFDOUIsSUFBQSxjQUFLLEdBQUU7Q0FDVixFQUFFLG9CQUFvQixDQUFDLENBQUM7QUFFekIsOGhJQUE4aEkiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19kZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19kZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn07XG5pbXBvcnQgeyBDYXRjaCwgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbiwgTm90Rm91bmRFeGNlcHRpb24sIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBCYXNlRXJyb3IsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlZEVudmlyb25tZW50IH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBUb01hbnlSZXF1ZXN0c0Vycm9yIH0gZnJvbSBcIi4vLi4vZXJyb3JzL3Rocm90dGxpbmcuanNcIjtcbmxldCBEZWNhZkV4Y2VwdGlvbkZpbHRlciA9IGNsYXNzIERlY2FmRXhjZXB0aW9uRmlsdGVyIHtcbiAgICBjYXRjaChleGNlcHRpb24sIGhvc3QpIHtcbiAgICAgICAgY29uc3QgY3R4ID0gaG9zdC5zd2l0Y2hUb0h0dHAoKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBjdHguZ2V0UmVzcG9uc2UoKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGN0eC5nZXRSZXF1ZXN0KCk7XG4gICAgICAgIGNvbnN0IGlzUHJvZHVjdGlvbiA9IExvZ2dlZEVudmlyb25tZW50LmVudiA9PT0gXCJwcm9kdWN0aW9uXCI7XG4gICAgICAgIGxldCBzdGF0dXNDb2RlO1xuICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24gfHxcbiAgICAgICAgICAgIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3IpIHtcbiAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uKGV4Y2VwdGlvbi5tZXNzYWdlKTtcbiAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBleGNlcHRpb24uZ2V0U3RhdHVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShleGNlcHRpb24gaW5zdGFuY2VvZiBCYXNlRXJyb3IpKSB7XG4gICAgICAgICAgICBpZiAoZXhjZXB0aW9uLnN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IFRvTWFueVJlcXVlc3RzRXJyb3IoZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IEludGVybmFsRXJyb3IoZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc3BvbnNlLnN0YXR1cyhleGNlcHRpb24uY29kZSB8fCBzdGF0dXNDb2RlKS5qc29uKHtcbiAgICAgICAgICAgIHN0YXR1czogZXhjZXB0aW9uLmNvZGUgfHwgc3RhdHVzQ29kZSxcbiAgICAgICAgICAgIGVycm9yOiBpc1Byb2R1Y3Rpb24gPyBleGNlcHRpb24ubmFtZSA6IGV4Y2VwdGlvbi5tZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybCxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5EZWNhZkV4Y2VwdGlvbkZpbHRlciA9IF9fZGVjb3JhdGUoW1xuICAgIENhdGNoKClcbl0sIERlY2FmRXhjZXB0aW9uRmlsdGVyKTtcbmV4cG9ydCB7IERlY2FmRXhjZXB0aW9uRmlsdGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lSR1ZqWVdaRmNuSnZja1pwYkhSbGNpNXFjeUlzSW5OdmRYSmpaVkp2YjNRaU9pSWlMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMeTR1THk0dUwzTnlZeTltWVdOMGIzSjVMMlY0WTJWd2RHbHZibk12UkdWallXWkZjbkp2Y2tacGJIUmxjaTUwY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pT3pzN096czdRVUZCUVN4UFFVRlBMRVZCUlV3c1MwRkJTeXhGUVVWTUxITkNRVUZ6UWl4RlFVTjBRaXhwUWtGQmFVSXNSMEZEYkVJc1RVRkJUU3huUWtGQlowSXNRMEZCUXp0QlFVTjRRaXhQUVVGUExFVkJRVVVzVTBGQlV5eEZRVUZGTEdGQlFXRXNSVUZCUlN4TlFVRk5MSGxDUVVGNVFpeERRVUZETzBGQlEyNUZMRTlCUVU4c1JVRkJSU3hwUWtGQmFVSXNSVUZCUlN4TlFVRk5MRzFDUVVGdFFpeERRVUZETzBGQlEzUkVMRTlCUVU4c1JVRkJSU3huUWtGQlowSXNSVUZCUlN4TlFVRk5MR2RDUVVGblFpeERRVUZETzBGQlEyeEVMRTlCUVU4c1JVRkJSU3h0UWtGQmJVSXNSVUZCUlN4clEwRkJOa0k3UVVGSGNFUXNTVUZCVFN4dlFrRkJiMElzUjBGQk1VSXNUVUZCVFN4dlFrRkJiMEk3U1VGREwwSXNTMEZCU3l4RFFVRkRMRk5CUVdkQ0xFVkJRVVVzU1VGQmJVSTdVVUZEZWtNc1RVRkJUU3hIUVVGSExFZEJRVWNzU1VGQlNTeERRVUZETEZsQlFWa3NSVUZCUlN4RFFVRkRPMUZCUTJoRExFMUJRVTBzVVVGQlVTeEhRVUZITEVkQlFVY3NRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJRenRSUVVOdVF5eE5RVUZOTEU5QlFVOHNSMEZCUnl4SFFVRkhMRU5CUVVNc1ZVRkJWU3hGUVVGRkxFTkJRVU03VVVGRmFrTXNUVUZCVFN4WlFVRlpMRWRCUVVjc2FVSkJRV2xDTEVOQlFVTXNSMEZCUnl4TFFVRkxMRmxCUVZrc1EwRkJRenRSUVVNMVJDeEpRVUZKTEZWQlFWVXNRMEZCUXp0UlFVVm1MRWxCUTBVc1UwRkJVeXhaUVVGWkxHbENRVUZwUWp0WlFVTjBReXhUUVVGVExGbEJRVmtzWjBKQlFXZENMRVZCUTNKRExFTkJRVU03V1VGRFJDeFRRVUZUTEVkQlFVY3NTVUZCU1N4elFrRkJjMElzUTBGQlF5eFRRVUZUTEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNN1dVRkRNVVFzVlVGQlZTeEhRVUZKTEZOQlFXOURMRU5CUVVNc1UwRkJVeXhGUVVGRkxFTkJRVU03VVVGRGFrVXNRMEZCUXp0aFFVRk5MRWxCUVVrc1EwRkJReXhEUVVGRExGTkJRVk1zV1VGQldTeFRRVUZUTEVOQlFVTXNSVUZCUlN4RFFVRkRPMWxCUXpkRExFbEJRVWtzVTBGQmFVSXNRMEZCUXl4TlFVRk5MRXRCUVVzc1IwRkJSeXhGUVVGRExFTkJRVU03WjBKQlEzQkRMRk5CUVZNc1IwRkJSeXhKUVVGSkxHMUNRVUZ0UWl4RFFVRkRMRk5CUVZNc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF6dFpRVU42UkN4RFFVRkRPMmxDUVVGSkxFTkJRVU03WjBKQlEwb3NVMEZCVXl4SFFVRkhMRWxCUVVrc1lVRkJZU3hEUVVGRExGTkJRVk1zUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXp0WlFVTnVSQ3hEUVVGRE8xRkJRMGdzUTBGQlF6dFJRVVZFTEZGQlFWRXNRMEZCUXl4TlFVRk5MRU5CUVVVc1UwRkJkVUlzUTBGQlF5eEpRVUZKTEVsQlFVa3NWVUZCVlN4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRE8xbEJRMmhGTEUxQlFVMHNSVUZCUnl4VFFVRjFRaXhEUVVGRExFbEJRVWtzU1VGQlNTeFZRVUZWTzFsQlEyNUVMRXRCUVVzc1JVRkJSU3haUVVGWkxFTkJRVU1zUTBGQlF5eERRVUZETEZOQlFWTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExGTkJRVk1zUTBGQlF5eFBRVUZQTzFsQlEzaEVMRk5CUVZNc1JVRkJSU3hKUVVGSkxFbEJRVWtzUlVGQlJTeERRVUZETEZkQlFWY3NSVUZCUlR0WlFVTnVReXhKUVVGSkxFVkJRVVVzVDBGQlR5eERRVUZETEVkQlFVYzdXVUZEYWtJc1RVRkJUU3hGUVVGRkxFOUJRVThzUTBGQlF5eE5RVUZOTzFOQlEzWkNMRU5CUVVNc1EwRkJRenRKUVVOTUxFTkJRVU03UTBGRFJpeERRVUZCTzBGQkwwSlpMRzlDUVVGdlFqdEpRVVJvUXl4TFFVRkxMRVZCUVVVN1IwRkRTeXh2UWtGQmIwSXNRMEVyUW1oRElpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElIdGNiaUFnUVhKbmRXMWxiblJ6U0c5emRDeGNiaUFnUTJGMFkyZ3NYRzRnSUVWNFkyVndkR2x2YmtacGJIUmxjaXhjYmlBZ1RtOTBRV05qWlhCMFlXSnNaVVY0WTJWd2RHbHZiaXhjYmlBZ1RtOTBSbTkxYm1SRmVHTmxjSFJwYjI0c1hHNTlJR1p5YjIwZ1hDSkFibVZ6ZEdwekwyTnZiVzF2Ymx3aU8xeHVhVzF3YjNKMElIc2dRbUZ6WlVWeWNtOXlMQ0JKYm5SbGNtNWhiRVZ5Y205eUlIMGdabkp2YlNCY0lrQmtaV05oWmkxMGN5OWtZaTFrWldOdmNtRjBiM0p6WENJN1hHNXBiWEJ2Y25RZ2V5Qk1iMmRuWldSRmJuWnBjbTl1YldWdWRDQjlJR1p5YjIwZ1hDSkFaR1ZqWVdZdGRITXZiRzluWjJsdVoxd2lPMXh1YVcxd2IzSjBJSHNnVlc1emRYQndiM0owWldSRmNuSnZjaUI5SUdaeWIyMGdYQ0pBWkdWallXWXRkSE12WTI5eVpWd2lPMXh1YVcxd2IzSjBJSHNnVkc5TllXNTVVbVZ4ZFdWemRITkZjbkp2Y2lCOUlHWnliMjBnWENJdUxpOWxjbkp2Y25NdmRHaHliM1IwYkdsdVoxd2lPMXh1WEc1QVEyRjBZMmdvS1Z4dVpYaHdiM0owSUdOc1lYTnpJRVJsWTJGbVJYaGpaWEIwYVc5dVJtbHNkR1Z5SUdsdGNHeGxiV1Z1ZEhNZ1JYaGpaWEIwYVc5dVJtbHNkR1Z5SUh0Y2JpQWdZMkYwWTJnb1pYaGpaWEIwYVc5dU9pQkZjbkp2Y2l3Z2FHOXpkRG9nUVhKbmRXMWxiblJ6U0c5emRDa2dlMXh1SUNBZ0lHTnZibk4wSUdOMGVDQTlJR2h2YzNRdWMzZHBkR05vVkc5SWRIUndLQ2s3WEc0Z0lDQWdZMjl1YzNRZ2NtVnpjRzl1YzJVZ1BTQmpkSGd1WjJWMFVtVnpjRzl1YzJVb0tUdGNiaUFnSUNCamIyNXpkQ0J5WlhGMVpYTjBJRDBnWTNSNExtZGxkRkpsY1hWbGMzUW9LVHRjYmx4dUlDQWdJR052Ym5OMElHbHpVSEp2WkhWamRHbHZiaUE5SUV4dloyZGxaRVZ1ZG1seWIyNXRaVzUwTG1WdWRpQTlQVDBnWENKd2NtOWtkV04wYVc5dVhDSTdYRzRnSUNBZ2JHVjBJSE4wWVhSMWMwTnZaR1U3WEc1Y2JpQWdJQ0JwWmlBb1hHNGdJQ0FnSUNCbGVHTmxjSFJwYjI0Z2FXNXpkR0Z1WTJWdlppQk9iM1JHYjNWdVpFVjRZMlZ3ZEdsdmJpQjhmRnh1SUNBZ0lDQWdaWGhqWlhCMGFXOXVJR2x1YzNSaGJtTmxiMllnVlc1emRYQndiM0owWldSRmNuSnZjbHh1SUNBZ0lDa2dlMXh1SUNBZ0lDQWdaWGhqWlhCMGFXOXVJRDBnYm1WM0lFNXZkRUZqWTJWd2RHRmliR1ZGZUdObGNIUnBiMjRvWlhoalpYQjBhVzl1TG0xbGMzTmhaMlVwTzF4dUlDQWdJQ0FnYzNSaGRIVnpRMjlrWlNBOUlDaGxlR05sY0hScGIyNGdZWE1nVG05MFFXTmpaWEIwWVdKc1pVVjRZMlZ3ZEdsdmJpa3VaMlYwVTNSaGRIVnpLQ2s3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2doS0dWNFkyVndkR2x2YmlCcGJuTjBZVzVqWlc5bUlFSmhjMlZGY25KdmNpa3BJSHRjYmlBZ0lDQWdJR2xtS0NobGVHTmxjSFJwYjI0Z1lYTWdZVzU1S1M1emRHRjBkWE1nUFQwOUlEUXlPU2w3WEc0Z0lDQWdJQ0FnSUdWNFkyVndkR2x2YmlBOUlHNWxkeUJVYjAxaGJubFNaWEYxWlhOMGMwVnljbTl5S0dWNFkyVndkR2x2Ymk1dFpYTnpZV2RsS1R0Y2JpQWdJQ0FnSUgxbGJITmxlMXh1SUNBZ0lDQWdJQ0JsZUdObGNIUnBiMjRnUFNCdVpYY2dTVzUwWlhKdVlXeEZjbkp2Y2lobGVHTmxjSFJwYjI0dWJXVnpjMkZuWlNrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dVhHNGdJQ0FnY21WemNHOXVjMlV1YzNSaGRIVnpLQ2hsZUdObGNIUnBiMjRnWVhNZ1FtRnpaVVZ5Y205eUtTNWpiMlJsSUh4OElITjBZWFIxYzBOdlpHVXBMbXB6YjI0b2UxeHVJQ0FnSUNBZ2MzUmhkSFZ6T2lBb1pYaGpaWEIwYVc5dUlHRnpJRUpoYzJWRmNuSnZjaWt1WTI5a1pTQjhmQ0J6ZEdGMGRYTkRiMlJsTEZ4dUlDQWdJQ0FnWlhKeWIzSTZJR2x6VUhKdlpIVmpkR2x2YmlBL0lHVjRZMlZ3ZEdsdmJpNXVZVzFsSURvZ1pYaGpaWEIwYVc5dUxtMWxjM05oWjJVc1hHNGdJQ0FnSUNCMGFXMWxjM1JoYlhBNklHNWxkeUJFWVhSbEtDa3VkRzlKVTA5VGRISnBibWNvS1N4Y2JpQWdJQ0FnSUhCaGRHZzZJSEpsY1hWbGMzUXVkWEpzTEZ4dUlDQWdJQ0FnYldWMGFHOWtPaUJ5WlhGMVpYTjBMbTFsZEdodlpDeGNiaUFnSUNCOUtUdGNiaUFnZlZ4dWZWeHVJbDE5Il19
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVjYWZFcnJvckZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9mYWN0b3J5L2V4Y2VwdGlvbnMvRGVjYWZFcnJvckZpbHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBRUwsbUJBQW1CLEVBQ25CLEtBQUssRUFDTCxpQkFBaUIsRUFFakIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixVQUFVLEVBQ1Ysc0JBQXNCLEVBQ3RCLGlCQUFpQixFQUNqQixRQUFRLEVBQ1IscUJBQXFCLEVBQ3JCLDRCQUE0QixHQUM3QixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0QsT0FBTyxFQUNMLGVBQWUsRUFDZixTQUFTLEVBQ1QsYUFBYSxFQUNiLGFBQWEsRUFDYixlQUFlLEdBQ2hCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0NBQTZCO0FBQzNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSwrQ0FBMEM7QUFHeEU7Ozs7OztHQU1HO0FBQ0gsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLEdBQUcsQ0FHM0M7SUFDQSxDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdELENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RELENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxHQUFHLEVB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RixDQUFBO0FBL0dZLG9CQUFvQjtJQUZoQyxLQUFLLEVBQUU7SUFDUCxVQUFVLEVBQUU7SUFFRSxXQUFBLFFBQVEsRUFBRSxDQUFBO3FDQUFnQyxTQUFTO0dBRHJELG9CQUFvQixDQStHaEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBcmd1bWVudHNIb3N0LFxuICBCYWRSZXF1ZXN0RXhjZXB0aW9uLFxuICBDYXRjaCxcbiAgQ29uZmxpY3RFeGNlcHRpb24sXG4gIEV4Y2VwdGlvbkZpbHRlcixcbiAgRm9yYmlkZGVuRXhjZXB0aW9uLFxuICBIdHRwRXhjZXB0aW9uLFxuICBJbmplY3RhYmxlLFxuICBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgT3B0aW9uYWwsXG4gIFVuYXV0aG9yaXplZEV4Y2VwdGlvbixcbiAgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbixcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBDb250ZXh0SWRGYWN0b3J5LCBNb2R1bGVSZWYgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQge1xuICBCYWRSZXF1ZXN0RXJyb3IsXG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlZEVudmlyb25tZW50LCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IsIEZvcmJpZGRlbkVycm9yLCBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBUb01hbnlSZXF1ZXN0c0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy90aHJvdHRsaW5nXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uLy4uL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0TG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcyB3ZWxsLWtub3duIE5lc3RKUyBgSHR0cEV4Y2VwdGlvbmAgc3ViY2xhc3NlcyAoYXMgZ3VhcmRzLCBwaXBlcywgb3JcbiAqIG90aGVyIGZyYW1ld29yay1sZXZlbCBjb2RlIHdvdWxkIHRocm93IHRoZW0pIG9udG8gdGhlIGVxdWl2YWxlbnQgZGVjYWYtdHMgYEJhc2VFcnJvcmAuXG4gKiBAc3VtbWFyeSBPbmx5IGBCYXNlRXJyb3JgIGluc3RhbmNlcyBjYXJyeSB0aGUgYC5jb2RlYCB0aGUgcmVzcG9uc2UgYm9keSByZWxpZXMgb24sIHNvXG4gKiB3aXRob3V0IHRoaXMgbWFwIGV2ZXJ5IG5vbi1kZWNhZiBleGNlcHRpb24g4oCUIGluY2x1ZGluZyBwZXJmZWN0bHkgbGVnaXRpbWF0ZSBvbmVzIGxpa2UgYVxuICogZ3VhcmQncyBgRm9yYmlkZGVuRXhjZXB0aW9uYCDigJQgd291bGQgYmUgZmxhdHRlbmVkIGludG8gYSBnZW5lcmljIDUwMCBgSW50ZXJuYWxFcnJvcmAuXG4gKi9cbmNvbnN0IEhUVFBfRVhDRVBUSU9OX1RPX0RFQ0FGX0VSUk9SID0gbmV3IE1hcDxcbiAgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gSHR0cEV4Y2VwdGlvbixcbiAgKG1zZzogc3RyaW5nKSA9PiBCYXNlRXJyb3Jcbj4oW1xuICBbVW5hdXRob3JpemVkRXhjZXB0aW9uLCAobXNnKSA9PiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1zZyldLFxuICBbRm9yYmlkZGVuRXhjZXB0aW9uLCAobXNnKSA9PiBuZXcgRm9yYmlkZGVuRXJyb3IobXNnKV0sXG4gIFtCYWRSZXF1ZXN0RXhjZXB0aW9uLCAobXNnKSA9PiBuZXcgQmFkUmVxdWVzdEVycm9yKG1zZyldLFxuICBbQ29uZmxpY3RFeGNlcHRpb24sIChtc2cpID0+IG5ldyBDb25mbGljdEVycm9yKG1zZyldLFxuICBbVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiwgKG1zZykgPT4gbmV3IFZhbGlkYXRpb25FcnJvcihtc2cpXSxcbl0pO1xuXG5AQ2F0Y2goKVxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERlY2FmRXhjZXB0aW9uRmlsdGVyIGltcGxlbWVudHMgRXhjZXB0aW9uRmlsdGVyIHtcbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgcHJvdGVjdGVkIHJlYWRvbmx5IG1vZHVsZVJlZj86IE1vZHVsZVJlZikge31cblxuICBhc3luYyBjYXRjaChleGNlcHRpb246IEVycm9yLCBob3N0OiBBcmd1bWVudHNIb3N0KSB7XG4gICAgY29uc3QgY3R4ID0gaG9zdC5zd2l0Y2hUb0h0dHAoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGN0eC5nZXRSZXNwb25zZSgpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSBjdHguZ2V0UmVxdWVzdCgpO1xuXG4gICAgY29uc3QgaXNQcm9kdWN0aW9uID0gTG9nZ2VkRW52aXJvbm1lbnQuZW52ID09PSBcInByb2R1Y3Rpb25cIjtcbiAgICBsZXQgc3RhdHVzQ29kZTtcblxuICAgIGlmIChcbiAgICAgIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uIHx8XG4gICAgICBleGNlcHRpb24gaW5zdGFuY2VvZiBVbnN1cHBvcnRlZEVycm9yXG4gICAgKSB7XG4gICAgICBleGNlcHRpb24gPSBuZXcgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICBzdGF0dXNDb2RlID0gKGV4Y2VwdGlvbiBhcyBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uKS5nZXRTdGF0dXMoKTtcbiAgICB9IGVsc2UgaWYgKCEoZXhjZXB0aW9uIGluc3RhbmNlb2YgQmFzZUVycm9yKSkge1xuICAgICAgY29uc3QgdG9EZWNhZkVycm9yID0gdGhpcy5kZWNhZkVycm9yRm9yKGV4Y2VwdGlvbik7XG4gICAgICBpZiAodG9EZWNhZkVycm9yKSB7XG4gICAgICAgIGV4Y2VwdGlvbiA9IHRvRGVjYWZFcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICB9IGVsc2UgaWYgKChleGNlcHRpb24gYXMgYW55KS5zdGF0dXMgPT09IDQyOSkge1xuICAgICAgICBleGNlcHRpb24gPSBuZXcgVG9NYW55UmVxdWVzdHNFcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICB9IGVsc2UgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIEh0dHBFeGNlcHRpb24pIHtcbiAgICAgICAgLy8gQSByZWNvZ25pemVkIGJ1dCB1bm1hcHBlZCBIdHRwRXhjZXB0aW9uIChlLmcuIHRocm93biBieSBhIGd1YXJkIG9yXG4gICAgICAgIC8vIHBpcGUpIOKAlCBwcmVzZXJ2ZSBpdHMgcmVhbCBzdGF0dXMgaW5zdGVhZCBvZiBmbGF0dGVuaW5nIGl0IHRvIDUwMC5cbiAgICAgICAgc3RhdHVzQ29kZSA9IGV4Y2VwdGlvbi5nZXRTdGF0dXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBJbnRlcm5hbEVycm9yKGV4Y2VwdGlvbi5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmxvZ0Vycm9yKHJlcXVlc3QsIGV4Y2VwdGlvbik7XG5cbiAgICByZXNwb25zZS5zdGF0dXMoKGV4Y2VwdGlvbiBhcyBCYXNlRXJyb3IpLmNvZGUgfHwgc3RhdHVzQ29kZSkuanNvbih7XG4gICAgICBzdGF0dXM6IChleGNlcHRpb24gYXMgQmFzZUVycm9yKS5jb2RlIHx8IHN0YXR1c0NvZGUsXG4gICAgICBlcnJvcjogaXNQcm9kdWN0aW9uID8gZXhjZXB0aW9uLm5hbWUgOiBleGNlcHRpb24ubWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgcGF0aDogcmVxdWVzdC51cmwsXG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaW5kcyB0aGUgZGVjYWYtdHMgYEJhc2VFcnJvcmAgY29uc3RydWN0b3IgbWFwcGVkIHRvIHRoaXMgZXhjZXB0aW9uJ3MgdHlwZSwgaWYgYW55LlxuICAgKiBAc3VtbWFyeSBXYWxrcyBgSFRUUF9FWENFUFRJT05fVE9fREVDQUZfRVJST1JgIHdpdGggYGluc3RhbmNlb2ZgIChyYXRoZXIgdGhhbiBhIHN0cmFpZ2h0XG4gICAqIGBNYXAuZ2V0YCkgc28gc3ViY2xhc3NlcyBvZiBhIG1hcHBlZCBleGNlcHRpb24gYXJlIG1hdGNoZWQgdG9vLlxuICAgKi9cbiAgcHJvdGVjdGVkIGRlY2FmRXJyb3JGb3IoXG4gICAgZXhjZXB0aW9uOiBFcnJvclxuICApOiAoKG1zZzogc3RyaW5nKSA9PiBCYXNlRXJyb3IpIHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGNvbnN0IFt0eXBlLCBmYWN0b3J5XSBvZiBIVFRQX0VYQ0VQVElPTl9UT19ERUNBRl9FUlJPUikge1xuICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIHR5cGUpIHJldHVybiBmYWN0b3J5O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIHRoZSBleGNlcHRpb24gd2l0aG91dCBldmVyIGxldHRpbmcgbG9nZ2luZyBmYWlsdXJlcyBibG9jayB0aGUgcmVzcG9uc2UuXG4gICAqIEBzdW1tYXJ5IEEgZ3VhcmQgKG9yIG1pZGRsZXdhcmUvQ09SUyBjaGVjaykgY2FuIHRocm93IGJlZm9yZSBhbnkgZGVjYWYtYXdhcmUgcHJvdmlkZXIgcmFuLFxuICAgKiBzbyB0aGUgcmVxdWVzdC1ib3VuZCBDb250ZXh0IG1heSBub3QgZXhpc3QgeWV0IOKAlCBvciB0aGUgcmVzb2x2ZWQgbG9nZ2VyJ3MgYC5lcnJvcigpYCBpdHNlbGZcbiAgICogY291bGQgdGhyb3cgKGJyb2tlbiB0cmFuc3BvcnQsIGZvcm1hdHRlciBidWcsIGV0Yy4pLiBFaXRoZXIgd2F5IHRoZSBjbGllbnQtZmFjaW5nIGVycm9yXG4gICAqIHJlc3BvbnNlIGJlbG93IG11c3Qgc3RpbGwgZ28gb3V0LCBzbyBldmVyeSBmYWlsdXJlIG1vZGUgaGVyZSBpcyBzd2FsbG93ZWQsIGZhbGxpbmcgYmFjayB0b1xuICAgKiB0aGUgcGxhaW4gYExvZ2dpbmcuZ2V0KClgIGxvZ2dlciBhbmQsIGFzIGEgbGFzdCByZXNvcnQsIGRvaW5nIG5vdGhpbmcgYXQgYWxsLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGxvZ0Vycm9yKFxuICAgIHJlcXVlc3Q6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgZXhjZXB0aW9uOiBFcnJvclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZXNzYWdlID0gYFVuaGFuZGxlZCBlcnJvciBvbiAke3JlcXVlc3Q/Lm1ldGhvZH0gJHtyZXF1ZXN0Py51cmx9YDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9nID0gYXdhaXQgdGhpcy5yZXNvbHZlTG9nZ2VyKHJlcXVlc3QpO1xuICAgICAgbG9nLmVycm9yKG1lc3NhZ2UsIGV4Y2VwdGlvbik7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICBMb2dnaW5nLmdldCgpLmVycm9yKG1lc3NhZ2UsIGV4Y2VwdGlvbik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gbG9nZ2luZyBpcyB1bmF2YWlsYWJsZSDigJQgdGhlIHJlc3BvbnNlIGlzIHN0aWxsIHNlbnQgYmVsb3dcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIHRoZSBsb2dnZXIgYm91bmQgdG8gdGhlIG9yaWdpbmF0aW5nIHJlcXVlc3QncyBkZWNhZi10cyBDb250ZXh0LlxuICAgKiBAc3VtbWFyeSBHbG9iYWwgZmlsdGVycyBhcmUgc2luZ2xldG9ucywgc28gdGhlIHJlcXVlc3Qtc2NvcGVkIHtAbGluayBEZWNhZlJlcXVlc3RDb250ZXh0fVxuICAgKiAoYW5kIHRoZSBjbGllbnQvdXNlci1ib3VuZCBsb2dnZXIgaXQgY2FycmllcykgY2FuJ3QgYmUgY29uc3RydWN0b3ItaW5qZWN0ZWQuIEluc3RlYWQsIHRoaXNcbiAgICogbG9va3MgdXAgdGhlIHNhbWUgcmVxdWVzdCdzIGNvbnRleHQgaWQgYW5kIHJlLXJlc29sdmVzIHRoZSBhbHJlYWR5LWFjY3VtdWxhdGVkIGluc3RhbmNlXG4gICAqIHRocm91Z2ggYE1vZHVsZVJlZmAuIEZhbGxzIGJhY2sgdG8gdGhlIGdlbmVyaWMgYExvZ2dpbmcuZ2V0KClgIGxvZ2dlciB3aGVuIHRoZSBmaWx0ZXIgd2Fzbid0XG4gICAqIGNvbnN0cnVjdGVkIHdpdGggYSBgTW9kdWxlUmVmYCAoZS5nLiBtYW51YWxseSBgbmV3YCdkKSBvciBubyByZXF1ZXN0LXNjb3BlZCBjb250ZXh0IGV4aXN0c1xuICAgKiBmb3IgdGhpcyByZXF1ZXN0IChlLmcuIHRoZSBlcnJvciBoYXBwZW5lZCBiZWZvcmUgYW55IGRlY2FmLWF3YXJlIHByb3ZpZGVyIHJhbiwgYXMgaXMgdGhlXG4gICAqIGNhc2Ugd2hlbiBhIGd1YXJkIHJlamVjdHMgdGhlIHJlcXVlc3QgYmVmb3JlIGludGVyY2VwdG9ycyBnZXQgdG8gYmluZCB0aGUgY2xpZW50LXNjb3BlZFxuICAgKiBsb2dnZXIgb250byB0aGUgQ29udGV4dCkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcmVzb2x2ZUxvZ2dlcihcbiAgICByZXF1ZXN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVxdWVzdExvZ2dlcj4ge1xuICAgIGlmICh0aGlzLm1vZHVsZVJlZikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGV4dElkID0gQ29udGV4dElkRmFjdG9yeS5nZXRCeVJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gYXdhaXQgdGhpcy5tb2R1bGVSZWYucmVzb2x2ZShcbiAgICAgICAgICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgICAgICAgIGNvbnRleHRJZCxcbiAgICAgICAgICB7IHN0cmljdDogZmFsc2UgfVxuICAgICAgICApO1xuICAgICAgICBpZiAocmVxdWVzdENvbnRleHQ/LmxvZ2dlcikgcmV0dXJuIHJlcXVlc3RDb250ZXh0LmxvZ2dlcjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBubyByZXF1ZXN0LXNjb3BlZCBjb250ZXh0IGJvdW5kIGZvciB0aGlzIHJlcXVlc3Qg4oCUIGZhbGwgYmFjayBiZWxvd1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gTG9nZ2luZy5nZXQoKSBhcyB1bmtub3duIGFzIFJlcXVlc3RMb2dnZXI7XG4gIH1cbn1cbiJdfQ==
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVjYWZFcnJvckZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkRlY2FmRXJyb3JGaWx0ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBSSxVQUFVLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSTtJQUNqRixJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzdILElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxVQUFVO1FBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7O1FBQzFILEtBQUssSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFBRSxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUs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QUFDO0FBT08sb0RBQW9CO0FBTjdCLCtCQUFBLG9CQUFvQixHQUFHLFVBQVUsQ0FBQztJQUM5QixJQUFBLGNBQUssR0FBRTtJQUNQLElBQUEsbUJBQVUsR0FBRTtJQUNaLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBQSxpQkFBUSxHQUFFLENBQUM7SUFDdEIsVUFBVSxDQUFDLG1CQUFtQixFQUFFLENBQUMsZ0JBQVMsQ0FBQyxDQUFDO0NBQy9DLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztBQUV6Qiw4NGFBQTg0YSIsInNvdXJjZXNDb250ZW50IjpbInZhciBfX2RlY29yYXRlID0gKHRoaXMgJiYgdGhpcy5fX2RlY29yYXRlKSB8fCBmdW5jdGlvbiAoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufTtcbnZhciBfX21ldGFkYXRhID0gKHRoaXMgJiYgdGhpcy5fX21ldGFkYXRhKSB8fCBmdW5jdGlvbiAoaywgdikge1xuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShrLCB2KTtcbn07XG52YXIgX19wYXJhbSA9ICh0aGlzICYmIHRoaXMuX19wYXJhbSkgfHwgZnVuY3Rpb24gKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufTtcbmltcG9ydCB7IEJhZFJlcXVlc3RFeGNlcHRpb24sIENhdGNoLCBDb25mbGljdEV4Y2VwdGlvbiwgRm9yYmlkZGVuRXhjZXB0aW9uLCBIdHRwRXhjZXB0aW9uLCBJbmplY3RhYmxlLCBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uLCBOb3RGb3VuZEV4Y2VwdGlvbiwgT3B0aW9uYWwsIFVuYXV0aG9yaXplZEV4Y2VwdGlvbiwgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiwgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IENvbnRleHRJZEZhY3RvcnksIE1vZHVsZVJlZiB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB7IEJhZFJlcXVlc3RFcnJvciwgQmFzZUVycm9yLCBDb25mbGljdEVycm9yLCBJbnRlcm5hbEVycm9yLCBWYWxpZGF0aW9uRXJyb3IsIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBMb2dnZWRFbnZpcm9ubWVudCwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbkVycm9yLCBGb3JiaWRkZW5FcnJvciwgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVG9NYW55UmVxdWVzdHNFcnJvciB9IGZyb20gXCIuLy4uL2Vycm9ycy90aHJvdHRsaW5nLmpzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vLi4vLi4vcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0LmpzXCI7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBzIHdlbGwta25vd24gTmVzdEpTIGBIdHRwRXhjZXB0aW9uYCBzdWJjbGFzc2VzIChhcyBndWFyZHMsIHBpcGVzLCBvclxuICogb3RoZXIgZnJhbWV3b3JrLWxldmVsIGNvZGUgd291bGQgdGhyb3cgdGhlbSkgb250byB0aGUgZXF1aXZhbGVudCBkZWNhZi10cyBgQmFzZUVycm9yYC5cbiAqIEBzdW1tYXJ5IE9ubHkgYEJhc2VFcnJvcmAgaW5zdGFuY2VzIGNhcnJ5IHRoZSBgLmNvZGVgIHRoZSByZXNwb25zZSBib2R5IHJlbGllcyBvbiwgc29cbiAqIHdpdGhvdXQgdGhpcyBtYXAgZXZlcnkgbm9uLWRlY2FmIGV4Y2VwdGlvbiDigJQgaW5jbHVkaW5nIHBlcmZlY3RseSBsZWdpdGltYXRlIG9uZXMgbGlrZSBhXG4gKiBndWFyZCdzIGBGb3JiaWRkZW5FeGNlcHRpb25gIOKAlCB3b3VsZCBiZSBmbGF0dGVuZWQgaW50byBhIGdlbmVyaWMgNTAwIGBJbnRlcm5hbEVycm9yYC5cbiAqL1xuY29uc3QgSFRUUF9FWENFUFRJT05fVE9fREVDQUZfRVJST1IgPSBuZXcgTWFwKFtcbiAgICBbVW5hdXRob3JpemVkRXhjZXB0aW9uLCAobXNnKSA9PiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKG1zZyldLFxuICAgIFtGb3JiaWRkZW5FeGNlcHRpb24sIChtc2cpID0+IG5ldyBGb3JiaWRkZW5FcnJvcihtc2cpXSxcbiAgICBbQmFkUmVxdWVzdEV4Y2VwdGlvbiwgKG1zZykgPT4gbmV3IEJhZFJlcXVlc3RFcnJvcihtc2cpXSxcbiAgICBbQ29uZmxpY3RFeGNlcHRpb24sIChtc2cpID0+IG5ldyBDb25mbGljdEVycm9yKG1zZyldLFxuICAgIFtVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uLCAobXNnKSA9PiBuZXcgVmFsaWRhdGlvbkVycm9yKG1zZyldLFxuXSk7XG5sZXQgRGVjYWZFeGNlcHRpb25GaWx0ZXIgPSBjbGFzcyBEZWNhZkV4Y2VwdGlvbkZpbHRlciB7XG4gICAgY29uc3RydWN0b3IobW9kdWxlUmVmKSB7XG4gICAgICAgIHRoaXMubW9kdWxlUmVmID0gbW9kdWxlUmVmO1xuICAgIH1cbiAgICBhc3luYyBjYXRjaChleGNlcHRpb24sIGhvc3QpIHtcbiAgICAgICAgY29uc3QgY3R4ID0gaG9zdC5zd2l0Y2hUb0h0dHAoKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBjdHguZ2V0UmVzcG9uc2UoKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGN0eC5nZXRSZXF1ZXN0KCk7XG4gICAgICAgIGNvbnN0IGlzUHJvZHVjdGlvbiA9IExvZ2dlZEVudmlyb25tZW50LmVudiA9PT0gXCJwcm9kdWN0aW9uXCI7XG4gICAgICAgIGxldCBzdGF0dXNDb2RlO1xuICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24gfHxcbiAgICAgICAgICAgIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3IpIHtcbiAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uKGV4Y2VwdGlvbi5tZXNzYWdlKTtcbiAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBleGNlcHRpb24uZ2V0U3RhdHVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShleGNlcHRpb24gaW5zdGFuY2VvZiBCYXNlRXJyb3IpKSB7XG4gICAgICAgICAgICBjb25zdCB0b0RlY2FmRXJyb3IgPSB0aGlzLmRlY2FmRXJyb3JGb3IoZXhjZXB0aW9uKTtcbiAgICAgICAgICAgIGlmICh0b0RlY2FmRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSB0b0RlY2FmRXJyb3IoZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXhjZXB0aW9uLnN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IFRvTWFueVJlcXVlc3RzRXJyb3IoZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgSHR0cEV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIC8vIEEgcmVjb2duaXplZCBidXQgdW5tYXBwZWQgSHR0cEV4Y2VwdGlvbiAoZS5nLiB0aHJvd24gYnkgYSBndWFyZCBvclxuICAgICAgICAgICAgICAgIC8vIHBpcGUpIOKAlCBwcmVzZXJ2ZSBpdHMgcmVhbCBzdGF0dXMgaW5zdGVhZCBvZiBmbGF0dGVuaW5nIGl0IHRvIDUwMC5cbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlID0gZXhjZXB0aW9uLmdldFN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IEludGVybmFsRXJyb3IoZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMubG9nRXJyb3IocmVxdWVzdCwgZXhjZXB0aW9uKTtcbiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzKGV4Y2VwdGlvbi5jb2RlIHx8IHN0YXR1c0NvZGUpLmpzb24oe1xuICAgICAgICAgICAgc3RhdHVzOiBleGNlcHRpb24uY29kZSB8fCBzdGF0dXNDb2RlLFxuICAgICAgICAgICAgZXJyb3I6IGlzUHJvZHVjdGlvbiA/IGV4Y2VwdGlvbi5uYW1lIDogZXhjZXB0aW9uLm1lc3NhZ2UsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgIHBhdGg6IHJlcXVlc3QudXJsLFxuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBGaW5kcyB0aGUgZGVjYWYtdHMgYEJhc2VFcnJvcmAgY29uc3RydWN0b3IgbWFwcGVkIHRvIHRoaXMgZXhjZXB0aW9uJ3MgdHlwZSwgaWYgYW55LlxuICAgICAqIEBzdW1tYXJ5IFdhbGtzIGBIVFRQX0VYQ0VQVElPTl9UT19ERUNBRl9FUlJPUmAgd2l0aCBgaW5zdGFuY2VvZmAgKHJhdGhlciB0aGFuIGEgc3RyYWlnaHRcbiAgICAgKiBgTWFwLmdldGApIHNvIHN1YmNsYXNzZXMgb2YgYSBtYXBwZWQgZXhjZXB0aW9uIGFyZSBtYXRjaGVkIHRvby5cbiAgICAgKi9cbiAgICBkZWNhZkVycm9yRm9yKGV4Y2VwdGlvbikge1xuICAgICAgICBmb3IgKGNvbnN0IFt0eXBlLCBmYWN0b3J5XSBvZiBIVFRQX0VYQ0VQVElPTl9UT19ERUNBRl9FUlJPUikge1xuICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIHR5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIExvZ3MgdGhlIGV4Y2VwdGlvbiB3aXRob3V0IGV2ZXIgbGV0dGluZyBsb2dnaW5nIGZhaWx1cmVzIGJsb2NrIHRoZSByZXNwb25zZS5cbiAgICAgKiBAc3VtbWFyeSBBIGd1YXJkIChvciBtaWRkbGV3YXJlL0NPUlMgY2hlY2spIGNhbiB0aHJvdyBiZWZvcmUgYW55IGRlY2FmLWF3YXJlIHByb3ZpZGVyIHJhbixcbiAgICAgKiBzbyB0aGUgcmVxdWVzdC1ib3VuZCBDb250ZXh0IG1heSBub3QgZXhpc3QgeWV0IOKAlCBvciB0aGUgcmVzb2x2ZWQgbG9nZ2VyJ3MgYC5lcnJvcigpYCBpdHNlbGZcbiAgICAgKiBjb3VsZCB0aHJvdyAoYnJva2VuIHRyYW5zcG9ydCwgZm9ybWF0dGVyIGJ1ZywgZXRjLikuIEVpdGhlciB3YXkgdGhlIGNsaWVudC1mYWNpbmcgZXJyb3JcbiAgICAgKiByZXNwb25zZSBiZWxvdyBtdXN0IHN0aWxsIGdvIG91dCwgc28gZXZlcnkgZmFpbHVyZSBtb2RlIGhlcmUgaXMgc3dhbGxvd2VkLCBmYWxsaW5nIGJhY2sgdG9cbiAgICAgKiB0aGUgcGxhaW4gYExvZ2dpbmcuZ2V0KClgIGxvZ2dlciBhbmQsIGFzIGEgbGFzdCByZXNvcnQsIGRvaW5nIG5vdGhpbmcgYXQgYWxsLlxuICAgICAqL1xuICAgIGFzeW5jIGxvZ0Vycm9yKHJlcXVlc3QsIGV4Y2VwdGlvbikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYFVuaGFuZGxlZCBlcnJvciBvbiAke3JlcXVlc3Q/Lm1ldGhvZH0gJHtyZXF1ZXN0Py51cmx9YDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGxvZyA9IGF3YWl0IHRoaXMucmVzb2x2ZUxvZ2dlcihyZXF1ZXN0KTtcbiAgICAgICAgICAgIGxvZy5lcnJvcihtZXNzYWdlLCBleGNlcHRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgTG9nZ2luZy5nZXQoKS5lcnJvcihtZXNzYWdlLCBleGNlcHRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIGxvZ2dpbmcgaXMgdW5hdmFpbGFibGUg4oCUIHRoZSByZXNwb25zZSBpcyBzdGlsbCBzZW50IGJlbG93XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIHRoZSBsb2dnZXIgYm91bmQgdG8gdGhlIG9yaWdpbmF0aW5nIHJlcXVlc3QncyBkZWNhZi10cyBDb250ZXh0LlxuICAgICAqIEBzdW1tYXJ5IEdsb2JhbCBmaWx0ZXJzIGFyZSBzaW5nbGV0b25zLCBzbyB0aGUgcmVxdWVzdC1zY29wZWQge0BsaW5rIERlY2FmUmVxdWVzdENvbnRleHR9XG4gICAgICogKGFuZCB0aGUgY2xpZW50L3VzZXItYm91bmQgbG9nZ2VyIGl0IGNhcnJpZXMpIGNhbid0IGJlIGNvbnN0cnVjdG9yLWluamVjdGVkLiBJbnN0ZWFkLCB0aGlzXG4gICAgICogbG9va3MgdXAgdGhlIHNhbWUgcmVxdWVzdCdzIGNvbnRleHQgaWQgYW5kIHJlLXJlc29sdmVzIHRoZSBhbHJlYWR5LWFjY3VtdWxhdGVkIGluc3RhbmNlXG4gICAgICogdGhyb3VnaCBgTW9kdWxlUmVmYC4gRmFsbHMgYmFjayB0byB0aGUgZ2VuZXJpYyBgTG9nZ2luZy5nZXQoKWAgbG9nZ2VyIHdoZW4gdGhlIGZpbHRlciB3YXNuJ3RcbiAgICAgKiBjb25zdHJ1Y3RlZCB3aXRoIGEgYE1vZHVsZVJlZmAgKGUuZy4gbWFudWFsbHkgYG5ld2AnZCkgb3Igbm8gcmVxdWVzdC1zY29wZWQgY29udGV4dCBleGlzdHNcbiAgICAgKiBmb3IgdGhpcyByZXF1ZXN0IChlLmcuIHRoZSBlcnJvciBoYXBwZW5lZCBiZWZvcmUgYW55IGRlY2FmLWF3YXJlIHByb3ZpZGVyIHJhbiwgYXMgaXMgdGhlXG4gICAgICogY2FzZSB3aGVuIGEgZ3VhcmQgcmVqZWN0cyB0aGUgcmVxdWVzdCBiZWZvcmUgaW50ZXJjZXB0b3JzIGdldCB0byBiaW5kIHRoZSBjbGllbnQtc2NvcGVkXG4gICAgICogbG9nZ2VyIG9udG8gdGhlIENvbnRleHQpLlxuICAgICAqL1xuICAgIGFzeW5jIHJlc29sdmVMb2dnZXIocmVxdWVzdCkge1xuICAgICAgICBpZiAodGhpcy5tb2R1bGVSZWYpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGV4dElkID0gQ29udGV4dElkRmFjdG9yeS5nZXRCeVJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdENvbnRleHQgPSBhd2FpdCB0aGlzLm1vZHVsZVJlZi5yZXNvbHZlKERlY2FmUmVxdWVzdENvbnRleHQsIGNvbnRleHRJZCwgeyBzdHJpY3Q6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0Q29udGV4dD8ubG9nZ2VyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdENvbnRleHQubG9nZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIG5vIHJlcXVlc3Qtc2NvcGVkIGNvbnRleHQgYm91bmQgZm9yIHRoaXMgcmVxdWVzdCDigJQgZmFsbCBiYWNrIGJlbG93XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIExvZ2dpbmcuZ2V0KCk7XG4gICAgfVxufTtcbkRlY2FmRXhjZXB0aW9uRmlsdGVyID0gX19kZWNvcmF0ZShbXG4gICAgQ2F0Y2goKSxcbiAgICBJbmplY3RhYmxlKCksXG4gICAgX19wYXJhbSgwLCBPcHRpb25hbCgpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW01vZHVsZVJlZl0pXG5dLCBEZWNhZkV4Y2VwdGlvbkZpbHRlcik7XG5leHBvcnQgeyBEZWNhZkV4Y2VwdGlvbkZpbHRlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pUkdWallXWkZjbkp2Y2tacGJIUmxjaTVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6SWpwYklpNHVMeTR1THk0dUx5NHVMM055WXk5bVlXTjBiM0o1TDJWNFkyVndkR2x2Ym5NdlJHVmpZV1pGY25KdmNrWnBiSFJsY2k1MGN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU96czdPenM3T3pzN096czdRVUZCUVN4UFFVRlBMRVZCUlV3c2JVSkJRVzFDTEVWQlEyNUNMRXRCUVVzc1JVRkRUQ3hwUWtGQmFVSXNSVUZGYWtJc2EwSkJRV3RDTEVWQlEyeENMR0ZCUVdFc1JVRkRZaXhWUVVGVkxFVkJRMVlzYzBKQlFYTkNMRVZCUTNSQ0xHbENRVUZwUWl4RlFVTnFRaXhSUVVGUkxFVkJRMUlzY1VKQlFYRkNMRVZCUTNKQ0xEUkNRVUUwUWl4SFFVTTNRaXhOUVVGTkxHZENRVUZuUWl4RFFVRkRPMEZCUTNoQ0xFOUJRVThzUlVGQlJTeG5Ra0ZCWjBJc1JVRkJSU3hUUVVGVExFVkJRVVVzVFVGQlRTeGpRVUZqTEVOQlFVTTdRVUZETTBRc1QwRkJUeXhGUVVOTUxHVkJRV1VzUlVGRFppeFRRVUZUTEVWQlExUXNZVUZCWVN4RlFVTmlMR0ZCUVdFc1JVRkRZaXhsUVVGbExFZEJRMmhDTEUxQlFVMHNlVUpCUVhsQ0xFTkJRVU03UVVGRGFrTXNUMEZCVHl4RlFVRkZMR2xDUVVGcFFpeEZRVUZGTEU5QlFVOHNSVUZCUlN4TlFVRk5MRzFDUVVGdFFpeERRVUZETzBGQlF5OUVMRTlCUVU4c1JVRkJSU3hyUWtGQmEwSXNSVUZCUlN4alFVRmpMRVZCUVVVc1owSkJRV2RDTEVWQlFVVXNUVUZCVFN4blFrRkJaMElzUTBGQlF6dEJRVU4wUml4UFFVRlBMRVZCUVVVc2JVSkJRVzFDTEVWQlFVVXNhME5CUVRaQ08wRkJRek5FTEU5QlFVOHNSVUZCUlN4dFFrRkJiVUlzUlVGQlJTd3JRMEZCTUVNN1FVRkhlRVU3T3pzN096dEhRVTFITzBGQlEwZ3NUVUZCVFN3MlFrRkJOa0lzUjBGQlJ5eEpRVUZKTEVkQlFVY3NRMEZITTBNN1NVRkRRU3hEUVVGRExIRkNRVUZ4UWl4RlFVRkZMRU5CUVVNc1IwRkJSeXhGUVVGRkxFVkJRVVVzUTBGQlF5eEpRVUZKTEd0Q1FVRnJRaXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETzBsQlF6ZEVMRU5CUVVNc2EwSkJRV3RDTEVWQlFVVXNRMEZCUXl4SFFVRkhMRVZCUVVVc1JVRkJSU3hEUVVGRExFbEJRVWtzWTBGQll5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMGxCUTNSRUxFTkJRVU1zYlVKQlFXMUNMRVZCUVVVc1EwRkJReXhIUVVGSExFVkJRVVVzUlVGQlJTeERRVUZETEVsQlFVa3NaVUZCWlN4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRE8wbEJRM2hFTEVOQlFVTXNhVUpCUVdsQ0xFVkJRVVVzUTBGQlF5eEhRVUZITEVWQlFVVXNSVUZCUlN4RFFVRkRMRWxCUVVrc1lVRkJZU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETzBsQlEzQkVMRU5CUVVNc05FSkJRVFJDTEVWQlFVVXNRMEZCUXl4SFFVRkhMRVZCUVVVc1JVRkJSU3hEUVVGRExFbEJRVWtzWlVGQlpTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPME5CUTJ4RkxFTkJRVU1zUTBGQlF6dEJRVWxKTEVsQlFVMHNiMEpCUVc5Q0xFZEJRVEZDTEUxQlFVMHNiMEpCUVc5Q08wbEJReTlDTEZsQlFUSkRMRk5CUVhGQ08xRkJRWEpDTEdOQlFWTXNSMEZCVkN4VFFVRlRMRU5CUVZrN1NVRkJSeXhEUVVGRE8wbEJSWEJGTEV0QlFVc3NRMEZCUXl4TFFVRkxMRU5CUVVNc1UwRkJaMElzUlVGQlJTeEpRVUZ0UWp0UlFVTXZReXhOUVVGTkxFZEJRVWNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RlFVRkZMRU5CUVVNN1VVRkRhRU1zVFVGQlRTeFJRVUZSTEVkQlFVY3NSMEZCUnl4RFFVRkRMRmRCUVZjc1JVRkJSU3hEUVVGRE8xRkJRMjVETEUxQlFVMHNUMEZCVHl4SFFVRkhMRWRCUVVjc1EwRkJReXhWUVVGVkxFVkJRVVVzUTBGQlF6dFJRVVZxUXl4TlFVRk5MRmxCUVZrc1IwRkJSeXhwUWtGQmFVSXNRMEZCUXl4SFFVRkhMRXRCUVVzc1dVRkJXU3hEUVVGRE8xRkJRelZFTEVsQlFVa3NWVUZCVlN4RFFVRkRPMUZCUldZc1NVRkRSU3hUUVVGVExGbEJRVmtzYVVKQlFXbENPMWxCUTNSRExGTkJRVk1zV1VGQldTeG5Ra0ZCWjBJc1JVRkRja01zUTBGQlF6dFpRVU5FTEZOQlFWTXNSMEZCUnl4SlFVRkpMSE5DUVVGelFpeERRVUZETEZOQlFWTXNRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJRenRaUVVNeFJDeFZRVUZWTEVkQlFVa3NVMEZCYjBNc1EwRkJReXhUUVVGVExFVkJRVVVzUTBGQlF6dFJRVU5xUlN4RFFVRkRPMkZCUVUwc1NVRkJTU3hEUVVGRExFTkJRVU1zVTBGQlV5eFpRVUZaTEZOQlFWTXNRMEZCUXl4RlFVRkZMRU5CUVVNN1dVRkROME1zVFVGQlRTeFpRVUZaTEVkQlFVY3NTVUZCU1N4RFFVRkRMR0ZCUVdFc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF6dFpRVU51UkN4SlFVRkpMRmxCUVZrc1JVRkJSU3hEUVVGRE8yZENRVU5xUWl4VFFVRlRMRWRCUVVjc1dVRkJXU3hEUVVGRExGTkJRVk1zUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXp0WlFVTTVReXhEUVVGRE8ybENRVUZOTEVsQlFVc3NVMEZCYVVJc1EwRkJReXhOUVVGTkxFdEJRVXNzUjBGQlJ5eEZRVUZGTEVOQlFVTTdaMEpCUXpkRExGTkJRVk1zUjBGQlJ5eEpRVUZKTEcxQ1FVRnRRaXhEUVVGRExGTkJRVk1zUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXp0WlFVTjZSQ3hEUVVGRE8ybENRVUZOTEVsQlFVa3NVMEZCVXl4WlFVRlpMR0ZCUVdFc1JVRkJSU3hEUVVGRE8yZENRVU01UXl4eFJVRkJjVVU3WjBKQlEzSkZMRzlGUVVGdlJUdG5Ra0ZEY0VVc1ZVRkJWU3hIUVVGSExGTkJRVk1zUTBGQlF5eFRRVUZUTEVWQlFVVXNRMEZCUXp0WlFVTnlReXhEUVVGRE8ybENRVUZOTEVOQlFVTTdaMEpCUTA0c1UwRkJVeXhIUVVGSExFbEJRVWtzWVVGQllTeERRVUZETEZOQlFWTXNRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJRenRaUVVOdVJDeERRVUZETzFGQlEwZ3NRMEZCUXp0UlFVVkVMRTFCUVUwc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eFBRVUZQTEVWQlFVVXNVMEZCVXl4RFFVRkRMRU5CUVVNN1VVRkZlRU1zVVVGQlVTeERRVUZETEUxQlFVMHNRMEZCUlN4VFFVRjFRaXhEUVVGRExFbEJRVWtzU1VGQlNTeFZRVUZWTEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNN1dVRkRhRVVzVFVGQlRTeEZRVUZITEZOQlFYVkNMRU5CUVVNc1NVRkJTU3hKUVVGSkxGVkJRVlU3V1VGRGJrUXNTMEZCU3l4RlFVRkZMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zVTBGQlV5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1UwRkJVeXhEUVVGRExFOUJRVTg3V1VGRGVFUXNVMEZCVXl4RlFVRkZMRWxCUVVrc1NVRkJTU3hGUVVGRkxFTkJRVU1zVjBGQlZ5eEZRVUZGTzFsQlEyNURMRWxCUVVrc1JVRkJSU3hQUVVGUExFTkJRVU1zUjBGQlJ6dFpRVU5xUWl4TlFVRk5MRVZCUVVVc1QwRkJUeXhEUVVGRExFMUJRVTA3VTBGRGRrSXNRMEZCUXl4RFFVRkRPMGxCUTB3c1EwRkJRenRKUVVWRU96czdPMDlCU1VjN1NVRkRUeXhoUVVGaExFTkJRM0pDTEZOQlFXZENPMUZCUldoQ0xFdEJRVXNzVFVGQlRTeERRVUZETEVsQlFVa3NSVUZCUlN4UFFVRlBMRU5CUVVNc1NVRkJTU3cyUWtGQk5rSXNSVUZCUlN4RFFVRkRPMWxCUXpWRUxFbEJRVWtzVTBGQlV5eFpRVUZaTEVsQlFVazdaMEpCUVVVc1QwRkJUeXhQUVVGUExFTkJRVU03VVVGRGFFUXNRMEZCUXp0UlFVTkVMRTlCUVU4c1UwRkJVeXhEUVVGRE8wbEJRMjVDTEVOQlFVTTdTVUZGUkRzN096czdPenRQUVU5SE8wbEJRMDhzUzBGQlN5eERRVUZETEZGQlFWRXNRMEZEZEVJc1QwRkJORUlzUlVGRE5VSXNVMEZCWjBJN1VVRkZhRUlzVFVGQlRTeFBRVUZQTEVkQlFVY3NjMEpCUVhOQ0xFOUJRVThzUlVGQlJTeE5RVUZOTEVsQlFVa3NUMEZCVHl4RlFVRkZMRWRCUVVjc1JVRkJSU3hEUVVGRE8xRkJRM2hGTEVsQlFVa3NRMEZCUXp0WlFVTklMRTFCUVUwc1IwRkJSeXhIUVVGSExFMUJRVTBzU1VGQlNTeERRVUZETEdGQlFXRXNRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJRenRaUVVNNVF5eEhRVUZITEVOQlFVTXNTMEZCU3l4RFFVRkRMRTlCUVU4c1JVRkJSU3hUUVVGVExFTkJRVU1zUTBGQlF6dFJRVU5vUXl4RFFVRkRPMUZCUVVNc1RVRkJUU3hEUVVGRE8xbEJRMUFzU1VGQlNTeERRVUZETzJkQ1FVTklMRTlCUVU4c1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF5eExRVUZMTEVOQlFVTXNUMEZCVHl4RlFVRkZMRk5CUVZNc1EwRkJReXhEUVVGRE8xbEJRekZETEVOQlFVTTdXVUZCUXl4TlFVRk5MRU5CUVVNN1owSkJRMUFzTkVSQlFUUkVPMWxCUXpsRUxFTkJRVU03VVVGRFNDeERRVUZETzBsQlEwZ3NRMEZCUXp0SlFVVkVPenM3T3pzN096czdPMDlCVlVjN1NVRkRUeXhMUVVGTExFTkJRVU1zWVVGQllTeERRVU16UWl4UFFVRTBRanRSUVVVMVFpeEpRVUZKTEVsQlFVa3NRMEZCUXl4VFFVRlRMRVZCUVVVc1EwRkJRenRaUVVOdVFpeEpRVUZKTEVOQlFVTTdaMEpCUTBnc1RVRkJUU3hUUVVGVExFZEJRVWNzWjBKQlFXZENMRU5CUVVNc1dVRkJXU3hEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETzJkQ1FVTjZSQ3hOUVVGTkxHTkJRV01zUjBGQlJ5eE5RVUZOTEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1QwRkJUeXhEUVVOcVJDeHRRa0ZCYlVJc1JVRkRia0lzVTBGQlV5eEZRVU5VTEVWQlFVVXNUVUZCVFN4RlFVRkZMRXRCUVVzc1JVRkJSU3hEUVVOc1FpeERRVUZETzJkQ1FVTkdMRWxCUVVrc1kwRkJZeXhGUVVGRkxFMUJRVTA3YjBKQlFVVXNUMEZCVHl4alFVRmpMRU5CUVVNc1RVRkJUU3hEUVVGRE8xbEJRek5FTEVOQlFVTTdXVUZCUXl4TlFVRk5MRU5CUVVNN1owSkJRMUFzY1VWQlFYRkZPMWxCUTNaRkxFTkJRVU03VVVGRFNDeERRVUZETzFGQlEwUXNUMEZCVHl4UFFVRlBMRU5CUVVNc1IwRkJSeXhGUVVFNFFpeERRVUZETzBsQlEyNUVMRU5CUVVNN1EwRkRSaXhEUVVGQk8wRkJMMGRaTEc5Q1FVRnZRanRKUVVab1F5eExRVUZMTEVWQlFVVTdTVUZEVUN4VlFVRlZMRVZCUVVVN1NVRkZSU3hYUVVGQkxGRkJRVkVzUlVGQlJTeERRVUZCTzNGRFFVRm5ReXhUUVVGVE8wZEJSSEpFTEc5Q1FVRnZRaXhEUVN0SGFFTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpwYlhCdmNuUWdlMXh1SUNCQmNtZDFiV1Z1ZEhOSWIzTjBMRnh1SUNCQ1lXUlNaWEYxWlhOMFJYaGpaWEIwYVc5dUxGeHVJQ0JEWVhSamFDeGNiaUFnUTI5dVpteHBZM1JGZUdObGNIUnBiMjRzWEc0Z0lFVjRZMlZ3ZEdsdmJrWnBiSFJsY2l4Y2JpQWdSbTl5WW1sa1pHVnVSWGhqWlhCMGFXOXVMRnh1SUNCSWRIUndSWGhqWlhCMGFXOXVMRnh1SUNCSmJtcGxZM1JoWW14bExGeHVJQ0JPYjNSQlkyTmxjSFJoWW14bFJYaGpaWEIwYVc5dUxGeHVJQ0JPYjNSR2IzVnVaRVY0WTJWd2RHbHZiaXhjYmlBZ1QzQjBhVzl1WVd3c1hHNGdJRlZ1WVhWMGFHOXlhWHBsWkVWNFkyVndkR2x2Yml4Y2JpQWdWVzV3Y205alpYTnpZV0pzWlVWdWRHbDBlVVY0WTJWd2RHbHZiaXhjYm4wZ1puSnZiU0JjSWtCdVpYTjBhbk12WTI5dGJXOXVYQ0k3WEc1cGJYQnZjblFnZXlCRGIyNTBaWGgwU1dSR1lXTjBiM0o1TENCTmIyUjFiR1ZTWldZZ2ZTQm1jbTl0SUZ3aVFHNWxjM1JxY3k5amIzSmxYQ0k3WEc1cGJYQnZjblFnZTF4dUlDQkNZV1JTWlhGMVpYTjBSWEp5YjNJc1hHNGdJRUpoYzJWRmNuSnZjaXhjYmlBZ1EyOXVabXhwWTNSRmNuSnZjaXhjYmlBZ1NXNTBaWEp1WVd4RmNuSnZjaXhjYmlBZ1ZtRnNhV1JoZEdsdmJrVnljbTl5TEZ4dWZTQm1jbTl0SUZ3aVFHUmxZMkZtTFhSekwyUmlMV1JsWTI5eVlYUnZjbk5jSWp0Y2JtbHRjRzl5ZENCN0lFeHZaMmRsWkVWdWRtbHliMjV0Wlc1MExDQk1iMmRuYVc1bklIMGdabkp2YlNCY0lrQmtaV05oWmkxMGN5OXNiMmRuYVc1blhDSTdYRzVwYlhCdmNuUWdleUJCZFhSb2IzSnBlbUYwYVc5dVJYSnliM0lzSUVadmNtSnBaR1JsYmtWeWNtOXlMQ0JWYm5OMWNIQnZjblJsWkVWeWNtOXlJSDBnWm5KdmJTQmNJa0JrWldOaFppMTBjeTlqYjNKbFhDSTdYRzVwYlhCdmNuUWdleUJVYjAxaGJubFNaWEYxWlhOMGMwVnljbTl5SUgwZ1puSnZiU0JjSWk0dUwyVnljbTl5Y3k5MGFISnZkSFJzYVc1blhDSTdYRzVwYlhCdmNuUWdleUJFWldOaFpsSmxjWFZsYzNSRGIyNTBaWGgwSUgwZ1puSnZiU0JjSWk0dUx5NHVMM0psY1hWbGMzUXZSR1ZqWVdaU1pYRjFaWE4wUTI5dWRHVjRkRndpTzF4dWFXMXdiM0owSUhSNWNHVWdleUJTWlhGMVpYTjBURzluWjJWeUlIMGdabkp2YlNCY0lrQmtaV05oWmkxMGN5OW1iM0l0YUhSMGNDOXpaWEoyWlhKY0lqdGNibHh1THlvcVhHNGdLaUJBWkdWelkzSnBjSFJwYjI0Z1RXRndjeUIzWld4c0xXdHViM2R1SUU1bGMzUktVeUJnU0hSMGNFVjRZMlZ3ZEdsdmJtQWdjM1ZpWTJ4aGMzTmxjeUFvWVhNZ1ozVmhjbVJ6TENCd2FYQmxjeXdnYjNKY2JpQXFJRzkwYUdWeUlHWnlZVzFsZDI5eWF5MXNaWFpsYkNCamIyUmxJSGR2ZFd4a0lIUm9jbTkzSUhSb1pXMHBJRzl1ZEc4Z2RHaGxJR1Z4ZFdsMllXeGxiblFnWkdWallXWXRkSE1nWUVKaGMyVkZjbkp2Y21BdVhHNGdLaUJBYzNWdGJXRnllU0JQYm14NUlHQkNZWE5sUlhKeWIzSmdJR2x1YzNSaGJtTmxjeUJqWVhKeWVTQjBhR1VnWUM1amIyUmxZQ0IwYUdVZ2NtVnpjRzl1YzJVZ1ltOWtlU0J5Wld4cFpYTWdiMjRzSUhOdlhHNGdLaUIzYVhSb2IzVjBJSFJvYVhNZ2JXRndJR1YyWlhKNUlHNXZiaTFrWldOaFppQmxlR05sY0hScGIyNGc0b0NVSUdsdVkyeDFaR2x1WnlCd1pYSm1aV04wYkhrZ2JHVm5hWFJwYldGMFpTQnZibVZ6SUd4cGEyVWdZVnh1SUNvZ1ozVmhjbVFuY3lCZ1JtOXlZbWxrWkdWdVJYaGpaWEIwYVc5dVlDRGlnSlFnZDI5MWJHUWdZbVVnWm14aGRIUmxibVZrSUdsdWRHOGdZU0JuWlc1bGNtbGpJRFV3TUNCZ1NXNTBaWEp1WVd4RmNuSnZjbUF1WEc0Z0tpOWNibU52Ym5OMElFaFVWRkJmUlZoRFJWQlVTVTlPWDFSUFgwUkZRMEZHWDBWU1VrOVNJRDBnYm1WM0lFMWhjRHhjYmlBZ2JtVjNJQ2d1TGk1aGNtZHpPaUJoYm5sYlhTa2dQVDRnU0hSMGNFVjRZMlZ3ZEdsdmJpeGNiaUFnS0cxelp6b2djM1J5YVc1bktTQTlQaUJDWVhObFJYSnliM0pjYmo0b1cxeHVJQ0JiVlc1aGRYUm9iM0pwZW1Wa1JYaGpaWEIwYVc5dUxDQW9iWE5uS1NBOVBpQnVaWGNnUVhWMGFHOXlhWHBoZEdsdmJrVnljbTl5S0cxelp5bGRMRnh1SUNCYlJtOXlZbWxrWkdWdVJYaGpaWEIwYVc5dUxDQW9iWE5uS1NBOVBpQnVaWGNnUm05eVltbGtaR1Z1UlhKeWIzSW9iWE5uS1Ywc1hHNGdJRnRDWVdSU1pYRjFaWE4wUlhoalpYQjBhVzl1TENBb2JYTm5LU0E5UGlCdVpYY2dRbUZrVW1WeGRXVnpkRVZ5Y205eUtHMXpaeWxkTEZ4dUlDQmJRMjl1Wm14cFkzUkZlR05sY0hScGIyNHNJQ2h0YzJjcElEMCtJRzVsZHlCRGIyNW1iR2xqZEVWeWNtOXlLRzF6WnlsZExGeHVJQ0JiVlc1d2NtOWpaWE56WVdKc1pVVnVkR2wwZVVWNFkyVndkR2x2Yml3Z0tHMXpaeWtnUFQ0Z2JtVjNJRlpoYkdsa1lYUnBiMjVGY25KdmNpaHRjMmNwWFN4Y2JsMHBPMXh1WEc1QVEyRjBZMmdvS1Z4dVFFbHVhbVZqZEdGaWJHVW9LVnh1Wlhod2IzSjBJR05zWVhOeklFUmxZMkZtUlhoalpYQjBhVzl1Um1sc2RHVnlJR2x0Y0d4bGJXVnVkSE1nUlhoalpYQjBhVzl1Um1sc2RHVnlJSHRjYmlBZ1kyOXVjM1J5ZFdOMGIzSW9RRTl3ZEdsdmJtRnNLQ2tnY0hKdmRHVmpkR1ZrSUhKbFlXUnZibXg1SUcxdlpIVnNaVkpsWmo4NklFMXZaSFZzWlZKbFppa2dlMzFjYmx4dUlDQmhjM2x1WXlCallYUmphQ2hsZUdObGNIUnBiMjQ2SUVWeWNtOXlMQ0JvYjNOME9pQkJjbWQxYldWdWRITkliM04wS1NCN1hHNGdJQ0FnWTI5dWMzUWdZM1I0SUQwZ2FHOXpkQzV6ZDJsMFkyaFViMGgwZEhBb0tUdGNiaUFnSUNCamIyNXpkQ0J5WlhOd2IyNXpaU0E5SUdOMGVDNW5aWFJTWlhOd2IyNXpaU2dwTzF4dUlDQWdJR052Ym5OMElISmxjWFZsYzNRZ1BTQmpkSGd1WjJWMFVtVnhkV1Z6ZENncE8xeHVYRzRnSUNBZ1kyOXVjM1FnYVhOUWNtOWtkV04wYVc5dUlEMGdURzluWjJWa1JXNTJhWEp2Ym0xbGJuUXVaVzUySUQwOVBTQmNJbkJ5YjJSMVkzUnBiMjVjSWp0Y2JpQWdJQ0JzWlhRZ2MzUmhkSFZ6UTI5a1pUdGNibHh1SUNBZ0lHbG1JQ2hjYmlBZ0lDQWdJR1Y0WTJWd2RHbHZiaUJwYm5OMFlXNWpaVzltSUU1dmRFWnZkVzVrUlhoalpYQjBhVzl1SUh4OFhHNGdJQ0FnSUNCbGVHTmxjSFJwYjI0Z2FXNXpkR0Z1WTJWdlppQlZibk4xY0hCdmNuUmxaRVZ5Y205eVhHNGdJQ0FnS1NCN1hHNGdJQ0FnSUNCbGVHTmxjSFJwYjI0Z1BTQnVaWGNnVG05MFFXTmpaWEIwWVdKc1pVVjRZMlZ3ZEdsdmJpaGxlR05sY0hScGIyNHViV1Z6YzJGblpTazdYRzRnSUNBZ0lDQnpkR0YwZFhORGIyUmxJRDBnS0dWNFkyVndkR2x2YmlCaGN5Qk9iM1JCWTJObGNIUmhZbXhsUlhoalpYQjBhVzl1S1M1blpYUlRkR0YwZFhNb0tUdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tDRW9aWGhqWlhCMGFXOXVJR2x1YzNSaGJtTmxiMllnUW1GelpVVnljbTl5S1NrZ2UxeHVJQ0FnSUNBZ1kyOXVjM1FnZEc5RVpXTmhaa1Z5Y205eUlEMGdkR2hwY3k1a1pXTmhaa1Z5Y205eVJtOXlLR1Y0WTJWd2RHbHZiaWs3WEc0Z0lDQWdJQ0JwWmlBb2RHOUVaV05oWmtWeWNtOXlLU0I3WEc0Z0lDQWdJQ0FnSUdWNFkyVndkR2x2YmlBOUlIUnZSR1ZqWVdaRmNuSnZjaWhsZUdObGNIUnBiMjR1YldWemMyRm5aU2s3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0NobGVHTmxjSFJwYjI0Z1lYTWdZVzU1S1M1emRHRjBkWE1nUFQwOUlEUXlPU2tnZTF4dUlDQWdJQ0FnSUNCbGVHTmxjSFJwYjI0Z1BTQnVaWGNnVkc5TllXNTVVbVZ4ZFdWemRITkZjbkp2Y2lobGVHTmxjSFJwYjI0dWJXVnpjMkZuWlNrN1hHNGdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHVjRZMlZ3ZEdsdmJpQnBibk4wWVc1alpXOW1JRWgwZEhCRmVHTmxjSFJwYjI0cElIdGNiaUFnSUNBZ0lDQWdMeThnUVNCeVpXTnZaMjVwZW1Wa0lHSjFkQ0IxYm0xaGNIQmxaQ0JJZEhSd1JYaGpaWEIwYVc5dUlDaGxMbWN1SUhSb2NtOTNiaUJpZVNCaElHZDFZWEprSUc5eVhHNGdJQ0FnSUNBZ0lDOHZJSEJwY0dVcElPS0FsQ0J3Y21WelpYSjJaU0JwZEhNZ2NtVmhiQ0J6ZEdGMGRYTWdhVzV6ZEdWaFpDQnZaaUJtYkdGMGRHVnVhVzVuSUdsMElIUnZJRFV3TUM1Y2JpQWdJQ0FnSUNBZ2MzUmhkSFZ6UTI5a1pTQTlJR1Y0WTJWd2RHbHZiaTVuWlhSVGRHRjBkWE1vS1R0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUdWNFkyVndkR2x2YmlBOUlHNWxkeUJKYm5SbGNtNWhiRVZ5Y205eUtHVjRZMlZ3ZEdsdmJpNXRaWE56WVdkbEtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCaGQyRnBkQ0IwYUdsekxteHZaMFZ5Y205eUtISmxjWFZsYzNRc0lHVjRZMlZ3ZEdsdmJpazdYRzVjYmlBZ0lDQnlaWE53YjI1elpTNXpkR0YwZFhNb0tHVjRZMlZ3ZEdsdmJpQmhjeUJDWVhObFJYSnliM0lwTG1OdlpHVWdmSHdnYzNSaGRIVnpRMjlrWlNrdWFuTnZiaWg3WEc0Z0lDQWdJQ0J6ZEdGMGRYTTZJQ2hsZUdObGNIUnBiMjRnWVhNZ1FtRnpaVVZ5Y205eUtTNWpiMlJsSUh4OElITjBZWFIxYzBOdlpHVXNYRzRnSUNBZ0lDQmxjbkp2Y2pvZ2FYTlFjbTlrZFdOMGFXOXVJRDhnWlhoalpYQjBhVzl1TG01aGJXVWdPaUJsZUdObGNIUnBiMjR1YldWemMyRm5aU3hjYmlBZ0lDQWdJSFJwYldWemRHRnRjRG9nYm1WM0lFUmhkR1VvS1M1MGIwbFRUMU4wY21sdVp5Z3BMRnh1SUNBZ0lDQWdjR0YwYURvZ2NtVnhkV1Z6ZEM1MWNtd3NYRzRnSUNBZ0lDQnRaWFJvYjJRNklISmxjWFZsYzNRdWJXVjBhRzlrTEZ4dUlDQWdJSDBwTzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFQmtaWE5qY21sd2RHbHZiaUJHYVc1a2N5QjBhR1VnWkdWallXWXRkSE1nWUVKaGMyVkZjbkp2Y21BZ1kyOXVjM1J5ZFdOMGIzSWdiV0Z3Y0dWa0lIUnZJSFJvYVhNZ1pYaGpaWEIwYVc5dUozTWdkSGx3WlN3Z2FXWWdZVzU1TGx4dUlDQWdLaUJBYzNWdGJXRnllU0JYWVd4cmN5QmdTRlJVVUY5RldFTkZVRlJKVDA1ZlZFOWZSRVZEUVVaZlJWSlNUMUpnSUhkcGRHZ2dZR2x1YzNSaGJtTmxiMlpnSUNoeVlYUm9aWElnZEdoaGJpQmhJSE4wY21GcFoyaDBYRzRnSUNBcUlHQk5ZWEF1WjJWMFlDa2djMjhnYzNWaVkyeGhjM05sY3lCdlppQmhJRzFoY0hCbFpDQmxlR05sY0hScGIyNGdZWEpsSUcxaGRHTm9aV1FnZEc5dkxseHVJQ0FnS2k5Y2JpQWdjSEp2ZEdWamRHVmtJR1JsWTJGbVJYSnliM0pHYjNJb1hHNGdJQ0FnWlhoalpYQjBhVzl1T2lCRmNuSnZjbHh1SUNBcE9pQW9LRzF6WnpvZ2MzUnlhVzVuS1NBOVBpQkNZWE5sUlhKeWIzSXBJSHdnZFc1a1pXWnBibVZrSUh0Y2JpQWdJQ0JtYjNJZ0tHTnZibk4wSUZ0MGVYQmxMQ0JtWVdOMGIzSjVYU0J2WmlCSVZGUlFYMFZZUTBWUVZFbFBUbDlVVDE5RVJVTkJSbDlGVWxKUFVpa2dlMXh1SUNBZ0lDQWdhV1lnS0dWNFkyVndkR2x2YmlCcGJuTjBZVzVqWlc5bUlIUjVjR1VwSUhKbGRIVnliaUJtWVdOMGIzSjVPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnZFc1a1pXWnBibVZrTzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFQmtaWE5qY21sd2RHbHZiaUJNYjJkeklIUm9aU0JsZUdObGNIUnBiMjRnZDJsMGFHOTFkQ0JsZG1WeUlHeGxkSFJwYm1jZ2JHOW5aMmx1WnlCbVlXbHNkWEpsY3lCaWJHOWpheUIwYUdVZ2NtVnpjRzl1YzJVdVhHNGdJQ0FxSUVCemRXMXRZWEo1SUVFZ1ozVmhjbVFnS0c5eUlHMXBaR1JzWlhkaGNtVXZRMDlTVXlCamFHVmpheWtnWTJGdUlIUm9jbTkzSUdKbFptOXlaU0JoYm5rZ1pHVmpZV1l0WVhkaGNtVWdjSEp2ZG1sa1pYSWdjbUZ1TEZ4dUlDQWdLaUJ6YnlCMGFHVWdjbVZ4ZFdWemRDMWliM1Z1WkNCRGIyNTBaWGgwSUcxaGVTQnViM1FnWlhocGMzUWdlV1YwSU9LQWxDQnZjaUIwYUdVZ2NtVnpiMngyWldRZ2JHOW5aMlZ5SjNNZ1lDNWxjbkp2Y2lncFlDQnBkSE5sYkdaY2JpQWdJQ29nWTI5MWJHUWdkR2h5YjNjZ0tHSnliMnRsYmlCMGNtRnVjM0J2Y25Rc0lHWnZjbTFoZEhSbGNpQmlkV2NzSUdWMFl5NHBMaUJGYVhSb1pYSWdkMkY1SUhSb1pTQmpiR2xsYm5RdFptRmphVzVuSUdWeWNtOXlYRzRnSUNBcUlISmxjM0J2Ym5ObElHSmxiRzkzSUcxMWMzUWdjM1JwYkd3Z1oyOGdiM1YwTENCemJ5QmxkbVZ5ZVNCbVlXbHNkWEpsSUcxdlpHVWdhR1Z5WlNCcGN5QnpkMkZzYkc5M1pXUXNJR1poYkd4cGJtY2dZbUZqYXlCMGIxeHVJQ0FnS2lCMGFHVWdjR3hoYVc0Z1lFeHZaMmRwYm1jdVoyVjBLQ2xnSUd4dloyZGxjaUJoYm1Rc0lHRnpJR0VnYkdGemRDQnlaWE52Y25Rc0lHUnZhVzVuSUc1dmRHaHBibWNnWVhRZ1lXeHNMbHh1SUNBZ0tpOWNiaUFnY0hKdmRHVmpkR1ZrSUdGemVXNWpJR3h2WjBWeWNtOXlLRnh1SUNBZ0lISmxjWFZsYzNRNklGSmxZMjl5WkR4emRISnBibWNzSUdGdWVUNHNYRzRnSUNBZ1pYaGpaWEIwYVc5dU9pQkZjbkp2Y2x4dUlDQXBPaUJRY205dGFYTmxQSFp2YVdRK0lIdGNiaUFnSUNCamIyNXpkQ0J0WlhOellXZGxJRDBnWUZWdWFHRnVaR3hsWkNCbGNuSnZjaUJ2YmlBa2UzSmxjWFZsYzNRL0xtMWxkR2h2WkgwZ0pIdHlaWEYxWlhOMFB5NTFjbXg5WUR0Y2JpQWdJQ0IwY25rZ2UxeHVJQ0FnSUNBZ1kyOXVjM1FnYkc5bklEMGdZWGRoYVhRZ2RHaHBjeTV5WlhOdmJIWmxURzluWjJWeUtISmxjWFZsYzNRcE8xeHVJQ0FnSUNBZ2JHOW5MbVZ5Y205eUtHMWxjM05oWjJVc0lHVjRZMlZ3ZEdsdmJpazdYRzRnSUNBZ2ZTQmpZWFJqYUNCN1hHNGdJQ0FnSUNCMGNua2dlMXh1SUNBZ0lDQWdJQ0JNYjJkbmFXNW5MbWRsZENncExtVnljbTl5S0cxbGMzTmhaMlVzSUdWNFkyVndkR2x2YmlrN1hHNGdJQ0FnSUNCOUlHTmhkR05vSUh0Y2JpQWdJQ0FnSUNBZ0x5OGdiRzluWjJsdVp5QnBjeUIxYm1GMllXbHNZV0pzWlNEaWdKUWdkR2hsSUhKbGMzQnZibk5sSUdseklITjBhV3hzSUhObGJuUWdZbVZzYjNkY2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNBdktpcGNiaUFnSUNvZ1FHUmxjMk55YVhCMGFXOXVJRkpsYzI5c2RtVnpJSFJvWlNCc2IyZG5aWElnWW05MWJtUWdkRzhnZEdobElHOXlhV2RwYm1GMGFXNW5JSEpsY1hWbGMzUW5jeUJrWldOaFppMTBjeUJEYjI1MFpYaDBMbHh1SUNBZ0tpQkFjM1Z0YldGeWVTQkhiRzlpWVd3Z1ptbHNkR1Z5Y3lCaGNtVWdjMmx1WjJ4bGRHOXVjeXdnYzI4Z2RHaGxJSEpsY1hWbGMzUXRjMk52Y0dWa0lIdEFiR2x1YXlCRVpXTmhabEpsY1hWbGMzUkRiMjUwWlhoMGZWeHVJQ0FnS2lBb1lXNWtJSFJvWlNCamJHbGxiblF2ZFhObGNpMWliM1Z1WkNCc2IyZG5aWElnYVhRZ1kyRnljbWxsY3lrZ1kyRnVKM1FnWW1VZ1kyOXVjM1J5ZFdOMGIzSXRhVzVxWldOMFpXUXVJRWx1YzNSbFlXUXNJSFJvYVhOY2JpQWdJQ29nYkc5dmEzTWdkWEFnZEdobElITmhiV1VnY21WeGRXVnpkQ2R6SUdOdmJuUmxlSFFnYVdRZ1lXNWtJSEpsTFhKbGMyOXNkbVZ6SUhSb1pTQmhiSEpsWVdSNUxXRmpZM1Z0ZFd4aGRHVmtJR2x1YzNSaGJtTmxYRzRnSUNBcUlIUm9jbTkxWjJnZ1lFMXZaSFZzWlZKbFptQXVJRVpoYkd4eklHSmhZMnNnZEc4Z2RHaGxJR2RsYm1WeWFXTWdZRXh2WjJkcGJtY3VaMlYwS0NsZ0lHeHZaMmRsY2lCM2FHVnVJSFJvWlNCbWFXeDBaWElnZDJGemJpZDBYRzRnSUNBcUlHTnZibk4wY25WamRHVmtJSGRwZEdnZ1lTQmdUVzlrZFd4bFVtVm1ZQ0FvWlM1bkxpQnRZVzUxWVd4c2VTQmdibVYzWUNka0tTQnZjaUJ1YnlCeVpYRjFaWE4wTFhOamIzQmxaQ0JqYjI1MFpYaDBJR1Y0YVhOMGMxeHVJQ0FnS2lCbWIzSWdkR2hwY3lCeVpYRjFaWE4wSUNobExtY3VJSFJvWlNCbGNuSnZjaUJvWVhCd1pXNWxaQ0JpWldadmNtVWdZVzU1SUdSbFkyRm1MV0YzWVhKbElIQnliM1pwWkdWeUlISmhiaXdnWVhNZ2FYTWdkR2hsWEc0Z0lDQXFJR05oYzJVZ2QyaGxiaUJoSUdkMVlYSmtJSEpsYW1WamRITWdkR2hsSUhKbGNYVmxjM1FnWW1WbWIzSmxJR2x1ZEdWeVkyVndkRzl5Y3lCblpYUWdkRzhnWW1sdVpDQjBhR1VnWTJ4cFpXNTBMWE5qYjNCbFpGeHVJQ0FnS2lCc2IyZG5aWElnYjI1MGJ5QjBhR1VnUTI5dWRHVjRkQ2t1WEc0Z0lDQXFMMXh1SUNCd2NtOTBaV04wWldRZ1lYTjVibU1nY21WemIyeDJaVXh2WjJkbGNpaGNiaUFnSUNCeVpYRjFaWE4wT2lCU1pXTnZjbVE4YzNSeWFXNW5MQ0JoYm5rK1hHNGdJQ2s2SUZCeWIyMXBjMlU4VW1WeGRXVnpkRXh2WjJkbGNqNGdlMXh1SUNBZ0lHbG1JQ2gwYUdsekxtMXZaSFZzWlZKbFppa2dlMXh1SUNBZ0lDQWdkSEo1SUh0Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnWTI5dWRHVjRkRWxrSUQwZ1EyOXVkR1Y0ZEVsa1JtRmpkRzl5ZVM1blpYUkNlVkpsY1hWbGMzUW9jbVZ4ZFdWemRDazdYRzRnSUNBZ0lDQWdJR052Ym5OMElISmxjWFZsYzNSRGIyNTBaWGgwSUQwZ1lYZGhhWFFnZEdocGN5NXRiMlIxYkdWU1pXWXVjbVZ6YjJ4MlpTaGNiaUFnSUNBZ0lDQWdJQ0JFWldOaFpsSmxjWFZsYzNSRGIyNTBaWGgwTEZ4dUlDQWdJQ0FnSUNBZ0lHTnZiblJsZUhSSlpDeGNiaUFnSUNBZ0lDQWdJQ0I3SUhOMGNtbGpkRG9nWm1Gc2MyVWdmVnh1SUNBZ0lDQWdJQ0FwTzF4dUlDQWdJQ0FnSUNCcFppQW9jbVZ4ZFdWemRFTnZiblJsZUhRL0xteHZaMmRsY2lrZ2NtVjBkWEp1SUhKbGNYVmxjM1JEYjI1MFpYaDBMbXh2WjJkbGNqdGNiaUFnSUNBZ0lIMGdZMkYwWTJnZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJ1YnlCeVpYRjFaWE4wTFhOamIzQmxaQ0JqYjI1MFpYaDBJR0p2ZFc1a0lHWnZjaUIwYUdseklISmxjWFZsYzNRZzRvQ1VJR1poYkd3Z1ltRmpheUJpWld4dmQxeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdURzluWjJsdVp5NW5aWFFvS1NCaGN5QjFibXR1YjNkdUlHRnpJRkpsY1hWbGMzUk1iMmRuWlhJN1hHNGdJSDFjYm4xY2JpSmRmUT09Il19
@@ -5,11 +5,14 @@ exports.UseDecafHeaders = UseDecafHeaders;
5
5
  const common_1 = require("@nestjs/common");
6
6
  const DecafErrorFilter_js_1 = require("./DecafErrorFilter.cjs");
7
7
  const index_js_1 = require("./../../request/index.cjs");
8
+ // No ModuleRef available at decoration time, so this instance falls back to
9
+ // Logging.get() rather than the request-bound context logger; prefer
10
+ // NestBootstraper.useGlobalFilters() for context-aware error logging.
8
11
  function UseDecafFilter() {
9
12
  return (0, common_1.UseFilters)(new DecafErrorFilter_js_1.DecafExceptionFilter());
10
13
  }
11
14
  function UseDecafHeaders() {
12
15
  return (0, common_1.UseInterceptors)(index_js_1.DecafResponseInterceptor);
13
16
  }
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9mYWN0b3J5L2V4Y2VwdGlvbnMvZGVjb3JhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSw4QkFBMkI7QUFDMUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLGlDQUE0QjtBQUUvRCxNQUFNLFVBQVUsY0FBYztJQUM1QixPQUFPLFVBQVUsQ0FBQyxJQUFJLG9CQUFvQixFQUFFLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWU7SUFDN0IsT0FBTyxlQUFlLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVXNlRmlsdGVycywgVXNlSW50ZXJjZXB0b3JzIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZkV4Y2VwdGlvbkZpbHRlciB9IGZyb20gXCIuL0RlY2FmRXJyb3JGaWx0ZXJcIjtcbmltcG9ydCB7IERlY2FmUmVzcG9uc2VJbnRlcmNlcHRvciB9IGZyb20gXCIuLi8uLi9yZXF1ZXN0L2luZGV4XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBVc2VEZWNhZkZpbHRlcigpIHtcbiAgcmV0dXJuIFVzZUZpbHRlcnMobmV3IERlY2FmRXhjZXB0aW9uRmlsdGVyKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVXNlRGVjYWZIZWFkZXJzKCkge1xuICByZXR1cm4gVXNlSW50ZXJjZXB0b3JzKERlY2FmUmVzcG9uc2VJbnRlcmNlcHRvcik7XG59XG4iXX0=
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRlY29yYXRvcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSx3Q0FFQztBQUNELDBDQUVDO0FBUkQsMkNBQTZEO0FBQzdELCtEQUE2RDtBQUM3RCx1REFBb0U7QUFDcEUsU0FBZ0IsY0FBYztJQUMxQixPQUFPLElBQUEsbUJBQVUsRUFBQyxJQUFJLDBDQUFvQixFQUFFLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBQ0QsU0FBZ0IsZUFBZTtJQUMzQixPQUFPLElBQUEsd0JBQWUsRUFBQyxtQ0FBd0IsQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFDRCw4bUNBQThtQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVzZUZpbHRlcnMsIFVzZUludGVyY2VwdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZFeGNlcHRpb25GaWx0ZXIgfSBmcm9tIFwiLi9EZWNhZkVycm9yRmlsdGVyLmpzXCI7XG5pbXBvcnQgeyBEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi8uLi8uLi9yZXF1ZXN0L2luZGV4LmpzXCI7XG5leHBvcnQgZnVuY3Rpb24gVXNlRGVjYWZGaWx0ZXIoKSB7XG4gICAgcmV0dXJuIFVzZUZpbHRlcnMobmV3IERlY2FmRXhjZXB0aW9uRmlsdGVyKCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIFVzZURlY2FmSGVhZGVycygpIHtcbiAgICByZXR1cm4gVXNlSW50ZXJjZXB0b3JzKERlY2FmUmVzcG9uc2VJbnRlcmNlcHRvcik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2laR1ZqYjNKaGRHOXljeTVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6SWpwYklpNHVMeTR1THk0dUx5NHVMM055WXk5bVlXTjBiM0o1TDJWNFkyVndkR2x2Ym5NdlpHVmpiM0poZEc5eWN5NTBjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lRVUZCUVN4UFFVRlBMRVZCUVVVc1ZVRkJWU3hGUVVGRkxHVkJRV1VzUlVGQlJTeE5RVUZOTEdkQ1FVRm5RaXhEUVVGRE8wRkJRemRFTEU5QlFVOHNSVUZCUlN4dlFrRkJiMElzUlVGQlJTdzRRa0ZCTWtJN1FVRkRNVVFzVDBGQlR5eEZRVUZGTEhkQ1FVRjNRaXhGUVVGRkxHbERRVUUwUWp0QlFVVXZSQ3hOUVVGTkxGVkJRVlVzWTBGQll6dEpRVU0xUWl4UFFVRlBMRlZCUVZVc1EwRkJReXhKUVVGSkxHOUNRVUZ2UWl4RlFVRkZMRU5CUVVNc1EwRkJRenRCUVVOb1JDeERRVUZETzBGQlJVUXNUVUZCVFN4VlFVRlZMR1ZCUVdVN1NVRkROMElzVDBGQlR5eGxRVUZsTEVOQlFVTXNkMEpCUVhkQ0xFTkJRVU1zUTBGQlF6dEJRVU51UkN4RFFVRkRJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJSHNnVlhObFJtbHNkR1Z5Y3l3Z1ZYTmxTVzUwWlhKalpYQjBiM0p6SUgwZ1puSnZiU0JjSWtCdVpYTjBhbk12WTI5dGJXOXVYQ0k3WEc1cGJYQnZjblFnZXlCRVpXTmhaa1Y0WTJWd2RHbHZia1pwYkhSbGNpQjlJR1p5YjIwZ1hDSXVMMFJsWTJGbVJYSnliM0pHYVd4MFpYSmNJanRjYm1sdGNHOXlkQ0I3SUVSbFkyRm1VbVZ6Y0c5dWMyVkpiblJsY21ObGNIUnZjaUI5SUdaeWIyMGdYQ0l1TGk4dUxpOXlaWEYxWlhOMEwybHVaR1Y0WENJN1hHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQlZjMlZFWldOaFprWnBiSFJsY2lncElIdGNiaUFnY21WMGRYSnVJRlZ6WlVacGJIUmxjbk1vYm1WM0lFUmxZMkZtUlhoalpYQjBhVzl1Um1sc2RHVnlLQ2twTzF4dWZWeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdWWE5sUkdWallXWklaV0ZrWlhKektDa2dlMXh1SUNCeVpYUjFjbTRnVlhObFNXNTBaWEpqWlhCMGIzSnpLRVJsWTJGbVVtVnpjRzl1YzJWSmJuUmxjbU5sY0hSdmNpazdYRzU5WEc0aVhYMD0iXX0=
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9mYWN0b3J5L2V4Y2VwdGlvbnMvZGVjb3JhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSw4QkFBMkI7QUFDMUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLGlDQUE0QjtBQUUvRCw0RUFBNEU7QUFDNUUscUVBQXFFO0FBQ3JFLHNFQUFzRTtBQUN0RSxNQUFNLFVBQVUsY0FBYztJQUM1QixPQUFPLFVBQVUsQ0FBQyxJQUFJLG9CQUFvQixFQUFFLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWU7SUFDN0IsT0FBTyxlQUFlLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVXNlRmlsdGVycywgVXNlSW50ZXJjZXB0b3JzIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZkV4Y2VwdGlvbkZpbHRlciB9IGZyb20gXCIuL0RlY2FmRXJyb3JGaWx0ZXJcIjtcbmltcG9ydCB7IERlY2FmUmVzcG9uc2VJbnRlcmNlcHRvciB9IGZyb20gXCIuLi8uLi9yZXF1ZXN0L2luZGV4XCI7XG5cbi8vIE5vIE1vZHVsZVJlZiBhdmFpbGFibGUgYXQgZGVjb3JhdGlvbiB0aW1lLCBzbyB0aGlzIGluc3RhbmNlIGZhbGxzIGJhY2sgdG9cbi8vIExvZ2dpbmcuZ2V0KCkgcmF0aGVyIHRoYW4gdGhlIHJlcXVlc3QtYm91bmQgY29udGV4dCBsb2dnZXI7IHByZWZlclxuLy8gTmVzdEJvb3RzdHJhcGVyLnVzZUdsb2JhbEZpbHRlcnMoKSBmb3IgY29udGV4dC1hd2FyZSBlcnJvciBsb2dnaW5nLlxuZXhwb3J0IGZ1bmN0aW9uIFVzZURlY2FmRmlsdGVyKCkge1xuICByZXR1cm4gVXNlRmlsdGVycyhuZXcgRGVjYWZFeGNlcHRpb25GaWx0ZXIoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBVc2VEZWNhZkhlYWRlcnMoKSB7XG4gIHJldHVybiBVc2VJbnRlcmNlcHRvcnMoRGVjYWZSZXNwb25zZUludGVyY2VwdG9yKTtcbn1cbiJdfQ==
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRlY29yYXRvcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFNQSx3Q0FFQztBQUNELDBDQUVDO0FBWEQsMkNBQTZEO0FBQzdELCtEQUE2RDtBQUM3RCx1REFBb0U7QUFDcEUsNEVBQTRFO0FBQzVFLHFFQUFxRTtBQUNyRSxzRUFBc0U7QUFDdEUsU0FBZ0IsY0FBYztJQUMxQixPQUFPLElBQUEsbUJBQVUsRUFBQyxJQUFJLDBDQUFvQixFQUFFLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBQ0QsU0FBZ0IsZUFBZTtJQUMzQixPQUFPLElBQUEsd0JBQWUsRUFBQyxtQ0FBd0IsQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFDRCwwOENBQTA4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVzZUZpbHRlcnMsIFVzZUludGVyY2VwdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZFeGNlcHRpb25GaWx0ZXIgfSBmcm9tIFwiLi9EZWNhZkVycm9yRmlsdGVyLmpzXCI7XG5pbXBvcnQgeyBEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi8uLi8uLi9yZXF1ZXN0L2luZGV4LmpzXCI7XG4vLyBObyBNb2R1bGVSZWYgYXZhaWxhYmxlIGF0IGRlY29yYXRpb24gdGltZSwgc28gdGhpcyBpbnN0YW5jZSBmYWxscyBiYWNrIHRvXG4vLyBMb2dnaW5nLmdldCgpIHJhdGhlciB0aGFuIHRoZSByZXF1ZXN0LWJvdW5kIGNvbnRleHQgbG9nZ2VyOyBwcmVmZXJcbi8vIE5lc3RCb290c3RyYXBlci51c2VHbG9iYWxGaWx0ZXJzKCkgZm9yIGNvbnRleHQtYXdhcmUgZXJyb3IgbG9nZ2luZy5cbmV4cG9ydCBmdW5jdGlvbiBVc2VEZWNhZkZpbHRlcigpIHtcbiAgICByZXR1cm4gVXNlRmlsdGVycyhuZXcgRGVjYWZFeGNlcHRpb25GaWx0ZXIoKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gVXNlRGVjYWZIZWFkZXJzKCkge1xuICAgIHJldHVybiBVc2VJbnRlcmNlcHRvcnMoRGVjYWZSZXNwb25zZUludGVyY2VwdG9yKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaVpHVmpiM0poZEc5eWN5NXFjeUlzSW5OdmRYSmpaVkp2YjNRaU9pSWlMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMeTR1THk0dUwzTnlZeTltWVdOMGIzSjVMMlY0WTJWd2RHbHZibk12WkdWamIzSmhkRzl5Y3k1MGN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaVFVRkJRU3hQUVVGUExFVkJRVVVzVlVGQlZTeEZRVUZGTEdWQlFXVXNSVUZCUlN4TlFVRk5MR2RDUVVGblFpeERRVUZETzBGQlF6ZEVMRTlCUVU4c1JVRkJSU3h2UWtGQmIwSXNSVUZCUlN3NFFrRkJNa0k3UVVGRE1VUXNUMEZCVHl4RlFVRkZMSGRDUVVGM1FpeEZRVUZGTEdsRFFVRTBRanRCUVVVdlJDdzBSVUZCTkVVN1FVRkROVVVzY1VWQlFYRkZPMEZCUTNKRkxITkZRVUZ6UlR0QlFVTjBSU3hOUVVGTkxGVkJRVlVzWTBGQll6dEpRVU0xUWl4UFFVRlBMRlZCUVZVc1EwRkJReXhKUVVGSkxHOUNRVUZ2UWl4RlFVRkZMRU5CUVVNc1EwRkJRenRCUVVOb1JDeERRVUZETzBGQlJVUXNUVUZCVFN4VlFVRlZMR1ZCUVdVN1NVRkROMElzVDBGQlR5eGxRVUZsTEVOQlFVTXNkMEpCUVhkQ0xFTkJRVU1zUTBGQlF6dEJRVU51UkN4RFFVRkRJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJSHNnVlhObFJtbHNkR1Z5Y3l3Z1ZYTmxTVzUwWlhKalpYQjBiM0p6SUgwZ1puSnZiU0JjSWtCdVpYTjBhbk12WTI5dGJXOXVYQ0k3WEc1cGJYQnZjblFnZXlCRVpXTmhaa1Y0WTJWd2RHbHZia1pwYkhSbGNpQjlJR1p5YjIwZ1hDSXVMMFJsWTJGbVJYSnliM0pHYVd4MFpYSmNJanRjYm1sdGNHOXlkQ0I3SUVSbFkyRm1VbVZ6Y0c5dWMyVkpiblJsY21ObGNIUnZjaUI5SUdaeWIyMGdYQ0l1TGk4dUxpOXlaWEYxWlhOMEwybHVaR1Y0WENJN1hHNWNiaTh2SUU1dklFMXZaSFZzWlZKbFppQmhkbUZwYkdGaWJHVWdZWFFnWkdWamIzSmhkR2x2YmlCMGFXMWxMQ0J6YnlCMGFHbHpJR2x1YzNSaGJtTmxJR1poYkd4eklHSmhZMnNnZEc5Y2JpOHZJRXh2WjJkcGJtY3VaMlYwS0NrZ2NtRjBhR1Z5SUhSb1lXNGdkR2hsSUhKbGNYVmxjM1F0WW05MWJtUWdZMjl1ZEdWNGRDQnNiMmRuWlhJN0lIQnlaV1psY2x4dUx5OGdUbVZ6ZEVKdmIzUnpkSEpoY0dWeUxuVnpaVWRzYjJKaGJFWnBiSFJsY25Nb0tTQm1iM0lnWTI5dWRHVjRkQzFoZDJGeVpTQmxjbkp2Y2lCc2IyZG5hVzVuTGx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUZWelpVUmxZMkZtUm1sc2RHVnlLQ2tnZTF4dUlDQnlaWFIxY200Z1ZYTmxSbWxzZEdWeWN5aHVaWGNnUkdWallXWkZlR05sY0hScGIyNUdhV3gwWlhJb0tTazdYRzU5WEc1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCVmMyVkVaV05oWmtobFlXUmxjbk1vS1NCN1hHNGdJSEpsZEhWeWJpQlZjMlZKYm5SbGNtTmxjSFJ2Y25Nb1JHVmpZV1pTWlhOd2IyNXpaVWx1ZEdWeVkyVndkRzl5S1R0Y2JuMWNiaUpkZlE9PSJdfQ==
package/lib/cjs/index.cjs CHANGED
@@ -60,21 +60,21 @@ __exportStar(require("./events-module/index.cjs"), exports);
60
60
  * @constant
61
61
  * @type {string}
62
62
  */
63
- exports.VERSION = "0.11.2-refactor.4";
63
+ exports.VERSION = "0.11.2-refactor.5";
64
64
  /**
65
65
  * @description Represents the current commit hash of the module build.
66
66
  * @summary Stores the current git commit hash for the package. The build replaces
67
67
  * the placeholder with the actual commit hash at publish time.
68
68
  * @const COMMIT
69
69
  */
70
- exports.COMMIT = "1b4f98c";
70
+ exports.COMMIT = "3009b85";
71
71
  /**
72
72
  * @description Represents the full version string of the module.
73
73
  * @summary Stores the semver version and commit hash for the package.
74
74
  * The build replaces the placeholder with the actual `<version>-<commit>` value at publish time.
75
75
  * @const FULL_VERSION
76
76
  */
77
- exports.FULL_VERSION = "0.11.2-refactor.4-1b4f98c";
77
+ exports.FULL_VERSION = "0.11.2-refactor.5-3009b85";
78
78
  exports.PACKAGE_NAME = "@decaf-ts/for-nest";
79
79
  decoration_1.Metadata.allowReregistration(true);
80
80
  decoration_1.Metadata.registerLibrary(exports.PACKAGE_NAME, exports.VERSION);
@@ -1,4 +1,5 @@
1
1
  import { Logger, } from "@nestjs/common";
2
+ import { ModuleRef } from "@nestjs/core";
2
3
  import { DecafExceptionFilter } from "./exceptions/index.js";
3
4
  import { SwaggerBuilder } from "./openapi/index.js";
4
5
  import { CorsError } from "./errors/index.js";
@@ -213,10 +214,17 @@ export class NestBootstraper {
213
214
  * set of standard exception filters for common error types like
214
215
  * `HttpException`, `ValidationException`, `ConflictException`, and others.
215
216
  *
217
+ * The default `DecafExceptionFilter` is constructed with the application's
218
+ * `ModuleRef` so it can resolve the request-scoped `DecafRequestContext` (and
219
+ * its client-bound logger) for the request that threw, instead of logging
220
+ * through the generic global logger.
221
+ *
216
222
  * @param {...ExceptionFilter[]} filters - Optional filters to apply globally.
217
223
  */
218
224
  static useGlobalFilters(...filters) {
219
- this.app.useGlobalFilters(...(filters.length > 0 ? filters : [new DecafExceptionFilter()]));
225
+ this.app.useGlobalFilters(...(filters.length > 0
226
+ ? filters
227
+ : [new DecafExceptionFilter(this.app.get(ModuleRef, { strict: false }))]));
220
228
  return this;
221
229
  }
222
230
  /**
@@ -259,4 +267,4 @@ export class NestBootstraper {
259
267
  });
260
268
  }
261
269
  }
262
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmVzdEJvb3RzdHJhcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ZhY3RvcnkvTmVzdEJvb3RzdHJhcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxNQUFNLEdBR1AsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsOEJBQXFCO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsMkJBQWtCO0FBRTNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsMEJBQWlCO0FBNENyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQ0c7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUkxQjs7Ozs7Ozs7O09BU0c7SUFDSyxNQUFNLEtBQUssTUFBTTtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLFdBQVc7WUFDWCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQXFCO1FBQ3JDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLFlBQXFCO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxJQUFJLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFH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QyxHQUFHLENBQUMsaUNBQWlDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSU5lc3RBcHBsaWNhdGlvbixcbiAgTG9nZ2VyLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIFBpcGVUcmFuc2Zvcm0sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZFeGNlcHRpb25GaWx0ZXIgfSBmcm9tIFwiLi9leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBTd2FnZ2VyQnVpbGRlciB9IGZyb20gXCIuL29wZW5hcGlcIjtcbmltcG9ydCB7IENvcnNPcHRpb25zIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uL2ludGVyZmFjZXMvZXh0ZXJuYWwvY29ycy1vcHRpb25zLmludGVyZmFjZVwiO1xuaW1wb3J0IHsgQ29yc0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBEZWZpbmVzIGFsbCBjdXN0b21pemFibGUgcGFyYW1ldGVycyBmb3IgU3dhZ2dlciBzZXR1cC5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGRldmVsb3BlcnMgdG8gY3VzdG9taXplIGhvdyBTd2FnZ2VyIFVJIGlzIGNvbmZpZ3VyZWRcbiAqIHdpdGhpbiB0aGUgTmVzdEpTIGFwcGxpY2F0aW9uLiBJdCBpbmNsdWRlcyBwYXJhbWV0ZXJzIGZvciB0aXRsZXMsIHBhdGhzLFxuICogY29sb3Igc2NoZW1lcywgYW5kIGFzc2V0IHBhdGhzIHRvIHRhaWxvciB0aGUgQVBJIGRvY3VtZW50YXRpb24gZXhwZXJpZW5jZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSBUaXRsZSBkaXNwbGF5ZWQgaW4gU3dhZ2dlciBVSS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvbiAtIERlc2NyaXB0aW9uIHNob3duIGJlbG93IHRoZSB0aXRsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gQVBJIHZlcnNpb24gZGlzcGxheWVkIGluIHRoZSBkb2N1bWVudGF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHBhdGggd2hlcmUgU3dhZ2dlciB3aWxsIGJlIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BlcnNpc3RBdXRob3JpemF0aW9uXSAtIFdoZXRoZXIgYXV0aG9yaXphdGlvbiB0b2tlbnMgcGVyc2lzdCBhY3Jvc3MgcmVsb2Fkcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXNzZXRzUGF0aF0gLSBQYXRoIHRvIGN1c3RvbSBhc3NldHMgZm9yIFN3YWdnZXIgVUkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RvcGJhckJnQ29sb3JdIC0gQ3VzdG9tIGJhY2tncm91bmQgY29sb3IgZm9yIHRoZSBTd2FnZ2VyIHRvcCBiYXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RvcGJhckljb25QYXRoXSAtIFBhdGggdG8gYSBjdXN0b20gaWNvbiBkaXNwbGF5ZWQgaW4gdGhlIHRvcCBiYXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Zhdmljb25QYXRoXSAtIFBhdGggdG8gYSBjdXN0b20gZmF2aWNvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2FnZ2VyU2V0dXBPcHRpb25zIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBwYXRoPzogc3RyaW5nO1xuICBwZXJzaXN0QXV0aG9yaXphdGlvbj86IGJvb2xlYW47XG4gIGFzc2V0c1BhdGg/OiBzdHJpbmc7XG4gIHRvcGJhckJnQ29sb3I/OiBzdHJpbmc7XG4gIHRvcGJhckljb25QYXRoPzogc3RyaW5nO1xuICBmYXZpY29uUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gSlNPTiBmb3JtYXQuXG4gICAqIEV4YW1wbGU6IC9hcGkvb3BlbmFwaS5qc29uXG4gICAqL1xuICBvcGVuQXBpSnNvblBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQYXRoIHRvIGV4cG9zZSB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIGluIFlBTUwgZm9ybWF0LlxuICAgKiBSZXF1aXJlcyAneWFtbCcgcGFja2FnZSBhcyBwZWVyIGRlcGVuZGVuY3kuXG4gICAqIEV4YW1wbGU6IC9hcGkvb3BlbmFwaS55YW1sXG4gICAqL1xuICBvcGVuQXBpWWFtbFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBIGZsdWVudCwgc3RhdGljIGJvb3RzdHJhcCBjbGFzcyBmb3IgaW5pdGlhbGl6aW5nIGFuZCBjb25maWd1cmluZyBhIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIGBOZXN0Qm9vdHN0cmFwZXJgIGNsYXNzIHByb3ZpZGVzIGEgY2hhaW5hYmxlIEFQSSBmb3IgY29uZmlndXJpbmdcbiAqIGEgTmVzdEpTIGFwcGxpY2F0aW9uIGluc3RhbmNlLiBJdCBpbmNsdWRlcyBidWlsdC1pbiBtZXRob2RzIGZvciBlbmFibGluZ1xuICogQ09SUywgSGVsbWV0IHNlY3VyaXR5LCBTd2FnZ2VyIGRvY3VtZW50YXRpb24sIGdsb2JhbCBwaXBlcywgZmlsdGVycyxcbiAqIGludGVyY2VwdG9ycywgYW5kIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuXG4gKlxuICogVGhpcyBjbGFzcyBwcm9tb3RlcyBjb25zaXN0ZW5jeSBhbmQgcmVkdWNlcyByZXBldGl0aXZlIHNldHVwIGNvZGVcbiAqIGFjcm9zcyBtdWx0aXBsZSBOZXN0SlMgcHJvamVjdHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBOZXN0RmFjdG9yeSB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbiAqIGltcG9ydCB7IEFwcE1vZHVsZSB9IGZyb20gXCIuL2FwcC5tb2R1bGVcIjtcbiAqIGltcG9ydCB7IE15TG9nZ2VyIH0gZnJvbSBcIi4vTXlMb2dnZXJcIjtcbiAqIGltcG9ydCB7IE5lc3RCb290c3RyYXBlciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLW5lc3RcIjtcbiAqXG4gKiBhc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gKiAgIGNvbnN0IGFwcCA9IGF3YWl0IE5lc3RGYWN0b3J5LmNyZWF0ZShBcHBNb2R1bGUpO1xuICpcbiAqICAgYXdhaXQgTmVzdEJvb3RzdHJhcGVyXG4gKiAgICAgLmluaXRpYWxpemUoYXBwKVxuICogICAgIC5lbmFibGVMb2dnZXIobmV3IE15TG9nZ2VyKCkpXG4gKiAgICAgLmVuYWJsZUNvcnMoW1wiaHR0cDovL2xvY2FsaG9zdDo0MjAwXCJdKVxuICogICAgIC51c2VIZWxtZXQoKVxuICogICAgIC5zZXR1cFN3YWdnZXIoe1xuICogICAgICAgdGl0bGU6IFwiT3BlbkFQSSBieSBUcmFkZU1hcmvihKJcIixcbiAqICAgICAgIGRlc2NyaXB0aW9uOiBcIlRyYWRlTWFya+KEoiBBUEkgZG9jdW1lbnRhdGlvblwiLFxuICogICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICogICAgICAgcGF0aDogXCJhcGlcIixcbiAqICAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0cnVlLFxuICogICAgICAgdG9wYmFyQmdDb2xvcjogXCIjMkMzRTUwXCIsXG4gKiAgICAgICB0b3BiYXJJY29uUGF0aDogXCIvYXNzZXRzL2xvZ28uc3ZnXCIsXG4gKiAgICAgICBmYXZpY29uUGF0aDogXCIvYXNzZXRzL2Zhdmljb24uaWNvXCJcbiAqICAgICB9KVxuICogICAgIC51c2VHbG9iYWxGaWx0ZXJzKClcbiAqICAgICAudXNlR2xvYmFsUGlwZXMoLi4uKVxuICogICAgIC51c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uKVxuICogICAgIC5zdGFydCgzMDAwKTtcbiAqIH1cbiAqXG4gKiBib290c3RyYXAoKTtcbiAqIGBgYFxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXN0Qm9vdHN0cmFwZXIge1xuICBwcml2YXRlIHN0YXRpYyBhcHA6IElOZXN0QXBwbGljYXRpb247XG4gIHByaXZhdGUgc3RhdGljIF9sb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbG9nZ2VyIGluc3RhbmNlLCBjcmVhdGluZyBhIGRlZmF1bHQgb25lIGlmIG5vdCBzZXQuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEVuc3VyZXMgdGhhdCBhIHZhbGlkIGBMb2dnZXJgIGluc3RhbmNlIGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICogZm9yIGxvZ2dpbmcgYm9vdHN0cmFwLXJlbGF0ZWQgbWVzc2FnZXMuXG4gICAqXG4gICAqIEByZXR1cm4ge0xvZ2dlcn0gVGhlIGFjdGl2ZSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXQgbG9nZ2VyKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLl9sb2dnZXIpIHtcbiAgICAgIC8vIGZhbGxiYWNrXG4gICAgICB0aGlzLl9sb2dnZXIgPSBuZXcgTG9nZ2VyKFwiTmVzdEJvb3RzdHJhcFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSW5pdGlhbGl6ZXMgdGhlIGJvb3RzdHJhcHBlciB3aXRoIGEgZ2l2ZW4gTmVzdEpTIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBCaW5kcyB0aGUgcHJvdmlkZWQgTmVzdEpTIGFwcCBpbnN0YW5jZSB0byB0aGUgYm9vdHN0cmFwcGVyLCBlbmFibGluZ1xuICAgKiBjaGFpbmVkIGNvbmZpZ3VyYXRpb24gbWV0aG9kcy5cbiAgICpcbiAgICogQHBhcmFtIHtJTmVzdEFwcGxpY2F0aW9ufSBhcHAgLSBUaGUgTmVzdEpTIGFwcGxpY2F0aW9uIGluc3RhbmNlIHRvIGluaXRpYWxpemUuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24gbWV0aG9kcy5cbiAgICovXG4gIHN0YXRpYyBpbml0aWFsaXplKGFwcDogSU5lc3RBcHBsaWNhdGlvbikge1xuICAgIHRoaXMuYXBwID0gYXBwO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFbmFibGVzIG9yIHJlcGxhY2VzIHRoZSBnbG9iYWwgbG9nZ2VyIGZvciB0aGUgTmVzdEpTIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBJZiBhIGN1c3RvbSBsb2dnZXIgaXMgcHJvdmlkZWQsIGl0IHJlcGxhY2VzIHRoZSBkZWZhdWx0IGxvZ2dlci4gT3RoZXJ3aXNlLFxuICAgKiBhIG5ldyBsb2dnZXIgbmFtZWQgYFwiTmVzdEJvb3RzdHJhcFwiYCBpcyB1c2VkLiBUaGlzIGxvZ2dlciBpcyBhbHNvIHJlZ2lzdGVyZWRcbiAgICogd2l0aCB0aGUgTmVzdEpTIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0xvZ2dlcn0gW2N1c3RvbUxvZ2dlcl0gLSBPcHRpb25hbCBjdXN0b20gbG9nZ2VyIGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZy5cbiAgICovXG4gIHN0YXRpYyBlbmFibGVMb2dnZXIoY3VzdG9tTG9nZ2VyPzogTG9nZ2VyKSB7XG4gICAgdGhpcy5fbG9nZ2VyID0gY3VzdG9tTG9nZ2VyIHx8IG5ldyBMb2dnZXIoXCJOZXN0Qm9vdHN0cmFwXCIpO1xuICAgIHRoaXMuYXBwLnVzZUxvZ2dlcih0aGlzLl9sb2dnZXIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFbmFibGVzIENyb3NzLU9yaWdpbiBSZXNvdXJjZSBTaGFyaW5nIChDT1JTKSBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBBbGxvd3MgZGVmaW5pbmcgZWl0aGVyIGEgd2lsZGNhcmQgb3JpZ2luIChgXCIqXCJgKSBvciBhIGxpc3Qgb2YgYWxsb3dlZCBvcmlnaW5zLlxuICAgKiBBdXRvbWF0aWNhbGx5IGFjY2VwdHMgbG9jYWwgZGV2ZWxvcG1lbnQgcmVxdWVzdHMgYW5kIHRob3NlIHdpdGhvdXQgb3JpZ2luIGhlYWRlcnMuXG4gICAqIFRocm93cyBhIGBDb3JzRXJyb3JgIGZvciB1bmF1dGhvcml6ZWQgb3JpZ2lucy5cbiAgICpcbiAgICogQHBhcmFtIHsnKicgfCBzdHJpbmdbXX0gW29yaWdpbnM9W11dIC0gTGlzdCBvZiBhbGxvd2VkIG9yaWdpbnMgb3IgYFwiKlwiYCB0byBhbGxvdyBhbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthbGxvd01ldGhvZHM9WydHRVQnLCAnUE9TVCcsICdQVVQnLCAnREVMRVRFJ11dIC0gQWxsb3dlZCBIVFRQIG1ldGhvZHMuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlQ29ycyhcbiAgICBvcmlnaW5zOiBcIipcIiB8IHN0cmluZ1tdID0gW10sXG4gICAgYWxsb3dNZXRob2RzOiBzdHJpbmdbXSA9IFtcIkdFVFwiLCBcIlBPU1RcIiwgXCJQVVRcIiwgXCJERUxFVEVcIl1cbiAgKSB7XG4gICAgY29uc3QgYWxsb3dlZE9yaWdpbnMgPVxuICAgICAgb3JpZ2lucyA9PT0gXCIqXCIgPyBcIipcIiA6IG9yaWdpbnMubWFwKChvKSA9PiBvLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcblxuICAgIGNvbnN0IGNvcnNPcHRpb25zOiBDb3JzT3B0aW9ucyA9IHtcbiAgICAgIG9yaWdpbjogKG9yaWdpbiwgY2FsbGJhY2spID0+IHtcbiAgICAgICAgLy8gQWxsb3cgcmVxdWVzdCB3aXRob3V0IG9yaWdpbi4uLlxuICAgICAgICBpZiAoIW9yaWdpbikgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHRydWUpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBhbGxvd2VkT3JpZ2lucyA9PT0gXCIqXCIgfHxcbiAgICAgICAgICAoQXJyYXkuaXNBcnJheShhbGxvd2VkT3JpZ2lucykgJiZcbiAgICAgICAgICAgIGFsbG93ZWRPcmlnaW5zLmluY2x1ZGVzKG9yaWdpbi50b0xvd2VyQ2FzZSgpKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2sobmV3IENvcnNFcnJvcihgT3JpZ2luICR7b3JpZ2lufSBub3QgYWxsb3dlZGApKTtcbiAgICAgIH0sXG4gICAgICBjcmVkZW50aWFsczogdHJ1ZSxcbiAgICAgIG1ldGhvZHM6IGFsbG93TWV0aG9kcy5qb2luKFwiLFwiKSxcbiAgICB9O1xuXG4gICAgdGhpcy5hcHAuZW5hYmxlQ29ycyhjb3JzT3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFwcGxpZXMgdGhlIEhlbG1ldCBtaWRkbGV3YXJlIGZvciBlbmhhbmNlZCBzZWN1cml0eS5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRHluYW1pY2FsbHkgbG9hZHMgdGhlIGBoZWxtZXRgIHBhY2thZ2UgaWYgYXZhaWxhYmxlIGFuZCByZWdpc3RlcnMgaXRcbiAgICogYXMgbWlkZGxld2FyZSB0byBpbXByb3ZlIEhUVFAgaGVhZGVyIHNlY3VyaXR5LiBJZiBub3QgaW5zdGFsbGVkLCBsb2dzIGEgd2FybmluZ1xuICAgKiBhbmQgY29udGludWVzIGV4ZWN1dGlvbiB3aXRob3V0IHRocm93aW5nIGVycm9ycy5cbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbb3B0aW9uc10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIHBhc3NlZCB0byBIZWxtZXQuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgdXNlSGVsbWV0KG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgICBjb25zdCBoZWxtZXQgPSByZXF1aXJlKFwiaGVsbWV0XCIpOyAvLyBEeW5hbWljIGltcG9ydCB0byBhdm9pZCBoYXJkIGRlcGVuZGVuY3lcbiAgICAgIHRoaXMuYXBwLnVzZShoZWxtZXQob3B0aW9ucykpO1xuICAgICAgdGhpcy5sb2dnZXIubG9nKFwiSGVsbWV0IG1pZGRsZXdhcmUgZW5hYmxlZCBzdWNjZXNzZnVsbHkuXCIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcIkhlbG1ldCBub3QgaW5zdGFsbGVkLiBTa2lwcGluZyBtaWRkbGV3YXJlLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQ29uZmlndXJlcyBhbmQgaW5pdGlhbGl6ZXMgU3dhZ2dlciBVSSBmb3IgQVBJIGRvY3VtZW50YXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIFVzZXMgdGhlIGBTd2FnZ2VyQnVpbGRlcmAgdXRpbGl0eSB0byBjb25maWd1cmUgQVBJIGRvY3VtZW50YXRpb25cbiAgICogd2l0aCBkZXRhaWxlZCBjdXN0b21pemF0aW9uIGZvciB0aXRsZSwgdmVyc2lvbiwgcGF0aHMsIGFuZCBjb2xvcnMuXG4gICAqIFN3YWdnZXIgaXMgYXV0b21hdGljYWxseSBleHBvc2VkIGF0IHRoZSBjb25maWd1cmVkIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSB7U3dhZ2dlclNldHVwT3B0aW9uc30gb3B0aW9ucyAtIFN3YWdnZXIgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIHNldHVwU3dhZ2dlcihvcHRpb25zOiBTd2FnZ2VyU2V0dXBPcHRpb25zKSB7XG4gICAgY29uc3Qgc3dhZ2dlciA9IG5ldyBTd2FnZ2VyQnVpbGRlcih0aGlzLmFwcCwge1xuICAgICAgdGl0bGU6IG9wdGlvbnMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbixcbiAgICAgIHBhdGg6IG9wdGlvbnMucGF0aCB8fCBcImFwaVwiLFxuICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IG9wdGlvbnMucGVyc2lzdEF1dGhvcml6YXRpb24gPz8gdHJ1ZSxcbiAgICAgIGFzc2V0c1BhdGg6IG9wdGlvbnMuYXNzZXRzUGF0aCxcbiAgICAgIGZhdmljb25GaWxlUGF0aDogb3B0aW9ucy5mYXZpY29uUGF0aCxcbiAgICAgIHRvcGJhckljb25GaWxlUGF0aDogb3B0aW9ucy50b3BiYXJJY29uUGF0aCxcbiAgICAgIHRvcGJhckJnQ29sb3I6IG9wdGlvbnMudG9wYmFyQmdDb2xvcixcbiAgICAgIG9wZW5BcGlKc29uUGF0aDogb3B0aW9ucy5vcGVuQXBpSnNvblBhdGgsXG4gICAgICBvcGVuQXBpWWFtbFBhdGg6IG9wdGlvbnMub3BlbkFwaVlhbWxQYXRoLFxuICAgIH0pO1xuICAgIHN3YWdnZXIuc2V0dXBTd2FnZ2VyKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJlZ2lzdGVycyBvbmUgb3IgbW9yZSBnbG9iYWwgdmFsaWRhdGlvbiBwaXBlcy5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRW5hYmxlcyByZXF1ZXN0IHBheWxvYWQgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24gZ2xvYmFsbHkgYWNyb3NzXG4gICAqIHRoZSBlbnRpcmUgTmVzdEpTIGFwcGxpY2F0aW9uLiBNdWx0aXBsZSBwaXBlcyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlclxuICAgKiBmb3IgbW9kdWxhciBpbnB1dCB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLlBpcGVUcmFuc2Zvcm1bXX0gcGlwZXMgLSBQaXBlIGluc3RhbmNlcyB0byByZWdpc3RlciBnbG9iYWxseS5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBzdGF0aWMgdXNlR2xvYmFsUGlwZXMoLi4ucGlwZXM6IFBpcGVUcmFuc2Zvcm1bXSkge1xuICAgIGlmIChwaXBlcy5sZW5ndGggPiAwKSB0aGlzLmFwcC51c2VHbG9iYWxQaXBlcyguLi5waXBlcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJlZ2lzdGVycyBvbmUgb3IgbW9yZSBnbG9iYWwgZXhjZXB0aW9uIGZpbHRlcnMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIElmIG5vIGZpbHRlcnMgYXJlIHByb3ZpZGVkLCBpdCBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVycyBhIGRlZmF1bHRcbiAgICogc2V0IG9mIHN0YW5kYXJkIGV4Y2VwdGlvbiBmaWx0ZXJzIGZvciBjb21tb24gZXJyb3IgdHlwZXMgbGlrZVxuICAgKiBgSHR0cEV4Y2VwdGlvbmAsIGBWYWxpZGF0aW9uRXhjZXB0aW9uYCwgYENvbmZsaWN0RXhjZXB0aW9uYCwgYW5kIG90aGVycy5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5FeGNlcHRpb25GaWx0ZXJbXX0gZmlsdGVycyAtIE9wdGlvbmFsIGZpbHRlcnMgdG8gYXBwbHkgZ2xvYmFsbHkuXG4gICAqL1xuICBzdGF0aWMgdXNlR2xvYmFsRmlsdGVycyguLi5maWx0ZXJzOiBhbnlbXSkge1xuICAgIHRoaXMuYXBwLnVzZUdsb2JhbEZpbHRlcnMoXG4gICAgICAuLi4oZmlsdGVycy5sZW5ndGggPiAwID8gZmlsdGVycyA6IFtuZXcgRGVjYWZFeGNlcHRpb25GaWx0ZXIoKV0pXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIGdsb2JhbCBpbnRlcmNlcHRvcnMgZm9yIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHRyYW5zZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBJbnRlcmNlcHRvcnMgYWxsb3cgYWR2YW5jZWQgcmVxdWVzdC9yZXNwb25zZSBtYW5pcHVsYXRpb24gc3VjaCBhc1xuICAgKiBzZXJpYWxpemF0aW9uLCBsb2dnaW5nLCBvciB0cmFuc2Zvcm1hdGlvbi4gTXVsdGlwbGUgaW50ZXJjZXB0b3JzXG4gICAqIGNhbiBiZSBhZGRlZCBmb3IgbW9kdWxhciBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLk5lc3RJbnRlcmNlcHRvcltdfSBpbnRlcmNlcHRvcnMgLSBJbnRlcmNlcHRvciBpbnN0YW5jZXMgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgdXNlR2xvYmFsSW50ZXJjZXB0b3JzKC4uLmludGVyY2VwdG9yczogTmVzdEludGVyY2VwdG9yW10pIHtcbiAgICBpZiAoaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApXG4gICAgICB0aGlzLmFwcC51c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uaW50ZXJjZXB0b3JzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU3RhcnRzIHRoZSBOZXN0SlMgYXBwbGljYXRpb24gYW5kIGJpbmRzIGl0IHRvIHRoZSBnaXZlbiBwb3J0IGFuZCBob3N0LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBMaXN0ZW5zIG9uIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQgb3B0aW9uYWxseSBhIGhvc3QuIE9uY2Ugc3RhcnRlZCxcbiAgICogbG9ncyB0aGUgYXBwbGljYXRpb24gVVJMIGZvciBlYXN5IGFjY2Vzcy4gVGhlIHN0YXJ0dXAgcHJvY2VzcyByZXNvbHZlc1xuICAgKiBvbmNlIHRoZSBhcHBsaWNhdGlvbiBpcyBzdWNjZXNzZnVsbHkgcnVubmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3J0PTMwMDBdIC0gUG9ydCBudW1iZXIgdG8gbGlzdGVuIG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2hvc3RdIC0gT3B0aW9uYWwgaG9zdCBvciBJUCBhZGRyZXNzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xvZz10cnVlXSAtIFdoZXRoZXIgdG8gbG9nIHRoZSBhcHBsaWNhdGlvbiBVUkwgdXBvbiBzdGFydHVwLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBvbmNlIHRoZSBhcHBsaWNhdGlvbiBzdGFydHMgc3VjY2Vzc2Z1bGx5LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHN0YXJ0KFxuICAgIHBvcnQ6IG51bWJlciA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUKSB8fCAzMDAwLFxuICAgIGhvc3Q6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICBsb2c6IGJvb2xlYW4gPSB0cnVlXG4gICkge1xuICAgIHRoaXMuYXBwLmxpc3Rlbihwb3J0LCBob3N0IGFzIGFueSkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICBpZiAobG9nKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuYXBwLmdldFVybCgpO1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2coYPCfmoAgQXBwbGljYXRpb24gaXMgcnVubmluZyBhdDogJHt1cmx9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
270
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmVzdEJvb3RzdHJhcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ZhY3RvcnkvTmVzdEJvb3RzdHJhcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxNQUFNLEdBR1AsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSw4QkFBcUI7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSwyQkFBa0I7QUFFM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSwwQkFBaUI7QUE0Q3JDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStDRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBSTFCOzs7Ozs7Ozs7T0FTRztJQUNLLE1BQU0sS0FBSyxNQUFNO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsV0FBVztZQUNYLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBcUI7UUFDckMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsWUFBcUI7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxZQUFZLElBQUksSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLE9BQU8s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SUFBSSxFQUFFO1lBQ2pELElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMxRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJTmVzdEFwcGxpY2F0aW9uLFxuICBMb2dnZXIsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgUGlwZVRyYW5zZm9ybSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBNb2R1bGVSZWYgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBEZWNhZkV4Y2VwdGlvbkZpbHRlciB9IGZyb20gXCIuL2V4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IFN3YWdnZXJCdWlsZGVyIH0gZnJvbSBcIi4vb3BlbmFwaVwiO1xuaW1wb3J0IHsgQ29yc09wdGlvbnMgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb24vaW50ZXJmYWNlcy9leHRlcm5hbC9jb3JzLW9wdGlvbnMuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBDb3JzRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIERlZmluZXMgYWxsIGN1c3RvbWl6YWJsZSBwYXJhbWV0ZXJzIGZvciBTd2FnZ2VyIHNldHVwLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgZGV2ZWxvcGVycyB0byBjdXN0b21pemUgaG93IFN3YWdnZXIgVUkgaXMgY29uZmlndXJlZFxuICogd2l0aGluIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uIEl0IGluY2x1ZGVzIHBhcmFtZXRlcnMgZm9yIHRpdGxlcywgcGF0aHMsXG4gKiBjb2xvciBzY2hlbWVzLCBhbmQgYXNzZXQgcGF0aHMgdG8gdGFpbG9yIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBleHBlcmllbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIFRpdGxlIGRpc3BsYXllZCBpbiBTd2FnZ2VyIFVJLlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uIC0gRGVzY3JpcHRpb24gc2hvd24gYmVsb3cgdGhlIHRpdGxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBBUEkgdmVyc2lvbiBkaXNwbGF5ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdIC0gT3B0aW9uYWwgcGF0aCB3aGVyZSBTd2FnZ2VyIHdpbGwgYmUgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtib29sZWFufSBbcGVyc2lzdEF1dGhvcml6YXRpb25dIC0gV2hldGhlciBhdXRob3JpemF0aW9uIHRva2VucyBwZXJzaXN0IGFjcm9zcyByZWxvYWRzLlxuICogQHBhcmFtIHtzdHJpbmd9IFthc3NldHNQYXRoXSAtIFBhdGggdG8gY3VzdG9tIGFzc2V0cyBmb3IgU3dhZ2dlciBVSS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdG9wYmFyQmdDb2xvcl0gLSBDdXN0b20gYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIFN3YWdnZXIgdG9wIGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdG9wYmFySWNvblBhdGhdIC0gUGF0aCB0byBhIGN1c3RvbSBpY29uIGRpc3BsYXllZCBpbiB0aGUgdG9wIGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmF2aWNvblBhdGhdIC0gUGF0aCB0byBhIGN1c3RvbSBmYXZpY29uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3YWdnZXJTZXR1cE9wdGlvbnMge1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uPzogYm9vbGVhbjtcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgdG9wYmFyQmdDb2xvcj86IHN0cmluZztcbiAgdG9wYmFySWNvblBhdGg/OiBzdHJpbmc7XG4gIGZhdmljb25QYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBKU09OIGZvcm1hdC5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLmpzb25cbiAgICovXG4gIG9wZW5BcGlKc29uUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gWUFNTCBmb3JtYXQuXG4gICAqIFJlcXVpcmVzICd5YW1sJyBwYWNrYWdlIGFzIHBlZXIgZGVwZW5kZW5jeS5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLnlhbWxcbiAgICovXG4gIG9wZW5BcGlZYW1sUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgZmx1ZW50LCBzdGF0aWMgYm9vdHN0cmFwIGNsYXNzIGZvciBpbml0aWFsaXppbmcgYW5kIGNvbmZpZ3VyaW5nIGEgTmVzdEpTIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYE5lc3RCb290c3RyYXBlcmAgY2xhc3MgcHJvdmlkZXMgYSBjaGFpbmFibGUgQVBJIGZvciBjb25maWd1cmluZ1xuICogYSBOZXN0SlMgYXBwbGljYXRpb24gaW5zdGFuY2UuIEl0IGluY2x1ZGVzIGJ1aWx0LWluIG1ldGhvZHMgZm9yIGVuYWJsaW5nXG4gKiBDT1JTLCBIZWxtZXQgc2VjdXJpdHksIFN3YWdnZXIgZG9jdW1lbnRhdGlvbiwgZ2xvYmFsIHBpcGVzLCBmaWx0ZXJzLFxuICogaW50ZXJjZXB0b3JzLCBhbmQgc3RhcnRpbmcgdGhlIHNlcnZlci5cbiAqXG4gKiBUaGlzIGNsYXNzIHByb21vdGVzIGNvbnNpc3RlbmN5IGFuZCByZWR1Y2VzIHJlcGV0aXRpdmUgc2V0dXAgY29kZVxuICogYWNyb3NzIG11bHRpcGxlIE5lc3RKUyBwcm9qZWN0cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IE5lc3RGYWN0b3J5IH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuICogaW1wb3J0IHsgQXBwTW9kdWxlIH0gZnJvbSBcIi4vYXBwLm1vZHVsZVwiO1xuICogaW1wb3J0IHsgTXlMb2dnZXIgfSBmcm9tIFwiLi9NeUxvZ2dlclwiO1xuICogaW1wb3J0IHsgTmVzdEJvb3RzdHJhcGVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItbmVzdFwiO1xuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHtcbiAqICAgY29uc3QgYXBwID0gYXdhaXQgTmVzdEZhY3RvcnkuY3JlYXRlKEFwcE1vZHVsZSk7XG4gKlxuICogICBhd2FpdCBOZXN0Qm9vdHN0cmFwZXJcbiAqICAgICAuaW5pdGlhbGl6ZShhcHApXG4gKiAgICAgLmVuYWJsZUxvZ2dlcihuZXcgTXlMb2dnZXIoKSlcbiAqICAgICAuZW5hYmxlQ29ycyhbXCJodHRwOi8vbG9jYWxob3N0OjQyMDBcIl0pXG4gKiAgICAgLnVzZUhlbG1ldCgpXG4gKiAgICAgLnNldHVwU3dhZ2dlcih7XG4gKiAgICAgICB0aXRsZTogXCJPcGVuQVBJIGJ5IFRyYWRlTWFya+KEolwiLFxuICogICAgICAgZGVzY3JpcHRpb246IFwiVHJhZGVNYXJr4oSiIEFQSSBkb2N1bWVudGF0aW9uXCIsXG4gKiAgICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gKiAgICAgICBwYXRoOiBcImFwaVwiLFxuICogICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRydWUsXG4gKiAgICAgICB0b3BiYXJCZ0NvbG9yOiBcIiMyQzNFNTBcIixcbiAqICAgICAgIHRvcGJhckljb25QYXRoOiBcIi9hc3NldHMvbG9nby5zdmdcIixcbiAqICAgICAgIGZhdmljb25QYXRoOiBcIi9hc3NldHMvZmF2aWNvbi5pY29cIlxuICogICAgIH0pXG4gKiAgICAgLnVzZUdsb2JhbEZpbHRlcnMoKVxuICogICAgIC51c2VHbG9iYWxQaXBlcyguLi4pXG4gKiAgICAgLnVzZUdsb2JhbEludGVyY2VwdG9ycyguLi4pXG4gKiAgICAgLnN0YXJ0KDMwMDApO1xuICogfVxuICpcbiAqIGJvb3RzdHJhcCgpO1xuICogYGBgXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIE5lc3RCb290c3RyYXBlciB7XG4gIHByaXZhdGUgc3RhdGljIGFwcDogSU5lc3RBcHBsaWNhdGlvbjtcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBsb2dnZXIgaW5zdGFuY2UsIGNyZWF0aW5nIGEgZGVmYXVsdCBvbmUgaWYgbm90IHNldC5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRW5zdXJlcyB0aGF0IGEgdmFsaWQgYExvZ2dlcmAgaW5zdGFuY2UgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgKiBmb3IgbG9nZ2luZyBib290c3RyYXAtcmVsYXRlZCBtZXNzYWdlcy5cbiAgICpcbiAgICogQHJldHVybiB7TG9nZ2VyfSBUaGUgYWN0aXZlIGxvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldCBsb2dnZXIoKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2xvZ2dlcikge1xuICAgICAgLy8gZmFsbGJhY2tcbiAgICAgIHRoaXMuX2xvZ2dlciA9IG5ldyBMb2dnZXIoXCJOZXN0Qm9vdHN0cmFwXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJbml0aWFsaXplcyB0aGUgYm9vdHN0cmFwcGVyIHdpdGggYSBnaXZlbiBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEJpbmRzIHRoZSBwcm92aWRlZCBOZXN0SlMgYXBwIGluc3RhbmNlIHRvIHRoZSBib290c3RyYXBwZXIsIGVuYWJsaW5nXG4gICAqIGNoYWluZWQgY29uZmlndXJhdGlvbiBtZXRob2RzLlxuICAgKlxuICAgKiBAcGFyYW0ge0lOZXN0QXBwbGljYXRpb259IGFwcCAtIFRoZSBOZXN0SlMgYXBwbGljYXRpb24gaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZS5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbiBtZXRob2RzLlxuICAgKi9cbiAgc3RhdGljIGluaXRpYWxpemUoYXBwOiBJTmVzdEFwcGxpY2F0aW9uKSB7XG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEVuYWJsZXMgb3IgcmVwbGFjZXMgdGhlIGdsb2JhbCBsb2dnZXIgZm9yIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIElmIGEgY3VzdG9tIGxvZ2dlciBpcyBwcm92aWRlZCwgaXQgcmVwbGFjZXMgdGhlIGRlZmF1bHQgbG9nZ2VyLiBPdGhlcndpc2UsXG4gICAqIGEgbmV3IGxvZ2dlciBuYW1lZCBgXCJOZXN0Qm9vdHN0cmFwXCJgIGlzIHVzZWQuIFRoaXMgbG9nZ2VyIGlzIGFsc28gcmVnaXN0ZXJlZFxuICAgKiB3aXRoIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7TG9nZ2VyfSBbY3VzdG9tTG9nZ2VyXSAtIE9wdGlvbmFsIGN1c3RvbSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgc3RhdGljIGVuYWJsZUxvZ2dlcihjdXN0b21Mb2dnZXI/OiBMb2dnZXIpIHtcbiAgICB0aGlzLl9sb2dnZXIgPSBjdXN0b21Mb2dnZXIgfHwgbmV3IExvZ2dlcihcIk5lc3RCb290c3RyYXBcIik7XG4gICAgdGhpcy5hcHAudXNlTG9nZ2VyKHRoaXMuX2xvZ2dlcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEVuYWJsZXMgQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcgKENPUlMpIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEFsbG93cyBkZWZpbmluZyBlaXRoZXIgYSB3aWxkY2FyZCBvcmlnaW4gKGBcIipcImApIG9yIGEgbGlzdCBvZiBhbGxvd2VkIG9yaWdpbnMuXG4gICAqIEF1dG9tYXRpY2FsbHkgYWNjZXB0cyBsb2NhbCBkZXZlbG9wbWVudCByZXF1ZXN0cyBhbmQgdGhvc2Ugd2l0aG91dCBvcmlnaW4gaGVhZGVycy5cbiAgICogVGhyb3dzIGEgYENvcnNFcnJvcmAgZm9yIHVuYXV0aG9yaXplZCBvcmlnaW5zLlxuICAgKlxuICAgKiBAcGFyYW0geycqJyB8IHN0cmluZ1tdfSBbb3JpZ2lucz1bXV0gLSBMaXN0IG9mIGFsbG93ZWQgb3JpZ2lucyBvciBgXCIqXCJgIHRvIGFsbG93IGFsbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FsbG93TWV0aG9kcz1bJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnXV0gLSBBbGxvd2VkIEhUVFAgbWV0aG9kcy5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICovXG4gIHN0YXRpYyBlbmFibGVDb3JzKFxuICAgIG9yaWdpbnM6IFwiKlwiIHwgc3RyaW5nW10gPSBbXSxcbiAgICBhbGxvd01ldGhvZHM6IHN0cmluZ1tdID0gW1wiR0VUXCIsIFwiUE9TVFwiLCBcIlBVVFwiLCBcIkRFTEVURVwiXVxuICApIHtcbiAgICBjb25zdCBhbGxvd2VkT3JpZ2lucyA9XG4gICAgICBvcmlnaW5zID09PSBcIipcIiA/IFwiKlwiIDogb3JpZ2lucy5tYXAoKG8pID0+IG8udHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgY29uc3QgY29yc09wdGlvbnM6IENvcnNPcHRpb25zID0ge1xuICAgICAgb3JpZ2luOiAob3JpZ2luLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICAvLyBBbGxvdyByZXF1ZXN0IHdpdGhvdXQgb3JpZ2luLi4uXG4gICAgICAgIGlmICghb3JpZ2luKSByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFsbG93ZWRPcmlnaW5zID09PSBcIipcIiB8fFxuICAgICAgICAgIChBcnJheS5pc0FycmF5KGFsbG93ZWRPcmlnaW5zKSAmJlxuICAgICAgICAgICAgYWxsb3dlZE9yaWdpbnMuaW5jbHVkZXMob3JpZ2luLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhuZXcgQ29yc0Vycm9yKGBPcmlnaW4gJHtvcmlnaW59IG5vdCBhbGxvd2VkYCkpO1xuICAgICAgfSxcbiAgICAgIGNyZWRlbnRpYWxzOiB0cnVlLFxuICAgICAgbWV0aG9kczogYWxsb3dNZXRob2RzLmpvaW4oXCIsXCIpLFxuICAgIH07XG5cbiAgICB0aGlzLmFwcC5lbmFibGVDb3JzKGNvcnNPcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQXBwbGllcyB0aGUgSGVsbWV0IG1pZGRsZXdhcmUgZm9yIGVuaGFuY2VkIHNlY3VyaXR5LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBEeW5hbWljYWxseSBsb2FkcyB0aGUgYGhlbG1ldGAgcGFja2FnZSBpZiBhdmFpbGFibGUgYW5kIHJlZ2lzdGVycyBpdFxuICAgKiBhcyBtaWRkbGV3YXJlIHRvIGltcHJvdmUgSFRUUCBoZWFkZXIgc2VjdXJpdHkuIElmIG5vdCBpbnN0YWxsZWQsIGxvZ3MgYSB3YXJuaW5nXG4gICAqIGFuZCBjb250aW51ZXMgZXhlY3V0aW9uIHdpdGhvdXQgdGhyb3dpbmcgZXJyb3JzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtvcHRpb25zXSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIEhlbG1ldC5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyB1c2VIZWxtZXQob3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICAgIGNvbnN0IGhlbG1ldCA9IHJlcXVpcmUoXCJoZWxtZXRcIik7IC8vIER5bmFtaWMgaW1wb3J0IHRvIGF2b2lkIGhhcmQgZGVwZW5kZW5jeVxuICAgICAgdGhpcy5hcHAudXNlKGhlbG1ldChvcHRpb25zKSk7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coXCJIZWxtZXQgbWlkZGxld2FyZSBlbmFibGVkIHN1Y2Nlc3NmdWxseS5cIik7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFwiSGVsbWV0IG5vdCBpbnN0YWxsZWQuIFNraXBwaW5nIG1pZGRsZXdhcmUuXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDb25maWd1cmVzIGFuZCBpbml0aWFsaXplcyBTd2FnZ2VyIFVJIGZvciBBUEkgZG9jdW1lbnRhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogVXNlcyB0aGUgYFN3YWdnZXJCdWlsZGVyYCB1dGlsaXR5IHRvIGNvbmZpZ3VyZSBBUEkgZG9jdW1lbnRhdGlvblxuICAgKiB3aXRoIGRldGFpbGVkIGN1c3RvbWl6YXRpb24gZm9yIHRpdGxlLCB2ZXJzaW9uLCBwYXRocywgYW5kIGNvbG9ycy5cbiAgICogU3dhZ2dlciBpcyBhdXRvbWF0aWNhbGx5IGV4cG9zZWQgYXQgdGhlIGNvbmZpZ3VyZWQgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHtTd2FnZ2VyU2V0dXBPcHRpb25zfSBvcHRpb25zIC0gU3dhZ2dlciBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgc2V0dXBTd2FnZ2VyKG9wdGlvbnM6IFN3YWdnZXJTZXR1cE9wdGlvbnMpIHtcbiAgICBjb25zdCBzd2FnZ2VyID0gbmV3IFN3YWdnZXJCdWlsZGVyKHRoaXMuYXBwLCB7XG4gICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uLFxuICAgICAgcGF0aDogb3B0aW9ucy5wYXRoIHx8IFwiYXBpXCIsXG4gICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogb3B0aW9ucy5wZXJzaXN0QXV0aG9yaXphdGlvbiA/PyB0cnVlLFxuICAgICAgYXNzZXRzUGF0aDogb3B0aW9ucy5hc3NldHNQYXRoLFxuICAgICAgZmF2aWNvbkZpbGVQYXRoOiBvcHRpb25zLmZhdmljb25QYXRoLFxuICAgICAgdG9wYmFySWNvbkZpbGVQYXRoOiBvcHRpb25zLnRvcGJhckljb25QYXRoLFxuICAgICAgdG9wYmFyQmdDb2xvcjogb3B0aW9ucy50b3BiYXJCZ0NvbG9yLFxuICAgICAgb3BlbkFwaUpzb25QYXRoOiBvcHRpb25zLm9wZW5BcGlKc29uUGF0aCxcbiAgICAgIG9wZW5BcGlZYW1sUGF0aDogb3B0aW9ucy5vcGVuQXBpWWFtbFBhdGgsXG4gICAgfSk7XG4gICAgc3dhZ2dlci5zZXR1cFN3YWdnZXIoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIG9uZSBvciBtb3JlIGdsb2JhbCB2YWxpZGF0aW9uIHBpcGVzLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBFbmFibGVzIHJlcXVlc3QgcGF5bG9hZCB2YWxpZGF0aW9uIGFuZCB0cmFuc2Zvcm1hdGlvbiBnbG9iYWxseSBhY3Jvc3NcbiAgICogdGhlIGVudGlyZSBOZXN0SlMgYXBwbGljYXRpb24uIE11bHRpcGxlIHBpcGVzIGNhbiBiZSBjaGFpbmVkIHRvZ2V0aGVyXG4gICAqIGZvciBtb2R1bGFyIGlucHV0IHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uUGlwZVRyYW5zZm9ybVtdfSBwaXBlcyAtIFBpcGUgaW5zdGFuY2VzIHRvIHJlZ2lzdGVyIGdsb2JhbGx5LlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZy5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxQaXBlcyguLi5waXBlczogUGlwZVRyYW5zZm9ybVtdKSB7XG4gICAgaWYgKHBpcGVzLmxlbmd0aCA+IDApIHRoaXMuYXBwLnVzZUdsb2JhbFBpcGVzKC4uLnBpcGVzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIG9uZSBvciBtb3JlIGdsb2JhbCBleGNlcHRpb24gZmlsdGVycy5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogSWYgbm8gZmlsdGVycyBhcmUgcHJvdmlkZWQsIGl0IGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJzIGEgZGVmYXVsdFxuICAgKiBzZXQgb2Ygc3RhbmRhcmQgZXhjZXB0aW9uIGZpbHRlcnMgZm9yIGNvbW1vbiBlcnJvciB0eXBlcyBsaWtlXG4gICAqIGBIdHRwRXhjZXB0aW9uYCwgYFZhbGlkYXRpb25FeGNlcHRpb25gLCBgQ29uZmxpY3RFeGNlcHRpb25gLCBhbmQgb3RoZXJzLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBgRGVjYWZFeGNlcHRpb25GaWx0ZXJgIGlzIGNvbnN0cnVjdGVkIHdpdGggdGhlIGFwcGxpY2F0aW9uJ3NcbiAgICogYE1vZHVsZVJlZmAgc28gaXQgY2FuIHJlc29sdmUgdGhlIHJlcXVlc3Qtc2NvcGVkIGBEZWNhZlJlcXVlc3RDb250ZXh0YCAoYW5kXG4gICAqIGl0cyBjbGllbnQtYm91bmQgbG9nZ2VyKSBmb3IgdGhlIHJlcXVlc3QgdGhhdCB0aHJldywgaW5zdGVhZCBvZiBsb2dnaW5nXG4gICAqIHRocm91Z2ggdGhlIGdlbmVyaWMgZ2xvYmFsIGxvZ2dlci5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5FeGNlcHRpb25GaWx0ZXJbXX0gZmlsdGVycyAtIE9wdGlvbmFsIGZpbHRlcnMgdG8gYXBwbHkgZ2xvYmFsbHkuXG4gICAqL1xuICBzdGF0aWMgdXNlR2xvYmFsRmlsdGVycyguLi5maWx0ZXJzOiBhbnlbXSkge1xuICAgIHRoaXMuYXBwLnVzZUdsb2JhbEZpbHRlcnMoXG4gICAgICAuLi4oZmlsdGVycy5sZW5ndGggPiAwXG4gICAgICAgID8gZmlsdGVyc1xuICAgICAgICA6IFtuZXcgRGVjYWZFeGNlcHRpb25GaWx0ZXIodGhpcy5hcHAuZ2V0KE1vZHVsZVJlZiwgeyBzdHJpY3Q6IGZhbHNlIH0pKV0pXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIGdsb2JhbCBpbnRlcmNlcHRvcnMgZm9yIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHRyYW5zZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBJbnRlcmNlcHRvcnMgYWxsb3cgYWR2YW5jZWQgcmVxdWVzdC9yZXNwb25zZSBtYW5pcHVsYXRpb24gc3VjaCBhc1xuICAgKiBzZXJpYWxpemF0aW9uLCBsb2dnaW5nLCBvciB0cmFuc2Zvcm1hdGlvbi4gTXVsdGlwbGUgaW50ZXJjZXB0b3JzXG4gICAqIGNhbiBiZSBhZGRlZCBmb3IgbW9kdWxhciBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLk5lc3RJbnRlcmNlcHRvcltdfSBpbnRlcmNlcHRvcnMgLSBJbnRlcmNlcHRvciBpbnN0YW5jZXMgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgdXNlR2xvYmFsSW50ZXJjZXB0b3JzKC4uLmludGVyY2VwdG9yczogTmVzdEludGVyY2VwdG9yW10pIHtcbiAgICBpZiAoaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApXG4gICAgICB0aGlzLmFwcC51c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uaW50ZXJjZXB0b3JzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU3RhcnRzIHRoZSBOZXN0SlMgYXBwbGljYXRpb24gYW5kIGJpbmRzIGl0IHRvIHRoZSBnaXZlbiBwb3J0IGFuZCBob3N0LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBMaXN0ZW5zIG9uIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQgb3B0aW9uYWxseSBhIGhvc3QuIE9uY2Ugc3RhcnRlZCxcbiAgICogbG9ncyB0aGUgYXBwbGljYXRpb24gVVJMIGZvciBlYXN5IGFjY2Vzcy4gVGhlIHN0YXJ0dXAgcHJvY2VzcyByZXNvbHZlc1xuICAgKiBvbmNlIHRoZSBhcHBsaWNhdGlvbiBpcyBzdWNjZXNzZnVsbHkgcnVubmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3J0PTMwMDBdIC0gUG9ydCBudW1iZXIgdG8gbGlzdGVuIG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2hvc3RdIC0gT3B0aW9uYWwgaG9zdCBvciBJUCBhZGRyZXNzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xvZz10cnVlXSAtIFdoZXRoZXIgdG8gbG9nIHRoZSBhcHBsaWNhdGlvbiBVUkwgdXBvbiBzdGFydHVwLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBvbmNlIHRoZSBhcHBsaWNhdGlvbiBzdGFydHMgc3VjY2Vzc2Z1bGx5LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHN0YXJ0KFxuICAgIHBvcnQ6IG51bWJlciA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUKSB8fCAzMDAwLFxuICAgIGhvc3Q6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICBsb2c6IGJvb2xlYW4gPSB0cnVlXG4gICkge1xuICAgIHRoaXMuYXBwLmxpc3Rlbihwb3J0LCBob3N0IGFzIGFueSkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICBpZiAobG9nKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuYXBwLmdldFVybCgpO1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2coYPCfmoAgQXBwbGljYXRpb24gaXMgcnVubmluZyBhdDogJHt1cmx9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==