@liflig/cdk 3.5.9 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,6 +3,7 @@ import type * as elb from "aws-cdk-lib/aws-elasticloadbalancingv2";
3
3
  import type * as ec2 from "aws-cdk-lib/aws-ec2";
4
4
  import * as lambda from "aws-cdk-lib/aws-lambda";
5
5
  import type * as sqs from "aws-cdk-lib/aws-sqs";
6
+ import type * as events from "aws-cdk-lib/aws-events";
6
7
  import * as apigw from "aws-cdk-lib/aws-apigatewayv2";
7
8
  import * as logs from "aws-cdk-lib/aws-logs";
8
9
  import * as iam from "aws-cdk-lib/aws-iam";
@@ -130,7 +131,11 @@ export type IntegrationProps =
130
131
  /** Use this when connecting a route to send to an SQS queue. */
131
132
  | ({
132
133
  type: "SQS";
133
- } & SqsIntegrationProps);
134
+ } & SqsIntegrationProps)
135
+ /** Use this when connecting a route to send to an EventBridge event bus. */
136
+ | ({
137
+ type: "EventBridge";
138
+ } & EventBridgeIntegrationProps);
134
139
  /**
135
140
  * Props for the API-GW -> ALB (Application Load Balancer) integration.
136
141
  *
@@ -241,6 +246,21 @@ export type SqsIntegrationProps = {
241
246
  };
242
247
  };
243
248
  };
249
+ export type EventBridgeIntegrationProps = {
250
+ /**
251
+ * An EventBridge event bus. Request bodies sent to the route will be forwarded to this event bus,
252
+ * in the `Detail` field (see
253
+ * https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEventsRequestEntry.html).
254
+ */
255
+ eventBus: events.IEventBus;
256
+ /**
257
+ * Sets the `DetailType` field (i.e., event type) on events published to the event bus.
258
+ *
259
+ * See AWS docs for more on this:
260
+ * https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEventsRequestEntry.html
261
+ */
262
+ detailType: string;
263
+ };
244
264
  export type AuthorizationProps<AuthScopesT extends string = string> =
245
265
  /**
246
266
  * No authentication, for when you want a fully public route (or handle authentication in the
@@ -324,6 +324,27 @@ export class ApiGateway extends constructs.Construct {
324
324
  payloadFormatVersion: apigw.PayloadFormatVersion.VERSION_1_0,
325
325
  });
326
326
  }
327
+ case "EventBridge": {
328
+ // API-GW does not have access to put events to event bus by default
329
+ const role = new iam.Role(this, `ApiGwTo${integration.eventBus.node.id}ServiceRole`, {
330
+ description: `Allows API-GW to put events to ${integration.eventBus.eventBusArn}`,
331
+ assumedBy: new iam.ServicePrincipal("apigateway.amazonaws.com"),
332
+ });
333
+ integration.eventBus.grantPutEventsTo(role);
334
+ const parameterMapping = new apigw.ParameterMapping()
335
+ // https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEventsRequestEntry.html
336
+ .custom("EventBusName", integration.eventBus.eventBusName)
337
+ .custom("Detail", "$request.body")
338
+ .custom("DetailType", integration.detailType)
339
+ .custom("Source", "$context.apiId");
340
+ return new EventBridgeRouteIntegration("EventBridgeIntegration", {
341
+ type: apigw.HttpIntegrationType.AWS_PROXY,
342
+ subtype: apigw.HttpIntegrationSubtype.EVENTBRIDGE_PUT_EVENTS,
343
+ credentials: apigw.IntegrationCredentials.fromRole(role),
344
+ parameterMapping: parameterMapping,
345
+ payloadFormatVersion: apigw.PayloadFormatVersion.VERSION_1_0,
346
+ });
347
+ }
327
348
  }
328
349
  }
329
350
  /**
@@ -367,6 +388,29 @@ class SqsRouteIntegration extends apigw.HttpRouteIntegration {
367
388
  return this.integrationProps;
368
389
  }
369
390
  }
391
+ /** Acts as glue (between the integration props and the HttpApi) when creating an EventBridge integration. */
392
+ class EventBridgeRouteIntegration extends apigw.HttpRouteIntegration {
393
+ integrationProps;
394
+ /**
395
+ * @param id The id used in the {@link apigw.HttpIntegration} construct
396
+ * created internally by {@link apigw.HttpRouteIntegration._bindToRoute}.
397
+ * [Source code](https://github.com/aws/aws-cdk/blob/b5ae37782bc3cb637eeef9fbb1fbe2c5efdfc068/packages/%40aws-cdk/aws-apigatewayv2/lib/http/integration.ts#L321)
398
+ * @param integrationProps The props to pass to the {@link apigw.HttpIntegration} construct.
399
+ */
400
+ constructor(id, integrationProps) {
401
+ super(id);
402
+ this.integrationProps = integrationProps;
403
+ }
404
+ /**
405
+ * This sends the properties needed for creating a {@link apigw.HttpIntegration} to the
406
+ * {@link apigw.HttpRouteIntegration}.
407
+ */
408
+ bind() {
409
+ // This method is called by:
410
+ // https://github.com/aws/aws-cdk/blob/b5ae37782bc3cb637eeef9fbb1fbe2c5efdfc068/packages/%40aws-cdk/aws-apigatewayv2/lib/http/integration.ts#L319
411
+ return this.integrationProps;
412
+ }
413
+ }
370
414
  /**
371
415
  * When using `NodejsFunction` with `entry`, we point CDK to a file with our lambda code. This can
372
416
  * either be a TypeScript or JavaScript file. When creating constructs in tests inside this library,
@@ -478,4 +522,4 @@ function shortHash(str) {
478
522
  // which is fine
479
523
  return createHash("sha1").update(str).digest("hex").substring(0, 10);
480
524
  }
481
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1hcGktZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGktZ2F0ZXdheS9odHRwLWFwaS1nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sYUFBYSxDQUFBO0FBR2xDLE9BQU8sS0FBSyxNQUFNLE1BQU0sd0JBQXdCLENBQUE7QUFFaEQsT0FBTyxLQUFLLEtBQUssTUFBTSw4QkFBOEIsQ0FBQTtBQUVyRCxPQUFPLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFBO0FBQzFDLE9BQU8sS0FBSyxjQUFjLE1BQU0sZ0NBQWdDLENBQUE7QUFDaEUsT0FBTyxLQUFLLFlBQVksTUFBTSwyQ0FBMkMsQ0FBQTtBQUN6RSxPQUFPLEtBQUssV0FBVyxNQUFNLDBDQUEwQyxDQUFBO0FBRXZFLE9BQU8sS0FBSyxZQUFZLE1BQU0sK0JBQStCLENBQUE7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxLQUFLLENBQUE7QUFDbkMsT0FBTyxFQUFzQixnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUMvRCxPQUFPLEVBQUUsb0JBQW9CLEVBQTZCLE1BQU0sZUFBZSxDQUFBO0FBRS9FLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ2pELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7QUErYTFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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dEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgdHlwZSAqIGFzIGVsYiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIlxuaW1wb3J0IHR5cGUgKiBhcyBlYzIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIlxuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCJcbmltcG9ydCB0eXBlICogYXMgc3FzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3FzXCJcbmltcG9ydCAqIGFzIGFwaWd3IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyXCJcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCJcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBzZWNyZXRzbWFuYWdlciBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCJcbmltcG9ydCAqIGFzIGludGVncmF0aW9ucyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2Mi1pbnRlZ3JhdGlvbnNcIlxuaW1wb3J0ICogYXMgYXV0aG9yaXplcnMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5djItYXV0aG9yaXplcnNcIlxuaW1wb3J0IHR5cGUgeyBJVXNlclBvb2wgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNvZ25pdG9cIlxuaW1wb3J0ICogYXMgbGFtYmRhTm9kZWpzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqc1wiXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcImNyeXB0b1wiXG5pbXBvcnQgeyB0YWdSZXNvdXJjZXMgfSBmcm9tIFwiLi4vdGFnc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwidXJsXCJcbmltcG9ydCB7IEFwaUdhdGV3YXlEbnNQcm9wcywgQXBpR2F0ZXdheURvbWFpbiB9IGZyb20gXCIuL2RvbWFpblwiXG5pbXBvcnQgeyBBcGlHYXRld2F5QWNjZXNzTG9ncywgQXBpR2F0ZXdheUFjY2Vzc0xvZ3NQcm9wcyB9IGZyb20gXCIuL2FjY2Vzcy1sb2dzXCJcblxuY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKVxuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpXG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSB7QGxpbmsgQXBpR2F0ZXdheX0gY29uc3RydWN0LlxuICpcbiAqIEBhdXRob3IgS3Jpc3RpYW4gUmVrc3RhZCA8a3JlQGNhcHJhY29uc3VsdGluZy5ubz5cbiAqIEBhdXRob3IgSGVybWFubiBNw7hya3JpZCA8aGVtQGxpZmxpZy5ubz5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpR2F0ZXdheVByb3BzPEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9IHtcbiAgLyoqIFNldHRpbmdzIGZvciB0aGUgZXh0ZXJuYWwtZmFjaW5nIHBhcnQgb2YgdGhlIEFQSS1HVy4gKi9cbiAgZG5zOiBBcGlHYXRld2F5RG5zUHJvcHNcblxuICAvKipcbiAgICogSWYgbm8gaW50ZWdyYXRpb24gaXMgc3BlY2lmaWVkIGZvciBhIHJvdXRlLCB0aGlzIGludGVncmF0aW9uIGlzIHVzZWQuXG4gICAqXG4gICAqIFNlZSB7QGxpbmsgSW50ZWdyYXRpb25Qcm9wc30gZm9yIHRoZSBhdmFpbGFibGUgb3B0aW9ucy5cbiAgICovXG4gIGRlZmF1bHRJbnRlZ3JhdGlvbj86IEludGVncmF0aW9uUHJvcHNcblxuICAvKipcbiAgICogSWYgbm8gYXV0aG9yaXphdGlvbiBpcyBzcGVjaWZpZWQgZm9yIGEgcm91dGUsIHRoaXMgYXV0aG9yaXphdGlvbiBpcyB1c2VkLlxuICAgKlxuICAgKiBTZWUge0BsaW5rIEF1dGhvcml6YXRpb25Qcm9wc30gZm9yIHRoZSBhdmFpbGFibGUgb3B0aW9ucy5cbiAgICovXG4gIGRlZmF1bHRBdXRob3JpemF0aW9uPzogQXV0aG9yaXphdGlvblByb3BzPEF1dGhTY29wZXNUPlxuXG4gIHJvdXRlczogQXBpR2F0ZXdheVJvdXRlPEF1dGhTY29wZXNUPltdXG5cbiAgLyoqXG4gICAqIFRoZSBBUEktR1cgYWNjZXNzIGxvZ3MgZm9yIHRoZSBgJGRlZmF1bHRgIHN0YWdlIGFyZSBrZXB0LlxuICAgKiBUaGlzIGhhcyBvcHRpb25zIGZvciB0aGUgbG9ncy5cbiAgICovXG4gIGFjY2Vzc0xvZ3M/OiBBcGlHYXRld2F5QWNjZXNzTG9nc1Byb3BzXG5cbiAgLyoqXG4gICAqIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHJvdXRlLWxldmVsIG1ldHJpY3MuXG4gICAqIFRoaXMgY2FuIGluY3JlYXNlIENsb3VkV2F0Y2ggY29zdHMgd2hlbiBub3QgZGlzYWJsZWQuXG4gICAqXG4gICAqIFNlZSBbQVdTOiBXb3JraW5nIHdpdGggbWV0cmljcyBmb3IgSFRUUCBBUElzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktbWV0cmljcy5odG1sP2ljbXBpZD1hcGlnYXRld2F5X2NvbnNvbGVfaGVscCM6fjp0ZXh0PWFuZCUyMHN0YWdlJTIwSUQuLSxBcGlJZCUyQyUyMFN0YWdlJTJDJTIwUm91dGUsLUZpbHRlcnMlMjBBUEklMjBHYXRld2F5KVxuICAgKiBmb3IgbW9yZSBpbmZvLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBkZXRhaWxlZE1ldHJpY3M/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIFRocm90dGxpbmcgb2YgcmVxdWVzdHMuXG4gICAqIElmIG5vdCBzZXQsIHRoZSBBV1MgZGVmYXVsdCBvZiA1MDAwIGJ1cnN0IGFuZCAxMDAwMCByYXRlIGlzIHVzZWQuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IHRocm90dGxpbmcgaXMgcGVyLWFjY291bnQsIGFuZCBjb3VudHMgYWxsIEFQSXMgaW4gdGhlIGFjY291bnQgYW5kIHJlZ2lvbi5cbiAgICogSWYgeW91IGhhdmUgYW5vdGhlciBBUEkgaW4gdGhpcyByZWdpb24gZ2V0dGluZyAxMF8wMDAgcmVxdWVzdCByYXRlLCBpdCBtYXkgaW1wYWN0IHRoaXMgQVBJIGFzIHdlbGwuXG4gICAqL1xuICB0aHJvdHRsaW5nPzoge1xuICAgIC8qKlxuICAgICAqIEdvaW5nIG92ZXIgYDVfMDAwYCBtYXkgcmVxdWlyZSB5b3UgdG8gY29udGFjdCBBV1MgU3VwcG9ydCAtIHRoZXkgYXJlIGFjY291bnQgYm91bmQuXG4gICAgICovXG4gICAgYnVyc3Q/OiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBHb2luZyBvdmVyIGAxMF8wMDBgIG1heSByZXF1aXJlIHlvdSB0byBjb250YWN0IEFXUyBTdXBwb3J0IC0gdGhleSBhcmUgYWNjb3VudCBib3VuZC5cbiAgICAgKi9cbiAgICByYXRlPzogbnVtYmVyXG4gIH1cblxuICAvKipcbiAgICogU2V0cyBDT1JTIGhlYWRlcnMgb24gcmVzcG9uc2VzIGZyb20gdGhlIEFQSSBHYXRld2F5IHRvIGFsbG93IGFsbCBvcmlnaW5zLCBoZWFkZXJzIGFuZCBtZXRob2RzLlxuICAgKiBVc2VmdWwgaWYgeW91ciBBUEkgc2hvdWxkIGJlIGFjY2Vzc2VkIGJ5IGFueSBicm93c2VyLlxuICAgKi9cbiAgY29yc0FsbG93QWxsPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBJZiBzb21lIHNldHRpbmdzIGluIHRoaXMgY29uc3RydWN0IGRvIG5vdCB3b3JrIGZvciB5b3UsIHRoaXMgaXMgYW4gZXNjYXBlIGhhdGNoIG1lY2hhbmlzbSB0b1xuICAgKiBvdmVycmlkZSBhbnl0aGluZy5cbiAgICovXG4gIHByb3BzT3ZlcnJpZGU/OiB7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgc2V0dGluZ3MgZm9yIHRoZSB7QGxpbmsgYXBpZ3cuSHR0cEFwaX0gKGFjY2Vzc2libGUgaW4ge0BsaW5rIEFwaUdhdGV3YXkuaHR0cEFwaX0pLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgZnJvbnRlbmQgYWNjZXNzaW5nIHRoaXMgQVBJLCB5b3UgbWlnaHQgd2FudCB0byBzZXRcbiAgICAgKiBbQ09SUyBwcmVmbGlnaHRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jZGsvYXBpL3YxL2RvY3MvYXdzLWFwaWdhdGV3YXl2Mi1yZWFkbWUuaHRtbCNjcm9zcy1vcmlnaW4tcmVzb3VyY2Utc2hhcmluZy1jb3JzKVxuICAgICAqIHNldHRpbmdzLlxuICAgICAqL1xuICAgIGh0dHBBcGk/OiBQYXJ0aWFsPGFwaWd3Lkh0dHBBcGlQcm9wcz5cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBBcGlHYXRld2F5Um91dGU8QXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0ge1xuICAvKiogVGhlIHBhdGggb2YgdGhlIHJvdXRlIHRvIGV4cG9zZSB0aHJvdWdoIHRoZSBBUEkgR2F0ZXdheS4gVXNlIFwiL1wiIGZvciB0aGUgcm9vdCByb3V0ZS4gKi9cbiAgcGF0aDogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQsIHdlIG9ubHkgZm9yd2FyZCByZXF1ZXN0cyB0aGF0IG1hdGNoIHRoZSByb3V0ZSdzIHBhdGggZXhhY3RseS4gU28gZm9yIGEgcm91dGUgd2l0aFxuICAgKiBwYXRoIGAvYXBpL3VzZXJzYCwgYSByZXF1ZXN0IHRvIGAvYXBpL3VzZXJzYCB3aWxsIGJlIGZvcndhcmRlZCwgYnV0IGEgcmVxdWVzdCB0b1xuICAgKiBgL2FwaS91c2Vycy9hZG1pbmAgd2lsbCBub3QuIElmIHlvdSB3YW50IHRvIGZvcndhcmQgcmVxdWVzdHMgdG8gYWxsIHN1Yi1wYXRocyB1bmRlciB0aGUgcm91dGUnc1xuICAgKiBwYXRoLCB5b3UgY2FuIHNldCB0aGlzIHRvIHRydWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBpbmNsdWRlU3VicGF0aHM/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIFRoZSBIVFRQIG1ldGhvZCB0byBleHBvc2UuIGBBTllgIGV4cG9zZXMgYWxsIEhUVFAgbWV0aG9kcyBvbiB0aGUgcGF0aC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJBTllcIlxuICAgKi9cbiAgbWV0aG9kPzogSHR0cE1ldGhvZFxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZWdyYXRpb24gdGhhdCB0aGUgcm91dGUgd2lsbCBmb3J3YXJkIHRvLiBTZWUge0BsaW5rIEludGVncmF0aW9uUHJvcHN9IGZvciB0aGUgYXZhaWxhYmxlXG4gICAqIG9wdGlvbnMuXG4gICAqXG4gICAqIElmIHVuZGVmaW5lZCwgdXNlcyB0aGUge0BsaW5rIEFwaUdhdGV3YXlQcm9wcy5kZWZhdWx0SW50ZWdyYXRpb259LlxuICAgKi9cbiAgaW50ZWdyYXRpb24/OiBJbnRlZ3JhdGlvblByb3BzXG5cbiAgLyoqXG4gICAqIEhvdyByZXF1ZXN0cyBvbiB0aGUgcm91dGUgYXJlIGF1dGhlbnRpY2F0ZWQuIFNlZSB7QGxpbmsgQXV0aG9yaXphdGlvblByb3BzfSBmb3IgdGhlIGF2YWlsYWJsZVxuICAgKiBvcHRpb25zLlxuICAgKlxuICAgKiBJZiB1bmRlZmluZWQsIHVzZXMgdGhlIHtAbGluayBBcGlHYXRld2F5UHJvcHMuZGVmYXVsdEF1dGhvcml6YXRpb259LlxuICAgKi9cbiAgYXV0aG9yaXphdGlvbj86IEF1dGhvcml6YXRpb25Qcm9wczxBdXRoU2NvcGVzVD5cbn1cblxuZXhwb3J0IHR5cGUgSHR0cE1ldGhvZCA9XG4gIHwgXCJBTllcIlxuICB8IFwiR0VUXCJcbiAgfCBcIlBPU1RcIlxuICB8IFwiUFVUXCJcbiAgfCBcIlBBVENIXCJcbiAgfCBcIkRFTEVURVwiXG4gIHwgXCJPUFRJT05TXCJcbiAgfCBcIkhFQURcIlxuXG5leHBvcnQgdHlwZSBJbnRlZ3JhdGlvblByb3BzID1cbiAgLyoqIFVzZSB0aGlzIHdoZW4gY29ubmVjdGluZyB0aGUgcm91dGUgdG8gYW4gQUxCIChBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VyKS4gKi9cbiAgfCAoeyB0eXBlOiBcIkFMQlwiIH0gJiBBbGJJbnRlZ3JhdGlvblByb3BzKVxuICAvKiogVXNlIHRoaXMgd2hlbiBjb25uZWN0aW5nIHJvdXRlIHRvIGEgTGFtYmRhLiAqL1xuICB8ICh7IHR5cGU6IFwiTGFtYmRhXCIgfSAmIExhbWJkYUludGVncmF0aW9uUHJvcHMpXG4gIC8qKiBVc2UgdGhpcyB3aGVuIGNvbm5lY3RpbmcgYSByb3V0ZSB0byBzZW5kIHRvIGFuIFNRUyBxdWV1ZS4gKi9cbiAgfCAoeyB0eXBlOiBcIlNRU1wiIH0gJiBTcXNJbnRlZ3JhdGlvblByb3BzKVxuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgQVBJLUdXIC0+IEFMQiAoQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlcikgaW50ZWdyYXRpb24uXG4gKlxuICogU2VlIHRoZSBub3RlIG9uIHtAbGluayBBcGlHYXRld2F5fSBhYm91dCB0aGUgbG9hZCBiYWxhbmNlciBzZWN1cml0eSBncm91cC5cbiAqL1xuZXhwb3J0IHR5cGUgQWxiSW50ZWdyYXRpb25Qcm9wcyA9IHtcbiAgLyoqXG4gICAqIEEgbGlzdGVuZXIgb24gZS5nLiBwb3J0IDQ0MyAoSFRUUFMpLlxuICAgKlxuICAgKiBTZWUgdGhlIG5vdGUgb24ge0BsaW5rIEFwaUdhdGV3YXl9IGFib3V0IHRoZSBsb2FkIGJhbGFuY2VyIHNlY3VyaXR5IGdyb3VwLlxuICAgKi9cbiAgbG9hZEJhbGFuY2VyTGlzdGVuZXI6IGVsYi5JQXBwbGljYXRpb25MaXN0ZW5lclxuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBuYW1lIChkb21haW4gbmFtZSkgb2YgdGhlIGJhY2tlbmQgc2VydmljZSB0aGF0IHdlIHdhbnQgdG8gcmVhY2ggdGhyb3VnaCB0aGUgQUxCLlxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWQgdG86XG4gICAqIC0gVmVyaWZ5IHRoZSBIVFRQUyBjZXJ0aWZpY2F0ZSBvZiB0aGUgYmFja2VuZCBzZXJ2aWNlLCBzbyB0aGF0IHRoZSByZXF1ZXN0IGZvcndhcmRlZCBmcm9tXG4gICAqICAgQVBJLUdXIGNhbiB1c2UgVExTXG4gICAqIC0gU2V0IHRoZSBgSG9zdGAgaGVhZGVyIG9uIHRoZSByZXF1ZXN0IHdoZW4gZm9yd2FyZGluZyB0byB0aGUgQUxCLCBzbyB0aGF0IHJlcXVlc3RzIGNhbiBiZVxuICAgKiAgIHJvdXRlZCB0byB0aGUgY29ycmVjdCBUYXJnZXQgR3JvdXBcbiAgICpcbiAgICogRXhhbXBsZSB2YWx1ZTogYDxzZXJ2aWNlPi5zdGFnaW5nLm15LXByb2plY3QubGlmbGlnLmlvYCAobm90IHByZWZpeGVkIGJ5IGBodHRwczovL2ApLlxuICAgKi9cbiAgaG9zdE5hbWU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBUaGUgVlBDIHVzZWQgYnkgdGhlIEFMQi4gVGhlIEFQSS1HVyBpbnRlZ3JhdGlvbiB3aWxsIGNvbm5lY3QgdG8gdGhlIEFMQiB1c2luZyBhIFZQQyBMaW5rIGZvclxuICAgKiB0aGlzIFZQQy5cbiAgICpcbiAgICogU2VlIHRoZSBub3RlIG9uIHtAbGluayBBcGlHYXRld2F5fSBhYm91dCB0aGUgbG9hZCBiYWxhbmNlciBzZWN1cml0eSBncm91cC5cbiAgICovXG4gIHZwYzogZWMyLklWcGNcblxuICAvKipcbiAgICogQSBzZWN1cml0eSBncm91cCAoU0cpIHRoYXQgYWxsb3dzIGluY29taW5nIHRyYWZmaWMgdG8gdGhlIEFMQi4gV2lsbCBiZSB1c2VkIGJ5IHRoZSBWUEMgbGluaywgc29cbiAgICogdGhlIEFQSS1HVyBpbnRlZ3JhdGlvbiBjYW4gY29ubmVjdC5cbiAgICpcbiAgICogVGhpcyBpcyB1c3VhbGx5IHRoZSBzYW1lIFNHIGFzIHRoZSBBTEIgdXNlcywgYmVjYXVzZSB0aGV5IGhhdmUgYSBydWxlIHRoYXQgYWxsb3dzIHRyYWZmaWMgZnJvbVxuICAgKiBvdGhlcnMgaW4gdGhlIHNhbWUgU0cuXG4gICAqXG4gICAqIFNlZSB0aGUgbm90ZSBvbiB7QGxpbmsgQXBpR2F0ZXdheX0gYWJvdXQgdGhlIGxvYWQgYmFsYW5jZXIgc2VjdXJpdHkgZ3JvdXAuXG4gICAqL1xuICBzZWN1cml0eUdyb3VwOiBlYzIuSVNlY3VyaXR5R3JvdXBcblxuICAvKipcbiAgICogTWFwIHJlcXVlc3QgcGFyYW1ldGVycyAoYWRkL292ZXJ3cml0ZSBwYXRoL2hlYWRlcnMvcXVlcnkgcGFyYW1zKSBiZWZvcmUgZm9yd2FyZGluZyB0byB0aGVcbiAgICogYmFja2VuZC5cbiAgICpcbiAgICogU2VlIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktcGFyYW1ldGVyLW1hcHBpbmcuaHRtbH1cbiAgICogZm9yIG1vcmUgb24gdGhpcy4gUmVhZCB0aGUgJ1Jlc2VydmVkIGhlYWRlcnMnIHNlY3Rpb24gZm9yIHdoaWNoIGhlYWRlcnMgY2Fubm90IGJlIG92ZXJyaWRkZW4uXG4gICAqIEluIGFkZGl0aW9uIHRvIHRoZSBBV1MtcmVzZXJ2ZWQgaGVhZGVycywgeW91IHNob3VsZCBub3Qgb3ZlcnJpZGUgdGhlICdIb3N0JyBoZWFkZXIgZWl0aGVyLCBhc1xuICAgKiB0aGF0J3MgdXNlZCBmb3Igcm91dGluZyB0aGUgcmVxdWVzdCB0byB0aGUgY29ycmVjdCBzZXJ2aWNlIGJlaGluZCB0aGUgbG9hZCBiYWxhbmNlci5cbiAgICpcbiAgICogIyMjIEV4YW1wbGU6XG4gICAqXG4gICAqIEFkZGluZyBhIGhlYWRlcjpcbiAgICogYGBgXG4gICAqIG1hcFBhcmFtZXRlcnM6IChwYXJhbWV0ZXJzKSA9PiBwYXJhbWV0ZXJzLm92ZXJ3cml0ZUhlYWRlcihcbiAgICogICAgXCJYLU15LUN1c3RvbS1IZWFkZXJcIixcbiAgICogICAgYXBpZ3cuTWFwcGluZ1ZhbHVlLmN1c3RvbShcIm15LWN1c3RvbS12YWx1ZVwiKSxcbiAgICogKVxuICAgKiBgYGBcbiAgICpcbiAgICogT3ZlcndyaXRpbmcgdGhlIHBhdGggKGlmLCBmb3IgZXhhbXBsZSwgeW91IGNvbmZpZ3VyZSBhIGAvdXNlcnNgIHJvdXRlIG9uIHRoZSBBUEkgR2F0ZXdheSB0aGF0XG4gICAqIHlvdSB3YW50IHRvIGZvcndhcmQgdG8gYC9hcGkvdXNlcnNgIG9uIHRoZSBiYWNrZW5kKTpcbiAgICogYGBgXG4gICAqIG1hcFBhcmFtZXRlcnM6IChwYXJhbWV0ZXJzKSA9PiBwYXJhbWV0ZXJzLm92ZXJ3cml0ZVBhdGgoXCIvYXBpL3VzZXJzXCIpXG4gICAqIGBgYFxuICAgKi9cbiAgbWFwUGFyYW1ldGVycz86IChwYXJhbWV0ZXJzOiBhcGlndy5QYXJhbWV0ZXJNYXBwaW5nKSA9PiB2b2lkXG59XG5cbmV4cG9ydCB0eXBlIExhbWJkYUludGVncmF0aW9uUHJvcHMgPSB7XG4gIC8qKlxuICAgKiBUaGUgTGFtYmRhIGludGVncmF0aW9uIHVzZXMgdGhlIFYyIHBheWxvYWQgZm9ybWF0OlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWRldmVsb3AtaW50ZWdyYXRpb25zLWxhbWJkYS5odG1sfVxuICAgKlxuICAgKiBJZiB3cml0aW5nIHRoZSBMYW1iZGEgaW4gVHlwZVNjcmlwdCwgdGhpcyBtZWFucyB5b3Ugc2hvdWxkIHVzZSBgQVBJR2F0ZXdheVByb3h5RXZlbnRWMmAgYXMgdGhlXG4gICAqIHJlcXVlc3QgdHlwZSwgYW5kIGBBUElHYXRld2F5UHJveHlSZXN1bHRWMmAgYXMgdGhlIHJlc3BvbnNlIHR5cGUuXG4gICAqL1xuICBsYW1iZGE6IGxhbWJkYS5JRnVuY3Rpb25cbn1cblxuZXhwb3J0IHR5cGUgU3FzSW50ZWdyYXRpb25Qcm9wcyA9IHtcbiAgcXVldWU6IHNxcy5JUXVldWVcblxuICAvKipcbiAgICogTWVzc2FnZSBhdHRyaWJ1dGVzIHRvIHBhc3Mgb24gdG8gU1FTLiBUaGUga2V5cyBpbiB0aGlzIG9iamVjdCBhcmUgdGhlIG5hbWVzIG9mIHRoZSBhdHRyaWJ1dGVzLlxuICAgKiBFYWNoIGF0dHJpYnV0ZSBoYXMgYSBEYXRhVHlwZSBmaWVsZCwgYW5kIGVpdGhlciBhIFN0cmluZ1ZhbHVlIG9yIEJpbmFyeVZhbHVlIGZpZWxkIGRlcGVuZGluZyBvblxuICAgKiBpdHMgdHlwZS4gU2VlIEFXUyBkb2NzOlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTU2ltcGxlUXVldWVTZXJ2aWNlL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01lc3NhZ2VBdHRyaWJ1dGVWYWx1ZS5odG1sXG4gICAqXG4gICAqIEluIHRoZSBTdHJpbmdWYWx1ZSBmaWVsZCwgeW91IGNhbiBkbyBBUEkgR2F0ZXdheSBwYXJhbWV0ZXIgbWFwcGluZzpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLXBhcmFtZXRlci1tYXBwaW5nLmh0bWxcbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogYGBgXG4gICAqIG1lc3NhZ2VBdHRyaWJ1dGVzOiB7XG4gICAqICAgY2xpZW50SWQ6IHtcbiAgICogICAgIERhdGFUeXBlOiBcIlN0cmluZ1wiLFxuICAgKiAgICAgU3RyaW5nVmFsdWU6IFwiJHtjb250ZXh0LmF1dGhvcml6ZXIuY2xpZW50SWR9XCIsXG4gICAqICAgfSxcbiAgICogfSxcbiAgICogYGBgXG4gICAqL1xuICBtZXNzYWdlQXR0cmlidXRlcz86IHtcbiAgICBbYXR0cmlidXRlTmFtZTogc3RyaW5nXTpcbiAgICAgIHwgeyBEYXRhVHlwZTogXCJTdHJpbmdcIiB8IFwiTnVtYmVyXCI7IFN0cmluZ1ZhbHVlOiBzdHJpbmcgfVxuICAgICAgfCB7XG4gICAgICAgICAgRGF0YVR5cGU6IFwiQmluYXJ5XCJcbiAgICAgICAgICAvKiogQmFzZTY0LWVuY29kZWQgYmluYXJ5IGRhdGEgb2JqZWN0LiAqL1xuICAgICAgICAgIEJpbmFyeVZhbHVlOiBzdHJpbmdcbiAgICAgICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIEF1dGhvcml6YXRpb25Qcm9wczxBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPVxuICAvKipcbiAgICogTm8gYXV0aGVudGljYXRpb24sIGZvciB3aGVuIHlvdSB3YW50IGEgZnVsbHkgcHVibGljIHJvdXRlIChvciBoYW5kbGUgYXV0aGVudGljYXRpb24gaW4gdGhlXG4gICAqIGJhY2tlbmQgaW50ZWdyYXRpb24pLlxuICAgKi9cbiAgfCB7IHR5cGU6IFwiTk9ORVwiIH1cbiAgLyoqXG4gICAqIEFXUyBJQU0gYXV0aG9yaXphdGlvbi5cbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWFjY2Vzcy1jb250cm9sLWlhbS5odG1sXG4gICAqL1xuICB8IHsgdHlwZTogXCJJQU1cIiB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY3VzdG9tIExhbWJkYSBhdXRob3JpemVyIHdoaWNoIHJlYWRzIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPGFjY2VzcyB0b2tlbj5gIGhlYWRlclxuICAgKiBhbmQgdmVyaWZpZXMgdGhlIHRva2VuIGFnYWluc3QgYSBDb2duaXRvIHVzZXIgcG9vbC5cbiAgICovXG4gIHwgKHtcbiAgICAgIHR5cGU6IFwiQ09HTklUT19VU0VSX1BPT0xcIlxuICAgIH0gJiBDb2duaXRvVXNlclBvb2xBdXRob3JpemVyUHJvcHM8QXV0aFNjb3Blc1Q+KVxuICAvKipcbiAgICogQ3JlYXRlcyBhIGN1c3RvbSBMYW1iZGEgYXV0aG9yaXplciB3aGljaCByZWFkcyBgQXV0aG9yaXphdGlvbjogQmFzaWMgPGJhc2U2NC1lbmNvZGVkIGNyZWRlbnRpYWxzPmBcbiAgICogaGVhZGVyIGFuZCB2ZXJpZmllcyB0aGUgY3JlZGVudGlhbHMgYWdhaW5zdCBhIGdpdmVuIHNlY3JldC5cbiAgICovXG4gIHwgKHsgdHlwZTogXCJCQVNJQ19BVVRIXCIgfSAmIEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wcylcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjdXN0b20gTGFtYmRhIGF1dGhvcml6ZXIgd2hpY2ggYWxsb3dzIGJvdGg6XG4gICAqIC0gYEF1dGhvcml6YXRpb246IEJlYXJlciA8YWNjZXNzIHRva2VuPmAgaGVhZGVyLCBmb3Igd2hpY2ggdGhlIHRva2VuIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGVcbiAgICogICBnaXZlbiBDb2duaXRvIHVzZXIgcG9vbFxuICAgKiAtIGBBdXRob3JpemF0aW9uOiBCYXNpYyA8YmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHM+YCBoZWFkZXIsIGZvciB3aGljaCB0aGUgY3JlZGVudGlhbHMgYXJlXG4gICAqICAgY2hlY2tlZCBhZ2FpbnN0IHRoZSBjcmVkZW50aWFscyBmcm9tIHRoZSBnaXZlbiBiYXNpYyBhdXRoIHNlY3JldCBuYW1lXG4gICAqXG4gICAqIElmIGVpdGhlciBvZiB0aGVzZSBhcmUgZ2l2ZW4gYW5kIHZhbGlkLCB0aGUgcmVxdWVzdCBpcyBhdXRoZW50aWNhdGVkLlxuICAgKi9cbiAgfCAoe1xuICAgICAgdHlwZTogXCJDT0dOSVRPX1VTRVJfUE9PTF9PUl9CQVNJQ19BVVRIXCJcbiAgICB9ICYgQ29nbml0b1VzZXJQb29sT3JCYXNpY0F1dGhBdXRob3JpemVyUHJvcHM8QXV0aFNjb3Blc1Q+KVxuICAvKipcbiAgICogQ3JlYXRlcyBhIGN1c3RvbSBhdXRob3JpemVyIHdpdGggdGhlIGdpdmVuIExhbWJkYSBmdW5jdGlvbi4gVXNlIHRoaXMgaWYgeW91IGhhdmUgY3VzdG9tXG4gICAqIGF1dGhvcml6YXRpb24gbG9naWMsIGFuZCB0aGUgb3RoZXIgYXV0aG9yaXplcnMgZnJvbSB0aGlzIGNvbnN0cnVjdCBkb24ndCBtZWV0IHlvdXIgbmVlZHMuXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1sYW1iZGEtYXV0aG9yaXplci5odG1sXG4gICAqL1xuICB8ICh7IHR5cGU6IFwiQ1VTVE9NX0xBTUJEQV9BVVRIT1JJWkVSXCIgfSAmIEN1c3RvbUxhbWJkYUF1dGhvcml6ZXJQcm9wcylcblxuZXhwb3J0IHR5cGUgQ29nbml0b1VzZXJQb29sQXV0aG9yaXplclByb3BzPFxuICBBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4gPSB7XG4gIHVzZXJQb29sOiBJVXNlclBvb2xcblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCBhY2Nlc3MgdG9rZW4gY2xhaW1zIGNvbnRhaW4gdGhlIGdpdmVuIHNjb3BlLlxuICAgKlxuICAgKiBXaGVuIGRlZmluZWQgYXMgcGFydCBvZiBhIHJlc291cmNlIHNlcnZlciwgc2NvcGVzIGFyZSBvbiB0aGUgZm9ybWF0OlxuICAgKiBge3Jlc291cmNlIHNlcnZlciBpZGVudGlmaWVyfS97c2NvcGUgbmFtZX1gLCBlLmcuIGBleHRlcm5hbC92aWV3X3VzZXJzYC5cbiAgICpcbiAgICogVG8gZ2V0IG1vcmUgdHlwZSBzYWZldHkgb24gdGhpcyBwYXJhbWV0ZXIsIHNlZSB0aGUgZG9jcyBmb3IgdGhlIGBBdXRoU2NvcGVzVGAgdHlwZSBwYXJhbWV0ZXIgb25cbiAgICoge0BsaW5rIEFwaUdhdGV3YXl9LlxuICAgKi9cbiAgcmVxdWlyZWRTY29wZT86IEF1dGhTY29wZXNUXG5cbiAgLyoqXG4gICAqIE5hbWUgb2Ygc2VjcmV0IGluIEFXUyBTZWNyZXRzIE1hbmFnZXIgdGhhdCBzdG9yZXMgYmFzaWMgYXV0aCBjcmVkZW50aWFscyBmb3IgdGhlIGJhY2tlbmRcbiAgICogc2VydmljZSwgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZSBiYWNrZW5kIGlmIENvZ25pdG8gdXNlciBwb29sIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRlZC5cbiAgICpcbiAgICogVGhlIHNlY3JldCB2YWx1ZSBtdXN0IGZvbGxvdyB0aGlzIGZvcm1hdDpcbiAgICogYGBganNvblxuICAgKiB7IFwidXNlcm5hbWVcIjogXCI8dXNlcm5hbWU+XCIsIFwicGFzc3dvcmRcIjogXCI8cGFzc3dvcmQ+XCIgfVxuICAgKiBgYGBcbiAgICpcbiAgICogVGhpcyBwcm9wIHNvbHZlcyB0aGUgZm9sbG93aW5nIHVzZS1jYXNlOlxuICAgKiAtIFlvdSB3YW50IHRvIGRvIENvZ25pdG8gdXNlciBwb29sIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBBUEkgR2F0ZXdheVxuICAgKiAtIFlvdSB3YW50IGFuIGFkZGl0aW9uYWwgYXV0aCBjaGVjayBpbiB0aGUgYmFja2VuZCwgYnV0IHlvdSBkb24ndCB3YW50IHRvIGRlYWwgd2l0aCBDb2duaXRvXG4gICAqICAgdGhlcmVcbiAgICogLSBUaGUgYmFja2VuZCB1c2VzIGJhc2ljIGF1dGhcbiAgICpcbiAgICogVGhpcyBwcm9wIHNvbHZlcyB0aGlzIGJ5IGxldHRpbmcgeW91IHNwZWNpZnkgY3JlZGVudGlhbHMgdG8gcGFzcyB0byB0aGUgYmFja2VuZCBhZnRlciBBUEktR1dcbiAgICogYXV0aGVudGljYXRpb24gc3VjY2VlZHMuIFlvdSBjYW4gcGFzcyB0aGUgZW5jb2RlZCBjcmVkZW50aWFscyB0aHJvdWdoXG4gICAqIHtAbGluayBBbGJJbnRlZ3JhdGlvblByb3BzLm1hcFBhcmFtZXRlcnN9LCB1c2luZyB0aGUgYGF1dGhvcml6ZXIuaW50ZXJuYWxBdXRob3JpemF0aW9uSGVhZGVyYFxuICAgKiBjb250ZXh0IHZhcmlhYmxlLCBsaWtlIHNvOlxuICAgKiBgYGBcbiAgICogbWFwUGFyYW1ldGVyczogKHBhcmFtZXRlcnMpID0+IHBhcmFtZXRlcnMub3ZlcndyaXRlSGVhZGVyKFxuICAgKiAgIC8vICdBdXRob3JpemF0aW9uJyBoZWFkZXIgY2Fubm90IGJlIG92ZXJyaWRkZW4sIHNvIHdlIHVzZSBhIGN1c3RvbSBoZWFkZXJcbiAgICogICBcIlgtSW50ZXJuYWwtQXV0aG9yaXphdGlvblwiLFxuICAgKiAgIGFwaWd3Lk1hcHBpbmdWYWx1ZS5jb250ZXh0VmFyaWFibGUoXCJhdXRob3JpemVyLmludGVybmFsQXV0aG9yaXphdGlvbkhlYWRlclwiKSxcbiAgICogKVxuICAgKiBgYGBcbiAgICogVGhlIGJhY2tlbmQgY2FuIHRoZW4gY2hlY2sgdGhlIGBYLUludGVybmFsLUF1dGhvcml6YXRpb25gIGhlYWRlci5cbiAgICovXG4gIGNyZWRlbnRpYWxzRm9ySW50ZXJuYWxBdXRob3JpemF0aW9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wcyA9IHtcbiAgLyoqXG4gICAqIE5hbWUgb2Ygc2VjcmV0IGluIEFXUyBTZWNyZXRzIE1hbmFnZXIgdGhhdCBzdG9yZXMgYmFzaWMgYXV0aCBjcmVkZW50aWFscy5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQgZm9yIHRoZSBzZWNyZXQgdmFsdWU6XG4gICAqIC0gU2luZ2xlIHVzZXJuYW1lIGFuZCBwYXNzd29yZDpcbiAgICogICBgYGBqc29uXG4gICAqICAgeyBcInVzZXJuYW1lXCI6IFwiPHVzZXJuYW1lPlwiLCBcInBhc3N3b3JkXCI6IFwiPHBhc3N3b3JkPlwiIH1cbiAgICogICBgYGBcbiAgICogLSBBcnJheSBvZiB1c2VybmFtZSArIHBhc3N3b3JkIG9iamVjdHM6XG4gICAqICAgYGBganNvblxuICAgKiAgIHsgXCJjcmVkZW50aWFsc1wiOiBcIlt7XFxcInVzZXJuYW1lXFxcIjpcXFwiPHVzZXItMT5cXFwiLFxcXCJwYXNzd29yZFxcXCI6XFxcInBhc3N3b3JkLTFcXFwifSx7XFxcInVzZXJuYW1lXFxcIjpcXFwiPHVzZXItMj5cXFwiLFxcXCJwYXNzd29yZFxcXCI6XFxcIjxwYXNzd29yZC0yPlxcXCJ9XVwiIH1cbiAgICogICBgYGBcbiAgICogICAtIFRoZSB2YWx1ZSBvZiB0aGUgYGNyZWRlbnRpYWxzYCBmaWVsZCBpcyBhIHN0cmluZywgd2l0aCBhIHN0cmluZ2lmaWVkLCBlc2NhcGVkIEpTT04gYXJyYXkgb2ZcbiAgICogICAgIG9iamVjdHMgd2l0aCBgdXNlcm5hbWVgIGFuZCBgcGFzc3dvcmRgIGZpZWxkcy5cbiAgICogICAtIFRoZSByZWFzb24gdGhhdCB0aGlzIHNlY29uZCBmb3JtYXQgc3RvcmVzIHN0cmluZ2lmaWVkIEpTT04gX2luc2lkZV8gSlNPTiwgaXMgZHVlIHRvIGFcbiAgICogICAgIGxpbWl0YXRpb24gaW4gTGlmbGlnJ3MgYGxvYWQtc2VjcmV0c2AgbGlicmFyeSwgd2hpY2ggb25seSBhbGxvd3Mgc3RvcmluZyBzdHJpbmcgdmFsdWVzLlxuICAgKiAtIEFycmF5IG9mIGJhc2U2NC1lbmNvZGVkIGNyZWRlbnRpYWxzOlxuICAgKiAgIGBgYGpzb25cbiAgICogICB7IFwiY3JlZGVudGlhbHNcIjogXCJbXFxcIjxlbmNvZGVkLWNyZWRlbnRpYWwtMT5cXFwiLFxcXCI8ZW5jb2RlZC1jcmVkZW50aWFsLTI+XFxcIl1cIiB9XG4gICAqICAgYGBgXG4gICAqICAgLSBFYWNoIGVsZW1lbnQgaXMgZW5jb2RlZCBmcm9tIGA8dXNlcm5hbWU+OjxwYXNzd29yZD5gLlxuICAgKiAgIC0gVGhlIGFycmF5IGlzIHN0cmluZ2lmaWVkIGZvciB0aGUgc2FtZSByZWFzb24gYXMgYWJvdmUuXG4gICAqXG4gICAqIElmIHRoZSBzZWNyZXQgdXNlcyBvbmUgb2YgdGhlIGFycmF5IGZvcm1hdHMsIHRoZSBhdXRob3JpemVyIHdpbGwgbWF0Y2ggdGhlIHJlcXVlc3Qnc1xuICAgKiBBdXRob3JpemF0aW9uIGhlYWRlciBhZ2FpbnN0IGFueSBvbmUgb2YgdGhlIGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgY3JlZGVudGlhbHNTZWNyZXROYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgQ29nbml0b1VzZXJQb29sT3JCYXNpY0F1dGhBdXRob3JpemVyUHJvcHM8XG4gIEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiA9IHtcbiAgdXNlclBvb2w6IElVc2VyUG9vbFxuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHNlY3JldCBpbiBBV1MgU2VjcmV0cyBNYW5hZ2VyIHRoYXQgc3RvcmVzIGJhc2ljIGF1dGggY3JlZGVudGlhbHMuXG4gICAqXG4gICAqIFNlZSB7QGxpbmsgQmFzaWNBdXRoQXV0aG9yaXplclByb3BzLmNyZWRlbnRpYWxzU2VjcmV0TmFtZX0gZm9yIHRoZSBzdXBwb3J0ZWQgZm9ybWF0cy5cbiAgICovXG4gIGJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZT86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IGFjY2VzcyB0b2tlbiBjbGFpbXMgY29udGFpbiB0aGUgZ2l2ZW4gc2NvcGUuIE9ubHkgYXBwbGljYWJsZSBmb3IgcmVxdWVzdHMgdGhhdFxuICAgKiB1c2UgYEF1dGhvcml6YXRpb246IEJlYXJlciA8YWNjZXNzIHRva2VuPmAgKG5vdCBhcHBsaWNhYmxlIGZvciBiYXNpYyBhdXRoKS5cbiAgICpcbiAgICogV2hlbiBkZWZpbmVkIGFzIHBhcnQgb2YgYSByZXNvdXJjZSBzZXJ2ZXIsIHNjb3BlcyBhcmUgb24gdGhlIGZvcm1hdDpcbiAgICogYHtyZXNvdXJjZSBzZXJ2ZXIgaWRlbnRpZmllcn0ve3Njb3BlIG5hbWV9YCwgZS5nLiBgZXh0ZXJuYWwvdmlld191c2Vyc2AuXG4gICAqXG4gICAqIFRvIGdldCBtb3JlIHR5cGUgc2FmZXR5IG9uIHRoaXMgcGFyYW1ldGVyLCBzZWUgdGhlIGRvY3MgZm9yIHRoZSBgQXV0aFNjb3Blc1RgIHR5cGUgcGFyYW1ldGVyIG9uXG4gICAqIHtAbGluayBBcGlHYXRld2F5fS5cbiAgICovXG4gIHJlcXVpcmVkU2NvcGU/OiBBdXRoU2NvcGVzVFxufVxuXG50eXBlIEN1c3RvbUxhbWJkYUF1dGhvcml6ZXJQcm9wcyA9IHtcbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHJ1biB3aGVuZXZlciB0aGUgQVBJIEdhdGV3YXkgcm91dGUgaXMgaW52b2tlZCwgdG8gYXV0aGVudGljYXRlXG4gICAqIHRoZSByZXF1ZXN0LiBTZWUgQVdTIGRvY3MgZm9yIG1vcmUgb24gaG93IHRvIHdyaXRlIHRoZSBMYW1iZGE6XG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1sYW1iZGEtYXV0aG9yaXplci5odG1sXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IHJlc3BvbnNlIGZvcm1hdCB1c2VkIGlzIGBIdHRwTGFtYmRhUmVzcG9uc2VUeXBlLlNJTVBMRWAgKGZvcm1hdCAyLjApLiBJZiB5b3Ugd3JpdGVcbiAgICogeW91ciBMYW1iZGEgaW4gVHlwZVNjcmlwdCwgdGhpcyBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBtdXN0IHJldHVyblxuICAgKiBgQVBJR2F0ZXdheVNpbXBsZUF1dGhvcml6ZXJSZXN1bHRgIChmcm9tIHRoZSBgYXdzLWxhbWJkYWAgcGFja2FnZSkuIFRoZSByZXF1ZXN0IGV2ZW50IHdpbGwgYWxzb1xuICAgKiB1c2UgZm9ybWF0IDIuMCAoYEFQSUdhdGV3YXlSZXF1ZXN0QXV0aG9yaXplckV2ZW50VjJgIGluIFR5cGVTY3JpcHQpLiBTZWUgdGhlIEFXUyBkb2NzIGxpbmtlZFxuICAgKiBhYm92ZSBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZXNlIGZvcm1hdHMuXG4gICAqXG4gICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIHJlc3BvbnNlIGZvcm1hdCB0eXBlIGluXG4gICAqIHtAbGluayBDdXN0b21MYW1iZGFBdXRob3JpemVyUHJvcHMuYXV0aG9yaXplclByb3BzfS5cbiAgICpcbiAgICogU2VlIHRoZSBMYW1iZGFzIHVuZGVyIHRoZSBgYXV0aG9yaXplcnNgIGZvbGRlciBuZXh0IHRvIHRoZSBgQXBpR2F0ZXdheWAgY29uc3RydWN0IGluXG4gICAqIGBsaWZsaWctY2RrYCBmb3IgZXhhbXBsZXMuXG4gICAqL1xuICBsYW1iZGFBdXRob3JpemVyOiBsYW1iZGEuSUZ1bmN0aW9uXG5cbiAgLyoqXG4gICAqIFByb3BzIGZvciB0aGUgYEh0dHBMYW1iZGFBdXRob3JpemVyYCBjb25zdHJ1Y3QuIFdlIHByb3ZpZGUgc29tZSBkaWZmZXJlbnQgZGVmYXVsdHM6XG4gICAqIC0gYHJlc3BvbnNlVHlwZXNgIGRlZmF1bHRzIHRvIGBbSHR0cExhbWJkYVJlc3BvbnNlVHlwZS5TSU1QTEVdYFxuICAgKiAtIGByZXN1bHRzQ2FjaGVUdGxgIGRlZmF1bHRzIHRvIGBEdXJhdGlvbi5ob3VycygxKWBcbiAgICovXG4gIGF1dGhvcml6ZXJQcm9wcz86IFBhcnRpYWw8YXV0aG9yaXplcnMuSHR0cExhbWJkYUF1dGhvcml6ZXJQcm9wcz5cbn1cblxuLyoqXG4gKiBUaGlzIGNvbnN0cnVjdCB0cmllcyB0byBzaW1wbGlmeSB0aGUgY3JlYXRpb24gb2YgYW4gQVBJIEdhdGV3YXkgZm9yIGEgc2VydmljZSwgYnkgY29sbGVjdGluZyBtb3N0XG4gKiBvZiB0aGUgY29tbW9uIHNldHVwIGhlcmUuXG4gKlxuICogVGhlIGFwcHJvYWNoIGZvbGxvd2VkIGluIHRoaXMgY29uc3RydWN0IGlzOlxuICogMS4gT25lIEFQSS1HVyBwZXIgc2VydmljZVxuICogMi4gT25lIHN1YmRvbWFpbiBwZXIgQVBJLUdXIC8gc2VydmljZVxuICogMy4gVXNlIEhUVFAgQVBJLCBub3QgUkVTVFxuICogNC4gVXNlIGEgJGRlZmF1bHQgc3RhZ2Ugd2l0aCBhdXRvZGVwbG95XG4gKiA1LiBTdXBwb3J0IG11bHRpcGxlIHJvdXRlcyAod2l0aCBwb3NzaWJsZSBgL3twcm94eSt9YCB0byBsZXQgYWxsIHN1Yi1wYXRocyB0aHJvdWdoKVxuICogNi4gQWxsb3cgY3VzdG9tIGludGVncmF0aW9uL2F1dGhvcml6ZXIgZm9yIGVhY2ggcm91dGUsIG9yIGRlZmF1bHRzIGZvciB0aGUgd2hvbGUgZ2F0ZXdheVxuICpcbiAqIFRoZSByb3V0ZSBpbnRlZ3JhdGlvbiBpcyBvbmUgb2YgdGhlc2U6XG4gKiAtIEFMQiBwcml2YXRlIGludGVncmF0aW9uIHdpdGggVlBDIExpbmsgdXNpbmcgSFRUUFMgdG8gdGhlIEFMQlxuICogLSBMYW1iZGEgaW50ZWdyYXRpb25cbiAqIC0gU1FTIGludGVncmF0aW9uXG4gKlxuICogIyMjIExvYWQgQmFsYW5jZXIgU2VjdXJpdHkgR3JvdXBcbiAqXG4gKiBOb3RlIHRoYXQgdGhlIGxvYWQgYmFsYW5jZXIgdXNlZCBpbiBhbiB7QGxpbmsgQWxiSW50ZWdyYXRpb25Qcm9wc30gbXVzdCBhbGxvdyBvdXRib3VuZCBIVFRQU1xuICogdHJhZmZpYyB0byBpdHMgU2VjdXJpdHlHcm91cC4gT3RoZXJ3aXNlLCB0aGUgVlBDIExpbmsgdXNlZCBieSB0aGUgQVBJLUdXIGNhbid0IGdldCB0cmFmZmljIGZyb21cbiAqIHRoZSBBTEIuXG4gKlxuICogYGBgXG4gKiBjb25zdCBsb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKC4uLiwge1xuICogICBhbGxvd0FsbE91dGJvdW5kOiBmYWxzZSxcbiAqIH0pXG4gKlxuICogbG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cC5hZGRFZ3Jlc3NSdWxlKFxuICogICBsb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLFxuICogICBlYzIuUG9ydC50Y3AoNDQzKSxcbiAqICAgXCJPdXRib3VuZCB0byBzZWxmIGZvciBBTEIgdG8gQVBJLUdXIFZQQy1MaW5rXCIsXG4gKiApXG4gKlxuICogY29uc3QgbG9hZEJhbGFuY2VyID0gbmV3IGxpZmxpZ0xvYWRCYWxhbmNlci5Mb2FkQmFsYW5jZXIoLi4uLFxuICogICB7XG4gKiAgICAgb3ZlcnJpZGVMb2FkQmFsYW5jZXJQcm9wczoge1xuICogICAgICAgc2VjdXJpdHlHcm91cDogbG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cCxcbiAqICAgICB9LFxuICogICB9LFxuICogKVxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIEF1dGhTY29wZXNUIFRoaXMgdHlwZSBwYXJhbWV0ZXIgYWxsb3dzIHlvdSB0byBpbXByb3ZlIHR5cGUgc2FmZXR5IG9uIHRoZVxuICogYHJlcXVpcmVkU2NvcGVgIGZpZWxkIG9uIHtAbGluayBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wc30sIGJ5IG5hcnJvd2luZyB0aGUgdHlwZVxuICogdG8gc3BlY2lmaWMgc3RyaW5ncy4gWW91IGNhbiB0aGVuIGV4dGVuZCB0aGUgYEFwaUdhdGV3YXlgIHdpdGggdGhpcyB0eXBlIHRvIGVuZm9yY2UgdGhvc2Ugc2NvcGVzXG4gKiBhY3Jvc3MgdGhlIGFwcGxpY2F0aW9uLiBSZW1lbWJlciB0aGF0IGF1dGggc2NvcGVzIG11c3QgYmUgb24gdGhlIGZvcm1hdFxuICogYHtyZXNvdXJjZSBzZXJ2ZXIgaWRlbnRpZmllcn0ve3Njb3BlIG5hbWV9YC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgXG4gKiB0eXBlIEF1dGhTY29wZXMgPSBcImV4dGVybmFsL3JlYWRfdXNlcnNcIiB8IFwiaW50ZXJuYWwvY3JlYXRlX3VzZXJzXCJcbiAqXG4gKiBleHBvcnQgY2xhc3MgTXlQcm9qZWN0QXBpR2F0ZXdheSBleHRlbmRzIEFwaUdhdGV3YXk8QXV0aFNjb3Blcz4ge31cbiAqIGBgYFxuICogVHlwZVNjcmlwdCB3aWxsIHRoZW4gZW5mb3JjZSB0aGF0IGByZXF1aXJlZFNjb3BlYCBpcyBvbmUgb2YgYEF1dGhTY29wZXNgLCBhbmQgcHJvdmlkZVxuICogYXV0by1jb21wbGV0ZS5cbiAqXG4gKiBAYXV0aG9yIEtyaXN0aWFuIFJla3N0YWQgPGtyZUBjYXByYWNvbnN1bHRpbmcubm8+XG4gKiBAYXV0aG9yIEhlcm1hbm4gTcO4cmtyaWQgPGhlbUBsaWZsaWcubm8+XG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlHYXRld2F5PFxuICBBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4gZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIC8qKiBUaGUgQVBJIEdhdGV3YXkgSFRUUCBBUEkuIFRoaXMgaXMgdGhlIG1haW4gY29uc3RydWN0IGZvciBBUEktR1cuICovXG4gIHB1YmxpYyByZWFkb25seSBodHRwQXBpOiBhcGlndy5IdHRwQXBpXG5cbiAgLyoqIFRoZSByb3V0ZXMgd2hpY2ggY29ubmVjdCB0aGUge0BsaW5rIGh0dHBBcGl9IHRvIHRoZSBiYWNrZW5kIGludGVncmF0aW9uKHMpLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm91dGVzOiBhcGlndy5IdHRwUm91dGVbXSA9IFtdXG5cbiAgLyoqIFRoZSBkb21haW4gd2hpY2ggY29uc3VtZXJzIG11c3QgdXNlLiovXG4gIHB1YmxpYyByZWFkb25seSBkb21haW46IHN0cmluZ1xuXG4gIC8qKiBBY2Nlc3MgbG9nIGdyb3VwLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nR3JvdXA6IGxvZ3MuTG9nR3JvdXBcblxuICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBBcGlHYXRld2F5UHJvcHM8QXV0aFNjb3Blc1Q+XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEFwaUdhdGV3YXlQcm9wczxBdXRoU2NvcGVzVD4sXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcblxuICAgIEFwaUdhdGV3YXkudmFsaWRhdGVQcm9wcyhwcm9wcywgaWQsIGNkay5TdGFjay5vZih0aGlzKSlcblxuICAgIGNvbnN0IGN1c3RvbURvbWFpbiA9IG5ldyBBcGlHYXRld2F5RG9tYWluKHRoaXMsIFwiQ3VzdG9tRG9tYWluXCIsIHByb3BzLmRucylcbiAgICB0aGlzLmRvbWFpbiA9IGN1c3RvbURvbWFpbi5mdWxsRG9tYWluTmFtZVxuXG4gICAgbGV0IGNvcnNPcHRpb25zOiBhcGlndy5Db3JzUHJlZmxpZ2h0T3B0aW9ucyB8IHVuZGVmaW5lZFxuICAgIGlmIChwcm9wcy5jb3JzQWxsb3dBbGwpIHtcbiAgICAgIGNvcnNPcHRpb25zID0ge1xuICAgICAgICBhbGxvd09yaWdpbnM6IFtcIipcIl0sXG4gICAgICAgIC8vIFwiVGhlIEF1dGhvcml6YXRpb24gaGVhZGVyIGNhbid0IGJlIHdpbGRjYXJkZWQgYW5kIGFsd2F5cyBuZWVkcyB0byBiZSBsaXN0ZWQgZXhwbGljaXRseVwiXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvSGVhZGVycy9BY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzXG4gICAgICAgIC8vIENvbnRlbnQtVHlwZSBtYXkgYWxzbyByZXF1aXJlIGV4cGxpY2l0IHdoaXRlbGlzdGluZzogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzYzNTY3NjQ3XG4gICAgICAgIGFsbG93SGVhZGVyczogW1wiQXV0aG9yaXphdGlvblwiLCBcIkNvbnRlbnQtVHlwZVwiLCBcIipcIl0sXG4gICAgICAgIC8vIE5vdCB1c2luZyAnKicgaGVyZSwgYmVjYXVzZSBcIkluIHJlcXVlc3RzIHdpdGggY3JlZGVudGlhbHMsIGl0IGlzIHRyZWF0ZWQgYXMgdGhlIGxpdGVyYWxcbiAgICAgICAgLy8gbWV0aG9kIG5hbWUgJyonIHdpdGhvdXQgc3BlY2lhbCBzZW1hbnRpY3NcIlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0hlYWRlcnMvQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kc1xuICAgICAgICBhbGxvd01ldGhvZHM6IFtcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5HRVQsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuUE9TVCxcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5QVVQsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuUEFUQ0gsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuREVMRVRFLFxuICAgICAgICAgIGFwaWd3LkNvcnNIdHRwTWV0aG9kLk9QVElPTlMsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuSEVBRCxcbiAgICAgICAgXSxcbiAgICAgICAgbWF4QWdlOiBjZGsuRHVyYXRpb24uZGF5cygxKSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgYWN0dWFsIEFQSS4gVGhpcyBob2xkcyB0aGUgcm91dGVzLCBhdXRob3JpemVycyBhbmQgaW50ZWdyYXRpb25zLlxuICAgIGNvbnN0IGFwaSA9IG5ldyBhcGlndy5IdHRwQXBpKHRoaXMsIFwiSHR0cEFwaS1cIiArIHByb3BzLmRucy5zdWJkb21haW4sIHtcbiAgICAgIC8vIGRlZmF1bHRJbnRlZ3JhdGlvbjogZGVmYXVsdEludGVncmF0aW9uLCAvLyBUaGlzIGlzIGZvciBhIGNhdGNoLWFsbCAkZGVmYXVsdCByb3V0ZVxuICAgICAgZGVzY3JpcHRpb246IGBBbiBIVFRQIEFQSSBmb3IgJHtwcm9wcy5kbnMuc3ViZG9tYWlufS4ke3Byb3BzLmRucy5ob3N0ZWRab25lLnpvbmVOYW1lfS5gLFxuICAgICAgZGlzYWJsZUV4ZWN1dGVBcGlFbmRwb2ludDogdHJ1ZSwgLy8gRm9yY2UgZXh0ZXJuYWxzIHRvIGdvIHRocm91Z2ggY3VzdG9tIGRvbWFpbi4gTVVTVCBiZSB0cnVlIHdoZW4gdXNpbmcgTXV0dWFsIFRMUywgZm9yIHNlY3VyaXR5IHJlYXNvbnNcbiAgICAgIGNyZWF0ZURlZmF1bHRTdGFnZTogdHJ1ZSxcbiAgICAgIGRlZmF1bHREb21haW5NYXBwaW5nOiB7IGRvbWFpbk5hbWU6IGN1c3RvbURvbWFpbi5hcGlHd0RvbWFpbk5hbWUgfSxcbiAgICAgIGNvcnNQcmVmbGlnaHQ6IGNvcnNPcHRpb25zLFxuICAgICAgLi4ucHJvcHM/LnByb3BzT3ZlcnJpZGU/Lmh0dHBBcGksXG4gICAgfSlcbiAgICB0aGlzLmh0dHBBcGkgPSBhcGlcblxuICAgIGNvbnN0IHN0YWdlID0gYXBpLmRlZmF1bHRTdGFnZT8ubm9kZS5kZWZhdWx0Q2hpbGQgYXMgYXBpZ3cuQ2ZuU3RhZ2VcblxuICAgIGNvbnN0IGxvZ3MgPSBuZXcgQXBpR2F0ZXdheUFjY2Vzc0xvZ3MoXG4gICAgICB0aGlzLFxuICAgICAgXCJBY2Nlc3NMb2dzXCIsXG4gICAgICBzdGFnZSxcbiAgICAgIHByb3BzLmFjY2Vzc0xvZ3MsXG4gICAgKVxuICAgIHRoaXMubG9nR3JvdXAgPSBsb2dzLmxvZ0dyb3VwXG5cbiAgICBzdGFnZS5kZWZhdWx0Um91dGVTZXR0aW5ncyA9IHtcbiAgICAgIC4uLnN0YWdlLmRlZmF1bHRSb3V0ZVNldHRpbmdzLFxuICAgICAgZGV0YWlsZWRNZXRyaWNzRW5hYmxlZDogcHJvcHMuZGV0YWlsZWRNZXRyaWNzID8/IHRydWUsXG4gICAgICB0aHJvdHRsaW5nQnVyc3RMaW1pdDogcHJvcHMudGhyb3R0bGluZz8uYnVyc3QsIC8vIERlZmF1bHQgZm9yIGFjY291bnQgaXMgNV8wMDBcbiAgICAgIHRocm90dGxpbmdSYXRlTGltaXQ6IHByb3BzLnRocm90dGxpbmc/LnJhdGUsIC8vIERlZmF1bHQgZm9yIGFjY291bnQgaXMgMTBfMDAwXG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdEludGVncmF0aW9uID0gcHJvcHMuZGVmYXVsdEludGVncmF0aW9uXG4gICAgICA/IHRoaXMuY3JlYXRlSW50ZWdyYXRpb24ocHJvcHMuZGVmYXVsdEludGVncmF0aW9uLCBwcm9wcy5kbnMpXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgZGVmYXVsdEF1dGhvcml6ZXIgPSBwcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvblxuICAgICAgPyB0aGlzLmNyZWF0ZUF1dGhvcml6ZXIoXCJEZWZhdWx0QXV0aG9yaXplclwiLCBwcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvbilcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHByb3BzLnJvdXRlcykge1xuICAgICAgbGV0IGludGVncmF0aW9uOiBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvblxuICAgICAgaWYgKHJvdXRlLmludGVncmF0aW9uKSB7XG4gICAgICAgIGludGVncmF0aW9uID0gdGhpcy5jcmVhdGVJbnRlZ3JhdGlvbihyb3V0ZS5pbnRlZ3JhdGlvbiwgcHJvcHMuZG5zKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZWdyYXRpb24gPSBkZWZhdWx0SW50ZWdyYXRpb24hIC8vIFZlcmlmaWVkIGluIHZhbGlkYXRlUHJvcHNcbiAgICAgIH1cblxuICAgICAgbGV0IGF1dGhvcml6ZXI6IGFwaWd3LklIdHRwUm91dGVBdXRob3JpemVyIHwgdW5kZWZpbmVkXG4gICAgICBpZiAocm91dGUuYXV0aG9yaXphdGlvbikge1xuICAgICAgICBhdXRob3JpemVyID0gdGhpcy5jcmVhdGVBdXRob3JpemVyKFxuICAgICAgICAgIC8vIFVzaW5nIHRoZSByb3V0ZSBwYXRoIGhlcmUgY2F1c2VkIENsb3VkRm9ybWF0aW9uIHRvIGZhaWwgZHVlIHRvIHJlc291cmNlIG5hbWVzIGJlaW5nIHRvb1xuICAgICAgICAgIC8vIGxvbmcuIFRoZXJlZm9yZSwgd2Ugbm93IGhhc2ggdGhlIHJvdXRlIHBhdGggdG8gZ2V0IGEgc2hvcnRlciBuYW1lLlxuICAgICAgICAgIGBSb3V0ZUF1dGhvcml6ZXIke3Nob3J0SGFzaChgJHtyb3V0ZS5tZXRob2QgPz8gXCJcIn0ke3JvdXRlLnBhdGh9YCl9YCxcbiAgICAgICAgICByb3V0ZS5hdXRob3JpemF0aW9uLFxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdXRob3JpemVyID0gZGVmYXVsdEF1dGhvcml6ZXJcbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm91dGVQYXRocyA9IFtyb3V0ZS5wYXRoXVxuICAgICAgaWYgKHJvdXRlLmluY2x1ZGVTdWJwYXRocyA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBJZiB3ZSBpbmNsdWRlIHN1Yi1wYXRocywgd2UgYWRkIGFuIGFkZGl0aW9uYWwgcm91dGUgd2l0aCAve3Byb3h5K30gKHRoZSArIG1lYW5zIGl0IHdpbGxcbiAgICAgICAgLy8gbWF0Y2ggYWxsIHN1YnJvdXRlcykuIFdlIHdhbnQgYm90aCB0aGlzIHJvdXRlIGFuZCB0aGUgbm9ybWFsIHJvdXRlIHdpdGhvdXQgL3twcm94eSt9LFxuICAgICAgICAvLyBzaW5jZSAve3Byb3h5K30gd2lsbCBvbmx5IG1hdGNoIHRoZSBiYXNlIHBhdGggd2l0aCB0cmFpbGluZyBzbGFzaC5cbiAgICAgICAgcm91dGVQYXRocy5wdXNoKFxuICAgICAgICAgIHJvdXRlLnBhdGggKyAocm91dGUucGF0aCA9PT0gXCIvXCIgPyBcIlwiIDogXCIvXCIpICsgXCJ7cHJveHkrfVwiLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgcm91dGVQYXRoIG9mIHJvdXRlUGF0aHMpIHtcbiAgICAgICAgLy8gVGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIEFQSSBHYXRld2F5IGNvbnN0cnVjdCBoYWQgYSBzaW5nbGUgcm91dGUgd2l0aCB0aGUgSURcbiAgICAgICAgLy8gJ0RlZmF1bHRQcm94eVJvdXRlJywgYW5kIGFsbCBnYXRld2F5cyB3ZSB1c2VkIGV4cG9zZWQgdGhlIHJvdXRlIC97cHJveHkrfS4gV2hlbiB0cnlpbmcgdG9cbiAgICAgICAgLy8gY2hhbmdlIHRvIHRoaXMgbmV3IHZlcnNpb24gb2YgdGhlIGNvbnN0cnVjdCwgZGVwbG95bWVudCBmYWlsZWQgZm9yIGdhdGV3YXlzIGV4cG9zaW5nXG4gICAgICAgIC8vIC97cHJveHkrfSwgYmVjYXVzZSBcImEgcm91dGUgd2l0aCB0aGF0IGtleSBbaS5lLiBwYXRoICsgbWV0aG9kXSBhbHJlYWR5IGV4aXN0c1wiLiBXZSB0aGlua1xuICAgICAgICAvLyB0aGlzIG1heSBiZSBiZWNhdXNlIHdlIHVzZWQgdGhlIHNhbWUgcm91dGUgcGF0aCwgYnV0IHdpdGggYSBuZXcgcm91dGUgSUQsIGNhdXNpbmdcbiAgICAgICAgLy8gY29uZnVzaW9uIGZvciBDbG91ZEZvcm1hdGlvbi4gU28gd2Uga2VlcCB0aGUgb2xkIHJvdXRlIElEIGhlcmUgZm9yIC97cHJveHkrfS5cbiAgICAgICAgY29uc3Qgcm91dGVJZCA9XG4gICAgICAgICAgcm91dGVQYXRoID09PSBcIi97cHJveHkrfVwiID8gXCJEZWZhdWx0UHJveHlSb3V0ZVwiIDogYFJvdXRlLSR7cm91dGVQYXRofWBcblxuICAgICAgICB0aGlzLnJvdXRlcy5wdXNoKFxuICAgICAgICAgIG5ldyBhcGlndy5IdHRwUm91dGUodGhpcywgcm91dGVJZCwge1xuICAgICAgICAgICAgaHR0cEFwaTogYXBpLFxuICAgICAgICAgICAgaW50ZWdyYXRpb246IGludGVncmF0aW9uLFxuICAgICAgICAgICAgYXV0aG9yaXplcjogYXV0aG9yaXplcixcbiAgICAgICAgICAgIHJvdXRlS2V5OiBhcGlndy5IdHRwUm91dGVLZXkud2l0aChcbiAgICAgICAgICAgICAgcm91dGVQYXRoLFxuICAgICAgICAgICAgICByb3V0ZS5tZXRob2RcbiAgICAgICAgICAgICAgICA/IGFwaWd3Lkh0dHBNZXRob2Rbcm91dGUubWV0aG9kXVxuICAgICAgICAgICAgICAgIDogYXBpZ3cuSHR0cE1ldGhvZC5BTlksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFnUmVzb3VyY2VzKHRoaXMsICgpID0+ICh7IHNlcnZpY2U6IHByb3BzLmRucy5zdWJkb21haW4gfSkpXG4gIH1cblxuICAvKiogQHRocm93cyBFcnJvciAqL1xuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZVByb3BzKFxuICAgIHByb3BzOiBBcGlHYXRld2F5UHJvcHMsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdGFjazogY2RrLlN0YWNrLFxuICApIHtcbiAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHByb3BzLnJvdXRlcykge1xuICAgICAgaWYgKCFyb3V0ZS5pbnRlZ3JhdGlvbiAmJiAhcHJvcHMuZGVmYXVsdEludGVncmF0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm8gaW50ZWdyYXRpb24gZGVmaW5lZCBmb3Igcm91dGUgJyR7cm91dGUucGF0aH0nLCBhbmQgbm8gZGVmYXVsdCBpbnRlZ3JhdGlvbiBzcGVjaWZpZWQgZm9yIHRoZSBnYXRld2F5YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKCFyb3V0ZS5hdXRob3JpemF0aW9uICYmICFwcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE5vIGF1dGhvcml6YXRpb24gZGVmaW5lZCBmb3Igcm91dGUgJyR7cm91dGUucGF0aH0nLCBhbmQgbm8gZGVmYXVsdCBhdXRob3JpemF0aW9uIHNwZWNpZmllZCBmb3IgdGhlIGdhdGV3YXlgLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAoIXJvdXRlLnBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIHBhdGggJyR7cm91dGUucGF0aH0nOiBwYXRocyBtdXN0IGJlZ2luIHdpdGggJy8nICh1c2UgJy8nIGZvciByb290IHBhdGgpYCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKHJvdXRlLnBhdGggIT09IFwiL1wiICYmIHJvdXRlLnBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBwYXRoICcke3JvdXRlLnBhdGh9JzogcGF0aHMgY2Fubm90IGVuZCB3aXRoICcvJyAoZXhjZXB0IHJvb3QgcGF0aClgLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHJvdXRlLmludGVncmF0aW9uPy50eXBlID09PSBcIkFMQlwiICYmXG4gICAgICAgIHJvdXRlLmludGVncmF0aW9uLmhvc3ROYW1lLnN0YXJ0c1dpdGgoXCJodHRwczpcIilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRoZSBhbGJJbnRlZ3JhdGlvbi5ob3N0SHR0cHNOYW1lIHNob3VsZCBub3QgaW5jbHVkZSBhIHByb3RvY29sOiAke3JvdXRlLmludGVncmF0aW9uLmhvc3ROYW1lfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb3BzLmRucy5zdWJkb21haW4gPT09IFwiXCIgfHwgcHJvcHMuZG5zLnN1YmRvbWFpbi5pbmNsdWRlcyhcIiBcIikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFN1YmRvbWFpbiBtdXN0IGJlIHNldCwgYW5kIG5vdCBjb250YWluIHNwYWNlczogJHtwcm9wcy5kbnMuc3ViZG9tYWlufWAsXG4gICAgICApXG4gICAgfVxuICAgIGlmIChwcm9wcy50aHJvdHRsaW5nPy5idXJzdCAmJiBwcm9wcy50aHJvdHRsaW5nLmJ1cnN0ID4gNV8wMDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYOKaoO+4jyBZb3VyIHRocm90dGxpbmcgYnVyc3QgbGltaXQgJyR7cHJvcHMudGhyb3R0bGluZy5idXJzdH0nIGlzIGhpZ2hlciB0aGFuIHRoZSBBV1MgQWNjb3VudCBsaW1pdC4gTWFrZSBzdXJlIHlvdXIgYWNjb3VudCBoYXMgdXBncmFkZWQgdGhpcyBxdW90YSEgYCxcbiAgICAgICAgc3RhY2ssXG4gICAgICAgIGlkLFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAocHJvcHMudGhyb3R0bGluZz8ucmF0ZSAmJiBwcm9wcy50aHJvdHRsaW5nLnJhdGUgPiAxMF8wMDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYOKaoO+4jyBZb3VyIHRocm90dGxpbmcgcmF0ZSBsaW1pdCAnJHtwcm9wcy50aHJvdHRsaW5nLnJhdGV9JyBpcyBoaWdoZXIgdGhhbiB0aGUgQVdTIEFjY291bnQgbGltaXQuIE1ha2Ugc3VyZSB5b3VyIGFjY291bnQgaGFzIHVwZ3JhZGVkIHRoaXMgcXVvdGEhIGAsXG4gICAgICAgIHN0YWNrLFxuICAgICAgICBpZCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGF1dGhvcml6ZXIgb25seSBhY2NlcHRzIHJlcXVlc3RzIGZyb20gZXh0ZXJuYWwgdXNlcnMgdGhhdCBhcmUgYXV0aG9yaXplZC5cbiAgICogVW5hdXRob3JpemVkIHVzZXJzIGFyZSBzdG9wcGVkIGluIHRoZSBBUEktR1csIGFuZCBub3QgZm9yd2FyZGVkIHRvIHRoZSBpbnRlZ3JhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQXV0aG9yaXplcjxBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZz4oXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdXRob3JpemF0aW9uOiBBdXRob3JpemF0aW9uUHJvcHM8QXV0aFNjb3Blc1Q+LFxuICApOiBhcGlndy5JSHR0cFJvdXRlQXV0aG9yaXplciB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoIChhdXRob3JpemF0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJOT05FXCI6IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuICAgICAgY2FzZSBcIklBTVwiOiB7XG4gICAgICAgIC8vIEFQSSBHYXRld2F5IGludm9rZXMgeW91ciBBUEkgcm91dGUgb25seSBpZiB0aGUgY2xpZW50IGhhcyBleGVjdXRlLWFwaSBwZXJtaXNzaW9uIGZvciB0aGUgcm91dGUuXG4gICAgICAgIC8vIFRoZSBjbGllbnQgaGFzIHRvIHVzZSBBV1MgU2lnVjQgdG8gaWRlbnRpZnkgdGhlbXNlbHZlcyBpbiB0aGUgcmVxdWVzdC5cbiAgICAgICAgLy8gUmVhZCB0aGlzIHBhZ2UgZm9yIGhlbHAgd2l0aCBJQU0gYW5kIEFQSS1HVyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc2VjdXJpdHlfaWFtX3NlcnZpY2Utd2l0aC1pYW0uaHRtbFxuICAgICAgICAvLyBOb3RlIHRoYXQgW3Jlc291cmNlIHBvbGljaWVzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCBmb3IgSFRUUF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWFjY2Vzcy1jb250cm9sLWlhbS5odG1sKVxuICAgICAgICByZXR1cm4gbmV3IGF1dGhvcml6ZXJzLkh0dHBJYW1BdXRob3JpemVyKClcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJDT0dOSVRPX1VTRVJfUE9PTFwiOiB7XG4gICAgICAgIC8vIFdlIHVzZSBhIGN1c3RvbSBsYW1iZGEgYXV0aG9yaXplciBoZXJlIGluc3RlYWQgb2YgdGhlIGBIdHRwVXNlclBvb2xBdXRob3JpemVyYCBwcm92aWRlZFxuICAgICAgICAvLyBieSBDREssIGluIG9yZGVyIHRvIHN1cHBvcnQgYHJlcXVpcmVkU2NvcGVgIGFuZCBzZXR0aW5nIG9mIGN1c3RvbSBjb250ZXh0IHZhcmlhYmxlcy5cbiAgICAgICAgY29uc3QgYXV0aG9yaXplciA9IG5ldyBDb2duaXRvVXNlclBvb2xBdXRob3JpemVyKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgaWQgKyBcIkxhbWJkYVwiLFxuICAgICAgICAgIGF1dGhvcml6YXRpb24sXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gbmV3IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFBdXRob3JpemVyKGlkLCBhdXRob3JpemVyLmxhbWJkYSwge1xuICAgICAgICAgIHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6ZXIucmVzcG9uc2VUeXBlcyxcbiAgICAgICAgICAvLyBNYXggMWgsIG9yIGRpc2FibGVkICgwcykuIFRoZSB2YWx1ZSBvbmx5IG1hdHRlcnMgd2hlbiBpbnZhbGlkYXRpbmcvZHluYW1pYyBjcmVkZW50aWFsc1xuICAgICAgICAgIHJlc3VsdHNDYWNoZVR0bDogY2RrLkR1cmF0aW9uLmhvdXJzKDEpLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgY2FzZSBcIkJBU0lDX0FVVEhcIjoge1xuICAgICAgICBjb25zdCBhdXRob3JpemVyID0gbmV3IEJhc2ljQXV0aEF1dGhvcml6ZXIoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBpZCArIFwiTGFtYmRhXCIsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbixcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiBuZXcgYXV0aG9yaXplcnMuSHR0cExhbWJkYUF1dGhvcml6ZXIoaWQsIGF1dGhvcml6ZXIubGFtYmRhLCB7XG4gICAgICAgICAgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplci5yZXNwb25zZVR5cGVzLFxuICAgICAgICAgIC8vIE1heCAxaCwgb3IgZGlzYWJsZWQgKDBzKS4gVGhlIHZhbHVlIG9ubHkgbWF0dGVycyB3aGVuIGludmFsaWRhdGluZy9keW5hbWljIGNyZWRlbnRpYWxzXG4gICAgICAgICAgcmVzdWx0c0NhY2hlVHRsOiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjYXNlIFwiQ09HTklUT19VU0VSX1BPT0xfT1JfQkFTSUNfQVVUSFwiOiB7XG4gICAgICAgIGNvbnN0IGF1dGhvcml6ZXIgPSBuZXcgQ29nbml0b1VzZXJQb29sT3JCYXNpY0F1dGhBdXRob3JpemVyKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgaWQgKyBcIkxhbWJkYVwiLFxuICAgICAgICAgIGF1dGhvcml6YXRpb24sXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gbmV3IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFBdXRob3JpemVyKGlkLCBhdXRob3JpemVyLmxhbWJkYSwge1xuICAgICAgICAgIHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6ZXIucmVzcG9uc2VUeXBlcyxcbiAgICAgICAgICAvLyBNYXggMWgsIG9yIGRpc2FibGVkICgwcykuIFRoZSB2YWx1ZSBvbmx5IG1hdHRlcnMgd2hlbiBpbnZhbGlkYXRpbmcvZHluYW1pYyBjcmVkZW50aWFsc1xuICAgICAgICAgIHJlc3VsdHNDYWNoZVR0bDogY2RrLkR1cmF0aW9uLmhvdXJzKDEpLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgY2FzZSBcIkNVU1RPTV9MQU1CREFfQVVUSE9SSVpFUlwiOiB7XG4gICAgICAgIHJldHVybiBuZXcgYXV0aG9yaXplcnMuSHR0cExhbWJkYUF1dGhvcml6ZXIoXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbi5sYW1iZGFBdXRob3JpemVyLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmF1dGhvcml6YXRpb24uYXV0aG9yaXplclByb3BzLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlczogYXV0aG9yaXphdGlvbi5hdXRob3JpemVyUHJvcHM/LnJlc3BvbnNlVHlwZXMgPz8gW1xuICAgICAgICAgICAgICBhdXRob3JpemVycy5IdHRwTGFtYmRhUmVzcG9uc2VUeXBlLlNJTVBMRSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZXN1bHRzQ2FjaGVUdGw6XG4gICAgICAgICAgICAgIGF1dGhvcml6YXRpb24uYXV0aG9yaXplclByb3BzPy5yZXN1bHRzQ2FjaGVUdGwgPz9cbiAgICAgICAgICAgICAgY2RrLkR1cmF0aW9uLmhvdXJzKDEpLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUludGVncmF0aW9uKFxuICAgIGludGVncmF0aW9uOiBJbnRlZ3JhdGlvblByb3BzLFxuICAgIGRuczogQXBpR2F0ZXdheVByb3BzW1wiZG5zXCJdLFxuICApOiBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvbiB7XG4gICAgc3dpdGNoIChpbnRlZ3JhdGlvbi50eXBlKSB7XG4gICAgICBjYXNlIFwiQUxCXCI6IHtcbiAgICAgICAgLy8gVGhlIFZQQ0xpbmsgY29ubmVjdHMgdGhlIGludGVncmF0aW9uIGludG8gdGhlIEFMQidzIFZQQy4gTXVzdCBiZSBtYW51YWxseSBjcmVhdGVkIHdoZW5cbiAgICAgICAgLy8gdGhlIFZQQyBpcyBpbXBvcnRlZCwgd2hpY2ggaXMgdGhlIGNhc2Ugd2hlbiB1c2luZyBDb3JlUGxhdGZvcm1Db25zdW1lci5cbiAgICAgICAgY29uc3QgdnBjTGluayA9IG5ldyBhcGlndy5WcGNMaW5rKHRoaXMsIFwiQWxiVnBjTGlua1wiLCB7XG4gICAgICAgICAgdnBjOiBpbnRlZ3JhdGlvbi52cGMsXG4gICAgICAgICAgc2VjdXJpdHlHcm91cHM6IFtpbnRlZ3JhdGlvbi5zZWN1cml0eUdyb3VwXSxcbiAgICAgICAgICBzdWJuZXRzOiBpbnRlZ3JhdGlvbi52cGMuc2VsZWN0U3VibmV0cygpLCAvLyBUaGlzIGNvcnJlY3RseSBzZWxlY3RzIHRoZSBwcml2YXRlIHN1Ym5ldHNcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBwYXJhbWV0ZXJNYXBwaW5nID0gbmV3IGFwaWd3LlBhcmFtZXRlck1hcHBpbmcoKVxuICAgICAgICAgIC8qKiBTZWUge0BsaW5rIEFsYkludGVncmF0aW9uUHJvcHMuaG9zdE5hbWV9ICovXG4gICAgICAgICAgLm92ZXJ3cml0ZUhlYWRlcihcbiAgICAgICAgICAgIFwiSG9zdFwiLFxuICAgICAgICAgICAgLy8gVGhlIEhvc3QgaGVhZGVyIGNhbiBOT1QgdXNlIGR5bmFtaWMgbWFwcGluZywgbGlrZSAkY29udGV4dC5kb21haW5OYW1lIGV0Yy5cbiAgICAgICAgICAgIGFwaWd3Lk1hcHBpbmdWYWx1ZS5jdXN0b20oaW50ZWdyYXRpb24uaG9zdE5hbWUpLFxuICAgICAgICAgIClcbiAgICAgICAgaWYgKGludGVncmF0aW9uLm1hcFBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGludGVncmF0aW9uLm1hcFBhcmFtZXRlcnMocGFyYW1ldGVyTWFwcGluZylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgaW50ZWdyYXRpb25zLkh0dHBBbGJJbnRlZ3JhdGlvbihcbiAgICAgICAgICBcIkFsYkludGVncmF0aW9uLVwiICsgZG5zLnN1YmRvbWFpbixcbiAgICAgICAgICBpbnRlZ3JhdGlvbi5sb2FkQmFsYW5jZXJMaXN0ZW5lcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZWN1cmVTZXJ2ZXJOYW1lOiBpbnRlZ3JhdGlvbi5ob3N0TmFtZSxcbiAgICAgICAgICAgIHZwY0xpbms6IHZwY0xpbmssXG4gICAgICAgICAgICBtZXRob2Q6IGFwaWd3Lkh0dHBNZXRob2QuQU5ZLFxuICAgICAgICAgICAgcGFyYW1ldGVyTWFwcGluZyxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjYXNlIFwiTGFtYmRhXCI6IHtcbiAgICAgICAgcmV0dXJuIG5ldyBpbnRlZ3JhdGlvbnMuSHR0cExhbWJkYUludGVncmF0aW9uKFxuICAgICAgICAgIFwiTGFtYmRhSW50ZWdyYXRpb25cIixcbiAgICAgICAgICBpbnRlZ3JhdGlvbi5sYW1iZGEsXG4gICAgICAgICAge1xuICAgICAgICAgICAgcGF5bG9hZEZvcm1hdFZlcnNpb246IGFwaWd3LlBheWxvYWRGb3JtYXRWZXJzaW9uLlZFUlNJT05fMl8wLFxuICAgICAgICAgICAgcGFyYW1ldGVyTWFwcGluZzogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJTUVNcIjoge1xuICAgICAgICAvLyBBUEktR1cgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gU1FTIGJ5IGRlZmF1bHRcbiAgICAgICAgY29uc3Qgcm9sZSA9IG5ldyBpYW0uUm9sZShcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGBBcGlHd1RvJHtpbnRlZ3JhdGlvbi5xdWV1ZS5ub2RlLmlkfVNlcnZpY2VSb2xlYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgXCJBbGxvd3MgQVBJLUdXIHRvIGFkZCBtZXNzYWdlcyB0byBcIiArIGludGVncmF0aW9uLnF1ZXVlLnF1ZXVlQXJuLFxuICAgICAgICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJhcGlnYXRld2F5LmFtYXpvbmF3cy5jb21cIiksXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgICBpbnRlZ3JhdGlvbi5xdWV1ZS5ncmFudFNlbmRNZXNzYWdlcyhyb2xlKVxuXG4gICAgICAgIGxldCBwYXJhbWV0ZXJNYXBwaW5nID0gbmV3IGFwaWd3LlBhcmFtZXRlck1hcHBpbmcoKVxuICAgICAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1kZXZlbG9wLWludGVncmF0aW9ucy1hd3Mtc2VydmljZXMtcmVmZXJlbmNlLmh0bWwjU1FTLVNlbmRNZXNzYWdlXG4gICAgICAgICAgLmN1c3RvbShcIlF1ZXVlVXJsXCIsIGludGVncmF0aW9uLnF1ZXVlLnF1ZXVlVXJsKVxuICAgICAgICAgIC5jdXN0b20oXCJNZXNzYWdlQm9keVwiLCBcIiRyZXF1ZXN0LmJvZHlcIilcbiAgICAgICAgICAuY3VzdG9tKFwiUmVnaW9uXCIsIFwiZXUtd2VzdC0xXCIpIC8vIENoYW5nZSB0aGlzIGlmIHRoZSBTUVMgcXVldWUgaXMgaW4gYW5vdGhlciByZWdpb24hXG5cbiAgICAgICAgaWYgKGludGVncmF0aW9uLm1lc3NhZ2VBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgcGFyYW1ldGVyTWFwcGluZyA9IHBhcmFtZXRlck1hcHBpbmcuY3VzdG9tKFxuICAgICAgICAgICAgXCJNZXNzYWdlQXR0cmlidXRlc1wiLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoaW50ZWdyYXRpb24ubWVzc2FnZUF0dHJpYnV0ZXMpLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgU3FzUm91dGVJbnRlZ3JhdGlvbihcIlNxc0ludGVncmF0aW9uXCIsIHtcbiAgICAgICAgICB0eXBlOiBhcGlndy5IdHRwSW50ZWdyYXRpb25UeXBlLkFXU19QUk9YWSxcbiAgICAgICAgICBzdWJ0eXBlOiBhcGlndy5IdHRwSW50ZWdyYXRpb25TdWJ0eXBlLlNRU19TRU5EX01FU1NBR0UsXG4gICAgICAgICAgY3JlZGVudGlhbHM6IGFwaWd3LkludGVncmF0aW9uQ3JlZGVudGlhbHMuZnJvbVJvbGUocm9sZSksXG4gICAgICAgICAgcGFyYW1ldGVyTWFwcGluZzogcGFyYW1ldGVyTWFwcGluZyxcbiAgICAgICAgICBwYXlsb2FkRm9ybWF0VmVyc2lvbjogYXBpZ3cuUGF5bG9hZEZvcm1hdFZlcnNpb24uVkVSU0lPTl8xXzAsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBhIGdyYW50YWJsZSB0YXJnZXQgKHJvbGUsIHVzZXIgZXRjLikgcGVybWlzc2lvbiB0byBpbnZva2UgdGhlIEFQSS5cbiAgICogT25seSB3b3JrcyB3aGVuIHVzaW5nIGBJQU1gIGFzIHtAbGluayBBcGlHYXRld2F5Um91dGUuYXV0aG9yaXphdGlvbn0uXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgQSBncmFudGFibGUsIGxpa2Uge0BsaW5rIGlhbS5Sb2xlfVxuICAgKi9cbiAgcHVibGljIGdyYW50SW52b2tlKHRhcmdldDogaWFtLklHcmFudGFibGUpIHtcbiAgICBmb3IgKGNvbnN0IHJvdXRlUHJvcHMgb2YgdGhpcy5wcm9wcy5yb3V0ZXMpIHtcbiAgICAgIGNvbnN0IGF1dGhUeXBlID1cbiAgICAgICAgcm91dGVQcm9wcy5hdXRob3JpemF0aW9uPy50eXBlID8/IHRoaXMucHJvcHMuZGVmYXVsdEF1dGhvcml6YXRpb24/LnR5cGVcblxuICAgICAgaWYgKGF1dGhUeXBlICE9PSBcIklBTVwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGdyYW50IGludm9rZSBmb3IgYW4gQVBJIEdhdGV3YXkgd2hlbiBub3QgdXNpbmcgSUFNIGF1dGggKGZvdW5kIGF1dGggJyR7YXV0aFR5cGV9JyBvbiByb3V0ZSAnJHtyb3V0ZVByb3BzLnBhdGh9JykgWyR7Y2RrLlN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZX1dYCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgcm91dGUgb2YgdGhpcy5yb3V0ZXMpIHtcbiAgICAgIHJvdXRlLmdyYW50SW52b2tlKHRhcmdldClcbiAgICB9XG4gIH1cbn1cblxuLyoqIEFjdHMgYXMgZ2x1ZSAoYmV0d2VlbiB0aGUgaW50ZWdyYXRpb24gcHJvcHMgYW5kIHRoZSBIdHRwQXBpKSB3aGVuIGNyZWF0aW5nIGFuIFNxc0ludGVncmF0aW9uLiAqL1xuY2xhc3MgU3FzUm91dGVJbnRlZ3JhdGlvbiBleHRlbmRzIGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBpZCBUaGUgaWQgdXNlZCBpbiB0aGUge0BsaW5rIGFwaWd3Lkh0dHBJbnRlZ3JhdGlvbn0gY29uc3RydWN0XG4gICAqICAgIGNyZWF0ZWQgaW50ZXJuYWxseSBieSB7QGxpbmsgYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb24uX2JpbmRUb1JvdXRlfS5cbiAgICogICAgW1NvdXJjZSBjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi9iNWFlMzc3ODJiYzNjYjYzN2VlZWY5ZmJiMWZiZTJjNWVmZGZjMDY4L3BhY2thZ2VzLyU0MGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi9saWIvaHR0cC9pbnRlZ3JhdGlvbi50cyNMMzIxKVxuICAgKiBAcGFyYW0gaW50ZWdyYXRpb25Qcm9wcyBUaGUgcHJvcHMgdG8gcGFzcyB0byB0aGUge0BsaW5rIGFwaWd3Lkh0dHBJbnRlZ3JhdGlvbn0gY29uc3RydWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIGludGVncmF0aW9uUHJvcHM6IGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uQ29uZmlnLFxuICApIHtcbiAgICBzdXBlcihpZClcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHNlbmRzIHRoZSBwcm9wZXJ0aWVzIG5lZWRlZCBmb3IgY3JlYXRpbmcgYSB7QGxpbmsgYXBpZ3cuSHR0cEludGVncmF0aW9ufSB0byB0aGVcbiAgICoge0BsaW5rIGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9ufS5cbiAgICovXG4gIGJpbmQoKTogYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb25Db25maWcge1xuICAgIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi9iNWFlMzc3ODJiYzNjYjYzN2VlZWY5ZmJiMWZiZTJjNWVmZGZjMDY4L3BhY2thZ2VzLyU0MGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi9saWIvaHR0cC9pbnRlZ3JhdGlvbi50cyNMMzE5XG4gICAgcmV0dXJuIHRoaXMuaW50ZWdyYXRpb25Qcm9wc1xuICB9XG59XG5cbi8qKlxuICogV2hlbiB1c2luZyBgTm9kZWpzRnVuY3Rpb25gIHdpdGggYGVudHJ5YCwgd2UgcG9pbnQgQ0RLIHRvIGEgZmlsZSB3aXRoIG91ciBsYW1iZGEgY29kZS4gVGhpcyBjYW5cbiAqIGVpdGhlciBiZSBhIFR5cGVTY3JpcHQgb3IgSmF2YVNjcmlwdCBmaWxlLiBXaGVuIGNyZWF0aW5nIGNvbnN0cnVjdHMgaW4gdGVzdHMgaW5zaWRlIHRoaXMgbGlicmFyeSxcbiAqIHRoZSBlbnRyeSB3aWxsIHBvaW50IHRvIHRoZSBUeXBlU2NyaXB0IGZpbGUgaW4gdGhlIHNvdXJjZSBjb2RlLiBCdXQgd2hlbiBhIGxpYnJhcnkgY29uc3VtZXIgdXNlc1xuICogdGhpcywgaXQgd2lsbCBpbnN0ZWFkIHBvaW50IHRvIHRoZSB0cmFuc3BpbGVkIEphdmFTY3JpcHQgZmlsZS4gU28gdG8gc2V0IHRoZSBjb3JyZWN0IGZpbGVcbiAqIGV4dGVuc2lvbiwgd2UgbXVzdCBjaGVjayBpZiB3ZSdyZSBiZWluZyBydW4gaW4gdGhlIGNvbnRleHQgb2YgdGhlIFR5cGVTY3JpcHQgc291cmNlIGNvZGVcbiAqIChzcmMvYXBpLWdhdGV3YXkpLCBvdGhlcndpc2Ugd2UncmUgYmVpbmcgcnVuIGJ5IGEgY29uc3VtZXIgYXMgdHJhbnNwaWxlZCBKYXZhU2NyaXB0LlxuICovXG5jb25zdCBhdXRob3JpemVyRmlsZUV4dGVuc2lvbiA9IF9fZGlybmFtZS5lbmRzV2l0aChcInNyYy9hcGktZ2F0ZXdheVwiKVxuICA/IFwidHNcIlxuICA6IFwianNcIlxuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gTGFtYmRhIGF1dGhvcml6ZXIgd2hpY2ggcmVhZHMgYEF1dGhvcml6YXRpb246IEJlYXJlciA8YWNjZXNzIHRva2VuPmAgaGVhZGVyIGFuZFxuICogdmVyaWZpZXMgdGhlIHRva2VuIGFnYWluc3QgYSBDb2duaXRvIHVzZXIgcG9vbC5cbiAqL1xuY2xhc3MgQ29nbml0b1VzZXJQb29sQXV0aG9yaXplcjxcbiAgQXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcsXG4+IGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgbGFtYmRhOiBsYW1iZGEuSUZ1bmN0aW9uXG5cbiAgLyoqXG4gICAqIFVzZSBzaW1wbGUgcmVzcG9uc2UgdHlwZSAoYHsgaXNBdXRob3JpemVkOiB0cnVlL2ZhbHNlIH1gKSwgYXMgb3Bwb3NlZCB0byByZXR1cm5pbmcgYW4gSUFNXG4gICAqIFBvbGljeSBkb2N1bWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNwb25zZVR5cGVzOiBhdXRob3JpemVycy5IdHRwTGFtYmRhUmVzcG9uc2VUeXBlW10gPSBbXG4gICAgYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZS5TSU1QTEUsXG4gIF1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQ29nbml0b1VzZXJQb29sQXV0aG9yaXplclByb3BzPEF1dGhTY29wZXNUPixcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5sYW1iZGEgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiQXV0aG9yaXplckZ1bmN0aW9uXCIsIHtcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oXG4gICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgYGF1dGhvcml6ZXJzL2NvZ25pdG8tdXNlci1wb29sLWF1dGhvcml6ZXIuJHthdXRob3JpemVyRmlsZUV4dGVuc2lvbn1gLFxuICAgICAgKSxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBbXCJVU0VSX1BPT0xfSURcIl06IHByb3BzLnVzZXJQb29sLnVzZXJQb29sSWQsXG4gICAgICAgIFtcIlJFUVVJUkVEX1NDT1BFXCJdOiBwcm9wcy5yZXF1aXJlZFNjb3BlID8/IFwiXCIsXG4gICAgICAgIFtcIkNSRURFTlRJQUxTX0ZPUl9JTlRFUk5BTF9BVVRIT1JJWkFUSU9OXCJdOlxuICAgICAgICAgIHByb3BzLmNyZWRlbnRpYWxzRm9ySW50ZXJuYWxBdXRob3JpemF0aW9uXG4gICAgICAgICAgICA/IHByb3BzLmNyZWRlbnRpYWxzRm9ySW50ZXJuYWxBdXRob3JpemF0aW9uXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBpZiAocHJvcHMuY3JlZGVudGlhbHNGb3JJbnRlcm5hbEF1dGhvcml6YXRpb24pIHtcbiAgICAgIHNlY3JldHNtYW5hZ2VyLlNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKFxuICAgICAgICBzY29wZSxcbiAgICAgICAgaWQgKyBcIkJhc2ljQXV0aFNlY3JldFwiLFxuICAgICAgICBwcm9wcy5jcmVkZW50aWFsc0ZvckludGVybmFsQXV0aG9yaXphdGlvbixcbiAgICAgICkuZ3JhbnRSZWFkKHRoaXMubGFtYmRhKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gTGFtYmRhIGF1dGhvcml6ZXIgd2hpY2ggcmVhZHMgYEF1dGhvcml6YXRpb246IEJhc2ljIDxiYXNlNjQtZW5jb2RlZCBjcmVkZW50aWFscz5gXG4gKiBoZWFkZXIgYW5kIHZlcmlmaWVzIHRoZSBjcmVkZW50aWFscyBhZ2FpbnN0IGEgZ2l2ZW4gc2VjcmV0LlxuICovXG5jbGFzcyBCYXNpY0F1dGhBdXRob3JpemVyIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgbGFtYmRhOiBsYW1iZGEuSUZ1bmN0aW9uXG5cbiAgLy8gU2ltcGxlIGlzIGB7IGlzQXV0aG9yaXplZDogdHJ1ZS9mYWxzZSB9YCwgYXMgb3Bwb3NlZCB0byByZXR1cm5pbmcgYW4gSUFNIFBvbGljeSBkb2N1bWVudFxuICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZVtdID0gW1xuICAgIGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGUuU0lNUExFLFxuICBdXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5sYW1iZGEgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiQmFzaWNBdXRoTGFtYmRhXCIsIHtcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oXG4gICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgYGF1dGhvcml6ZXJzL2Jhc2ljLWF1dGgtYXV0aG9yaXplci4ke2F1dGhvcml6ZXJGaWxlRXh0ZW5zaW9ufWAsXG4gICAgICApLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiQW4gYXV0aG9yaXplciBmb3IgQVBJLUdhdGV3YXkgdGhhdCBjaGVja3MgQmFzaWMgQXV0aCBjcmVkZW50aWFscyBvbiByZXF1ZXN0c1wiLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBbXCJDUkVERU5USUFMU19TRUNSRVRfTkFNRVwiXTogcHJvcHMuY3JlZGVudGlhbHNTZWNyZXROYW1lXG4gICAgICAgICAgPyBwcm9wcy5jcmVkZW50aWFsc1NlY3JldE5hbWVcbiAgICAgICAgICA6IFwiXCIsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBzZWNyZXRzbWFuYWdlci5TZWNyZXQuZnJvbVNlY3JldE5hbWVWMihcbiAgICAgIHNjb3BlLFxuICAgICAgaWQgKyBcIkJhc2ljQXV0aFNlY3JldFwiLFxuICAgICAgcHJvcHMuY3JlZGVudGlhbHNTZWNyZXROYW1lLFxuICAgICkuZ3JhbnRSZWFkKHRoaXMubGFtYmRhKVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGN1c3RvbSBMYW1iZGEgYXV0aG9yaXplciB3aGljaCBhbGxvd3MgYm90aDpcbiAqIC0gYEF1dGhvcml6YXRpb246IEJlYXJlciA8YWNjZXNzIHRva2VuPmAgaGVhZGVyLCBmb3Igd2hpY2ggdGhlIHRva2VuIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgZ2l2ZW5cbiAqICAgQ29nbml0byB1c2VyIHBvb2xcbiAqIC0gYEF1dGhvcml6YXRpb246IEJhc2ljIDxiYXNlNjQtZW5jb2RlZCBjcmVkZW50aWFscz5gIGhlYWRlciwgZm9yIHdoaWNoIHRoZSBjcmVkZW50aWFscyBhcmVcbiAqICAgY2hlY2tlZCBhZ2FpbnN0IHRoZSBjcmVkZW50aWFscyBmcm9tIHRoZSBnaXZlbiBiYXNpYyBhdXRoIHNlY3JldCBuYW1lXG4gKlxuICogSWYgZWl0aGVyIG9mIHRoZXNlIGFyZSBnaXZlbiBhbmQgdmFsaWQsIHRoZSByZXF1ZXN0IGlzIGF1dGhlbnRpY2F0ZWQuXG4gKi9cbmNsYXNzIENvZ25pdG9Vc2VyUG9vbE9yQmFzaWNBdXRoQXV0aG9yaXplcjxcbiAgQXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcsXG4+IGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgbGFtYmRhOiBsYW1iZGEuSUZ1bmN0aW9uXG5cbiAgLyoqXG4gICAqIFVzZSBzaW1wbGUgcmVzcG9uc2UgdHlwZSAoYHsgaXNBdXRob3JpemVkOiB0cnVlL2ZhbHNlIH1gKSwgYXMgb3Bwb3NlZCB0byByZXR1cm5pbmcgYW4gSUFNXG4gICAqIFBvbGljeSBkb2N1bWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNwb25zZVR5cGVzOiBhdXRob3JpemVycy5IdHRwTGFtYmRhUmVzcG9uc2VUeXBlW10gPSBbXG4gICAgYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZS5TSU1QTEUsXG4gIF1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQ29nbml0b1VzZXJQb29sT3JCYXNpY0F1dGhBdXRob3JpemVyUHJvcHM8QXV0aFNjb3Blc1Q+LFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICB0aGlzLmxhbWJkYSA9IG5ldyBsYW1iZGFOb2RlanMuTm9kZWpzRnVuY3Rpb24odGhpcywgXCJBdXRob3JpemVyRnVuY3Rpb25cIiwge1xuICAgICAgZW50cnk6IHBhdGguam9pbihcbiAgICAgICAgX19kaXJuYW1lLFxuICAgICAgICBgYXV0aG9yaXplcnMvY29nbml0by11c2VyLXBvb2wtb3ItYmFzaWMtYXV0aC1hdXRob3JpemVyLiR7YXV0aG9yaXplckZpbGVFeHRlbnNpb259YCxcbiAgICAgICksXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgW1wiVVNFUl9QT09MX0lEXCJdOiBwcm9wcy51c2VyUG9vbCA/IHByb3BzLnVzZXJQb29sLnVzZXJQb29sSWQgOiBcIlwiLFxuICAgICAgICBbXCJSRVFVSVJFRF9TQ09QRVwiXTogcHJvcHMucmVxdWlyZWRTY29wZSA/PyBcIlwiLFxuICAgICAgICBbXCJCQVNJQ19BVVRIX0NSRURFTlRJQUxTX1NFQ1JFVF9OQU1FXCJdOlxuICAgICAgICAgIHByb3BzLmJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZVxuICAgICAgICAgICAgPyBwcm9wcy5iYXNpY0F1dGhDcmVkZW50aWFsc1NlY3JldE5hbWVcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGlmIChwcm9wcy5iYXNpY0F1dGhDcmVkZW50aWFsc1NlY3JldE5hbWUpIHtcbiAgICAgIHNlY3JldHNtYW5hZ2VyLlNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKFxuICAgICAgICBzY29wZSxcbiAgICAgICAgaWQgKyBcIkJhc2ljQXV0aFNlY3JldFwiLFxuICAgICAgICBwcm9wcy5iYXNpY0F1dGhDcmVkZW50aWFsc1NlY3JldE5hbWUsXG4gICAgICApLmdyYW50UmVhZCh0aGlzLmxhbWJkYSlcbiAgICB9XG4gIH1cbn1cblxuLyoqIFJldHVybnMgYSBzaG9ydCBzZW1pLXVuaXF1ZSBoYXNoIG9mIHRoZSBnaXZlbiBzdHJpbmcuICovXG5mdW5jdGlvbiBzaG9ydEhhc2goc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBTSEEtMSBpcyBuby1ubyB3aGVuIHdlIG5lZWQgY3J5cHRvZ3JhcGhpYyBzZWN1cml0eSwgYnV0IGhlcmUgd2UganVzdCBpdCBmb3Igc2hvcnRlbmluZyBhIG5hbWUsXG4gIC8vIHdoaWNoIGlzIGZpbmVcbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJzaGExXCIpLnVwZGF0ZShzdHIpLmRpZ2VzdChcImhleFwiKS5zdWJzdHJpbmcoMCwgMTApXG59XG4iXX0=
525
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1hcGktZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGktZ2F0ZXdheS9odHRwLWFwaS1nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sYUFBYSxDQUFBO0FBR2xDLE9BQU8sS0FBSyxNQUFNLE1BQU0sd0JBQXdCLENBQUE7QUFHaEQsT0FBTyxLQUFLLEtBQUssTUFBTSw4QkFBOEIsQ0FBQTtBQUVyRCxPQUFPLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFBO0FBQzFDLE9BQU8sS0FBSyxjQUFjLE1BQU0sZ0NBQWdDLENBQUE7QUFDaEUsT0FBTyxLQUFLLFlBQVksTUFBTSwyQ0FBMkMsQ0FBQTtBQUN6RSxPQUFPLEtBQUssV0FBVyxNQUFNLDBDQUEwQyxDQUFBO0FBRXZFLE9BQU8sS0FBSyxZQUFZLE1BQU0sK0JBQStCLENBQUE7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxLQUFLLENBQUE7QUFDbkMsT0FBTyxFQUFzQixnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUMvRCxPQUFPLEVBQUUsb0JBQW9CLEVBQTZCLE1BQU0sZUFBZSxDQUFBO0FBRS9FLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ2pELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7QUFpYzFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0REc7QUFDSCxNQUFNLE9BQU8sVUFFWCxTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBQzVCLHVFQUF1RTtJQUN2RCxPQUFPLENBQWU7SUFFdEMsa0ZBQWtGO0lBQ2xFLE1BQU0sR0FBc0IsRUFBRSxDQUFBO0lBRTlDLDBDQUEwQztJQUMxQixNQUFNLENBQVE7SUFFOUIsd0JBQXdCO0lBQ1IsUUFBUSxDQUFlO0lBRXRCLEtBQUssQ0FBOEI7SUFFcEQsWUFDRSxLQUEyQixFQUMzQixFQUFVLEVBQ1YsS0FBbUM7UUFFbkMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUNoQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUVsQixVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUV2RCxNQUFNLFlBQVksR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzFFLElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQTtRQUV6QyxJQUFJLFdBQW1ELENBQUE7UUFDdkQsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdkIsV0FBVyxHQUFHO2dCQUNaLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztnQkFDbkIsMEZBQTBGO2dCQUMxRix5RkFBeUY7Z0JBQ3pGLDRGQUE0RjtnQkFDNUYsWUFBWSxFQUFFLENBQUMsZUFBZSxFQUFFLGNBQWMsRUFBRSxHQUFHLENBQUM7Z0JBQ3BELDBGQUEwRjtnQkFDMUYsNkNBQTZDO2dCQUM3Qyx5RkFBeUY7Z0JBQ3pGLFlBQVksRUFBRTtvQkFDWixLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUc7b0JBQ3hCLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSTtvQkFDekIsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHO29CQUN4QixLQUFLLENBQUMsY0FBYyxDQUFDLEtBQUs7b0JBQzFCLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTTtvQkFDM0IsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPO29CQUM1QixLQUFLLENBQUMsY0FBYyxDQUFDLElBQUk7aUJBQzFCO2dCQUNELE1BQU0sRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDN0IsQ0FBQTtRQUNILENBQUM7UUFFRCx1RUFBdUU7UUFDdkUsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUU7WUFDcEUsb0ZBQW9GO1lBQ3BGLFdBQVcsRUFBRSxtQkFBbUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHO1lBQ3ZGLHlCQUF5QixFQUFFLElBQUksRUFBRSx3R0FBd0c7WUFDekksa0JBQWtCLEVBQUUsSUFBSTtZQUN4QixvQkFBb0IsRUFBRSxFQUFFLFVBQVUsRUFBRSxZQUFZLENBQUMsZUFBZSxFQUFFO1lBQ2xFLGFBQWEsRUFBRSxXQUFXO1lBQzFCLEdBQUcsS0FBSyxFQUFFLGFBQWEsRUFBRSxPQUFPO1NBQ2pDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFBO1FBRWxCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQThCLENBQUE7UUFFbkUsTUFBTSxJQUFJLEdBQUcsSUFBSSxvQkFBb0IsQ0FDbkMsSUFBSSxFQUNKLFlBQVksRUFDWixLQUFLLEVBQ0wsS0FBSyxDQUFDLFVBQVUsQ0FDakIsQ0FBQTtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQTtRQUU3QixLQUFLLENBQUMsb0JBQW9CLEdBQUc7WUFDM0IsR0FBRyxLQUFLLENBQUMsb0JBQW9CO1lBQzdCLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxlQUFlLElBQUksSUFBSTtZQUNyRCxvQkFBb0IsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSwrQkFBK0I7WUFDOUUsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsZ0NBQWdDO1NBQzlFLENBQUE7UUFFRCxNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxrQkFBa0I7WUFDakQsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUM3RCxDQUFDLENBQUMsU0FBUyxDQUFBO1FBRWIsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsb0JBQW9CO1lBQ2xELENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDO1lBQ3hFLENBQUMsQ0FBQyxTQUFTLENBQUE7UUFFYixLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQyxJQUFJLFdBQXVDLENBQUE7WUFDM0MsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3RCLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDcEUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFdBQVcsR0FBRyxrQkFBbUIsQ0FBQSxDQUFDLDRCQUE0QjtZQUNoRSxDQUFDO1lBRUQsSUFBSSxVQUFrRCxDQUFBO1lBQ3RELElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN4QixVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQjtnQkFDaEMsMEZBQTBGO2dCQUMxRixxRUFBcUU7Z0JBQ3JFLGtCQUFrQixTQUFTLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUNuRSxLQUFLLENBQUMsYUFBYSxDQUNwQixDQUFBO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQTtZQUNoQyxDQUFDO1lBRUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDL0IsSUFBSSxLQUFLLENBQUMsZUFBZSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNuQywwRkFBMEY7Z0JBQzFGLHdGQUF3RjtnQkFDeEYscUVBQXFFO2dCQUNyRSxVQUFVLENBQUMsSUFBSSxDQUNiLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQzFELENBQUE7WUFDSCxDQUFDO1lBRUQsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDbkMsbUZBQW1GO2dCQUNuRiw0RkFBNEY7Z0JBQzVGLHVGQUF1RjtnQkFDdkYsMkZBQTJGO2dCQUMzRixvRkFBb0Y7Z0JBQ3BGLGdGQUFnRjtnQkFDaEYsTUFBTSxPQUFPLEdBQ1gsU0FBUyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsU0FBUyxFQUFFLENBQUE7Z0JBRXhFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFO29CQUNqQyxPQUFPLEVBQUUsR0FBRztvQkFDWixXQUFXLEVBQUUsV0FBVztvQkFDeEIsVUFBVSxFQUFFLFVBQVU7b0JBQ3RCLFFBQVEsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDL0IsU0FBUyxFQUNULEtBQUssQ0FBQyxNQUFNO3dCQUNWLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7d0JBQ2hDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FDekI7aUJBQ0YsQ0FBQyxDQUNILENBQUE7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsb0JBQW9CO0lBQ1osTUFBTSxDQUFDLGFBQWEsQ0FDMUIsS0FBc0IsRUFDdEIsRUFBVSxFQUNWLEtBQWdCO1FBRWhCLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3BELE1BQU0sSUFBSSxLQUFLLENBQ2IscUNBQXFDLEtBQUssQ0FBQyxJQUFJLHlEQUF5RCxDQUN6RyxDQUFBO1lBQ0gsQ0FBQztZQUNELElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3hELE1BQU0sSUFBSSxLQUFLLENBQ2IsdUNBQXVDLEtBQUssQ0FBQyxJQUFJLDJEQUEyRCxDQUM3RyxDQUFBO1lBQ0gsQ0FBQztZQUNELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLElBQUksS0FBSyxDQUNiLGlCQUFpQixLQUFLLENBQUMsSUFBSSxzREFBc0QsQ0FDbEYsQ0FBQTtZQUNILENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sSUFBSSxLQUFLLENBQ2IsaUJBQWlCLEtBQUssQ0FBQyxJQUFJLGlEQUFpRCxDQUM3RSxDQUFBO1lBQ0gsQ0FBQztZQUNELElBQ0UsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssS0FBSztnQkFDakMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUMvQyxDQUFDO2dCQUNELE1BQU0sSUFBSSxLQUFLLENBQ2IsbUVBQW1FLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQ2hHLENBQUE7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BFLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0RBQWtELEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQ3hFLENBQUE7UUFDSCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUM5RCxPQUFPLENBQUMsSUFBSSxDQUNWLG1DQUFtQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssMEZBQTBGLEVBQ25KLEtBQUssRUFDTCxFQUFFLENBQ0gsQ0FBQTtRQUNILENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDO1lBQzdELE9BQU8sQ0FBQyxJQUFJLENBQ1Ysa0NBQWtDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSwwRkFBMEYsRUFDakosS0FBSyxFQUNMLEVBQUUsQ0FDSCxDQUFBO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxnQkFBZ0IsQ0FDdEIsRUFBVSxFQUNWLGFBQThDO1FBRTlDLFFBQVEsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNCLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDWixPQUFPLFNBQVMsQ0FBQTtZQUNsQixDQUFDO1lBQ0QsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNYLGtHQUFrRztnQkFDbEcseUVBQXlFO2dCQUN6RSw4SUFBOEk7Z0JBQzlJLDhKQUE4SjtnQkFDOUosT0FBTyxJQUFJLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1lBQzVDLENBQUM7WUFDRCxLQUFLLG1CQUFtQixDQUFDLENBQUMsQ0FBQztnQkFDekIsMEZBQTBGO2dCQUMxRix1RkFBdUY7Z0JBQ3ZGLE1BQU0sVUFBVSxHQUFHLElBQUkseUJBQXlCLENBQzlDLElBQUksRUFDSixFQUFFLEdBQUcsUUFBUSxFQUNiLGFBQWEsQ0FDZCxDQUFBO2dCQUVELE9BQU8sSUFBSSxXQUFXLENBQUMsb0JBQW9CLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUU7b0JBQ2pFLGFBQWEsRUFBRSxVQUFVLENBQUMsYUFBYTtvQkFDdkMseUZBQXlGO29CQUN6RixlQUFlLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2lCQUN2QyxDQUFDLENBQUE7WUFDSixDQUFDO1lBQ0QsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixNQUFNLFVBQVUsR0FBRyxJQUFJLG1CQUFtQixDQUN4QyxJQUFJLEVBQ0osRUFBRSxHQUFHLFFBQVEsRUFDYixhQUFhLENBQ2QsQ0FBQTtnQkFFRCxPQUFPLElBQUksV0FBVyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFO29CQUNqRSxhQUFhLEVBQUUsVUFBVSxDQUFDLGFBQWE7b0JBQ3ZDLHlGQUF5RjtvQkFDekYsZUFBZSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztpQkFDMUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQztZQUNELEtBQUssaUNBQWlDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxNQUFNLFVBQVUsR0FBRyxJQUFJLG9DQUFvQyxDQUN6RCxJQUFJLEVBQ0osRUFBRSxHQUFHLFFBQVEsRUFDYixhQUFhLENBQ2QsQ0FBQTtnQkFFRCxPQUFPLElBQUksV0FBVyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFO29CQUNqRSxhQUFhLEVBQUUsVUFBVSxDQUFDLGFBQWE7b0JBQ3ZDLHlGQUF5RjtvQkFDekYsZUFBZSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDdkMsQ0FBQyxDQUFBO1lBQ0osQ0FBQztZQUNELEtBQUssMEJBQTBCLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxPQUFPLElBQUksV0FBVyxDQUFDLG9CQUFvQixDQUN6QyxFQUFFLEVBQ0YsYUFBYSxDQUFDLGdCQUFnQixFQUM5QjtvQkFDRSxHQUFHLGFBQWEsQ0FBQyxlQUFlO29CQUNoQyxhQUFhLEVBQUUsYUFBYSxDQUFDLGVBQWUsRUFBRSxhQUFhLElBQUk7d0JBQzdELFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNO3FCQUMxQztvQkFDRCxlQUFlLEVBQ2IsYUFBYSxDQUFDLGVBQWUsRUFBRSxlQUFlO3dCQUM5QyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7aUJBQ3hCLENBQ0YsQ0FBQTtZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLGlCQUFpQixDQUN2QixXQUE2QixFQUM3QixHQUEyQjtRQUUzQixRQUFRLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6QixLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ1gseUZBQXlGO2dCQUN6RiwwRUFBMEU7Z0JBQzFFLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFO29CQUNwRCxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7b0JBQ3BCLGNBQWMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUM7b0JBQzNDLE9BQU8sRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxFQUFFLDZDQUE2QztpQkFDeEYsQ0FBQyxDQUFBO2dCQUVGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLEVBQUU7b0JBQ25ELCtDQUErQztxQkFDOUMsZUFBZSxDQUNkLE1BQU07Z0JBQ04sNkVBQTZFO2dCQUM3RSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQ2hELENBQUE7Z0JBQ0gsSUFBSSxXQUFXLENBQUMsYUFBYSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUM1QyxXQUFXLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUE7Z0JBQzdDLENBQUM7Z0JBRUQsT0FBTyxJQUFJLFlBQVksQ0FBQyxrQkFBa0IsQ0FDeEMsaUJBQWlCLEdBQUcsR0FBRyxDQUFDLFNBQVMsRUFDakMsV0FBVyxDQUFDLG9CQUFvQixFQUNoQztvQkFDRSxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsUUFBUTtvQkFDdEMsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLE1BQU0sRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUc7b0JBQzVCLGdCQUFnQjtpQkFDakIsQ0FDRixDQUFBO1lBQ0gsQ0FBQztZQUNELEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDZCxPQUFPLElBQUksWUFBWSxDQUFDLHFCQUFxQixDQUMzQyxtQkFBbUIsRUFDbkIsV0FBVyxDQUFDLE1BQU0sRUFDbEI7b0JBQ0Usb0JBQW9CLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFdBQVc7b0JBQzVELGdCQUFnQixFQUFFLFNBQVM7aUJBQzVCLENBQ0YsQ0FBQTtZQUNILENBQUM7WUFDRCxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ1gsZ0RBQWdEO2dCQUNoRCxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQ3ZCLElBQUksRUFDSixVQUFVLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsYUFBYSxFQUNoRDtvQkFDRSxXQUFXLEVBQ1QsbUNBQW1DLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRO29CQUNsRSxTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUM7aUJBQ2hFLENBQ0YsQ0FBQTtnQkFDRCxXQUFXLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUV6QyxJQUFJLGdCQUFnQixHQUFHLElBQUksS0FBSyxDQUFDLGdCQUFnQixFQUFFO29CQUNqRCx5SUFBeUk7cUJBQ3hJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7cUJBQzlDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsZUFBZSxDQUFDO3FCQUN0QyxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFBLENBQUMscURBQXFEO2dCQUV0RixJQUFJLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUNsQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQ3hDLG1CQUFtQixFQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUM5QyxDQUFBO2dCQUNILENBQUM7Z0JBRUQsT0FBTyxJQUFJLG1CQUFtQixDQUFDLGdCQUFnQixFQUFFO29CQUMvQyxJQUFJLEVBQUUsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFNBQVM7b0JBQ3pDLE9BQU8sRUFBRSxLQUFLLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCO29CQUN0RCxXQUFXLEVBQUUsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ3hELGdCQUFnQixFQUFFLGdCQUFnQjtvQkFDbEMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFdBQVc7aUJBQzdELENBQUMsQ0FBQTtZQUNKLENBQUM7WUFDRCxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLG9FQUFvRTtnQkFDcEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUN2QixJQUFJLEVBQ0osVUFBVSxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLGFBQWEsRUFDbkQ7b0JBQ0UsV0FBVyxFQUFFLGtDQUFrQyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRTtvQkFDakYsU0FBUyxFQUFFLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLDBCQUEwQixDQUFDO2lCQUNoRSxDQUNGLENBQUE7Z0JBQ0QsV0FBVyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFFM0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDbkQsNkZBQTZGO3FCQUM1RixNQUFNLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO3FCQUN6RCxNQUFNLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQztxQkFDakMsTUFBTSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsVUFBVSxDQUFDO3FCQUM1QyxNQUFNLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUE7Z0JBRXJDLE9BQU8sSUFBSSwyQkFBMkIsQ0FBQyx3QkFBd0IsRUFBRTtvQkFDL0QsSUFBSSxFQUFFLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTO29CQUN6QyxPQUFPLEVBQUUsS0FBSyxDQUFDLHNCQUFzQixDQUFDLHNCQUFzQjtvQkFDNUQsV0FBVyxFQUFFLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO29CQUN4RCxnQkFBZ0IsRUFBRSxnQkFBZ0I7b0JBQ2xDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXO2lCQUM3RCxDQUFDLENBQUE7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFdBQVcsQ0FBQyxNQUFzQjtRQUN2QyxLQUFLLE1BQU0sVUFBVSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0MsTUFBTSxRQUFRLEdBQ1osVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUE7WUFFekUsSUFBSSxRQUFRLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQ2IsK0VBQStFLFFBQVEsZUFBZSxVQUFVLENBQUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUM1SixDQUFBO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzNCLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRCxvR0FBb0c7QUFDcEcsTUFBTSxtQkFBb0IsU0FBUSxLQUFLLENBQUMsb0JBQW9CO0lBU2hEO0lBUlY7Ozs7O09BS0c7SUFDSCxZQUNFLEVBQVUsRUFDRixnQkFBa0Q7UUFFMUQsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRkQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQztJQUc1RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSTtRQUNGLDRCQUE0QjtRQUM1QixpSkFBaUo7UUFDakosT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUE7SUFDOUIsQ0FBQztDQUNGO0FBRUQsNkdBQTZHO0FBQzdHLE1BQU0sMkJBQTRCLFNBQVEsS0FBSyxDQUFDLG9CQUFvQjtJQVN4RDtJQVJWOzs7OztPQUtHO0lBQ0gsWUFDRSxFQUFVLEVBQ0YsZ0JBQWtEO1FBRTFELEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUZELHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0M7SUFHNUQsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUk7UUFDRiw0QkFBNEI7UUFDNUIsaUpBQWlKO1FBQ2pKLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFBO0lBQzlCLENBQUM7Q0FDRjtBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLHVCQUF1QixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7SUFDbkUsQ0FBQyxDQUFDLElBQUk7SUFDTixDQUFDLENBQUMsSUFBSSxDQUFBO0FBRVI7OztHQUdHO0FBQ0gsTUFBTSx5QkFFSixTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBQ1osTUFBTSxDQUFrQjtJQUV4Qzs7O09BR0c7SUFDYSxhQUFhLEdBQXlDO1FBQ3BFLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNO0tBQzFDLENBQUE7SUFFRCxZQUNFLEtBQTJCLEVBQzNCLEVBQVUsRUFDVixLQUFrRDtRQUVsRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUN4RSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FDZCxTQUFTLEVBQ1QsNENBQTRDLHVCQUF1QixFQUFFLENBQ3RFO1lBQ0QsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVztZQUNuQyxPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLFdBQVcsRUFBRTtnQkFDWCxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVTtnQkFDM0MsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEtBQUssQ0FBQyxhQUFhLElBQUksRUFBRTtnQkFDN0MsQ0FBQyx3Q0FBd0MsQ0FBQyxFQUN4QyxLQUFLLENBQUMsbUNBQW1DO29CQUN2QyxDQUFDLENBQUMsS0FBSyxDQUFDLG1DQUFtQztvQkFDM0MsQ0FBQyxDQUFDLEVBQUU7YUFDVDtTQUNGLENBQUMsQ0FBQTtRQUVGLElBQUksS0FBSyxDQUFDLG1DQUFtQyxFQUFFLENBQUM7WUFDOUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDcEMsS0FBSyxFQUNMLEVBQUUsR0FBRyxpQkFBaUIsRUFDdEIsS0FBSyxDQUFDLG1DQUFtQyxDQUMxQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDMUIsQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILE1BQU0sbUJBQW9CLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFDcEMsTUFBTSxDQUFrQjtJQUV4QywyRkFBMkY7SUFDM0UsYUFBYSxHQUF5QztRQUNwRSxXQUFXLENBQUMsc0JBQXNCLENBQUMsTUFBTTtLQUMxQyxDQUFBO0lBRUQsWUFDRSxLQUEyQixFQUMzQixFQUFVLEVBQ1YsS0FBK0I7UUFFL0IsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVoQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7WUFDckUsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQ2QsU0FBUyxFQUNULHFDQUFxQyx1QkFBdUIsRUFBRSxDQUMvRDtZQUNELFdBQVcsRUFDVCw4RUFBOEU7WUFDaEYsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVztZQUNuQyxXQUFXLEVBQUU7Z0JBQ1gsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxxQkFBcUI7b0JBQ3RELENBQUMsQ0FBQyxLQUFLLENBQUMscUJBQXFCO29CQUM3QixDQUFDLENBQUMsRUFBRTthQUNQO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsY0FBYyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDcEMsS0FBSyxFQUNMLEVBQUUsR0FBRyxpQkFBaUIsRUFDdEIsS0FBSyxDQUFDLHFCQUFxQixDQUM1QixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDMUIsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLG9DQUVKLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFDWixNQUFNLENBQWtCO0lBRXhDOzs7T0FHRztJQUNhLGFBQWEsR0FBeUM7UUFDcEUsV0FBVyxDQUFDLHNCQUFzQixDQUFDLE1BQU07S0FDMUMsQ0FBQTtJQUVELFlBQ0UsS0FBMkIsRUFDM0IsRUFBVSxFQUNWLEtBQTZEO1FBRTdELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFO1lBQ3hFLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUNkLFNBQVMsRUFDVCwwREFBMEQsdUJBQXVCLEVBQUUsQ0FDcEY7WUFDRCxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBQ25DLE9BQU8sRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDaEMsV0FBVyxFQUFFO2dCQUNYLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2pFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxLQUFLLENBQUMsYUFBYSxJQUFJLEVBQUU7Z0JBQzdDLENBQUMsb0NBQW9DLENBQUMsRUFDcEMsS0FBSyxDQUFDLDhCQUE4QjtvQkFDbEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyw4QkFBOEI7b0JBQ3RDLENBQUMsQ0FBQyxFQUFFO2FBQ1Q7U0FDRixDQUFDLENBQUE7UUFFRixJQUFJLEtBQUssQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1lBQ3pDLGNBQWMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQ3BDLEtBQUssRUFDTCxFQUFFLEdBQUcsaUJBQWlCLEVBQ3RCLEtBQUssQ0FBQyw4QkFBOEIsQ0FDckMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzFCLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRCw0REFBNEQ7QUFDNUQsU0FBUyxTQUFTLENBQUMsR0FBVztJQUM1QixpR0FBaUc7SUFDakcsZ0JBQWdCO0lBQ2hCLE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUN0RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB0eXBlICogYXMgZWxiIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiXG5pbXBvcnQgdHlwZSAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiXG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0IHR5cGUgKiBhcyBzcXMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zcXNcIlxuaW1wb3J0IHR5cGUgKiBhcyBldmVudHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIlxuaW1wb3J0ICogYXMgYXBpZ3cgZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5djJcIlxuaW1wb3J0ICogYXMgbG9ncyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIlxuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCJcbmltcG9ydCAqIGFzIHNlY3JldHNtYW5hZ2VyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIlxuaW1wb3J0ICogYXMgaW50ZWdyYXRpb25zIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyLWludGVncmF0aW9uc1wiXG5pbXBvcnQgKiBhcyBhdXRob3JpemVycyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2Mi1hdXRob3JpemVyc1wiXG5pbXBvcnQgdHlwZSB7IElVc2VyUG9vbCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY29nbml0b1wiXG5pbXBvcnQgKiBhcyBsYW1iZGFOb2RlanMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCJcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCJcbmltcG9ydCB7IHRhZ1Jlc291cmNlcyB9IGZyb20gXCIuLi90YWdzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJ1cmxcIlxuaW1wb3J0IHsgQXBpR2F0ZXdheURuc1Byb3BzLCBBcGlHYXRld2F5RG9tYWluIH0gZnJvbSBcIi4vZG9tYWluXCJcbmltcG9ydCB7IEFwaUdhdGV3YXlBY2Nlc3NMb2dzLCBBcGlHYXRld2F5QWNjZXNzTG9nc1Byb3BzIH0gZnJvbSBcIi4vYWNjZXNzLWxvZ3NcIlxuXG5jb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpXG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoX19maWxlbmFtZSlcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIHtAbGluayBBcGlHYXRld2F5fSBjb25zdHJ1Y3QuXG4gKlxuICogQGF1dGhvciBLcmlzdGlhbiBSZWtzdGFkIDxrcmVAY2FwcmFjb25zdWx0aW5nLm5vPlxuICogQGF1dGhvciBIZXJtYW5uIE3DuHJrcmlkIDxoZW1AbGlmbGlnLm5vPlxuICovXG5leHBvcnQgdHlwZSBBcGlHYXRld2F5UHJvcHM8QXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0ge1xuICAvKiogU2V0dGluZ3MgZm9yIHRoZSBleHRlcm5hbC1mYWNpbmcgcGFydCBvZiB0aGUgQVBJLUdXLiAqL1xuICBkbnM6IEFwaUdhdGV3YXlEbnNQcm9wc1xuXG4gIC8qKlxuICAgKiBJZiBubyBpbnRlZ3JhdGlvbiBpcyBzcGVjaWZpZWQgZm9yIGEgcm91dGUsIHRoaXMgaW50ZWdyYXRpb24gaXMgdXNlZC5cbiAgICpcbiAgICogU2VlIHtAbGluayBJbnRlZ3JhdGlvblByb3BzfSBmb3IgdGhlIGF2YWlsYWJsZSBvcHRpb25zLlxuICAgKi9cbiAgZGVmYXVsdEludGVncmF0aW9uPzogSW50ZWdyYXRpb25Qcm9wc1xuXG4gIC8qKlxuICAgKiBJZiBubyBhdXRob3JpemF0aW9uIGlzIHNwZWNpZmllZCBmb3IgYSByb3V0ZSwgdGhpcyBhdXRob3JpemF0aW9uIGlzIHVzZWQuXG4gICAqXG4gICAqIFNlZSB7QGxpbmsgQXV0aG9yaXphdGlvblByb3BzfSBmb3IgdGhlIGF2YWlsYWJsZSBvcHRpb25zLlxuICAgKi9cbiAgZGVmYXVsdEF1dGhvcml6YXRpb24/OiBBdXRob3JpemF0aW9uUHJvcHM8QXV0aFNjb3Blc1Q+XG5cbiAgcm91dGVzOiBBcGlHYXRld2F5Um91dGU8QXV0aFNjb3Blc1Q+W11cblxuICAvKipcbiAgICogVGhlIEFQSS1HVyBhY2Nlc3MgbG9ncyBmb3IgdGhlIGAkZGVmYXVsdGAgc3RhZ2UgYXJlIGtlcHQuXG4gICAqIFRoaXMgaGFzIG9wdGlvbnMgZm9yIHRoZSBsb2dzLlxuICAgKi9cbiAgYWNjZXNzTG9ncz86IEFwaUdhdGV3YXlBY2Nlc3NMb2dzUHJvcHNcblxuICAvKipcbiAgICogU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgcm91dGUtbGV2ZWwgbWV0cmljcy5cbiAgICogVGhpcyBjYW4gaW5jcmVhc2UgQ2xvdWRXYXRjaCBjb3N0cyB3aGVuIG5vdCBkaXNhYmxlZC5cbiAgICpcbiAgICogU2VlIFtBV1M6IFdvcmtpbmcgd2l0aCBtZXRyaWNzIGZvciBIVFRQIEFQSXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1tZXRyaWNzLmh0bWw/aWNtcGlkPWFwaWdhdGV3YXlfY29uc29sZV9oZWxwIzp+OnRleHQ9YW5kJTIwc3RhZ2UlMjBJRC4tLEFwaUlkJTJDJTIwU3RhZ2UlMkMlMjBSb3V0ZSwtRmlsdGVycyUyMEFQSSUyMEdhdGV3YXkpXG4gICAqIGZvciBtb3JlIGluZm8uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGRldGFpbGVkTWV0cmljcz86IGJvb2xlYW5cblxuICAvKipcbiAgICogVGhyb3R0bGluZyBvZiByZXF1ZXN0cy5cbiAgICogSWYgbm90IHNldCwgdGhlIEFXUyBkZWZhdWx0IG9mIDUwMDAgYnVyc3QgYW5kIDEwMDAwIHJhdGUgaXMgdXNlZC5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgdGhyb3R0bGluZyBpcyBwZXItYWNjb3VudCwgYW5kIGNvdW50cyBhbGwgQVBJcyBpbiB0aGUgYWNjb3VudCBhbmQgcmVnaW9uLlxuICAgKiBJZiB5b3UgaGF2ZSBhbm90aGVyIEFQSSBpbiB0aGlzIHJlZ2lvbiBnZXR0aW5nIDEwXzAwMCByZXF1ZXN0IHJhdGUsIGl0IG1heSBpbXBhY3QgdGhpcyBBUEkgYXMgd2VsbC5cbiAgICovXG4gIHRocm90dGxpbmc/OiB7XG4gICAgLyoqXG4gICAgICogR29pbmcgb3ZlciBgNV8wMDBgIG1heSByZXF1aXJlIHlvdSB0byBjb250YWN0IEFXUyBTdXBwb3J0IC0gdGhleSBhcmUgYWNjb3VudCBib3VuZC5cbiAgICAgKi9cbiAgICBidXJzdD86IG51bWJlclxuICAgIC8qKlxuICAgICAqIEdvaW5nIG92ZXIgYDEwXzAwMGAgbWF5IHJlcXVpcmUgeW91IHRvIGNvbnRhY3QgQVdTIFN1cHBvcnQgLSB0aGV5IGFyZSBhY2NvdW50IGJvdW5kLlxuICAgICAqL1xuICAgIHJhdGU/OiBudW1iZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIENPUlMgaGVhZGVycyBvbiByZXNwb25zZXMgZnJvbSB0aGUgQVBJIEdhdGV3YXkgdG8gYWxsb3cgYWxsIG9yaWdpbnMsIGhlYWRlcnMgYW5kIG1ldGhvZHMuXG4gICAqIFVzZWZ1bCBpZiB5b3VyIEFQSSBzaG91bGQgYmUgYWNjZXNzZWQgYnkgYW55IGJyb3dzZXIuXG4gICAqL1xuICBjb3JzQWxsb3dBbGw/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIElmIHNvbWUgc2V0dGluZ3MgaW4gdGhpcyBjb25zdHJ1Y3QgZG8gbm90IHdvcmsgZm9yIHlvdSwgdGhpcyBpcyBhbiBlc2NhcGUgaGF0Y2ggbWVjaGFuaXNtIHRvXG4gICAqIG92ZXJyaWRlIGFueXRoaW5nLlxuICAgKi9cbiAgcHJvcHNPdmVycmlkZT86IHtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSBzZXR0aW5ncyBmb3IgdGhlIHtAbGluayBhcGlndy5IdHRwQXBpfSAoYWNjZXNzaWJsZSBpbiB7QGxpbmsgQXBpR2F0ZXdheS5odHRwQXBpfSkuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBmcm9udGVuZCBhY2Nlc3NpbmcgdGhpcyBBUEksIHlvdSBtaWdodCB3YW50IHRvIHNldFxuICAgICAqIFtDT1JTIHByZWZsaWdodF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nkay9hcGkvdjEvZG9jcy9hd3MtYXBpZ2F0ZXdheXYyLXJlYWRtZS5odG1sI2Nyb3NzLW9yaWdpbi1yZXNvdXJjZS1zaGFyaW5nLWNvcnMpXG4gICAgICogc2V0dGluZ3MuXG4gICAgICovXG4gICAgaHR0cEFwaT86IFBhcnRpYWw8YXBpZ3cuSHR0cEFwaVByb3BzPlxuICB9XG59XG5cbmV4cG9ydCB0eXBlIEFwaUdhdGV3YXlSb3V0ZTxBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XG4gIC8qKiBUaGUgcGF0aCBvZiB0aGUgcm91dGUgdG8gZXhwb3NlIHRocm91Z2ggdGhlIEFQSSBHYXRld2F5LiBVc2UgXCIvXCIgZm9yIHRoZSByb290IHJvdXRlLiAqL1xuICBwYXRoOiBzdHJpbmdcblxuICAvKipcbiAgICogQnkgZGVmYXVsdCwgd2Ugb25seSBmb3J3YXJkIHJlcXVlc3RzIHRoYXQgbWF0Y2ggdGhlIHJvdXRlJ3MgcGF0aCBleGFjdGx5LiBTbyBmb3IgYSByb3V0ZSB3aXRoXG4gICAqIHBhdGggYC9hcGkvdXNlcnNgLCBhIHJlcXVlc3QgdG8gYC9hcGkvdXNlcnNgIHdpbGwgYmUgZm9yd2FyZGVkLCBidXQgYSByZXF1ZXN0IHRvXG4gICAqIGAvYXBpL3VzZXJzL2FkbWluYCB3aWxsIG5vdC4gSWYgeW91IHdhbnQgdG8gZm9yd2FyZCByZXF1ZXN0cyB0byBhbGwgc3ViLXBhdGhzIHVuZGVyIHRoZSByb3V0ZSdzXG4gICAqIHBhdGgsIHlvdSBjYW4gc2V0IHRoaXMgdG8gdHJ1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGluY2x1ZGVTdWJwYXRocz86IGJvb2xlYW5cblxuICAvKipcbiAgICogVGhlIEhUVFAgbWV0aG9kIHRvIGV4cG9zZS4gYEFOWWAgZXhwb3NlcyBhbGwgSFRUUCBtZXRob2RzIG9uIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIkFOWVwiXG4gICAqL1xuICBtZXRob2Q/OiBIdHRwTWV0aG9kXG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlZ3JhdGlvbiB0aGF0IHRoZSByb3V0ZSB3aWxsIGZvcndhcmQgdG8uIFNlZSB7QGxpbmsgSW50ZWdyYXRpb25Qcm9wc30gZm9yIHRoZSBhdmFpbGFibGVcbiAgICogb3B0aW9ucy5cbiAgICpcbiAgICogSWYgdW5kZWZpbmVkLCB1c2VzIHRoZSB7QGxpbmsgQXBpR2F0ZXdheVByb3BzLmRlZmF1bHRJbnRlZ3JhdGlvbn0uXG4gICAqL1xuICBpbnRlZ3JhdGlvbj86IEludGVncmF0aW9uUHJvcHNcblxuICAvKipcbiAgICogSG93IHJlcXVlc3RzIG9uIHRoZSByb3V0ZSBhcmUgYXV0aGVudGljYXRlZC4gU2VlIHtAbGluayBBdXRob3JpemF0aW9uUHJvcHN9IGZvciB0aGUgYXZhaWxhYmxlXG4gICAqIG9wdGlvbnMuXG4gICAqXG4gICAqIElmIHVuZGVmaW5lZCwgdXNlcyB0aGUge0BsaW5rIEFwaUdhdGV3YXlQcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvbn0uXG4gICAqL1xuICBhdXRob3JpemF0aW9uPzogQXV0aG9yaXphdGlvblByb3BzPEF1dGhTY29wZXNUPlxufVxuXG5leHBvcnQgdHlwZSBIdHRwTWV0aG9kID1cbiAgfCBcIkFOWVwiXG4gIHwgXCJHRVRcIlxuICB8IFwiUE9TVFwiXG4gIHwgXCJQVVRcIlxuICB8IFwiUEFUQ0hcIlxuICB8IFwiREVMRVRFXCJcbiAgfCBcIk9QVElPTlNcIlxuICB8IFwiSEVBRFwiXG5cbmV4cG9ydCB0eXBlIEludGVncmF0aW9uUHJvcHMgPVxuICAvKiogVXNlIHRoaXMgd2hlbiBjb25uZWN0aW5nIHRoZSByb3V0ZSB0byBhbiBBTEIgKEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIpLiAqL1xuICB8ICh7IHR5cGU6IFwiQUxCXCIgfSAmIEFsYkludGVncmF0aW9uUHJvcHMpXG4gIC8qKiBVc2UgdGhpcyB3aGVuIGNvbm5lY3Rpbmcgcm91dGUgdG8gYSBMYW1iZGEuICovXG4gIHwgKHsgdHlwZTogXCJMYW1iZGFcIiB9ICYgTGFtYmRhSW50ZWdyYXRpb25Qcm9wcylcbiAgLyoqIFVzZSB0aGlzIHdoZW4gY29ubmVjdGluZyBhIHJvdXRlIHRvIHNlbmQgdG8gYW4gU1FTIHF1ZXVlLiAqL1xuICB8ICh7IHR5cGU6IFwiU1FTXCIgfSAmIFNxc0ludGVncmF0aW9uUHJvcHMpXG4gIC8qKiBVc2UgdGhpcyB3aGVuIGNvbm5lY3RpbmcgYSByb3V0ZSB0byBzZW5kIHRvIGFuIEV2ZW50QnJpZGdlIGV2ZW50IGJ1cy4gKi9cbiAgfCAoeyB0eXBlOiBcIkV2ZW50QnJpZGdlXCIgfSAmIEV2ZW50QnJpZGdlSW50ZWdyYXRpb25Qcm9wcylcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIEFQSS1HVyAtPiBBTEIgKEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIpIGludGVncmF0aW9uLlxuICpcbiAqIFNlZSB0aGUgbm90ZSBvbiB7QGxpbmsgQXBpR2F0ZXdheX0gYWJvdXQgdGhlIGxvYWQgYmFsYW5jZXIgc2VjdXJpdHkgZ3JvdXAuXG4gKi9cbmV4cG9ydCB0eXBlIEFsYkludGVncmF0aW9uUHJvcHMgPSB7XG4gIC8qKlxuICAgKiBBIGxpc3RlbmVyIG9uIGUuZy4gcG9ydCA0NDMgKEhUVFBTKS5cbiAgICpcbiAgICogU2VlIHRoZSBub3RlIG9uIHtAbGluayBBcGlHYXRld2F5fSBhYm91dCB0aGUgbG9hZCBiYWxhbmNlciBzZWN1cml0eSBncm91cC5cbiAgICovXG4gIGxvYWRCYWxhbmNlckxpc3RlbmVyOiBlbGIuSUFwcGxpY2F0aW9uTGlzdGVuZXJcblxuICAvKipcbiAgICogVGhlIGhvc3QgbmFtZSAoZG9tYWluIG5hbWUpIG9mIHRoZSBiYWNrZW5kIHNlcnZpY2UgdGhhdCB3ZSB3YW50IHRvIHJlYWNoIHRocm91Z2ggdGhlIEFMQi5cbiAgICpcbiAgICogVGhpcyBpcyB1c2VkIHRvOlxuICAgKiAtIFZlcmlmeSB0aGUgSFRUUFMgY2VydGlmaWNhdGUgb2YgdGhlIGJhY2tlbmQgc2VydmljZSwgc28gdGhhdCB0aGUgcmVxdWVzdCBmb3J3YXJkZWQgZnJvbVxuICAgKiAgIEFQSS1HVyBjYW4gdXNlIFRMU1xuICAgKiAtIFNldCB0aGUgYEhvc3RgIGhlYWRlciBvbiB0aGUgcmVxdWVzdCB3aGVuIGZvcndhcmRpbmcgdG8gdGhlIEFMQiwgc28gdGhhdCByZXF1ZXN0cyBjYW4gYmVcbiAgICogICByb3V0ZWQgdG8gdGhlIGNvcnJlY3QgVGFyZ2V0IEdyb3VwXG4gICAqXG4gICAqIEV4YW1wbGUgdmFsdWU6IGA8c2VydmljZT4uc3RhZ2luZy5teS1wcm9qZWN0LmxpZmxpZy5pb2AgKG5vdCBwcmVmaXhlZCBieSBgaHR0cHM6Ly9gKS5cbiAgICovXG4gIGhvc3ROYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogVGhlIFZQQyB1c2VkIGJ5IHRoZSBBTEIuIFRoZSBBUEktR1cgaW50ZWdyYXRpb24gd2lsbCBjb25uZWN0IHRvIHRoZSBBTEIgdXNpbmcgYSBWUEMgTGluayBmb3JcbiAgICogdGhpcyBWUEMuXG4gICAqXG4gICAqIFNlZSB0aGUgbm90ZSBvbiB7QGxpbmsgQXBpR2F0ZXdheX0gYWJvdXQgdGhlIGxvYWQgYmFsYW5jZXIgc2VjdXJpdHkgZ3JvdXAuXG4gICAqL1xuICB2cGM6IGVjMi5JVnBjXG5cbiAgLyoqXG4gICAqIEEgc2VjdXJpdHkgZ3JvdXAgKFNHKSB0aGF0IGFsbG93cyBpbmNvbWluZyB0cmFmZmljIHRvIHRoZSBBTEIuIFdpbGwgYmUgdXNlZCBieSB0aGUgVlBDIGxpbmssIHNvXG4gICAqIHRoZSBBUEktR1cgaW50ZWdyYXRpb24gY2FuIGNvbm5lY3QuXG4gICAqXG4gICAqIFRoaXMgaXMgdXN1YWxseSB0aGUgc2FtZSBTRyBhcyB0aGUgQUxCIHVzZXMsIGJlY2F1c2UgdGhleSBoYXZlIGEgcnVsZSB0aGF0IGFsbG93cyB0cmFmZmljIGZyb21cbiAgICogb3RoZXJzIGluIHRoZSBzYW1lIFNHLlxuICAgKlxuICAgKiBTZWUgdGhlIG5vdGUgb24ge0BsaW5rIEFwaUdhdGV3YXl9IGFib3V0IHRoZSBsb2FkIGJhbGFuY2VyIHNlY3VyaXR5IGdyb3VwLlxuICAgKi9cbiAgc2VjdXJpdHlHcm91cDogZWMyLklTZWN1cml0eUdyb3VwXG5cbiAgLyoqXG4gICAqIE1hcCByZXF1ZXN0IHBhcmFtZXRlcnMgKGFkZC9vdmVyd3JpdGUgcGF0aC9oZWFkZXJzL3F1ZXJ5IHBhcmFtcykgYmVmb3JlIGZvcndhcmRpbmcgdG8gdGhlXG4gICAqIGJhY2tlbmQuXG4gICAqXG4gICAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLXBhcmFtZXRlci1tYXBwaW5nLmh0bWx9XG4gICAqIGZvciBtb3JlIG9uIHRoaXMuIFJlYWQgdGhlICdSZXNlcnZlZCBoZWFkZXJzJyBzZWN0aW9uIGZvciB3aGljaCBoZWFkZXJzIGNhbm5vdCBiZSBvdmVycmlkZGVuLlxuICAgKiBJbiBhZGRpdGlvbiB0byB0aGUgQVdTLXJlc2VydmVkIGhlYWRlcnMsIHlvdSBzaG91bGQgbm90IG92ZXJyaWRlIHRoZSAnSG9zdCcgaGVhZGVyIGVpdGhlciwgYXNcbiAgICogdGhhdCdzIHVzZWQgZm9yIHJvdXRpbmcgdGhlIHJlcXVlc3QgdG8gdGhlIGNvcnJlY3Qgc2VydmljZSBiZWhpbmQgdGhlIGxvYWQgYmFsYW5jZXIuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlOlxuICAgKlxuICAgKiBBZGRpbmcgYSBoZWFkZXI6XG4gICAqIGBgYFxuICAgKiBtYXBQYXJhbWV0ZXJzOiAocGFyYW1ldGVycykgPT4gcGFyYW1ldGVycy5vdmVyd3JpdGVIZWFkZXIoXG4gICAqICAgIFwiWC1NeS1DdXN0b20tSGVhZGVyXCIsXG4gICAqICAgIGFwaWd3Lk1hcHBpbmdWYWx1ZS5jdXN0b20oXCJteS1jdXN0b20tdmFsdWVcIiksXG4gICAqIClcbiAgICogYGBgXG4gICAqXG4gICAqIE92ZXJ3cml0aW5nIHRoZSBwYXRoIChpZiwgZm9yIGV4YW1wbGUsIHlvdSBjb25maWd1cmUgYSBgL3VzZXJzYCByb3V0ZSBvbiB0aGUgQVBJIEdhdGV3YXkgdGhhdFxuICAgKiB5b3Ugd2FudCB0byBmb3J3YXJkIHRvIGAvYXBpL3VzZXJzYCBvbiB0aGUgYmFja2VuZCk6XG4gICAqIGBgYFxuICAgKiBtYXBQYXJhbWV0ZXJzOiAocGFyYW1ldGVycykgPT4gcGFyYW1ldGVycy5vdmVyd3JpdGVQYXRoKFwiL2FwaS91c2Vyc1wiKVxuICAgKiBgYGBcbiAgICovXG4gIG1hcFBhcmFtZXRlcnM/OiAocGFyYW1ldGVyczogYXBpZ3cuUGFyYW1ldGVyTWFwcGluZykgPT4gdm9pZFxufVxuXG5leHBvcnQgdHlwZSBMYW1iZGFJbnRlZ3JhdGlvblByb3BzID0ge1xuICAvKipcbiAgICogVGhlIExhbWJkYSBpbnRlZ3JhdGlvbiB1c2VzIHRoZSBWMiBwYXlsb2FkIGZvcm1hdDpcbiAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1kZXZlbG9wLWludGVncmF0aW9ucy1sYW1iZGEuaHRtbH1cbiAgICpcbiAgICogSWYgd3JpdGluZyB0aGUgTGFtYmRhIGluIFR5cGVTY3JpcHQsIHRoaXMgbWVhbnMgeW91IHNob3VsZCB1c2UgYEFQSUdhdGV3YXlQcm94eUV2ZW50VjJgIGFzIHRoZVxuICAgKiByZXF1ZXN0IHR5cGUsIGFuZCBgQVBJR2F0ZXdheVByb3h5UmVzdWx0VjJgIGFzIHRoZSByZXNwb25zZSB0eXBlLlxuICAgKi9cbiAgbGFtYmRhOiBsYW1iZGEuSUZ1bmN0aW9uXG59XG5cbmV4cG9ydCB0eXBlIFNxc0ludGVncmF0aW9uUHJvcHMgPSB7XG4gIHF1ZXVlOiBzcXMuSVF1ZXVlXG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgYXR0cmlidXRlcyB0byBwYXNzIG9uIHRvIFNRUy4gVGhlIGtleXMgaW4gdGhpcyBvYmplY3QgYXJlIHRoZSBuYW1lcyBvZiB0aGUgYXR0cmlidXRlcy5cbiAgICogRWFjaCBhdHRyaWJ1dGUgaGFzIGEgRGF0YVR5cGUgZmllbGQsIGFuZCBlaXRoZXIgYSBTdHJpbmdWYWx1ZSBvciBCaW5hcnlWYWx1ZSBmaWVsZCBkZXBlbmRpbmcgb25cbiAgICogaXRzIHR5cGUuIFNlZSBBV1MgZG9jczpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU1NpbXBsZVF1ZXVlU2VydmljZS9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9NZXNzYWdlQXR0cmlidXRlVmFsdWUuaHRtbFxuICAgKlxuICAgKiBJbiB0aGUgU3RyaW5nVmFsdWUgZmllbGQsIHlvdSBjYW4gZG8gQVBJIEdhdGV3YXkgcGFyYW1ldGVyIG1hcHBpbmc6XG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1wYXJhbWV0ZXItbWFwcGluZy5odG1sXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqIGBgYFxuICAgKiBtZXNzYWdlQXR0cmlidXRlczoge1xuICAgKiAgIGNsaWVudElkOiB7XG4gICAqICAgICBEYXRhVHlwZTogXCJTdHJpbmdcIixcbiAgICogICAgIFN0cmluZ1ZhbHVlOiBcIiR7Y29udGV4dC5hdXRob3JpemVyLmNsaWVudElkfVwiLFxuICAgKiAgIH0sXG4gICAqIH0sXG4gICAqIGBgYFxuICAgKi9cbiAgbWVzc2FnZUF0dHJpYnV0ZXM/OiB7XG4gICAgW2F0dHJpYnV0ZU5hbWU6IHN0cmluZ106XG4gICAgICB8IHsgRGF0YVR5cGU6IFwiU3RyaW5nXCIgfCBcIk51bWJlclwiOyBTdHJpbmdWYWx1ZTogc3RyaW5nIH1cbiAgICAgIHwge1xuICAgICAgICAgIERhdGFUeXBlOiBcIkJpbmFyeVwiXG4gICAgICAgICAgLyoqIEJhc2U2NC1lbmNvZGVkIGJpbmFyeSBkYXRhIG9iamVjdC4gKi9cbiAgICAgICAgICBCaW5hcnlWYWx1ZTogc3RyaW5nXG4gICAgICAgIH1cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBFdmVudEJyaWRnZUludGVncmF0aW9uUHJvcHMgPSB7XG4gIC8qKlxuICAgKiBBbiBFdmVudEJyaWRnZSBldmVudCBidXMuIFJlcXVlc3QgYm9kaWVzIHNlbnQgdG8gdGhlIHJvdXRlIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoaXMgZXZlbnQgYnVzLFxuICAgKiBpbiB0aGUgYERldGFpbGAgZmllbGQgKHNlZVxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZXZlbnRicmlkZ2UvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUHV0RXZlbnRzUmVxdWVzdEVudHJ5Lmh0bWwpLlxuICAgKi9cbiAgZXZlbnRCdXM6IGV2ZW50cy5JRXZlbnRCdXNcbiAgLyoqXG4gICAqIFNldHMgdGhlIGBEZXRhaWxUeXBlYCBmaWVsZCAoaS5lLiwgZXZlbnQgdHlwZSkgb24gZXZlbnRzIHB1Ymxpc2hlZCB0byB0aGUgZXZlbnQgYnVzLlxuICAgKlxuICAgKiBTZWUgQVdTIGRvY3MgZm9yIG1vcmUgb24gdGhpczpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2V2ZW50YnJpZGdlL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1B1dEV2ZW50c1JlcXVlc3RFbnRyeS5odG1sXG4gICAqL1xuICBkZXRhaWxUeXBlOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgQXV0aG9yaXphdGlvblByb3BzPEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9XG4gIC8qKlxuICAgKiBObyBhdXRoZW50aWNhdGlvbiwgZm9yIHdoZW4geW91IHdhbnQgYSBmdWxseSBwdWJsaWMgcm91dGUgKG9yIGhhbmRsZSBhdXRoZW50aWNhdGlvbiBpbiB0aGVcbiAgICogYmFja2VuZCBpbnRlZ3JhdGlvbikuXG4gICAqL1xuICB8IHsgdHlwZTogXCJOT05FXCIgfVxuICAvKipcbiAgICogQVdTIElBTSBhdXRob3JpemF0aW9uLlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktYWNjZXNzLWNvbnRyb2wtaWFtLmh0bWxcbiAgICovXG4gIHwgeyB0eXBlOiBcIklBTVwiIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjdXN0b20gTGFtYmRhIGF1dGhvcml6ZXIgd2hpY2ggcmVhZHMgYEF1dGhvcml6YXRpb246IEJlYXJlciA8YWNjZXNzIHRva2VuPmAgaGVhZGVyXG4gICAqIGFuZCB2ZXJpZmllcyB0aGUgdG9rZW4gYWdhaW5zdCBhIENvZ25pdG8gdXNlciBwb29sLlxuICAgKi9cbiAgfCAoe1xuICAgICAgdHlwZTogXCJDT0dOSVRPX1VTRVJfUE9PTFwiXG4gICAgfSAmIENvZ25pdG9Vc2VyUG9vbEF1dGhvcml6ZXJQcm9wczxBdXRoU2NvcGVzVD4pXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY3VzdG9tIExhbWJkYSBhdXRob3JpemVyIHdoaWNoIHJlYWRzIGBBdXRob3JpemF0aW9uOiBCYXNpYyA8YmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHM+YFxuICAgKiBoZWFkZXIgYW5kIHZlcmlmaWVzIHRoZSBjcmVkZW50aWFscyBhZ2FpbnN0IGEgZ2l2ZW4gc2VjcmV0LlxuICAgKi9cbiAgfCAoeyB0eXBlOiBcIkJBU0lDX0FVVEhcIiB9ICYgQmFzaWNBdXRoQXV0aG9yaXplclByb3BzKVxuICAvKipcbiAgICogQ3JlYXRlcyBhIGN1c3RvbSBMYW1iZGEgYXV0aG9yaXplciB3aGljaCBhbGxvd3MgYm90aDpcbiAgICogLSBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDxhY2Nlc3MgdG9rZW4+YCBoZWFkZXIsIGZvciB3aGljaCB0aGUgdG9rZW4gaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZVxuICAgKiAgIGdpdmVuIENvZ25pdG8gdXNlciBwb29sXG4gICAqIC0gYEF1dGhvcml6YXRpb246IEJhc2ljIDxiYXNlNjQtZW5jb2RlZCBjcmVkZW50aWFscz5gIGhlYWRlciwgZm9yIHdoaWNoIHRoZSBjcmVkZW50aWFscyBhcmVcbiAgICogICBjaGVja2VkIGFnYWluc3QgdGhlIGNyZWRlbnRpYWxzIGZyb20gdGhlIGdpdmVuIGJhc2ljIGF1dGggc2VjcmV0IG5hbWVcbiAgICpcbiAgICogSWYgZWl0aGVyIG9mIHRoZXNlIGFyZSBnaXZlbiBhbmQgdmFsaWQsIHRoZSByZXF1ZXN0IGlzIGF1dGhlbnRpY2F0ZWQuXG4gICAqL1xuICB8ICh7XG4gICAgICB0eXBlOiBcIkNPR05JVE9fVVNFUl9QT09MX09SX0JBU0lDX0FVVEhcIlxuICAgIH0gJiBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wczxBdXRoU2NvcGVzVD4pXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY3VzdG9tIGF1dGhvcml6ZXIgd2l0aCB0aGUgZ2l2ZW4gTGFtYmRhIGZ1bmN0aW9uLiBVc2UgdGhpcyBpZiB5b3UgaGF2ZSBjdXN0b21cbiAgICogYXV0aG9yaXphdGlvbiBsb2dpYywgYW5kIHRoZSBvdGhlciBhdXRob3JpemVycyBmcm9tIHRoaXMgY29uc3RydWN0IGRvbid0IG1lZXQgeW91ciBuZWVkcy5cbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWxhbWJkYS1hdXRob3JpemVyLmh0bWxcbiAgICovXG4gIHwgKHsgdHlwZTogXCJDVVNUT01fTEFNQkRBX0FVVEhPUklaRVJcIiB9ICYgQ3VzdG9tTGFtYmRhQXV0aG9yaXplclByb3BzKVxuXG5leHBvcnQgdHlwZSBDb2duaXRvVXNlclBvb2xBdXRob3JpemVyUHJvcHM8XG4gIEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiA9IHtcbiAgdXNlclBvb2w6IElVc2VyUG9vbFxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IGFjY2VzcyB0b2tlbiBjbGFpbXMgY29udGFpbiB0aGUgZ2l2ZW4gc2NvcGUuXG4gICAqXG4gICAqIFdoZW4gZGVmaW5lZCBhcyBwYXJ0IG9mIGEgcmVzb3VyY2Ugc2VydmVyLCBzY29wZXMgYXJlIG9uIHRoZSBmb3JtYXQ6XG4gICAqIGB7cmVzb3VyY2Ugc2VydmVyIGlkZW50aWZpZXJ9L3tzY29wZSBuYW1lfWAsIGUuZy4gYGV4dGVybmFsL3ZpZXdfdXNlcnNgLlxuICAgKlxuICAgKiBUbyBnZXQgbW9yZSB0eXBlIHNhZmV0eSBvbiB0aGlzIHBhcmFtZXRlciwgc2VlIHRoZSBkb2NzIGZvciB0aGUgYEF1dGhTY29wZXNUYCB0eXBlIHBhcmFtZXRlciBvblxuICAgKiB7QGxpbmsgQXBpR2F0ZXdheX0uXG4gICAqL1xuICByZXF1aXJlZFNjb3BlPzogQXV0aFNjb3Blc1RcblxuICAvKipcbiAgICogTmFtZSBvZiBzZWNyZXQgaW4gQVdTIFNlY3JldHMgTWFuYWdlciB0aGF0IHN0b3JlcyBiYXNpYyBhdXRoIGNyZWRlbnRpYWxzIGZvciB0aGUgYmFja2VuZFxuICAgKiBzZXJ2aWNlLCB0byBiZSBmb3J3YXJkZWQgdG8gdGhlIGJhY2tlbmQgaWYgQ29nbml0byB1c2VyIHBvb2wgYXV0aGVudGljYXRpb24gc3VjY2VlZGVkLlxuICAgKlxuICAgKiBUaGUgc2VjcmV0IHZhbHVlIG11c3QgZm9sbG93IHRoaXMgZm9ybWF0OlxuICAgKiBgYGBqc29uXG4gICAqIHsgXCJ1c2VybmFtZVwiOiBcIjx1c2VybmFtZT5cIiwgXCJwYXNzd29yZFwiOiBcIjxwYXNzd29yZD5cIiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBUaGlzIHByb3Agc29sdmVzIHRoZSBmb2xsb3dpbmcgdXNlLWNhc2U6XG4gICAqIC0gWW91IHdhbnQgdG8gZG8gQ29nbml0byB1c2VyIHBvb2wgYXV0aGVudGljYXRpb24gaW4gdGhlIEFQSSBHYXRld2F5XG4gICAqIC0gWW91IHdhbnQgYW4gYWRkaXRpb25hbCBhdXRoIGNoZWNrIGluIHRoZSBiYWNrZW5kLCBidXQgeW91IGRvbid0IHdhbnQgdG8gZGVhbCB3aXRoIENvZ25pdG9cbiAgICogICB0aGVyZVxuICAgKiAtIFRoZSBiYWNrZW5kIHVzZXMgYmFzaWMgYXV0aFxuICAgKlxuICAgKiBUaGlzIHByb3Agc29sdmVzIHRoaXMgYnkgbGV0dGluZyB5b3Ugc3BlY2lmeSBjcmVkZW50aWFscyB0byBwYXNzIHRvIHRoZSBiYWNrZW5kIGFmdGVyIEFQSS1HV1xuICAgKiBhdXRoZW50aWNhdGlvbiBzdWNjZWVkcy4gWW91IGNhbiBwYXNzIHRoZSBlbmNvZGVkIGNyZWRlbnRpYWxzIHRocm91Z2hcbiAgICoge0BsaW5rIEFsYkludGVncmF0aW9uUHJvcHMubWFwUGFyYW1ldGVyc30sIHVzaW5nIHRoZSBgYXV0aG9yaXplci5pbnRlcm5hbEF1dGhvcml6YXRpb25IZWFkZXJgXG4gICAqIGNvbnRleHQgdmFyaWFibGUsIGxpa2Ugc286XG4gICAqIGBgYFxuICAgKiBtYXBQYXJhbWV0ZXJzOiAocGFyYW1ldGVycykgPT4gcGFyYW1ldGVycy5vdmVyd3JpdGVIZWFkZXIoXG4gICAqICAgLy8gJ0F1dGhvcml6YXRpb24nIGhlYWRlciBjYW5ub3QgYmUgb3ZlcnJpZGRlbiwgc28gd2UgdXNlIGEgY3VzdG9tIGhlYWRlclxuICAgKiAgIFwiWC1JbnRlcm5hbC1BdXRob3JpemF0aW9uXCIsXG4gICAqICAgYXBpZ3cuTWFwcGluZ1ZhbHVlLmNvbnRleHRWYXJpYWJsZShcImF1dGhvcml6ZXIuaW50ZXJuYWxBdXRob3JpemF0aW9uSGVhZGVyXCIpLFxuICAgKiApXG4gICAqIGBgYFxuICAgKiBUaGUgYmFja2VuZCBjYW4gdGhlbiBjaGVjayB0aGUgYFgtSW50ZXJuYWwtQXV0aG9yaXphdGlvbmAgaGVhZGVyLlxuICAgKi9cbiAgY3JlZGVudGlhbHNGb3JJbnRlcm5hbEF1dGhvcml6YXRpb24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgQmFzaWNBdXRoQXV0aG9yaXplclByb3BzID0ge1xuICAvKipcbiAgICogTmFtZSBvZiBzZWNyZXQgaW4gQVdTIFNlY3JldHMgTWFuYWdlciB0aGF0IHN0b3JlcyBiYXNpYyBhdXRoIGNyZWRlbnRpYWxzLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCBmb3IgdGhlIHNlY3JldCB2YWx1ZTpcbiAgICogLSBTaW5nbGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkOlxuICAgKiAgIGBgYGpzb25cbiAgICogICB7IFwidXNlcm5hbWVcIjogXCI8dXNlcm5hbWU+XCIsIFwicGFzc3dvcmRcIjogXCI8cGFzc3dvcmQ+XCIgfVxuICAgKiAgIGBgYFxuICAgKiAtIEFycmF5IG9mIHVzZXJuYW1lICsgcGFzc3dvcmQgb2JqZWN0czpcbiAgICogICBgYGBqc29uXG4gICAqICAgeyBcImNyZWRlbnRpYWxzXCI6IFwiW3tcXFwidXNlcm5hbWVcXFwiOlxcXCI8dXNlci0xPlxcXCIsXFxcInBhc3N3b3JkXFxcIjpcXFwicGFzc3dvcmQtMVxcXCJ9LHtcXFwidXNlcm5hbWVcXFwiOlxcXCI8dXNlci0yPlxcXCIsXFxcInBhc3N3b3JkXFxcIjpcXFwiPHBhc3N3b3JkLTI+XFxcIn1dXCIgfVxuICAgKiAgIGBgYFxuICAgKiAgIC0gVGhlIHZhbHVlIG9mIHRoZSBgY3JlZGVudGlhbHNgIGZpZWxkIGlzIGEgc3RyaW5nLCB3aXRoIGEgc3RyaW5naWZpZWQsIGVzY2FwZWQgSlNPTiBhcnJheSBvZlxuICAgKiAgICAgb2JqZWN0cyB3aXRoIGB1c2VybmFtZWAgYW5kIGBwYXNzd29yZGAgZmllbGRzLlxuICAgKiAgIC0gVGhlIHJlYXNvbiB0aGF0IHRoaXMgc2Vjb25kIGZvcm1hdCBzdG9yZXMgc3RyaW5naWZpZWQgSlNPTiBfaW5zaWRlXyBKU09OLCBpcyBkdWUgdG8gYVxuICAgKiAgICAgbGltaXRhdGlvbiBpbiBMaWZsaWcncyBgbG9hZC1zZWNyZXRzYCBsaWJyYXJ5LCB3aGljaCBvbmx5IGFsbG93cyBzdG9yaW5nIHN0cmluZyB2YWx1ZXMuXG4gICAqIC0gQXJyYXkgb2YgYmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHM6XG4gICAqICAgYGBganNvblxuICAgKiAgIHsgXCJjcmVkZW50aWFsc1wiOiBcIltcXFwiPGVuY29kZWQtY3JlZGVudGlhbC0xPlxcXCIsXFxcIjxlbmNvZGVkLWNyZWRlbnRpYWwtMj5cXFwiXVwiIH1cbiAgICogICBgYGBcbiAgICogICAtIEVhY2ggZWxlbWVudCBpcyBlbmNvZGVkIGZyb20gYDx1c2VybmFtZT46PHBhc3N3b3JkPmAuXG4gICAqICAgLSBUaGUgYXJyYXkgaXMgc3RyaW5naWZpZWQgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyBhYm92ZS5cbiAgICpcbiAgICogSWYgdGhlIHNlY3JldCB1c2VzIG9uZSBvZiB0aGUgYXJyYXkgZm9ybWF0cywgdGhlIGF1dGhvcml6ZXIgd2lsbCBtYXRjaCB0aGUgcmVxdWVzdCdzXG4gICAqIEF1dGhvcml6YXRpb24gaGVhZGVyIGFnYWluc3QgYW55IG9uZSBvZiB0aGUgY3JlZGVudGlhbHMuXG4gICAqL1xuICBjcmVkZW50aWFsc1NlY3JldE5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wczxcbiAgQXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4+ID0ge1xuICB1c2VyUG9vbDogSVVzZXJQb29sXG5cbiAgLyoqXG4gICAqIE5hbWUgb2Ygc2VjcmV0IGluIEFXUyBTZWNyZXRzIE1hbmFnZXIgdGhhdCBzdG9yZXMgYmFzaWMgYXV0aCBjcmVkZW50aWFscy5cbiAgICpcbiAgICogU2VlIHtAbGluayBCYXNpY0F1dGhBdXRob3JpemVyUHJvcHMuY3JlZGVudGlhbHNTZWNyZXROYW1lfSBmb3IgdGhlIHN1cHBvcnRlZCBmb3JtYXRzLlxuICAgKi9cbiAgYmFzaWNBdXRoQ3JlZGVudGlhbHNTZWNyZXROYW1lPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgYWNjZXNzIHRva2VuIGNsYWltcyBjb250YWluIHRoZSBnaXZlbiBzY29wZS4gT25seSBhcHBsaWNhYmxlIGZvciByZXF1ZXN0cyB0aGF0XG4gICAqIHVzZSBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDxhY2Nlc3MgdG9rZW4+YCAobm90IGFwcGxpY2FibGUgZm9yIGJhc2ljIGF1dGgpLlxuICAgKlxuICAgKiBXaGVuIGRlZmluZWQgYXMgcGFydCBvZiBhIHJlc291cmNlIHNlcnZlciwgc2NvcGVzIGFyZSBvbiB0aGUgZm9ybWF0OlxuICAgKiBge3Jlc291cmNlIHNlcnZlciBpZGVudGlmaWVyfS97c2NvcGUgbmFtZX1gLCBlLmcuIGBleHRlcm5hbC92aWV3X3VzZXJzYC5cbiAgICpcbiAgICogVG8gZ2V0IG1vcmUgdHlwZSBzYWZldHkgb24gdGhpcyBwYXJhbWV0ZXIsIHNlZSB0aGUgZG9jcyBmb3IgdGhlIGBBdXRoU2NvcGVzVGAgdHlwZSBwYXJhbWV0ZXIgb25cbiAgICoge0BsaW5rIEFwaUdhdGV3YXl9LlxuICAgKi9cbiAgcmVxdWlyZWRTY29wZT86IEF1dGhTY29wZXNUXG59XG5cbnR5cGUgQ3VzdG9tTGFtYmRhQXV0aG9yaXplclByb3BzID0ge1xuICAvKipcbiAgICogVGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcnVuIHdoZW5ldmVyIHRoZSBBUEkgR2F0ZXdheSByb3V0ZSBpcyBpbnZva2VkLCB0byBhdXRoZW50aWNhdGVcbiAgICogdGhlIHJlcXVlc3QuIFNlZSBBV1MgZG9jcyBmb3IgbW9yZSBvbiBob3cgdG8gd3JpdGUgdGhlIExhbWJkYTpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWxhbWJkYS1hdXRob3JpemVyLmh0bWxcbiAgICpcbiAgICogVGhlIGRlZmF1bHQgcmVzcG9uc2UgZm9ybWF0IHVzZWQgaXMgYEh0dHBMYW1iZGFSZXNwb25zZVR5cGUuU0lNUExFYCAoZm9ybWF0IDIuMCkuIElmIHlvdSB3cml0ZVxuICAgKiB5b3VyIExhbWJkYSBpbiBUeXBlU2NyaXB0LCB0aGlzIG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIG11c3QgcmV0dXJuXG4gICAqIGBBUElHYXRld2F5U2ltcGxlQXV0aG9yaXplclJlc3VsdGAgKGZyb20gdGhlIGBhd3MtbGFtYmRhYCBwYWNrYWdlKS4gVGhlIHJlcXVlc3QgZXZlbnQgd2lsbCBhbHNvXG4gICAqIHVzZSBmb3JtYXQgMi4wIChgQVBJR2F0ZXdheVJlcXVlc3RBdXRob3JpemVyRXZlbnRWMmAgaW4gVHlwZVNjcmlwdCkuIFNlZSB0aGUgQVdTIGRvY3MgbGlua2VkXG4gICAqIGFib3ZlIGZvciBtb3JlIGRldGFpbHMgb24gdGhlc2UgZm9ybWF0cy5cbiAgICpcbiAgICogWW91IGNhbiBvdmVycmlkZSB0aGUgcmVzcG9uc2UgZm9ybWF0IHR5cGUgaW5cbiAgICoge0BsaW5rIEN1c3RvbUxhbWJkYUF1dGhvcml6ZXJQcm9wcy5hdXRob3JpemVyUHJvcHN9LlxuICAgKlxuICAgKiBTZWUgdGhlIExhbWJkYXMgdW5kZXIgdGhlIGBhdXRob3JpemVyc2AgZm9sZGVyIG5leHQgdG8gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QgaW5cbiAgICogYGxpZmxpZy1jZGtgIGZvciBleGFtcGxlcy5cbiAgICovXG4gIGxhbWJkYUF1dGhvcml6ZXI6IGxhbWJkYS5JRnVuY3Rpb25cblxuICAvKipcbiAgICogUHJvcHMgZm9yIHRoZSBgSHR0cExhbWJkYUF1dGhvcml6ZXJgIGNvbnN0cnVjdC4gV2UgcHJvdmlkZSBzb21lIGRpZmZlcmVudCBkZWZhdWx0czpcbiAgICogLSBgcmVzcG9uc2VUeXBlc2AgZGVmYXVsdHMgdG8gYFtIdHRwTGFtYmRhUmVzcG9uc2VUeXBlLlNJTVBMRV1gXG4gICAqIC0gYHJlc3VsdHNDYWNoZVR0bGAgZGVmYXVsdHMgdG8gYER1cmF0aW9uLmhvdXJzKDEpYFxuICAgKi9cbiAgYXV0aG9yaXplclByb3BzPzogUGFydGlhbDxhdXRob3JpemVycy5IdHRwTGFtYmRhQXV0aG9yaXplclByb3BzPlxufVxuXG4vKipcbiAqIFRoaXMgY29uc3RydWN0IHRyaWVzIHRvIHNpbXBsaWZ5IHRoZSBjcmVhdGlvbiBvZiBhbiBBUEkgR2F0ZXdheSBmb3IgYSBzZXJ2aWNlLCBieSBjb2xsZWN0aW5nIG1vc3RcbiAqIG9mIHRoZSBjb21tb24gc2V0dXAgaGVyZS5cbiAqXG4gKiBUaGUgYXBwcm9hY2ggZm9sbG93ZWQgaW4gdGhpcyBjb25zdHJ1Y3QgaXM6XG4gKiAxLiBPbmUgQVBJLUdXIHBlciBzZXJ2aWNlXG4gKiAyLiBPbmUgc3ViZG9tYWluIHBlciBBUEktR1cgLyBzZXJ2aWNlXG4gKiAzLiBVc2UgSFRUUCBBUEksIG5vdCBSRVNUXG4gKiA0LiBVc2UgYSAkZGVmYXVsdCBzdGFnZSB3aXRoIGF1dG9kZXBsb3lcbiAqIDUuIFN1cHBvcnQgbXVsdGlwbGUgcm91dGVzICh3aXRoIHBvc3NpYmxlIGAve3Byb3h5K31gIHRvIGxldCBhbGwgc3ViLXBhdGhzIHRocm91Z2gpXG4gKiA2LiBBbGxvdyBjdXN0b20gaW50ZWdyYXRpb24vYXV0aG9yaXplciBmb3IgZWFjaCByb3V0ZSwgb3IgZGVmYXVsdHMgZm9yIHRoZSB3aG9sZSBnYXRld2F5XG4gKlxuICogVGhlIHJvdXRlIGludGVncmF0aW9uIGlzIG9uZSBvZiB0aGVzZTpcbiAqIC0gQUxCIHByaXZhdGUgaW50ZWdyYXRpb24gd2l0aCBWUEMgTGluayB1c2luZyBIVFRQUyB0byB0aGUgQUxCXG4gKiAtIExhbWJkYSBpbnRlZ3JhdGlvblxuICogLSBTUVMgaW50ZWdyYXRpb25cbiAqXG4gKiAjIyMgTG9hZCBCYWxhbmNlciBTZWN1cml0eSBHcm91cFxuICpcbiAqIE5vdGUgdGhhdCB0aGUgbG9hZCBiYWxhbmNlciB1c2VkIGluIGFuIHtAbGluayBBbGJJbnRlZ3JhdGlvblByb3BzfSBtdXN0IGFsbG93IG91dGJvdW5kIEhUVFBTXG4gKiB0cmFmZmljIHRvIGl0cyBTZWN1cml0eUdyb3VwLiBPdGhlcndpc2UsIHRoZSBWUEMgTGluayB1c2VkIGJ5IHRoZSBBUEktR1cgY2FuJ3QgZ2V0IHRyYWZmaWMgZnJvbVxuICogdGhlIEFMQi5cbiAqXG4gKiBgYGBcbiAqIGNvbnN0IGxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAgPSBuZXcgZWMyLlNlY3VyaXR5R3JvdXAoLi4uLCB7XG4gKiAgIGFsbG93QWxsT3V0Ym91bmQ6IGZhbHNlLFxuICogfSlcbiAqXG4gKiBsb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLmFkZEVncmVzc1J1bGUoXG4gKiAgIGxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAsXG4gKiAgIGVjMi5Qb3J0LnRjcCg0NDMpLFxuICogICBcIk91dGJvdW5kIHRvIHNlbGYgZm9yIEFMQiB0byBBUEktR1cgVlBDLUxpbmtcIixcbiAqIClcbiAqXG4gKiBjb25zdCBsb2FkQmFsYW5jZXIgPSBuZXcgbGlmbGlnTG9hZEJhbGFuY2VyLkxvYWRCYWxhbmNlciguLi4sXG4gKiAgIHtcbiAqICAgICBvdmVycmlkZUxvYWRCYWxhbmNlclByb3BzOiB7XG4gKiAgICAgICBzZWN1cml0eUdyb3VwOiBsb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLFxuICogICAgIH0sXG4gKiAgIH0sXG4gKiApXG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgQXV0aFNjb3Blc1QgVGhpcyB0eXBlIHBhcmFtZXRlciBhbGxvd3MgeW91IHRvIGltcHJvdmUgdHlwZSBzYWZldHkgb24gdGhlXG4gKiBgcmVxdWlyZWRTY29wZWAgZmllbGQgb24ge0BsaW5rIENvZ25pdG9Vc2VyUG9vbE9yQmFzaWNBdXRoQXV0aG9yaXplclByb3BzfSwgYnkgbmFycm93aW5nIHRoZSB0eXBlXG4gKiB0byBzcGVjaWZpYyBzdHJpbmdzLiBZb3UgY2FuIHRoZW4gZXh0ZW5kIHRoZSBgQXBpR2F0ZXdheWAgd2l0aCB0aGlzIHR5cGUgdG8gZW5mb3JjZSB0aG9zZSBzY29wZXNcbiAqIGFjcm9zcyB0aGUgYXBwbGljYXRpb24uIFJlbWVtYmVyIHRoYXQgYXV0aCBzY29wZXMgbXVzdCBiZSBvbiB0aGUgZm9ybWF0XG4gKiBge3Jlc291cmNlIHNlcnZlciBpZGVudGlmaWVyfS97c2NvcGUgbmFtZX1gLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBcbiAqIHR5cGUgQXV0aFNjb3BlcyA9IFwiZXh0ZXJuYWwvcmVhZF91c2Vyc1wiIHwgXCJpbnRlcm5hbC9jcmVhdGVfdXNlcnNcIlxuICpcbiAqIGV4cG9ydCBjbGFzcyBNeVByb2plY3RBcGlHYXRld2F5IGV4dGVuZHMgQXBpR2F0ZXdheTxBdXRoU2NvcGVzPiB7fVxuICogYGBgXG4gKiBUeXBlU2NyaXB0IHdpbGwgdGhlbiBlbmZvcmNlIHRoYXQgYHJlcXVpcmVkU2NvcGVgIGlzIG9uZSBvZiBgQXV0aFNjb3Blc2AsIGFuZCBwcm92aWRlXG4gKiBhdXRvLWNvbXBsZXRlLlxuICpcbiAqIEBhdXRob3IgS3Jpc3RpYW4gUmVrc3RhZCA8a3JlQGNhcHJhY29uc3VsdGluZy5ubz5cbiAqIEBhdXRob3IgSGVybWFubiBNw7hya3JpZCA8aGVtQGxpZmxpZy5ubz5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwaUdhdGV3YXk8XG4gIEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgLyoqIFRoZSBBUEkgR2F0ZXdheSBIVFRQIEFQSS4gVGhpcyBpcyB0aGUgbWFpbiBjb25zdHJ1Y3QgZm9yIEFQSS1HVy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGh0dHBBcGk6IGFwaWd3Lkh0dHBBcGlcblxuICAvKiogVGhlIHJvdXRlcyB3aGljaCBjb25uZWN0IHRoZSB7QGxpbmsgaHR0cEFwaX0gdG8gdGhlIGJhY2tlbmQgaW50ZWdyYXRpb24ocykuICovXG4gIHB1YmxpYyByZWFkb25seSByb3V0ZXM6IGFwaWd3Lkh0dHBSb3V0ZVtdID0gW11cblxuICAvKiogVGhlIGRvbWFpbiB3aGljaCBjb25zdW1lcnMgbXVzdCB1c2UuKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbjogc3RyaW5nXG5cbiAgLyoqIEFjY2VzcyBsb2cgZ3JvdXAuICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dHcm91cDogbG9ncy5Mb2dHcm91cFxuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IEFwaUdhdGV3YXlQcm9wczxBdXRoU2NvcGVzVD5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQXBpR2F0ZXdheVByb3BzPEF1dGhTY29wZXNUPixcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuXG4gICAgQXBpR2F0ZXdheS52YWxpZGF0ZVByb3BzKHByb3BzLCBpZCwgY2RrLlN0YWNrLm9mKHRoaXMpKVxuXG4gICAgY29uc3QgY3VzdG9tRG9tYWluID0gbmV3IEFwaUdhdGV3YXlEb21haW4odGhpcywgXCJDdXN0b21Eb21haW5cIiwgcHJvcHMuZG5zKVxuICAgIHRoaXMuZG9tYWluID0gY3VzdG9tRG9tYWluLmZ1bGxEb21haW5OYW1lXG5cbiAgICBsZXQgY29yc09wdGlvbnM6IGFwaWd3LkNvcnNQcmVmbGlnaHRPcHRpb25zIHwgdW5kZWZpbmVkXG4gICAgaWYgKHByb3BzLmNvcnNBbGxvd0FsbCkge1xuICAgICAgY29yc09wdGlvbnMgPSB7XG4gICAgICAgIGFsbG93T3JpZ2luczogW1wiKlwiXSxcbiAgICAgICAgLy8gXCJUaGUgQXV0aG9yaXphdGlvbiBoZWFkZXIgY2FuJ3QgYmUgd2lsZGNhcmRlZCBhbmQgYWx3YXlzIG5lZWRzIHRvIGJlIGxpc3RlZCBleHBsaWNpdGx5XCJcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnNcbiAgICAgICAgLy8gQ29udGVudC1UeXBlIG1heSBhbHNvIHJlcXVpcmUgZXhwbGljaXQgd2hpdGVsaXN0aW5nOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNjM1Njc2NDdcbiAgICAgICAgYWxsb3dIZWFkZXJzOiBbXCJBdXRob3JpemF0aW9uXCIsIFwiQ29udGVudC1UeXBlXCIsIFwiKlwiXSxcbiAgICAgICAgLy8gTm90IHVzaW5nICcqJyBoZXJlLCBiZWNhdXNlIFwiSW4gcmVxdWVzdHMgd2l0aCBjcmVkZW50aWFscywgaXQgaXMgdHJlYXRlZCBhcyB0aGUgbGl0ZXJhbFxuICAgICAgICAvLyBtZXRob2QgbmFtZSAnKicgd2l0aG91dCBzcGVjaWFsIHNlbWFudGljc1wiXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvSGVhZGVycy9BY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzXG4gICAgICAgIGFsbG93TWV0aG9kczogW1xuICAgICAgICAgIGFwaWd3LkNvcnNIdHRwTWV0aG9kLkdFVCxcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5QT1NULFxuICAgICAgICAgIGFwaWd3LkNvcnNIdHRwTWV0aG9kLlBVVCxcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5QQVRDSCxcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5ERUxFVEUsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuT1BUSU9OUyxcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5IRUFELFxuICAgICAgICBdLFxuICAgICAgICBtYXhBZ2U6IGNkay5EdXJhdGlvbi5kYXlzKDEpLFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBhY3R1YWwgQVBJLiBUaGlzIGhvbGRzIHRoZSByb3V0ZXMsIGF1dGhvcml6ZXJzIGFuZCBpbnRlZ3JhdGlvbnMuXG4gICAgY29uc3QgYXBpID0gbmV3IGFwaWd3Lkh0dHBBcGkodGhpcywgXCJIdHRwQXBpLVwiICsgcHJvcHMuZG5zLnN1YmRvbWFpbiwge1xuICAgICAgLy8gZGVmYXVsdEludGVncmF0aW9uOiBkZWZhdWx0SW50ZWdyYXRpb24sIC8vIFRoaXMgaXMgZm9yIGEgY2F0Y2gtYWxsICRkZWZhdWx0IHJvdXRlXG4gICAgICBkZXNjcmlwdGlvbjogYEFuIEhUVFAgQVBJIGZvciAke3Byb3BzLmRucy5zdWJkb21haW59LiR7cHJvcHMuZG5zLmhvc3RlZFpvbmUuem9uZU5hbWV9LmAsXG4gICAgICBkaXNhYmxlRXhlY3V0ZUFwaUVuZHBvaW50OiB0cnVlLCAvLyBGb3JjZSBleHRlcm5hbHMgdG8gZ28gdGhyb3VnaCBjdXN0b20gZG9tYWluLiBNVVNUIGJlIHRydWUgd2hlbiB1c2luZyBNdXR1YWwgVExTLCBmb3Igc2VjdXJpdHkgcmVhc29uc1xuICAgICAgY3JlYXRlRGVmYXVsdFN0YWdlOiB0cnVlLFxuICAgICAgZGVmYXVsdERvbWFpbk1hcHBpbmc6IHsgZG9tYWluTmFtZTogY3VzdG9tRG9tYWluLmFwaUd3RG9tYWluTmFtZSB9LFxuICAgICAgY29yc1ByZWZsaWdodDogY29yc09wdGlvbnMsXG4gICAgICAuLi5wcm9wcz8ucHJvcHNPdmVycmlkZT8uaHR0cEFwaSxcbiAgICB9KVxuICAgIHRoaXMuaHR0cEFwaSA9IGFwaVxuXG4gICAgY29uc3Qgc3RhZ2UgPSBhcGkuZGVmYXVsdFN0YWdlPy5ub2RlLmRlZmF1bHRDaGlsZCBhcyBhcGlndy5DZm5TdGFnZVxuXG4gICAgY29uc3QgbG9ncyA9IG5ldyBBcGlHYXRld2F5QWNjZXNzTG9ncyhcbiAgICAgIHRoaXMsXG4gICAgICBcIkFjY2Vzc0xvZ3NcIixcbiAgICAgIHN0YWdlLFxuICAgICAgcHJvcHMuYWNjZXNzTG9ncyxcbiAgICApXG4gICAgdGhpcy5sb2dHcm91cCA9IGxvZ3MubG9nR3JvdXBcblxuICAgIHN0YWdlLmRlZmF1bHRSb3V0ZVNldHRpbmdzID0ge1xuICAgICAgLi4uc3RhZ2UuZGVmYXVsdFJvdXRlU2V0dGluZ3MsXG4gICAgICBkZXRhaWxlZE1ldHJpY3NFbmFibGVkOiBwcm9wcy5kZXRhaWxlZE1ldHJpY3MgPz8gdHJ1ZSxcbiAgICAgIHRocm90dGxpbmdCdXJzdExpbWl0OiBwcm9wcy50aHJvdHRsaW5nPy5idXJzdCwgLy8gRGVmYXVsdCBmb3IgYWNjb3VudCBpcyA1XzAwMFxuICAgICAgdGhyb3R0bGluZ1JhdGVMaW1pdDogcHJvcHMudGhyb3R0bGluZz8ucmF0ZSwgLy8gRGVmYXVsdCBmb3IgYWNjb3VudCBpcyAxMF8wMDBcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0SW50ZWdyYXRpb24gPSBwcm9wcy5kZWZhdWx0SW50ZWdyYXRpb25cbiAgICAgID8gdGhpcy5jcmVhdGVJbnRlZ3JhdGlvbihwcm9wcy5kZWZhdWx0SW50ZWdyYXRpb24sIHByb3BzLmRucylcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBjb25zdCBkZWZhdWx0QXV0aG9yaXplciA9IHByb3BzLmRlZmF1bHRBdXRob3JpemF0aW9uXG4gICAgICA/IHRoaXMuY3JlYXRlQXV0aG9yaXplcihcIkRlZmF1bHRBdXRob3JpemVyXCIsIHByb3BzLmRlZmF1bHRBdXRob3JpemF0aW9uKVxuICAgICAgOiB1bmRlZmluZWRcblxuICAgIGZvciAoY29uc3Qgcm91dGUgb2YgcHJvcHMucm91dGVzKSB7XG4gICAgICBsZXQgaW50ZWdyYXRpb246IGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uXG4gICAgICBpZiAocm91dGUuaW50ZWdyYXRpb24pIHtcbiAgICAgICAgaW50ZWdyYXRpb24gPSB0aGlzLmNyZWF0ZUludGVncmF0aW9uKHJvdXRlLmludGVncmF0aW9uLCBwcm9wcy5kbnMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnRlZ3JhdGlvbiA9IGRlZmF1bHRJbnRlZ3JhdGlvbiEgLy8gVmVyaWZpZWQgaW4gdmFsaWRhdGVQcm9wc1xuICAgICAgfVxuXG4gICAgICBsZXQgYXV0aG9yaXplcjogYXBpZ3cuSUh0dHBSb3V0ZUF1dGhvcml6ZXIgfCB1bmRlZmluZWRcbiAgICAgIGlmIChyb3V0ZS5hdXRob3JpemF0aW9uKSB7XG4gICAgICAgIGF1dGhvcml6ZXIgPSB0aGlzLmNyZWF0ZUF1dGhvcml6ZXIoXG4gICAgICAgICAgLy8gVXNpbmcgdGhlIHJvdXRlIHBhdGggaGVyZSBjYXVzZWQgQ2xvdWRGb3JtYXRpb24gdG8gZmFpbCBkdWUgdG8gcmVzb3VyY2UgbmFtZXMgYmVpbmcgdG9vXG4gICAgICAgICAgLy8gbG9uZy4gVGhlcmVmb3JlLCB3ZSBub3cgaGFzaCB0aGUgcm91dGUgcGF0aCB0byBnZXQgYSBzaG9ydGVyIG5hbWUuXG4gICAgICAgICAgYFJvdXRlQXV0aG9yaXplciR7c2hvcnRIYXNoKGAke3JvdXRlLm1ldGhvZCA/PyBcIlwifSR7cm91dGUucGF0aH1gKX1gLFxuICAgICAgICAgIHJvdXRlLmF1dGhvcml6YXRpb24sXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF1dGhvcml6ZXIgPSBkZWZhdWx0QXV0aG9yaXplclxuICAgICAgfVxuXG4gICAgICBjb25zdCByb3V0ZVBhdGhzID0gW3JvdXRlLnBhdGhdXG4gICAgICBpZiAocm91dGUuaW5jbHVkZVN1YnBhdGhzID09PSB0cnVlKSB7XG4gICAgICAgIC8vIElmIHdlIGluY2x1ZGUgc3ViLXBhdGhzLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCByb3V0ZSB3aXRoIC97cHJveHkrfSAodGhlICsgbWVhbnMgaXQgd2lsbFxuICAgICAgICAvLyBtYXRjaCBhbGwgc3Vicm91dGVzKS4gV2Ugd2FudCBib3RoIHRoaXMgcm91dGUgYW5kIHRoZSBub3JtYWwgcm91dGUgd2l0aG91dCAve3Byb3h5K30sXG4gICAgICAgIC8vIHNpbmNlIC97cHJveHkrfSB3aWxsIG9ubHkgbWF0Y2ggdGhlIGJhc2UgcGF0aCB3aXRoIHRyYWlsaW5nIHNsYXNoLlxuICAgICAgICByb3V0ZVBhdGhzLnB1c2goXG4gICAgICAgICAgcm91dGUucGF0aCArIChyb3V0ZS5wYXRoID09PSBcIi9cIiA/IFwiXCIgOiBcIi9cIikgKyBcIntwcm94eSt9XCIsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCByb3V0ZVBhdGggb2Ygcm91dGVQYXRocykge1xuICAgICAgICAvLyBUaGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgQVBJIEdhdGV3YXkgY29uc3RydWN0IGhhZCBhIHNpbmdsZSByb3V0ZSB3aXRoIHRoZSBJRFxuICAgICAgICAvLyAnRGVmYXVsdFByb3h5Um91dGUnLCBhbmQgYWxsIGdhdGV3YXlzIHdlIHVzZWQgZXhwb3NlZCB0aGUgcm91dGUgL3twcm94eSt9LiBXaGVuIHRyeWluZyB0b1xuICAgICAgICAvLyBjaGFuZ2UgdG8gdGhpcyBuZXcgdmVyc2lvbiBvZiB0aGUgY29uc3RydWN0LCBkZXBsb3ltZW50IGZhaWxlZCBmb3IgZ2F0ZXdheXMgZXhwb3NpbmdcbiAgICAgICAgLy8gL3twcm94eSt9LCBiZWNhdXNlIFwiYSByb3V0ZSB3aXRoIHRoYXQga2V5IFtpLmUuIHBhdGggKyBtZXRob2RdIGFscmVhZHkgZXhpc3RzXCIuIFdlIHRoaW5rXG4gICAgICAgIC8vIHRoaXMgbWF5IGJlIGJlY2F1c2Ugd2UgdXNlZCB0aGUgc2FtZSByb3V0ZSBwYXRoLCBidXQgd2l0aCBhIG5ldyByb3V0ZSBJRCwgY2F1c2luZ1xuICAgICAgICAvLyBjb25mdXNpb24gZm9yIENsb3VkRm9ybWF0aW9uLiBTbyB3ZSBrZWVwIHRoZSBvbGQgcm91dGUgSUQgaGVyZSBmb3IgL3twcm94eSt9LlxuICAgICAgICBjb25zdCByb3V0ZUlkID1cbiAgICAgICAgICByb3V0ZVBhdGggPT09IFwiL3twcm94eSt9XCIgPyBcIkRlZmF1bHRQcm94eVJvdXRlXCIgOiBgUm91dGUtJHtyb3V0ZVBhdGh9YFxuXG4gICAgICAgIHRoaXMucm91dGVzLnB1c2goXG4gICAgICAgICAgbmV3IGFwaWd3Lkh0dHBSb3V0ZSh0aGlzLCByb3V0ZUlkLCB7XG4gICAgICAgICAgICBodHRwQXBpOiBhcGksXG4gICAgICAgICAgICBpbnRlZ3JhdGlvbjogaW50ZWdyYXRpb24sXG4gICAgICAgICAgICBhdXRob3JpemVyOiBhdXRob3JpemVyLFxuICAgICAgICAgICAgcm91dGVLZXk6IGFwaWd3Lkh0dHBSb3V0ZUtleS53aXRoKFxuICAgICAgICAgICAgICByb3V0ZVBhdGgsXG4gICAgICAgICAgICAgIHJvdXRlLm1ldGhvZFxuICAgICAgICAgICAgICAgID8gYXBpZ3cuSHR0cE1ldGhvZFtyb3V0ZS5tZXRob2RdXG4gICAgICAgICAgICAgICAgOiBhcGlndy5IdHRwTWV0aG9kLkFOWSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YWdSZXNvdXJjZXModGhpcywgKCkgPT4gKHsgc2VydmljZTogcHJvcHMuZG5zLnN1YmRvbWFpbiB9KSlcbiAgfVxuXG4gIC8qKiBAdGhyb3dzIEVycm9yICovXG4gIHByaXZhdGUgc3RhdGljIHZhbGlkYXRlUHJvcHMoXG4gICAgcHJvcHM6IEFwaUdhdGV3YXlQcm9wcyxcbiAgICBpZDogc3RyaW5nLFxuICAgIHN0YWNrOiBjZGsuU3RhY2ssXG4gICkge1xuICAgIGZvciAoY29uc3Qgcm91dGUgb2YgcHJvcHMucm91dGVzKSB7XG4gICAgICBpZiAoIXJvdXRlLmludGVncmF0aW9uICYmICFwcm9wcy5kZWZhdWx0SW50ZWdyYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBObyBpbnRlZ3JhdGlvbiBkZWZpbmVkIGZvciByb3V0ZSAnJHtyb3V0ZS5wYXRofScsIGFuZCBubyBkZWZhdWx0IGludGVncmF0aW9uIHNwZWNpZmllZCBmb3IgdGhlIGdhdGV3YXlgLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAoIXJvdXRlLmF1dGhvcml6YXRpb24gJiYgIXByb3BzLmRlZmF1bHRBdXRob3JpemF0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm8gYXV0aG9yaXphdGlvbiBkZWZpbmVkIGZvciByb3V0ZSAnJHtyb3V0ZS5wYXRofScsIGFuZCBubyBkZWZhdWx0IGF1dGhvcml6YXRpb24gc3BlY2lmaWVkIGZvciB0aGUgZ2F0ZXdheWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmICghcm91dGUucGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgcGF0aCAnJHtyb3V0ZS5wYXRofSc6IHBhdGhzIG11c3QgYmVnaW4gd2l0aCAnLycgKHVzZSAnLycgZm9yIHJvb3QgcGF0aClgLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAocm91dGUucGF0aCAhPT0gXCIvXCIgJiYgcm91dGUucGF0aC5lbmRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIHBhdGggJyR7cm91dGUucGF0aH0nOiBwYXRocyBjYW5ub3QgZW5kIHdpdGggJy8nIChleGNlcHQgcm9vdCBwYXRoKWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgcm91dGUuaW50ZWdyYXRpb24/LnR5cGUgPT09IFwiQUxCXCIgJiZcbiAgICAgICAgcm91dGUuaW50ZWdyYXRpb24uaG9zdE5hbWUuc3RhcnRzV2l0aChcImh0dHBzOlwiKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIGFsYkludGVncmF0aW9uLmhvc3RIdHRwc05hbWUgc2hvdWxkIG5vdCBpbmNsdWRlIGEgcHJvdG9jb2w6ICR7cm91dGUuaW50ZWdyYXRpb24uaG9zdE5hbWV9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJvcHMuZG5zLnN1YmRvbWFpbiA9PT0gXCJcIiB8fCBwcm9wcy5kbnMuc3ViZG9tYWluLmluY2x1ZGVzKFwiIFwiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgU3ViZG9tYWluIG11c3QgYmUgc2V0LCBhbmQgbm90IGNvbnRhaW4gc3BhY2VzOiAke3Byb3BzLmRucy5zdWJkb21haW59YCxcbiAgICAgIClcbiAgICB9XG4gICAgaWYgKHByb3BzLnRocm90dGxpbmc/LmJ1cnN0ICYmIHByb3BzLnRocm90dGxpbmcuYnVyc3QgPiA1XzAwMCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBg4pqg77iPIFlvdXIgdGhyb3R0bGluZyBidXJzdCBsaW1pdCAnJHtwcm9wcy50aHJvdHRsaW5nLmJ1cnN0fScgaXMgaGlnaGVyIHRoYW4gdGhlIEFXUyBBY2NvdW50IGxpbWl0LiBNYWtlIHN1cmUgeW91ciBhY2NvdW50IGhhcyB1cGdyYWRlZCB0aGlzIHF1b3RhISBgLFxuICAgICAgICBzdGFjayxcbiAgICAgICAgaWQsXG4gICAgICApXG4gICAgfVxuICAgIGlmIChwcm9wcy50aHJvdHRsaW5nPy5yYXRlICYmIHByb3BzLnRocm90dGxpbmcucmF0ZSA+IDEwXzAwMCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBg4pqg77iPIFlvdXIgdGhyb3R0bGluZyByYXRlIGxpbWl0ICcke3Byb3BzLnRocm90dGxpbmcucmF0ZX0nIGlzIGhpZ2hlciB0aGFuIHRoZSBBV1MgQWNjb3VudCBsaW1pdC4gTWFrZSBzdXJlIHlvdXIgYWNjb3VudCBoYXMgdXBncmFkZWQgdGhpcyBxdW90YSEgYCxcbiAgICAgICAgc3RhY2ssXG4gICAgICAgIGlkLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXV0aG9yaXplciBvbmx5IGFjY2VwdHMgcmVxdWVzdHMgZnJvbSBleHRlcm5hbCB1c2VycyB0aGF0IGFyZSBhdXRob3JpemVkLlxuICAgKiBVbmF1dGhvcml6ZWQgdXNlcnMgYXJlIHN0b3BwZWQgaW4gdGhlIEFQSS1HVywgYW5kIG5vdCBmb3J3YXJkZWQgdG8gdGhlIGludGVncmF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBdXRob3JpemVyPEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nPihcbiAgICBpZDogc3RyaW5nLFxuICAgIGF1dGhvcml6YXRpb246IEF1dGhvcml6YXRpb25Qcm9wczxBdXRoU2NvcGVzVD4sXG4gICk6IGFwaWd3LklIdHRwUm91dGVBdXRob3JpemVyIHwgdW5kZWZpbmVkIHtcbiAgICBzd2l0Y2ggKGF1dGhvcml6YXRpb24udHlwZSkge1xuICAgICAgY2FzZSBcIk5PTkVcIjoge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgICBjYXNlIFwiSUFNXCI6IHtcbiAgICAgICAgLy8gQVBJIEdhdGV3YXkgaW52b2tlcyB5b3VyIEFQSSByb3V0ZSBvbmx5IGlmIHRoZSBjbGllbnQgaGFzIGV4ZWN1dGUtYXBpIHBlcm1pc3Npb24gZm9yIHRoZSByb3V0ZS5cbiAgICAgICAgLy8gVGhlIGNsaWVudCBoYXMgdG8gdXNlIEFXUyBTaWdWNCB0byBpZGVudGlmeSB0aGVtc2VsdmVzIGluIHRoZSByZXF1ZXN0LlxuICAgICAgICAvLyBSZWFkIHRoaXMgcGFnZSBmb3IgaGVscCB3aXRoIElBTSBhbmQgQVBJLUdXIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZWN1cml0eV9pYW1fc2VydmljZS13aXRoLWlhbS5odG1sXG4gICAgICAgIC8vIE5vdGUgdGhhdCBbcmVzb3VyY2UgcG9saWNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0IGZvciBIVFRQXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktYWNjZXNzLWNvbnRyb2wtaWFtLmh0bWwpXG4gICAgICAgIHJldHVybiBuZXcgYXV0aG9yaXplcnMuSHR0cElhbUF1dGhvcml6ZXIoKVxuICAgICAgfVxuICAgICAgY2FzZSBcIkNPR05JVE9fVVNFUl9QT09MXCI6IHtcbiAgICAgICAgLy8gV2UgdXNlIGEgY3VzdG9tIGxhbWJkYSBhdXRob3JpemVyIGhlcmUgaW5zdGVhZCBvZiB0aGUgYEh0dHBVc2VyUG9vbEF1dGhvcml6ZXJgIHByb3ZpZGVkXG4gICAgICAgIC8vIGJ5IENESywgaW4gb3JkZXIgdG8gc3VwcG9ydCBgcmVxdWlyZWRTY29wZWAgYW5kIHNldHRpbmcgb2YgY3VzdG9tIGNvbnRleHQgdmFyaWFibGVzLlxuICAgICAgICBjb25zdCBhdXRob3JpemVyID0gbmV3IENvZ25pdG9Vc2VyUG9vbEF1dGhvcml6ZXIoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBpZCArIFwiTGFtYmRhXCIsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbixcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiBuZXcgYXV0aG9yaXplcnMuSHR0cExhbWJkYUF1dGhvcml6ZXIoaWQsIGF1dGhvcml6ZXIubGFtYmRhLCB7XG4gICAgICAgICAgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplci5yZXNwb25zZVR5cGVzLFxuICAgICAgICAgIC8vIE1heCAxaCwgb3IgZGlzYWJsZWQgKDBzKS4gVGhlIHZhbHVlIG9ubHkgbWF0dGVycyB3aGVuIGludmFsaWRhdGluZy9keW5hbWljIGNyZWRlbnRpYWxzXG4gICAgICAgICAgcmVzdWx0c0NhY2hlVHRsOiBjZGsuRHVyYXRpb24uaG91cnMoMSksXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjYXNlIFwiQkFTSUNfQVVUSFwiOiB7XG4gICAgICAgIGNvbnN0IGF1dGhvcml6ZXIgPSBuZXcgQmFzaWNBdXRoQXV0aG9yaXplcihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGlkICsgXCJMYW1iZGFcIixcbiAgICAgICAgICBhdXRob3JpemF0aW9uLFxuICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIG5ldyBhdXRob3JpemVycy5IdHRwTGFtYmRhQXV0aG9yaXplcihpZCwgYXV0aG9yaXplci5sYW1iZGEsIHtcbiAgICAgICAgICByZXNwb25zZVR5cGVzOiBhdXRob3JpemVyLnJlc3BvbnNlVHlwZXMsXG4gICAgICAgICAgLy8gTWF4IDFoLCBvciBkaXNhYmxlZCAoMHMpLiBUaGUgdmFsdWUgb25seSBtYXR0ZXJzIHdoZW4gaW52YWxpZGF0aW5nL2R5bmFtaWMgY3JlZGVudGlhbHNcbiAgICAgICAgICByZXN1bHRzQ2FjaGVUdGw6IGNkay5EdXJhdGlvbi5taW51dGVzKDMwKSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJDT0dOSVRPX1VTRVJfUE9PTF9PUl9CQVNJQ19BVVRIXCI6IHtcbiAgICAgICAgY29uc3QgYXV0aG9yaXplciA9IG5ldyBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXIoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBpZCArIFwiTGFtYmRhXCIsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbixcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiBuZXcgYXV0aG9yaXplcnMuSHR0cExhbWJkYUF1dGhvcml6ZXIoaWQsIGF1dGhvcml6ZXIubGFtYmRhLCB7XG4gICAgICAgICAgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplci5yZXNwb25zZVR5cGVzLFxuICAgICAgICAgIC8vIE1heCAxaCwgb3IgZGlzYWJsZWQgKDBzKS4gVGhlIHZhbHVlIG9ubHkgbWF0dGVycyB3aGVuIGludmFsaWRhdGluZy9keW5hbWljIGNyZWRlbnRpYWxzXG4gICAgICAgICAgcmVzdWx0c0NhY2hlVHRsOiBjZGsuRHVyYXRpb24uaG91cnMoMSksXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjYXNlIFwiQ1VTVE9NX0xBTUJEQV9BVVRIT1JJWkVSXCI6IHtcbiAgICAgICAgcmV0dXJuIG5ldyBhdXRob3JpemVycy5IdHRwTGFtYmRhQXV0aG9yaXplcihcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBhdXRob3JpemF0aW9uLmxhbWJkYUF1dGhvcml6ZXIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uYXV0aG9yaXphdGlvbi5hdXRob3JpemVyUHJvcHMsXG4gICAgICAgICAgICByZXNwb25zZVR5cGVzOiBhdXRob3JpemF0aW9uLmF1dGhvcml6ZXJQcm9wcz8ucmVzcG9uc2VUeXBlcyA/PyBbXG4gICAgICAgICAgICAgIGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGUuU0lNUExFLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlc3VsdHNDYWNoZVR0bDpcbiAgICAgICAgICAgICAgYXV0aG9yaXphdGlvbi5hdXRob3JpemVyUHJvcHM/LnJlc3VsdHNDYWNoZVR0bCA/P1xuICAgICAgICAgICAgICBjZGsuRHVyYXRpb24uaG91cnMoMSksXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW50ZWdyYXRpb24oXG4gICAgaW50ZWdyYXRpb246IEludGVncmF0aW9uUHJvcHMsXG4gICAgZG5zOiBBcGlHYXRld2F5UHJvcHNbXCJkbnNcIl0sXG4gICk6IGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uIHtcbiAgICBzd2l0Y2ggKGludGVncmF0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJBTEJcIjoge1xuICAgICAgICAvLyBUaGUgVlBDTGluayBjb25uZWN0cyB0aGUgaW50ZWdyYXRpb24gaW50byB0aGUgQUxCJ3MgVlBDLiBNdXN0IGJlIG1hbnVhbGx5IGNyZWF0ZWQgd2hlblxuICAgICAgICAvLyB0aGUgVlBDIGlzIGltcG9ydGVkLCB3aGljaCBpcyB0aGUgY2FzZSB3aGVuIHVzaW5nIENvcmVQbGF0Zm9ybUNvbnN1bWVyLlxuICAgICAgICBjb25zdCB2cGNMaW5rID0gbmV3IGFwaWd3LlZwY0xpbmsodGhpcywgXCJBbGJWcGNMaW5rXCIsIHtcbiAgICAgICAgICB2cGM6IGludGVncmF0aW9uLnZwYyxcbiAgICAgICAgICBzZWN1cml0eUdyb3VwczogW2ludGVncmF0aW9uLnNlY3VyaXR5R3JvdXBdLFxuICAgICAgICAgIHN1Ym5ldHM6IGludGVncmF0aW9uLnZwYy5zZWxlY3RTdWJuZXRzKCksIC8vIFRoaXMgY29ycmVjdGx5IHNlbGVjdHMgdGhlIHByaXZhdGUgc3VibmV0c1xuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlck1hcHBpbmcgPSBuZXcgYXBpZ3cuUGFyYW1ldGVyTWFwcGluZygpXG4gICAgICAgICAgLyoqIFNlZSB7QGxpbmsgQWxiSW50ZWdyYXRpb25Qcm9wcy5ob3N0TmFtZX0gKi9cbiAgICAgICAgICAub3ZlcndyaXRlSGVhZGVyKFxuICAgICAgICAgICAgXCJIb3N0XCIsXG4gICAgICAgICAgICAvLyBUaGUgSG9zdCBoZWFkZXIgY2FuIE5PVCB1c2UgZHluYW1pYyBtYXBwaW5nLCBsaWtlICRjb250ZXh0LmRvbWFpbk5hbWUgZXRjLlxuICAgICAgICAgICAgYXBpZ3cuTWFwcGluZ1ZhbHVlLmN1c3RvbShpbnRlZ3JhdGlvbi5ob3N0TmFtZSksXG4gICAgICAgICAgKVxuICAgICAgICBpZiAoaW50ZWdyYXRpb24ubWFwUGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaW50ZWdyYXRpb24ubWFwUGFyYW1ldGVycyhwYXJhbWV0ZXJNYXBwaW5nKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBpbnRlZ3JhdGlvbnMuSHR0cEFsYkludGVncmF0aW9uKFxuICAgICAgICAgIFwiQWxiSW50ZWdyYXRpb24tXCIgKyBkbnMuc3ViZG9tYWluLFxuICAgICAgICAgIGludGVncmF0aW9uLmxvYWRCYWxhbmNlckxpc3RlbmVyLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNlY3VyZVNlcnZlck5hbWU6IGludGVncmF0aW9uLmhvc3ROYW1lLFxuICAgICAgICAgICAgdnBjTGluazogdnBjTGluayxcbiAgICAgICAgICAgIG1ldGhvZDogYXBpZ3cuSHR0cE1ldGhvZC5BTlksXG4gICAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJMYW1iZGFcIjoge1xuICAgICAgICByZXR1cm4gbmV3IGludGVncmF0aW9ucy5IdHRwTGFtYmRhSW50ZWdyYXRpb24oXG4gICAgICAgICAgXCJMYW1iZGFJbnRlZ3JhdGlvblwiLFxuICAgICAgICAgIGludGVncmF0aW9uLmxhbWJkYSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXlsb2FkRm9ybWF0VmVyc2lvbjogYXBpZ3cuUGF5bG9hZEZvcm1hdFZlcnNpb24uVkVSU0lPTl8yXzAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgY2FzZSBcIlNRU1wiOiB7XG4gICAgICAgIC8vIEFQSS1HVyBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byBTUVMgYnkgZGVmYXVsdFxuICAgICAgICBjb25zdCByb2xlID0gbmV3IGlhbS5Sb2xlKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYEFwaUd3VG8ke2ludGVncmF0aW9uLnF1ZXVlLm5vZGUuaWR9U2VydmljZVJvbGVgLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICBcIkFsbG93cyBBUEktR1cgdG8gYWRkIG1lc3NhZ2VzIHRvIFwiICsgaW50ZWdyYXRpb24ucXVldWUucXVldWVBcm4sXG4gICAgICAgICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbChcImFwaWdhdGV3YXkuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICAgIGludGVncmF0aW9uLnF1ZXVlLmdyYW50U2VuZE1lc3NhZ2VzKHJvbGUpXG5cbiAgICAgICAgbGV0IHBhcmFtZXRlck1hcHBpbmcgPSBuZXcgYXBpZ3cuUGFyYW1ldGVyTWFwcGluZygpXG4gICAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWRldmVsb3AtaW50ZWdyYXRpb25zLWF3cy1zZXJ2aWNlcy1yZWZlcmVuY2UuaHRtbCNTUVMtU2VuZE1lc3NhZ2VcbiAgICAgICAgICAuY3VzdG9tKFwiUXVldWVVcmxcIiwgaW50ZWdyYXRpb24ucXVldWUucXVldWVVcmwpXG4gICAgICAgICAgLmN1c3RvbShcIk1lc3NhZ2VCb2R5XCIsIFwiJHJlcXVlc3QuYm9keVwiKVxuICAgICAgICAgIC5jdXN0b20oXCJSZWdpb25cIiwgXCJldS13ZXN0LTFcIikgLy8gQ2hhbmdlIHRoaXMgaWYgdGhlIFNRUyBxdWV1ZSBpcyBpbiBhbm90aGVyIHJlZ2lvbiFcblxuICAgICAgICBpZiAoaW50ZWdyYXRpb24ubWVzc2FnZUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nID0gcGFyYW1ldGVyTWFwcGluZy5jdXN0b20oXG4gICAgICAgICAgICBcIk1lc3NhZ2VBdHRyaWJ1dGVzXCIsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShpbnRlZ3JhdGlvbi5tZXNzYWdlQXR0cmlidXRlcyksXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTcXNSb3V0ZUludGVncmF0aW9uKFwiU3FzSW50ZWdyYXRpb25cIiwge1xuICAgICAgICAgIHR5cGU6IGFwaWd3Lkh0dHBJbnRlZ3JhdGlvblR5cGUuQVdTX1BST1hZLFxuICAgICAgICAgIHN1YnR5cGU6IGFwaWd3Lkh0dHBJbnRlZ3JhdGlvblN1YnR5cGUuU1FTX1NFTkRfTUVTU0FHRSxcbiAgICAgICAgICBjcmVkZW50aWFsczogYXBpZ3cuSW50ZWdyYXRpb25DcmVkZW50aWFscy5mcm9tUm9sZShyb2xlKSxcbiAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nOiBwYXJhbWV0ZXJNYXBwaW5nLFxuICAgICAgICAgIHBheWxvYWRGb3JtYXRWZXJzaW9uOiBhcGlndy5QYXlsb2FkRm9ybWF0VmVyc2lvbi5WRVJTSU9OXzFfMCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJFdmVudEJyaWRnZVwiOiB7XG4gICAgICAgIC8vIEFQSS1HVyBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byBwdXQgZXZlbnRzIHRvIGV2ZW50IGJ1cyBieSBkZWZhdWx0XG4gICAgICAgIGNvbnN0IHJvbGUgPSBuZXcgaWFtLlJvbGUoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBgQXBpR3dUbyR7aW50ZWdyYXRpb24uZXZlbnRCdXMubm9kZS5pZH1TZXJ2aWNlUm9sZWAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBBbGxvd3MgQVBJLUdXIHRvIHB1dCBldmVudHMgdG8gJHtpbnRlZ3JhdGlvbi5ldmVudEJ1cy5ldmVudEJ1c0Fybn1gLFxuICAgICAgICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJhcGlnYXRld2F5LmFtYXpvbmF3cy5jb21cIiksXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgICBpbnRlZ3JhdGlvbi5ldmVudEJ1cy5ncmFudFB1dEV2ZW50c1RvKHJvbGUpXG5cbiAgICAgICAgY29uc3QgcGFyYW1ldGVyTWFwcGluZyA9IG5ldyBhcGlndy5QYXJhbWV0ZXJNYXBwaW5nKClcbiAgICAgICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZXZlbnRicmlkZ2UvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUHV0RXZlbnRzUmVxdWVzdEVudHJ5Lmh0bWxcbiAgICAgICAgICAuY3VzdG9tKFwiRXZlbnRCdXNOYW1lXCIsIGludGVncmF0aW9uLmV2ZW50QnVzLmV2ZW50QnVzTmFtZSlcbiAgICAgICAgICAuY3VzdG9tKFwiRGV0YWlsXCIsIFwiJHJlcXVlc3QuYm9keVwiKVxuICAgICAgICAgIC5jdXN0b20oXCJEZXRhaWxUeXBlXCIsIGludGVncmF0aW9uLmRldGFpbFR5cGUpXG4gICAgICAgICAgLmN1c3RvbShcIlNvdXJjZVwiLCBcIiRjb250ZXh0LmFwaUlkXCIpXG5cbiAgICAgICAgcmV0dXJuIG5ldyBFdmVudEJyaWRnZVJvdXRlSW50ZWdyYXRpb24oXCJFdmVudEJyaWRnZUludGVncmF0aW9uXCIsIHtcbiAgICAgICAgICB0eXBlOiBhcGlndy5IdHRwSW50ZWdyYXRpb25UeXBlLkFXU19QUk9YWSxcbiAgICAgICAgICBzdWJ0eXBlOiBhcGlndy5IdHRwSW50ZWdyYXRpb25TdWJ0eXBlLkVWRU5UQlJJREdFX1BVVF9FVkVOVFMsXG4gICAgICAgICAgY3JlZGVudGlhbHM6IGFwaWd3LkludGVncmF0aW9uQ3JlZGVudGlhbHMuZnJvbVJvbGUocm9sZSksXG4gICAgICAgICAgcGFyYW1ldGVyTWFwcGluZzogcGFyYW1ldGVyTWFwcGluZyxcbiAgICAgICAgICBwYXlsb2FkRm9ybWF0VmVyc2lvbjogYXBpZ3cuUGF5bG9hZEZvcm1hdFZlcnNpb24uVkVSU0lPTl8xXzAsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBhIGdyYW50YWJsZSB0YXJnZXQgKHJvbGUsIHVzZXIgZXRjLikgcGVybWlzc2lvbiB0byBpbnZva2UgdGhlIEFQSS5cbiAgICogT25seSB3b3JrcyB3aGVuIHVzaW5nIGBJQU1gIGFzIHtAbGluayBBcGlHYXRld2F5Um91dGUuYXV0aG9yaXphdGlvbn0uXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgQSBncmFudGFibGUsIGxpa2Uge0BsaW5rIGlhbS5Sb2xlfVxuICAgKi9cbiAgcHVibGljIGdyYW50SW52b2tlKHRhcmdldDogaWFtLklHcmFudGFibGUpIHtcbiAgICBmb3IgKGNvbnN0IHJvdXRlUHJvcHMgb2YgdGhpcy5wcm9wcy5yb3V0ZXMpIHtcbiAgICAgIGNvbnN0IGF1dGhUeXBlID1cbiAgICAgICAgcm91dGVQcm9wcy5hdXRob3JpemF0aW9uPy50eXBlID8/IHRoaXMucHJvcHMuZGVmYXVsdEF1dGhvcml6YXRpb24/LnR5cGVcblxuICAgICAgaWYgKGF1dGhUeXBlICE9PSBcIklBTVwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGdyYW50IGludm9rZSBmb3IgYW4gQVBJIEdhdGV3YXkgd2hlbiBub3QgdXNpbmcgSUFNIGF1dGggKGZvdW5kIGF1dGggJyR7YXV0aFR5cGV9JyBvbiByb3V0ZSAnJHtyb3V0ZVByb3BzLnBhdGh9JykgWyR7Y2RrLlN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZX1dYCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgcm91dGUgb2YgdGhpcy5yb3V0ZXMpIHtcbiAgICAgIHJvdXRlLmdyYW50SW52b2tlKHRhcmdldClcbiAgICB9XG4gIH1cbn1cblxuLyoqIEFjdHMgYXMgZ2x1ZSAoYmV0d2VlbiB0aGUgaW50ZWdyYXRpb24gcHJvcHMgYW5kIHRoZSBIdHRwQXBpKSB3aGVuIGNyZWF0aW5nIGFuIFNxc0ludGVncmF0aW9uLiAqL1xuY2xhc3MgU3FzUm91dGVJbnRlZ3JhdGlvbiBleHRlbmRzIGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBpZCBUaGUgaWQgdXNlZCBpbiB0aGUge0BsaW5rIGFwaWd3Lkh0dHBJbnRlZ3JhdGlvbn0gY29uc3RydWN0XG4gICAqICAgIGNyZWF0ZWQgaW50ZXJuYWxseSBieSB7QGxpbmsgYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb24uX2JpbmRUb1JvdXRlfS5cbiAgICogICAgW1NvdXJjZSBjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi9iNWFlMzc3ODJiYzNjYjYzN2VlZWY5ZmJiMWZiZTJjNWVmZGZjMDY4L3BhY2thZ2VzLyU0MGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi9saWIvaHR0cC9pbnRlZ3JhdGlvbi50cyNMMzIxKVxuICAgKiBAcGFyYW0gaW50ZWdyYXRpb25Qcm9wcyBUaGUgcHJvcHMgdG8gcGFzcyB0byB0aGUge0BsaW5rIGFwaWd3Lkh0dHBJbnRlZ3JhdGlvbn0gY29uc3RydWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIGludGVncmF0aW9uUHJvcHM6IGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uQ29uZmlnLFxuICApIHtcbiAgICBzdXBlcihpZClcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHNlbmRzIHRoZSBwcm9wZXJ0aWVzIG5lZWRlZCBmb3IgY3JlYXRpbmcgYSB7QGxpbmsgYXBpZ3cuSHR0cEludGVncmF0aW9ufSB0byB0aGVcbiAgICoge0BsaW5rIGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9ufS5cbiAgICovXG4gIGJpbmQoKTogYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb25Db25maWcge1xuICAgIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi9iNWFlMzc3ODJiYzNjYjYzN2VlZWY5ZmJiMWZiZTJjNWVmZGZjMDY4L3BhY2thZ2VzLyU0MGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi9saWIvaHR0cC9pbnRlZ3JhdGlvbi50cyNMMzE5XG4gICAgcmV0dXJuIHRoaXMuaW50ZWdyYXRpb25Qcm9wc1xuICB9XG59XG5cbi8qKiBBY3RzIGFzIGdsdWUgKGJldHdlZW4gdGhlIGludGVncmF0aW9uIHByb3BzIGFuZCB0aGUgSHR0cEFwaSkgd2hlbiBjcmVhdGluZyBhbiBFdmVudEJyaWRnZSBpbnRlZ3JhdGlvbi4gKi9cbmNsYXNzIEV2ZW50QnJpZGdlUm91dGVJbnRlZ3JhdGlvbiBleHRlbmRzIGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBpZCBUaGUgaWQgdXNlZCBpbiB0aGUge0BsaW5rIGFwaWd3Lkh0dHBJbnRlZ3JhdGlvbn0gY29uc3RydWN0XG4gICAqICAgIGNyZWF0ZWQgaW50ZXJuYWxseSBieSB7QGxpbmsgYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb24uX2JpbmRUb1JvdXRlfS5cbiAgICogICAgW1NvdXJjZSBjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi9iNWFlMzc3ODJiYzNjYjYzN2VlZWY5ZmJiMWZiZTJjNWVmZGZjMDY4L3BhY2thZ2VzLyU0MGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi9saWIvaHR0cC9pbnRlZ3JhdGlvbi50cyNMMzIxKVxuICAgKiBAcGFyYW0gaW50ZWdyYXRpb25Qcm9wcyBUaGUgcHJvcHMgdG8gcGFzcyB0byB0aGUge0BsaW5rIGFwaWd3Lkh0dHBJbnRlZ3JhdGlvbn0gY29uc3RydWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIGludGVncmF0aW9uUHJvcHM6IGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uQ29uZmlnLFxuICApIHtcbiAgICBzdXBlcihpZClcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHNlbmRzIHRoZSBwcm9wZXJ0aWVzIG5lZWRlZCBmb3IgY3JlYXRpbmcgYSB7QGxpbmsgYXBpZ3cuSHR0cEludGVncmF0aW9ufSB0byB0aGVcbiAgICoge0BsaW5rIGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9ufS5cbiAgICovXG4gIGJpbmQoKTogYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb25Db25maWcge1xuICAgIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi9iNWFlMzc3ODJiYzNjYjYzN2VlZWY5ZmJiMWZiZTJjNWVmZGZjMDY4L3BhY2thZ2VzLyU0MGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi9saWIvaHR0cC9pbnRlZ3JhdGlvbi50cyNMMzE5XG4gICAgcmV0dXJuIHRoaXMuaW50ZWdyYXRpb25Qcm9wc1xuICB9XG59XG5cbi8qKlxuICogV2hlbiB1c2luZyBgTm9kZWpzRnVuY3Rpb25gIHdpdGggYGVudHJ5YCwgd2UgcG9pbnQgQ0RLIHRvIGEgZmlsZSB3aXRoIG91ciBsYW1iZGEgY29kZS4gVGhpcyBjYW5cbiAqIGVpdGhlciBiZSBhIFR5cGVTY3JpcHQgb3IgSmF2YVNjcmlwdCBmaWxlLiBXaGVuIGNyZWF0aW5nIGNvbnN0cnVjdHMgaW4gdGVzdHMgaW5zaWRlIHRoaXMgbGlicmFyeSxcbiAqIHRoZSBlbnRyeSB3aWxsIHBvaW50IHRvIHRoZSBUeXBlU2NyaXB0IGZpbGUgaW4gdGhlIHNvdXJjZSBjb2RlLiBCdXQgd2hlbiBhIGxpYnJhcnkgY29uc3VtZXIgdXNlc1xuICogdGhpcywgaXQgd2lsbCBpbnN0ZWFkIHBvaW50IHRvIHRoZSB0cmFuc3BpbGVkIEphdmFTY3JpcHQgZmlsZS4gU28gdG8gc2V0IHRoZSBjb3JyZWN0IGZpbGVcbiAqIGV4dGVuc2lvbiwgd2UgbXVzdCBjaGVjayBpZiB3ZSdyZSBiZWluZyBydW4gaW4gdGhlIGNvbnRleHQgb2YgdGhlIFR5cGVTY3JpcHQgc291cmNlIGNvZGVcbiAqIChzcmMvYXBpLWdhdGV3YXkpLCBvdGhlcndpc2Ugd2UncmUgYmVpbmcgcnVuIGJ5IGEgY29uc3VtZXIgYXMgdHJhbnNwaWxlZCBKYXZhU2NyaXB0LlxuICovXG5jb25zdCBhdXRob3JpemVyRmlsZUV4dGVuc2lvbiA9IF9fZGlybmFtZS5lbmRzV2l0aChcInNyYy9hcGktZ2F0ZXdheVwiKVxuICA/IFwidHNcIlxuICA6IFwianNcIlxuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gTGFtYmRhIGF1dGhvcml6ZXIgd2hpY2ggcmVhZHMgYEF1dGhvcml6YXRpb246IEJlYXJlciA8YWNjZXNzIHRva2VuPmAgaGVhZGVyIGFuZFxuICogdmVyaWZpZXMgdGhlIHRva2VuIGFnYWluc3QgYSBDb2duaXRvIHVzZXIgcG9vbC5cbiAqL1xuY2xhc3MgQ29nbml0b1VzZXJQb29sQXV0aG9yaXplcjxcbiAgQXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcsXG4+IGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgbGFtYmRhOiBsYW1iZGEuSUZ1bmN0aW9uXG5cbiAgLyoqXG4gICAqIFVzZSBzaW1wbGUgcmVzcG9uc2UgdHlwZSAoYHsgaXNBdXRob3JpemVkOiB0cnVlL2ZhbHNlIH1gKSwgYXMgb3Bwb3NlZCB0byByZXR1cm5pbmcgYW4gSUFNXG4gICAqIFBvbGljeSBkb2N1bWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNwb25zZVR5cGVzOiBhdXRob3JpemVycy5IdHRwTGFtYmRhUmVzcG9uc2VUeXBlW10gPSBbXG4gICAgYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZS5TSU1QTEUsXG4gIF1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQ29nbml0b1VzZXJQb29sQXV0aG9yaXplclByb3BzPEF1dGhTY29wZXNUPixcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5sYW1iZGEgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiQXV0aG9yaXplckZ1bmN0aW9uXCIsIHtcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oXG4gICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgYGF1dGhvcml6ZXJzL2NvZ25pdG8tdXNlci1wb29sLWF1dGhvcml6ZXIuJHthdXRob3JpemVyRmlsZUV4dGVuc2lvbn1gLFxuICAgICAgKSxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBbXCJVU0VSX1BPT0xfSURcIl06IHByb3BzLnVzZXJQb29sLnVzZXJQb29sSWQsXG4gICAgICAgIFtcIlJFUVVJUkVEX1NDT1BFXCJdOiBwcm9wcy5yZXF1aXJlZFNjb3BlID8/IFwiXCIsXG4gICAgICAgIFtcIkNSRURFTlRJQUxTX0ZPUl9JTlRFUk5BTF9BVVRIT1JJWkFUSU9OXCJdOlxuICAgICAgICAgIHByb3BzLmNyZWRlbnRpYWxzRm9ySW50ZXJuYWxBdXRob3JpemF0aW9uXG4gICAgICAgICAgICA/IHByb3BzLmNyZWRlbnRpYWxzRm9ySW50ZXJuYWxBdXRob3JpemF0aW9uXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBpZiAocHJvcHMuY3JlZGVudGlhbHNGb3JJbnRlcm5hbEF1dGhvcml6YXRpb24pIHtcbiAgICAgIHNlY3JldHNtYW5hZ2VyLlNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKFxuICAgICAgICBzY29wZSxcbiAgICAgICAgaWQgKyBcIkJhc2ljQXV0aFNlY3JldFwiLFxuICAgICAgICBwcm9wcy5jcmVkZW50aWFsc0ZvckludGVybmFsQXV0aG9yaXphdGlvbixcbiAgICAgICkuZ3JhbnRSZWFkKHRoaXMubGFtYmRhKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gTGFtYmRhIGF1dGhvcml6ZXIgd2hpY2ggcmVhZHMgYEF1dGhvcml6YXRpb246IEJhc2ljIDxiYXNlNjQtZW5jb2RlZCBjcmVkZW50aWFscz5gXG4gKiBoZWFkZXIgYW5kIHZlcmlmaWVzIHRoZSBjcmVkZW50aWFscyBhZ2FpbnN0IGEgZ2l2ZW4gc2VjcmV0LlxuICovXG5jbGFzcyBCYXNpY0F1dGhBdXRob3JpemVyIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgbGFtYmRhOiBsYW1iZGEuSUZ1bmN0aW9uXG5cbiAgLy8gU2ltcGxlIGlzIGB7IGlzQXV0aG9yaXplZDogdHJ1ZS9mYWxzZSB9YCwgYXMgb3Bwb3NlZCB0byByZXR1cm5pbmcgYW4gSUFNIFBvbGljeSBkb2N1bWVudFxuICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZVtdID0gW1xuICAgIGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGUuU0lNUExFLFxuICBdXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5sYW1iZGEgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiQmFzaWNBdXRoTGFtYmRhXCIsIHtcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oXG4gICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgYGF1dGhvcml6ZXJzL2Jhc2ljLWF1dGgtYXV0aG9yaXplci4ke2F1dGhvcml6ZXJGaWxlRXh0ZW5zaW9ufWAsXG4gICAgICApLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiQW4gYXV0aG9yaXplciBmb3IgQVBJLUdhdGV3YXkgdGhhdCBjaGVja3MgQmFzaWMgQXV0aCBjcmVkZW50aWFscyBvbiByZXF1ZXN0c1wiLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBbXCJDUkVERU5USUFMU19TRUNSRVRfTkFNRVwiXTogcHJvcHMuY3JlZGVudGlhbHNTZWNyZXROYW1lXG4gICAgICAgICAgPyBwcm9wcy5jcmVkZW50aWFsc1NlY3JldE5hbWVcbiAgICAgICAgICA6IFwiXCIsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBzZWNyZXRzbWFuYWdlci5TZWNyZXQuZnJvbVNlY3JldE5hbWVWMihcbiAgICAgIHNjb3BlLFxuICAgICAgaWQgKyBcIkJhc2ljQXV0aFNlY3JldFwiLFxuICAgICAgcHJvcHMuY3JlZGVudGlhbHNTZWNyZXROYW1lLFxuICAgICkuZ3JhbnRSZWFkKHRoaXMubGFtYmRhKVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGN1c3RvbSBMYW1iZGEgYXV0aG9yaXplciB3aGljaCBhbGxvd3MgYm90aDpcbiAqIC0gYEF1dGhvcml6YXRpb246IEJlYXJlciA8YWNjZXNzIHRva2VuPmAgaGVhZGVyLCBmb3Igd2hpY2ggdGhlIHRva2VuIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgZ2l2ZW5cbiAqICAgQ29nbml0byB1c2VyIHBvb2xcbiAqIC0gYEF1dGhvcml6YXRpb246IEJhc2ljIDxiYXNlNjQtZW5jb2RlZCBjcmVkZW50aWFscz5gIGhlYWRlciwgZm9yIHdoaWNoIHRoZSBjcmVkZW50aWFscyBhcmVcbiAqICAgY2hlY2tlZCBhZ2FpbnN0IHRoZSBjcmVkZW50aWFscyBmcm9tIHRoZSBnaXZlbiBiYXNpYyBhdXRoIHNlY3JldCBuYW1lXG4gKlxuICogSWYgZWl0aGVyIG9mIHRoZXNlIGFyZSBnaXZlbiBhbmQgdmFsaWQsIHRoZSByZXF1ZXN0IGlzIGF1dGhlbnRpY2F0ZWQuXG4gKi9cbmNsYXNzIENvZ25pdG9Vc2VyUG9vbE9yQmFzaWNBdXRoQXV0aG9yaXplcjxcbiAgQXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcsXG4+IGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgbGFtYmRhOiBsYW1iZGEuSUZ1bmN0aW9uXG5cbiAgLyoqXG4gICAqIFVzZSBzaW1wbGUgcmVzcG9uc2UgdHlwZSAoYHsgaXNBdXRob3JpemVkOiB0cnVlL2ZhbHNlIH1gKSwgYXMgb3Bwb3NlZCB0byByZXR1cm5pbmcgYW4gSUFNXG4gICAqIFBvbGljeSBkb2N1bWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNwb25zZVR5cGVzOiBhdXRob3JpemVycy5IdHRwTGFtYmRhUmVzcG9uc2VUeXBlW10gPSBbXG4gICAgYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZS5TSU1QTEUsXG4gIF1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQ29nbml0b1VzZXJQb29sT3JCYXNpY0F1dGhBdXRob3JpemVyUHJvcHM8QXV0aFNjb3Blc1Q+LFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICB0aGlzLmxhbWJkYSA9IG5ldyBsYW1iZGFOb2RlanMuTm9kZWpzRnVuY3Rpb24odGhpcywgXCJBdXRob3JpemVyRnVuY3Rpb25cIiwge1xuICAgICAgZW50cnk6IHBhdGguam9pbihcbiAgICAgICAgX19kaXJuYW1lLFxuICAgICAgICBgYXV0aG9yaXplcnMvY29nbml0by11c2VyLXBvb2wtb3ItYmFzaWMtYXV0aC1hdXRob3JpemVyLiR7YXV0aG9yaXplckZpbGVFeHRlbnNpb259YCxcbiAgICAgICksXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgW1wiVVNFUl9QT09MX0lEXCJdOiBwcm9wcy51c2VyUG9vbCA/IHByb3BzLnVzZXJQb29sLnVzZXJQb29sSWQgOiBcIlwiLFxuICAgICAgICBbXCJSRVFVSVJFRF9TQ09QRVwiXTogcHJvcHMucmVxdWlyZWRTY29wZSA/PyBcIlwiLFxuICAgICAgICBbXCJCQVNJQ19BVVRIX0NSRURFTlRJQUxTX1NFQ1JFVF9OQU1FXCJdOlxuICAgICAgICAgIHByb3BzLmJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZVxuICAgICAgICAgICAgPyBwcm9wcy5iYXNpY0F1dGhDcmVkZW50aWFsc1NlY3JldE5hbWVcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGlmIChwcm9wcy5iYXNpY0F1dGhDcmVkZW50aWFsc1NlY3JldE5hbWUpIHtcbiAgICAgIHNlY3JldHNtYW5hZ2VyLlNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKFxuICAgICAgICBzY29wZSxcbiAgICAgICAgaWQgKyBcIkJhc2ljQXV0aFNlY3JldFwiLFxuICAgICAgICBwcm9wcy5iYXNpY0F1dGhDcmVkZW50aWFsc1NlY3JldE5hbWUsXG4gICAgICApLmdyYW50UmVhZCh0aGlzLmxhbWJkYSlcbiAgICB9XG4gIH1cbn1cblxuLyoqIFJldHVybnMgYSBzaG9ydCBzZW1pLXVuaXF1ZSBoYXNoIG9mIHRoZSBnaXZlbiBzdHJpbmcuICovXG5mdW5jdGlvbiBzaG9ydEhhc2goc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBTSEEtMSBpcyBuby1ubyB3aGVuIHdlIG5lZWQgY3J5cHRvZ3JhcGhpYyBzZWN1cml0eSwgYnV0IGhlcmUgd2UganVzdCBpdCBmb3Igc2hvcnRlbmluZyBhIG5hbWUsXG4gIC8vIHdoaWNoIGlzIGZpbmVcbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJzaGExXCIpLnVwZGF0ZShzdHIpLmRpZ2VzdChcImhleFwiKS5zdWJzdHJpbmcoMCwgMTApXG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liflig/cdk",
3
- "version": "3.5.9",
3
+ "version": "3.6.0",
4
4
  "description": "CDK library for Liflig",
5
5
  "type": "module",
6
6
  "repository": {
@@ -42,44 +42,44 @@
42
42
  },
43
43
  "devDependencies": {
44
44
  "@aws-cdk/assert": "2.68.0",
45
- "@aws-sdk/client-cloudwatch-logs": "3.758.0",
46
- "@aws-sdk/client-codebuild": "3.758.0",
45
+ "@aws-sdk/client-cloudwatch-logs": "3.767.0",
46
+ "@aws-sdk/client-codebuild": "3.767.0",
47
47
  "@aws-sdk/client-codepipeline": "3.758.0",
48
- "@aws-sdk/client-ecs": "3.758.0",
48
+ "@aws-sdk/client-ecs": "3.766.0",
49
49
  "@aws-sdk/client-s3": "3.758.0",
50
50
  "@aws-sdk/client-secrets-manager": "3.758.0",
51
51
  "@aws-sdk/client-ses": "3.758.0",
52
52
  "@aws-sdk/client-sesv2": "3.758.0",
53
53
  "@aws-sdk/client-sfn": "3.758.0",
54
54
  "@aws-sdk/lib-storage": "3.758.0",
55
- "@commitlint/cli": "19.7.1",
56
- "@commitlint/config-conventional": "19.7.1",
55
+ "@commitlint/cli": "19.8.0",
56
+ "@commitlint/config-conventional": "19.8.0",
57
57
  "@eslint/eslintrc": "3.3.0",
58
- "@eslint/js": "9.21.0",
58
+ "@eslint/js": "9.22.0",
59
59
  "@types/aws-lambda": "8.10.147",
60
60
  "@types/jest": "29.5.14",
61
- "@types/node": "22.13.5",
62
- "@typescript-eslint/eslint-plugin": "8.25.0",
63
- "@typescript-eslint/parser": "8.25.0",
64
- "aws-cdk": "2.1001.0",
65
- "aws-cdk-lib": "2.181.0",
61
+ "@types/node": "22.13.10",
62
+ "@typescript-eslint/eslint-plugin": "8.26.1",
63
+ "@typescript-eslint/parser": "8.26.1",
64
+ "aws-cdk": "2.1004.0",
65
+ "aws-cdk-lib": "2.183.0",
66
66
  "constructs": "10.4.2",
67
- "esbuild": "0.25.0",
68
- "eslint": "9.21.0",
69
- "eslint-config-prettier": "10.0.2",
67
+ "esbuild": "0.25.1",
68
+ "eslint": "9.22.0",
69
+ "eslint-config-prettier": "10.1.1",
70
70
  "eslint-plugin-prettier": "5.2.3",
71
71
  "husky": "9.1.7",
72
72
  "jest": "29.7.0",
73
73
  "jest-cdk-snapshot": "2.2.5",
74
- "prettier": "3.5.2",
74
+ "prettier": "3.5.3",
75
75
  "semantic-release": "24.2.3",
76
76
  "ts-jest": "29.2.6",
77
77
  "tsx": "4.19.3",
78
- "typedoc": "0.27.9",
79
- "typescript": "5.7.3"
78
+ "typedoc": "0.28.0",
79
+ "typescript": "5.8.2"
80
80
  },
81
81
  "dependencies": {
82
- "@aws-sdk/client-ssm": "3.758.0",
82
+ "@aws-sdk/client-ssm": "3.759.0",
83
83
  "@capraconsulting/webapp-deploy-lambda": "2.4.1",
84
84
  "aws-jwt-verify": "5.0.0",
85
85
  "del": "8.0.0",