@ashishpandeyone/cdk-lambda-web-function 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -53,7 +53,7 @@ const web_function_grants_1 = require("./web-function-grants");
53
53
  * Endpoints are created only through `WebFunction`, which owns their log groups in every region, so the constructor is private.
54
54
  */
55
55
  class WebFunctionEndpoint extends constructs_1.Construct {
56
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionEndpoint", version: "0.1.4" };
56
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionEndpoint", version: "0.1.6" };
57
57
  /**
58
58
  * Creates an endpoint of a Web Function. Used by `WebFunction`.
59
59
  *
@@ -82,13 +82,14 @@ class WebFunctionEndpoint extends constructs_1.Construct {
82
82
  url;
83
83
  /** Grants on this endpoint (e.g. `grants.invoke(principal)`). */
84
84
  grants;
85
+ /** The function this endpoint belongs to. */
86
+ webFunction;
85
87
  /**
86
88
  * The alarms this endpoint created for its deployment's `rollbackOn`, one per threshold in every region it serves from
87
89
  * (the home region's first). Empty without `rollbackOn`.
88
90
  */
89
91
  rollbackAlarms = [];
90
92
  homeRegion;
91
- webFunction;
92
93
  resource;
93
94
  weights;
94
95
  routed = false;
@@ -167,7 +168,7 @@ class WebFunctionEndpoint extends constructs_1.Construct {
167
168
  this.endpointArn = resource.attrEndpointArn;
168
169
  this.domainName = resource.attrDomainName;
169
170
  this.url = `https://${resource.attrDomainName}`;
170
- this.grants = web_function_grants_1.WebFunctionGrants._forEndpoint(this);
171
+ this.grants = web_function_grants_1.WebFunctionGrants._forEndpoint(this, props.webFunction);
171
172
  }
172
173
  /**
173
174
  * The URL of this endpoint in one region. Only for `PER_REGION` endpoints.
@@ -175,14 +176,22 @@ class WebFunctionEndpoint extends constructs_1.Construct {
175
176
  * @param region one of `regions`
176
177
  */
177
178
  regionalUrl(region) {
179
+ return `https://${this.regionalDomainName(region)}`;
180
+ }
181
+ /**
182
+ * The domain name of this endpoint in one region. Only for `PER_REGION` endpoints.
183
+ *
184
+ * @param region one of `regions`
185
+ */
186
+ regionalDomainName(region) {
178
187
  if (this.endpointType !== enums_1.WebFunctionEndpointType.PER_REGION) {
179
- throw new Error(`${this.node.path}: regionalUrl() is only available for PER_REGION endpoints (this one is ${this.endpointType}); use url`);
188
+ throw new Error(`${this.node.path}: regional URLs and domain names are only available for PER_REGION endpoints (this one is ${this.endpointType}); use url or domainName`);
180
189
  }
181
190
  if (!this.regions.includes(region)) {
182
191
  throw new Error(`${this.node.path}: region ${region} is not one of the endpoint's regions (${this.regions.join(', ')})`);
183
192
  }
184
193
  if (region === this.homeRegion) {
185
- return this.url;
194
+ return this.domainName;
186
195
  }
187
196
  this.lookup ??= new endpoint_lookup_1.EndpointLookup(this, 'Lookup', {
188
197
  functionName: this.webFunction.webFunctionName,
@@ -190,7 +199,7 @@ class WebFunctionEndpoint extends constructs_1.Construct {
190
199
  endpointName: this.endpointName,
191
200
  endpointArn: this.endpointArn,
192
201
  });
193
- return `https://${this.lookup.regionalDomain(region)}`;
202
+ return this.lookup.regionalDomain(region);
194
203
  }
195
204
  /**
196
205
  * Routes the endpoint to `revision` instead of the function's current revision, optionally sharing
@@ -435,4 +444,4 @@ function defaultEndpointName(prefix, seed, endpointType, extraRegions) {
435
444
  const hash = (0, node_crypto_1.createHash)('sha256').update([...(seed !== undefined ? [seed] : []), endpointType, ...extraRegions].join(',')).digest('hex').slice(0, 8);
436
445
  return `${prefix}-${hash}`;
437
446
  }
438
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWVuZHBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi1lbmRwb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXlDO0FBQ3pDLDZDQUErRTtBQUMvRSx1RUFBeUQ7QUFFekQsK0RBQWlEO0FBQ2pELDJDQUF1QztBQUN2QyxtQ0FBdUU7QUFDdkUsK0RBQTJEO0FBQzNELCtDQUcyQjtBQUMzQiw2REFBNEU7QUFFNUUsMkRBQXVEO0FBQ3ZELHFEQUFxRjtBQUdyRiwrREFBMEQ7QUFxSTFEOzs7O0dBSUc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLHNCQUFTOztJQUNoRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUNqRixPQUFPLElBQUksbUJBQW1CLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsMkJBQTJCO0lBQ1gsWUFBWSxDQUFTO0lBRXJDLDBCQUEwQjtJQUNWLFdBQVcsQ0FBUztJQUVwQyw4Q0FBOEM7SUFDOUIsWUFBWSxDQUEwQjtJQUV0RCxxREFBcUQ7SUFDckMsUUFBUSxDQUFzQjtJQUU5QywyR0FBMkc7SUFDM0YsT0FBTyxDQUFXO0lBRWxDOztPQUVHO0lBQ2EsVUFBVSxDQUFTO0lBRW5DOztPQUVHO0lBQ2EsR0FBRyxDQUFTO0lBRTVCLGlFQUFpRTtJQUNqRCxNQUFNLENBQW9CO0lBRTFDOzs7T0FHRztJQUNhLGNBQWMsR0FBd0IsRUFBRSxDQUFDO0lBRXhDLFVBQVUsQ0FBUztJQUNuQixXQUFXLENBQWU7SUFDMUIsUUFBUSxDQUFnQztJQUNqRCxPQUFPLENBQXlEO0lBQ2hFLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDTixPQUFPLENBQVU7SUFDMUIsTUFBTSxDQUFrQjtJ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QyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckosT0FBTyxHQUFHLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IEFubm90YXRpb25zLCBEdXJhdGlvbiwgU3RhY2ssIFRva2VuLCBWYWxpZGF0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkF1dGhUeXBlLCBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZSB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHsgRW5kcG9pbnRMb29rdXAgfSBmcm9tICcuL3ByaXZhdGUvZW5kcG9pbnQtbG9va3VwJztcbmltcG9ydCB7XG4gIENMSUVOVF9FUlJPUlMsIERFRkFVTFRfUEVSSU9ELCBSRVFVRVNUUywgU0VSVkVSX0VSUk9SUywgVVNBR0VfTkFNRVNQQUNFLCBXRUJfTkFNRVNQQUNFLFxuICBlbmRwb2ludERpbWVuc2lvbnMsIHJhdGVBbGFybVF1ZXJpZXMsIHJhdGVFeHByZXNzaW9uLFxufSBmcm9tICcuL3ByaXZhdGUvbWV0cmljcyc7XG5pbXBvcnQgeyBBTEFSTV9OQU1FX1BSRUZJWCwgUmVnaW9uYWxBbGFybSB9IGZyb20gJy4vcHJpdmF0ZS9yZWdpb25hbC1hbGFybSc7XG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkUm9sbGJhY2tPcHRpb25zIH0gZnJvbSAnLi9wcml2YXRlL3JvbGxiYWNrJztcbmltcG9ydCB7IFRyYWZmaWNTaGlmdCB9IGZyb20gJy4vcHJpdmF0ZS90cmFmZmljLXNoaWZ0JztcbmltcG9ydCB7IENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUsIGFzc2VydFJlc291cmNlTmFtZSB9IGZyb20gJy4vcHJpdmF0ZS92YWxpZGF0aW9uJztcbmltcG9ydCB0eXBlIHsgSVdlYkZ1bmN0aW9uIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBXZWJGdW5jdGlvbkRlcGxveW1lbnQgfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1kZXBsb3ltZW50JztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uR3JhbnRzIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZ3JhbnRzJztcbmltcG9ydCB0eXBlIHsgSVdlYkZ1bmN0aW9uUmV2aXNpb24gfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1yZXZpc2lvbic7XG5cbi8qKlxuICogQSByZXZpc2lvbiBhbmQgdGhlIHNoYXJlIG9mIGFuIGVuZHBvaW50J3MgdHJhZmZpYyBpdCByZWNlaXZlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvblJldmlzaW9uV2VpZ2h0IHtcbiAgLyoqIFRoZSByZXZpc2lvbi4gKi9cbiAgcmVhZG9ubHkgcmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgcmV2aXNpb24ncyBzaGFyZSBvZiB0aGUgZW5kcG9pbnQncyB0cmFmZmljLCBhcyBhIGZyYWN0aW9uIChsaWtlIGBsYW1iZGEuQWxpYXNgIGBhZGRpdGlvbmFsVmVyc2lvbnNgKS5cbiAgICogTXVzdCBiZSBhIHdob2xlIHBlcmNlbnRhZ2UgZnJvbSAwLjAxIHRvIDAuOTkuXG4gICAqL1xuICByZWFkb25seSB3ZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhIFdlYiBGdW5jdGlvbidzIGVuZHBvaW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBlbmRwb2ludCBzZXJ2ZXMgdHJhZmZpYyBmcm9tLlxuICAgKlxuICAgKiBAZGVmYXVsdCBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnRUeXBlPzogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGU7XG5cbiAgLyoqXG4gICAqIFJlZ2lvbnMgdG8gc2VydmUgZnJvbSBpbiBhZGRpdGlvbiB0byB0aGUgaG9tZSByZWdpb24gKHRoZSBzdGFjaydzIHJlZ2lvbikuXG4gICAqIFJlcXVpcmVkIChhdCBsZWFzdCBvbmUpIGZvciBgTVVMVElfUkVHSU9OYCBhbmQgYFBFUl9SRUdJT05gOyBtdXN0IGJlIGVtcHR5IGZvciBgSE9NRV9SRUdJT05gLlxuICAgKlxuICAgKiBDaGFuZ2luZyB0aGlzIGNyZWF0ZXMgYSBuZXcgZW5kcG9pbnQgd2l0aCBhIG5ldyBVUkwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZXh0cmEgcmVnaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9ucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZW5kcG9pbnQncyBuYW1lLCBzaG93biBpbiBsb2dzIChgZW5kcG9pbnROYW1lYCkgYW5kIGluIHRoZSBgbGFtYmRhLXdlYi1lbmRwb2ludC1uYW1lYCBoZWFkZXIuXG4gICAqIE5hbWVzIGFyZSB1bmlxdWUgcGVyIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIHRoZSBuYW1lIGVuZHMgaW4gYSBoYXNoIG9mIHRoZSBlbmRwb2ludCB0eXBlIGFuZCByZWdpb25zLCBzbyBjaGFuZ2luZyBlaXRoZXIgZGVwbG95c1xuICAgKiBhIG5ldyBlbmRwb2ludCBjbGVhbmx5LiBXaGVuIHNldCwgY2hhbmdpbmcgdGhlIGVuZHBvaW50IHR5cGUgb3IgcmVnaW9ucyBhbHNvIHJlcXVpcmVzIGEgbmV3IG5hbWU6XG4gICAqIHR3byBlbmRwb2ludHMgb2Ygb25lIGZ1bmN0aW9uIGNhbid0IHNoYXJlIGEgbmFtZSwgYW5kIENsb3VkRm9ybWF0aW9uIGNyZWF0ZXMgdGhlIHJlcGxhY2VtZW50XG4gICAqIGJlZm9yZSBkZWxldGluZyB0aGUgb2xkIG9uZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgZGVmYXVsdC08aGFzaD5gIGZvciB0aGUgZnVuY3Rpb24ncyBkZWZhdWx0IGVuZHBvaW50LCBgPGlkPi08aGFzaD5gIGZvciBlbmRwb2ludHMgYWRkZWQgd2l0aCBgYWRkRW5kcG9pbnRgXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIGVuZHBvaW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vc3QgcmVxdWVzdHMgcGVyIHNlY29uZCB0aGUgZW5kcG9pbnQgYWNjZXB0czsgZXhjZXNzIHJlcXVlc3RzIGdldCBIVFRQIDQyOS5cbiAgICogQWxsb3dlZDogMCAoYmxvY2tzIGFsbCB0cmFmZmljKSwgMTAw4oCTMSwwMDAgaW4gc3RlcHMgb2YgMTAwLCBvciAyLDAwMOKAkzEwLDAwMCBpbiBzdGVwcyBvZiAxLDAwMC5cbiAgICpcbiAgICogRW5mb3JjZWQgc2VwYXJhdGVseSBpbiBlYWNoIHJlZ2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzIGZyb20sIHNvIGEgbXVsdGktcmVnaW9uIGVuZHBvaW50XG4gICAqIGNhbiBhY2NlcHQgdGhpcyBtYW55IHJlcXVlc3RzIHBlciBzZWNvbmQgaW4gZXZlcnkgcmVnaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGxpbWl0IGJleW9uZCB0aGUgc2VydmljZSBxdW90YSBvZiAxMCwwMDAgcmVxdWVzdHMgcGVyIHNlY29uZCBwZXIgZW5kcG9pbnQgKHBlciByZWdpb24pXG4gICAqL1xuICByZWFkb25seSByYXRlTGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtb3N0IGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdGhlIGVuZHBvaW50IG1heSB1c2UgKDLigJMxMCwwMDApLiBFYWNoIG9uZSB1c2VzIDIgdkNQVXMgb2YgdGhlIGFjY291bnQncyBxdW90YS5cbiAgICpcbiAgICogRW5mb3JjZWQgc2VwYXJhdGVseSBpbiBlYWNoIHJlZ2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzIGZyb20uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc2NhbGVzIHdpdGhpbiB0aGUgYWNjb3VudCdzIHZDUFUgcXVvdGFcbiAgICovXG4gIHJlYWRvbmx5IG1heEVudmlyb25tZW50cz86IG51bWJlcjtcblxuICAvKipcbiAgICogSG93IHRoZSBlbmRwb2ludCBtb3ZlcyBpdHMgdHJhZmZpYyB0byBhIG5ldyByZXZpc2lvbjogYWxsIGF0IG9uY2UsIG9yIGluIHN0ZXBzXG4gICAqIChgV2ViRnVuY3Rpb25EZXBsb3ltZW50LmNhbmFyeSgpYCBvciBgbGluZWFyKClgKSB0aGF0IHdhdGNoIENsb3VkV2F0Y2ggYWxhcm1zIGFuZCBtb3ZlXG4gICAqIHRoZSB0cmFmZmljIGJhY2sgd2hlbiBvbmUgZ29lcyBpbnRvIEFMQVJNLlxuICAgKlxuICAgKiBBIGRlcGxveW1lbnQgaW4gc3RlcHMgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCBgcmV2aXNpb25gLCBgYWRkaXRpb25hbFJldmlzaW9uc2Agb3IgYHJvdXRlVHJhZmZpYygpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgV2ViRnVuY3Rpb25EZXBsb3ltZW50LmFsbEF0T25jZSgpXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50PzogV2ViRnVuY3Rpb25EZXBsb3ltZW50O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBXZWJGdW5jdGlvbi5hZGRFbmRwb2ludGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnMgZXh0ZW5kcyBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgY2FsbGVycyBvZiB0aGlzIGVuZHBvaW50IGFyZSBhdXRoZW50aWNhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aFR5cGU6IFdlYkZ1bmN0aW9uQXV0aFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSByZXZpc2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzLCBlLmcuIGFuIGVhcmxpZXIgb25lIGZyb20gYFdlYkZ1bmN0aW9uUmV2aXNpb24uZnJvbVJldmlzaW9uQXR0cmlidXRlc2BcbiAgICogdG8ga2VlcCB0aGlzIGVuZHBvaW50IG9uIGl0IHdoaWxlIG90aGVycyBtb3ZlIG9uLiBTYW1lIGFzIGNhbGxpbmcgYHJvdXRlVHJhZmZpY2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGZ1bmN0aW9uJ3MgY3VycmVudCByZXZpc2lvbiAoYGN1cnJlbnRSZXZpc2lvbmApXG4gICAqL1xuICByZWFkb25seSByZXZpc2lvbj86IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKlxuICAgKiBBIHNlY29uZCByZXZpc2lvbiBhbmQgaXRzIHNoYXJlIG9mIHRoZSBlbmRwb2ludCdzIHRyYWZmaWM7IGByZXZpc2lvbmAgZ2V0cyB0aGUgcmVzdC5cbiAgICogQW4gZW5kcG9pbnQgcm91dGVzIHRvIGF0IG1vc3QgdHdvIHJldmlzaW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbGwgdHJhZmZpYyBnb2VzIHRvIGByZXZpc2lvbmBcbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxSZXZpc2lvbnM/OiBXZWJGdW5jdGlvblJldmlzaW9uV2VpZ2h0W107XG59XG5cbi8qKlxuICogSW50ZXJuYWw6IGhvdyBgV2ViRnVuY3Rpb25gIGNyZWF0ZXMgaXRzIGVuZHBvaW50cy4gTm90IHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuXG4gKi9cbmludGVyZmFjZSBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMgZXh0ZW5kcyBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKiBUaGUgZnVuY3Rpb24gdGhhdCBvd25zIHRoZSBlbmRwb2ludC4gKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb246IElXZWJGdW5jdGlvbjtcblxuICAvKiogVGhlIGZ1bmN0aW9uJ3MgY3VycmVudCByZXZpc2lvbiwgc2VydmVkIHVubGVzcyBgcmV2aXNpb25gIGlzIGdpdmVuLiAqL1xuICByZWFkb25seSBjdXJyZW50UmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKiBQcmVmaXggb2YgdGhlIGdlbmVyYXRlZCBlbmRwb2ludCBuYW1lLiAqL1xuICByZWFkb25seSBuYW1lUHJlZml4OiBzdHJpbmc7XG5cbiAgLyoqIEV4dHJhIGlucHV0IHRvIHRoZSBnZW5lcmF0ZWQgbmFtZSdzIGhhc2ggKHRoZSBjb25zdHJ1Y3QgSUQgb2YgYW4gYWRkZWQgZW5kcG9pbnQpLiAqL1xuICByZWFkb25seSBuYW1lU2VlZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBIVFRQUyBlbmRwb2ludCBvZiBhIFdlYiBGdW5jdGlvbjogYGZuLmVuZHBvaW50YCAodGhlIGRlZmF1bHQgb25lKSBvciB0aGUgcmVzdWx0IG9mIGBmbi5hZGRFbmRwb2ludCgpYC5cbiAqXG4gKiBFbmRwb2ludHMgYXJlIGNyZWF0ZWQgb25seSB0aHJvdWdoIGBXZWJGdW5jdGlvbmAsIHdoaWNoIG93bnMgdGhlaXIgbG9nIGdyb3VwcyBpbiBldmVyeSByZWdpb24sIHNvIHRoZSBjb25zdHJ1Y3RvciBpcyBwcml2YXRlLlxuICovXG5leHBvcnQgY2xhc3MgV2ViRnVuY3Rpb25FbmRwb2ludCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVuZHBvaW50IG9mIGEgV2ViIEZ1bmN0aW9uLiBVc2VkIGJ5IGBXZWJGdW5jdGlvbmAuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfY3JlYXRlKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMpOiBXZWJGdW5jdGlvbkVuZHBvaW50IHtcbiAgICByZXR1cm4gbmV3IFdlYkZ1bmN0aW9uRW5kcG9pbnQoc2NvcGUsIGlkLCBwcm9wcyk7XG4gIH1cblxuICAvKiogVGhlIGVuZHBvaW50J3MgbmFtZS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50TmFtZTogc3RyaW5nO1xuXG4gIC8qKiBUaGUgZW5kcG9pbnQncyBBUk4uICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludEFybjogc3RyaW5nO1xuXG4gIC8qKiBXaGVyZSB0aGUgZW5kcG9pbnQgc2VydmVzIHRyYWZmaWMgZnJvbS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50VHlwZTogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGU7XG5cbiAgLyoqIEhvdyBjYWxsZXJzIG9mIHRoZSBlbmRwb2ludCBhcmUgYXV0aGVudGljYXRlZC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGF1dGhUeXBlOiBXZWJGdW5jdGlvbkF1dGhUeXBlO1xuXG4gIC8qKiBFdmVyeSByZWdpb24gdGhlIGVuZHBvaW50IHNlcnZlcyBmcm9tOiB0aGUgaG9tZSByZWdpb24gZmlyc3QsIHRoZW4gdGhlIG90aGVycyBpbiBhbHBoYWJldGljYWwgb3JkZXIuICovXG4gIHB1YmxpYyByZWFkb25seSByZWdpb25zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgZG9tYWluIG5hbWU6IHRoZSBnbG9iYWwgZG9tYWluIGZvciBgTVVMVElfUkVHSU9OYCwgb3RoZXJ3aXNlIHRoZSBob21lIHJlZ2lvbidzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgVVJMOiB0aGUgZ2xvYmFsIFVSTCBmb3IgYE1VTFRJX1JFR0lPTmAsIG90aGVyd2lzZSB0aGUgaG9tZSByZWdpb24ncy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKiogR3JhbnRzIG9uIHRoaXMgZW5kcG9pbnQgKGUuZy4gYGdyYW50cy5pbnZva2UocHJpbmNpcGFsKWApLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRzOiBXZWJGdW5jdGlvbkdyYW50cztcblxuICAvKipcbiAgICogVGhlIGFsYXJtcyB0aGlzIGVuZHBvaW50IGNyZWF0ZWQgZm9yIGl0cyBkZXBsb3ltZW50J3MgYHJvbGxiYWNrT25gLCBvbmUgcGVyIHRocmVzaG9sZCBpbiBldmVyeSByZWdpb24gaXQgc2VydmVzIGZyb21cbiAgICogKHRoZSBob21lIHJlZ2lvbidzIGZpcnN0KS4gRW1wdHkgd2l0aG91dCBgcm9sbGJhY2tPbmAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sbGJhY2tBbGFybXM6IGNsb3Vkd2F0Y2guSUFsYXJtW10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhvbWVSZWdpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWJGdW5jdGlvbjogSVdlYkZ1bmN0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlOiBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25FbmRwb2ludDtcbiAgcHJpdmF0ZSB3ZWlnaHRzOiBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25FbmRwb2ludC5SZXZpc2lvbldlaWdodFByb3BlcnR5W107XG4gIHByaXZhdGUgcm91dGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JhZHVhbDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBsb29rdXA/OiBFbmRwb2ludExvb2t1cDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgaG9tZVJlZ2lvbiA9IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbjtcbiAgICBjb25zdCBlbmRwb2ludFR5cGUgPSBwcm9wcy5lbmRwb2ludFR5cGUgPz8gV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuSE9NRV9SRUdJT047XG4gICAgY29uc3QgZXh0cmFSZWdpb25zID0gbm9ybWFsaXNlUmVnaW9ucyh0aGlzLCBlbmRwb2ludFR5cGUsIGhvbWVSZWdpb24sIHByb3BzLnJlZ2lvbnMgPz8gW10pO1xuICAgIHZhbGlkYXRlUmF0ZUxpbWl0KHRoaXMsIHByb3BzLnJhdGVMaW1pdCk7XG4gICAgdmFsaWRhdGVNYXhFbnZpcm9ubWVudHModGhpcywgcHJvcHMubWF4RW52aXJvbm1lbnRzKTtcblxuICAgIGlmIChwcm9wcy5lbmRwb2ludE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXNzZXJ0UmVzb3VyY2VOYW1lKHRoaXMsICdlbmRwb2ludE5hbWUnLCBwcm9wcy5lbmRwb2ludE5hbWUpO1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKCdAY2RrLWxhbWJkYS13ZWI6ZXhwbGljaXRFbmRwb2ludE5hbWUnLFxuICAgICAgICBgZW5kcG9pbnROYW1lICcke3Byb3BzLmVuZHBvaW50TmFtZX0nIGlzIHNldCBleHBsaWNpdGx5OiBjaGFuZ2luZyBlbmRwb2ludFR5cGUgb3IgcmVnaW9ucyBsYXRlciBhbHNvIHJlcXVpcmVzIGEgbmV3IGVuZHBvaW50TmFtZSwgb3RoZXJ3aXNlIHRoZSBkZXBsb3ltZW50IGZhaWxzIHdpdGggXCJhbHJlYWR5IGV4aXN0c1wiICh0aGUgc3RhY2sgcm9sbHMgYmFjayBzYWZlbHkpLiBPbWl0IGVuZHBvaW50TmFtZSB0byBnZXQgYSBuYW1lIHRoYXQgY2hhbmdlcyBhdXRvbWF0aWNhbGx5LmApO1xuICAgIH1cbiAgICBpZiAocHJvcHMuYXV0aFR5cGUgPT09IFdlYkZ1bmN0aW9uQXV0aFR5cGUuTk9ORSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKCdAY2RrLWxhbWJkYS13ZWI6YXV0aFR5cGVOb25lJyxcbiAgICAgICAgJ2F1dGhUeXBlIE5PTkUgbWFrZXMgdGhlIGVuZHBvaW50IHB1YmxpYzogTGFtYmRhIGRvZXMgbm8gYXV0aGVudGljYXRpb24sIHNvIHlvdXIgYXBwbGljYXRpb24gbXVzdCBhdXRoZW50aWNhdGUgcmVxdWVzdHMgaXRzZWxmLicpO1xuICAgIH1cblxuICAgIHRoaXMuZW5kcG9pbnRUeXBlID0gZW5kcG9pbnRUeXBlO1xuICAgIHRoaXMuYXV0aFR5cGUgPSBwcm9wcy5hdXRoVHlwZTtcbiAgICB0aGlzLmVuZHBvaW50TmFtZSA9IHByb3BzLmVuZHBvaW50TmFtZSA/PyBkZWZhdWx0RW5kcG9pbnROYW1lKHByb3BzLm5hbWVQcmVmaXgsIHByb3BzLm5hbWVTZWVkLCBlbmRwb2ludFR5cGUsIGV4dHJhUmVnaW9ucyk7XG4gICAgdGhpcy5yZWdpb25zID0gW2hvbWVSZWdpb24sIC4uLmV4dHJhUmVnaW9uc107XG4gICAgdGhpcy5ob21lUmVnaW9uID0gaG9tZVJlZ2lvbjtcbiAgICB0aGlzLndlYkZ1bmN0aW9uID0gcHJvcHMud2ViRnVuY3Rpb247XG4gICAgdGhpcy53ZWlnaHRzID0gW3sgcmV2aXNpb25JZDogcHJvcHMuY3VycmVudFJldmlzaW9uLnJldmlzaW9uSWQsIHdlaWdodDogMTAwIH1dO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgbGFtYmRhLkNmbldlYkZ1bmN0aW9uRW5kcG9pbnQodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBwcm9wcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbkFybixcbiAgICAgIGVuZHBvaW50TmFtZTogdGhpcy5lbmRwb2ludE5hbWUsXG4gICAgICBlbmRwb2ludFR5cGUsXG4gICAgICBhdXRoVHlwZTogcHJvcHMuYXV0aFR5cGUsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICByZWdpb25zOiBleHRyYVJlZ2lvbnMubGVuZ3RoID4gMCA/IGV4dHJhUmVnaW9ucyA6IHVuZGVmaW5lZCxcbiAgICAgIHJldmlzaW9uV2VpZ2h0czogdGhpcy53ZWlnaHRzLFxuICAgICAgdGhyb3R0bGVDb25maWc6IHByb3BzLnJhdGVMaW1pdCAhPT0gdW5kZWZpbmVkID8geyByYXRlTGltaXQ6IHByb3BzLnJhdGVMaW1pdCB9IDogdW5kZWZpbmVkLFxuICAgICAgc2NhbGluZ0NvbmZpZzogcHJvcHMubWF4RW52aXJvbm1lbnRzICE9PSB1bmRlZmluZWQgPyB7IG1heEVudmlyb25tZW50czogcHJvcHMubWF4RW52aXJvbm1lbnRzIH0gOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgVmFsaWRhdGlvbnMub2YocmVzb3VyY2UpLmFja25vd2xlZGdlKENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUpO1xuICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTtcblxuICAgIHRoaXMuZ3JhZHVhbCA9IHByb3BzLmRlcGxveW1lbnQ/Ll9ncmFkdWFsID8/IGZhbHNlO1xuICAgIGlmIChwcm9wcy5kZXBsb3ltZW50Py5fZ3JhZHVhbCkge1xuICAgICAgaWYgKHByb3BzLnJldmlzaW9uICE9PSB1bmRlZmluZWQgfHwgcHJvcHMuYWRkaXRpb25hbFJldmlzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IGFuIGVuZHBvaW50IHdpdGggYSAke3Byb3BzLmRlcGxveW1lbnQuX2tpbmR9IGRlcGxveW1lbnQgYWx3YXlzIG1vdmVzIHRvIHRoZSBjdXJyZW50IHJldmlzaW9uOyBpdCBjYW4ndCBhbHNvIHNldCByZXZpc2lvbiBvciBhZGRpdGlvbmFsUmV2aXNpb25zYCk7XG4gICAgICB9XG4gICAgICBjb25zdCByb2xsYmFja0FsYXJtQXJucyA9IHByb3BzLmRlcGxveW1lbnQuX3JvbGxiYWNrT24gPyB0aGlzLmNyZWF0ZVJvbGxiYWNrQWxhcm1zKHByb3BzLmRlcGxveW1lbnQuX3JvbGxiYWNrT24pIDogW107XG4gICAgICBjb25zdCB3YWl0U2Vjb25kcyA9IHByb3BzLmRlcGxveW1lbnQuX3dhaXRTZWNvbmRzO1xuICAgICAgY29uc3Qgcm9sbGJhY2sgPSBwcm9wcy5kZXBsb3ltZW50Ll9yb2xsYmFja09uO1xuICAgICAgaWYgKHJvbGxiYWNrICYmIHdhaXRTZWNvbmRzIDwgcm9sbGJhY2sucGVyaW9kLnRvU2Vjb25kcygpICogcm9sbGJhY2suZXZhbHVhdGlvblBlcmlvZHMgKyAxMjApIHtcbiAgICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKCdAY2RrLWxhbWJkYS13ZWI6cm9sbGJhY2tTbG93ZXJUaGFuU3RlcCcsXG4gICAgICAgICAgYHJvbGxiYWNrT24gbmVlZHMgJHtyb2xsYmFjay5ldmFsdWF0aW9uUGVyaW9kc30gcGVyaW9kKHMpIG9mICR7cm9sbGJhY2sucGVyaW9kLnRvSHVtYW5TdHJpbmcoKX0gcGx1cyBhYm91dCAyIG1pbnV0ZXMgb2YgQ2xvdWRXYXRjaCBkZWxheSB0byBmaXJlLCBsb25nZXIgdGhhbiBlYWNoICR7cHJvcHMuZGVwbG95bWVudC5fa2luZH0gc3RlcCAoJHtEdXJhdGlvbi5zZWNvbmRzKHdhaXRTZWNvbmRzKS50b0h1bWFuU3RyaW5nKCl9KTogYSBiYWQgcmV2aXNpb24gY2FuIHJlYWNoIHRoZSBuZXh0IHN0ZXAgYmVmb3JlIGl0cyBhbGFybSBmaXJlcy5gKTtcbiAgICAgIH1cbiAgICAgIC8vIE1vdmVzIHRoZSB0cmFmZmljIGluIHN0ZXBzIGJlZm9yZSBDbG91ZEZvcm1hdGlvbiB3cml0ZXMgdGhlIGVuZHBvaW50LCB3aGljaCB0aGVuIGZpbmRzIGl0IGFscmVhZHkgZG9uZS5cbiAgICAgIGNvbnN0IHNoaWZ0ID0gbmV3IFRyYWZmaWNTaGlmdCh0aGlzLCAnRGVwbG95bWVudCcsIHtcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBwcm9wcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbk5hbWUsXG4gICAgICAgIGZ1bmN0aW9uQXJuOiBwcm9wcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbkFybixcbiAgICAgICAgZW5kcG9pbnROYW1lOiB0aGlzLmVuZHBvaW50TmFtZSxcbiAgICAgICAgcmV2aXNpb25JZDogcHJvcHMuY3VycmVudFJldmlzaW9uLnJldmlzaW9uSWQsXG4gICAgICAgIGRlcGxveW1lbnQ6IHByb3BzLmRlcGxveW1lbnQsXG4gICAgICAgIGFsYXJtQXJuczogcm9sbGJhY2tBbGFybUFybnMsXG4gICAgICAgIGVuZHBvaW50Q29uZmlnOiB7XG4gICAgICAgICAgZW5kcG9pbnRUeXBlLFxuICAgICAgICAgIGF1dGhUeXBlOiBwcm9wcy5hdXRoVHlwZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICAgICAgcmVnaW9uczogZXh0cmFSZWdpb25zLFxuICAgICAgICAgIHJhdGVMaW1pdDogcHJvcHMucmF0ZUxpbWl0LFxuICAgICAgICAgIG1heEVudmlyb25tZW50czogcHJvcHMubWF4RW52aXJvbm1lbnRzLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3koc2hpZnQpO1xuICAgICAgLy8gQWxhcm1zIGluIG90aGVyIHJlZ2lvbnMgYXJlIG9ubHkgcmVmZXJlbmNlZCBieSBBUk4uXG4gICAgICBmb3IgKGNvbnN0IGFsYXJtIG9mIHRoaXMubm9kZS5maW5kQWxsKCkuZmlsdGVyKChjKSA9PiBjIGluc3RhbmNlb2YgUmVnaW9uYWxBbGFybSkpIHNoaWZ0Lm5vZGUuYWRkRGVwZW5kZW5jeShhbGFybSk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5yZXZpc2lvbiAhPT0gdW5kZWZpbmVkIHx8IHByb3BzLmFkZGl0aW9uYWxSZXZpc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yb3V0ZVRyYWZmaWMocHJvcHMucmV2aXNpb24gPz8gcHJvcHMuY3VycmVudFJldmlzaW9uLCBwcm9wcy5hZGRpdGlvbmFsUmV2aXNpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLmVuZHBvaW50QXJuID0gcmVzb3VyY2UuYXR0ckVuZHBvaW50QXJuO1xuICAgIHRoaXMuZG9tYWluTmFtZSA9IHJlc291cmNlLmF0dHJEb21haW5OYW1lO1xuICAgIHRoaXMudXJsID0gYGh0dHBzOi8vJHtyZXNvdXJjZS5hdHRyRG9tYWluTmFtZX1gO1xuICAgIHRoaXMuZ3JhbnRzID0gV2ViRnVuY3Rpb25HcmFudHMuX2ZvckVuZHBvaW50KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBVUkwgb2YgdGhpcyBlbmRwb2ludCBpbiBvbmUgcmVnaW9uLiBPbmx5IGZvciBgUEVSX1JFR0lPTmAgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAcGFyYW0gcmVnaW9uIG9uZSBvZiBgcmVnaW9uc2BcbiAgICovXG4gIHB1YmxpYyByZWdpb25hbFVybChyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZW5kcG9pbnRUeXBlICE9PSBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5QRVJfUkVHSU9OKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiByZWdpb25hbFVybCgpIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBQRVJfUkVHSU9OIGVuZHBvaW50cyAodGhpcyBvbmUgaXMgJHt0aGlzLmVuZHBvaW50VHlwZX0pOyB1c2UgdXJsYCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5yZWdpb25zLmluY2x1ZGVzKHJlZ2lvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHJlZ2lvbiAke3JlZ2lvbn0gaXMgbm90IG9uZSBvZiB0aGUgZW5kcG9pbnQncyByZWdpb25zICgke3RoaXMucmVnaW9ucy5qb2luKCcsICcpfSlgKTtcbiAgICB9XG4gICAgaWYgKHJlZ2lvbiA9PT0gdGhpcy5ob21lUmVnaW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy51cmw7XG4gICAgfVxuICAgIHRoaXMubG9va3VwID8/PSBuZXcgRW5kcG9pbnRMb29rdXAodGhpcywgJ0xvb2t1cCcsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogdGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbk5hbWUsXG4gICAgICBmdW5jdGlvbkFybjogdGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbkFybixcbiAgICAgIGVuZHBvaW50TmFtZTogdGhpcy5lbmRwb2ludE5hbWUsXG4gICAgICBlbmRwb2ludEFybjogdGhpcy5lbmRwb2ludEFybixcbiAgICB9KTtcbiAgICByZXR1cm4gYGh0dHBzOi8vJHt0aGlzLmxvb2t1cC5yZWdpb25hbERvbWFpbihyZWdpb24pfWA7XG4gIH1cblxuICAvKipcbiAgICogUm91dGVzIHRoZSBlbmRwb2ludCB0byBgcmV2aXNpb25gIGluc3RlYWQgb2YgdGhlIGZ1bmN0aW9uJ3MgY3VycmVudCByZXZpc2lvbiwgb3B0aW9uYWxseSBzaGFyaW5nXG4gICAqIHRyYWZmaWMgd2l0aCBvbmUgbW9yZSByZXZpc2lvbiAoYGFkZGl0aW9uYWxSZXZpc2lvbnNgLCB3aGljaCBnZXRzIGl0cyB3ZWlnaHQ7IGByZXZpc2lvbmAgZ2V0cyB0aGUgcmVzdCkuXG4gICAqXG4gICAqIFVzZSBpdCB0byBrZWVwIGFuIGVuZHBvaW50IG9uIGFuIGVhcmxpZXIgcmV2aXNpb24gKGBXZWJGdW5jdGlvblJldmlzaW9uLmZyb21SZXZpc2lvbkF0dHJpYnV0ZXNgKSxcbiAgICogb3IgdG8gc2VuZCBwYXJ0IG9mIHRoZSB0cmFmZmljIHRvIHRoZSBjdXJyZW50IHJldmlzaW9uOlxuICAgKiBgZm4uZW5kcG9pbnQucm91dGVUcmFmZmljKHByZXZpb3VzLCBbeyByZXZpc2lvbjogZm4uY3VycmVudFJldmlzaW9uLCB3ZWlnaHQ6IDAuMSB9XSlgLlxuICAgKiBDYW4gYmUgY2FsbGVkIG9uY2UgcGVyIGVuZHBvaW50LCBhbmQgbm90IG9uIG9uZSBjcmVhdGVkIHdpdGggYHJldmlzaW9uYCBvciBgYWRkaXRpb25hbFJldmlzaW9uc2AuXG4gICAqL1xuICBwdWJsaWMgcm91dGVUcmFmZmljKHJldmlzaW9uOiBJV2ViRnVuY3Rpb25SZXZpc2lvbiwgYWRkaXRpb25hbFJldmlzaW9ucz86IFdlYkZ1bmN0aW9uUmV2aXNpb25XZWlnaHRbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdyYWR1YWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHRoZSBlbmRwb2ludCBoYXMgYSBkZXBsb3ltZW50IGluIHN0ZXBzLCB3aGljaCBhbHdheXMgbW92ZXMgaXQgdG8gdGhlIGN1cnJlbnQgcmV2aXNpb247IHJvdXRlVHJhZmZpYygpIGNhbid0IGJlIHVzZWQgd2l0aCBpdGApO1xuICAgIH1cbiAgICBpZiAodGhpcy5yb3V0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHRoZSBlbmRwb2ludCdzIHJldmlzaW9ucyBhcmUgYWxyZWFkeSBzZXQgKHJldmlzaW9uLCBhZGRpdGlvbmFsUmV2aXNpb25zIG9yIHJvdXRlVHJhZmZpYylgKTtcbiAgICB9XG4gICAgdGhpcy53ZWlnaHRzID0gcmV2aXNpb25XZWlnaHRzKHRoaXMsIHRoaXMud2ViRnVuY3Rpb24sIHJldmlzaW9uLCBhZGRpdGlvbmFsUmV2aXNpb25zID8/IFtdKTtcbiAgICB0aGlzLnJlc291cmNlLnJldmlzaW9uV2VpZ2h0cyA9IHRoaXMud2VpZ2h0cztcbiAgICB0aGlzLnJvdXRlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIElEcyBvZiB0aGUgcmV2aXNpb25zIHRoaXMgZW5kcG9pbnQgcm91dGVzIHRvLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfcmV2aXNpb25JZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLndlaWdodHMubWFwKCh3KSA9PiB3LnJldmlzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbWV0cmljIG9mIHRoaXMgZW5kcG9pbnQgaW4gYEFXUy9MYW1iZGEvV2ViYCAoZGltZW5zaW9ucyBgRnVuY3Rpb25OYW1lYCBhbmQgYEVuZHBvaW50TmFtZWApLlxuICAgKlxuICAgKiBNZXRyaWNzIGFyZSBwdWJsaXNoZWQgaW4gdGhlIHJlZ2lvbiB0aGF0IHNlcnZlZCB0aGUgcmVxdWVzdDogcGFzcyBgcmVnaW9uYCBmb3Igb25lIG9mIHRoZSBlbmRwb2ludCdzXG4gICAqIG90aGVyIHJlZ2lvbnMuIEFuIGFsYXJtIGNhbiBvbmx5IHVzZSBtZXRyaWNzIGZyb20gaXRzIG93biBzdGFjaydzIHJlZ2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciAxIG1pbnV0ZSwgaW4gdGhlIGhvbWUgcmVnaW9uXG4gICAqL1xuICBwdWJsaWMgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICBuYW1lc3BhY2U6IFdFQl9OQU1FU1BBQ0UsXG4gICAgICBtZXRyaWNOYW1lLFxuICAgICAgZGltZW5zaW9uc01hcDogZW5kcG9pbnREaW1lbnNpb25zKHRoaXMubWV0cmljSWRzKCkpLFxuICAgICAgc3RhdGlzdGljOiBjbG91ZHdhdGNoLlN0YXRzLlNVTSxcbiAgICAgIHBlcmlvZDogREVGQVVMVF9QRVJJT0QsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXF1ZXN0cyB0aGUgZW5kcG9pbnQgc2VydmVkIChgRXhlY3V0ZWRSZXF1ZXN0c2ApLiBUaGVyZSdzIG5vIHNlcGFyYXRlIGNvdW50IG9mIHN1Y2Nlc3NmdWwgKDJYWCkgcmVzcG9uc2VzLiAqL1xuICBwdWJsaWMgbWV0cmljUmVxdWVzdHMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFJFUVVFU1RTLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgYW5zd2VyZWQgd2l0aCBhIDRYWCBzdGF0dXMgKGBIVFRQUmVzcG9uc2VTdGF0dXNDbGFzczRYWGApLCBpbmNsdWRpbmcgNDI5cyBmcm9tIGByYXRlTGltaXRgIGFuZCBgbWF4RW52aXJvbm1lbnRzYC5cbiAgICogVGhlIG1ldHJpYyBvbmx5IGV4aXN0cyBvbmNlIGl0J3Mgbm9uLXplcm8sIHNvIGFsYXJtcyBzaG91bGQgdHJlYXQgbWlzc2luZyBkYXRhIGFzIG5vdCBicmVhY2hpbmcuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljQ2xpZW50RXJyb3JzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhDTElFTlRfRVJST1JTLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgYW5zd2VyZWQgd2l0aCBhIDVYWCBzdGF0dXMgKGBIVFRQUmVzcG9uc2VTdGF0dXNDbGFzczVYWGApLiBJbmNsdWRlcyB0aGUgcGxhdGZvcm0ncyA1MDNzIHdoaWxlIHRoZSBlbmRwb2ludFxuICAgKiBzY2FsZXMgdXAgZm9yIGEgc3VkZGVuIGJ1cnN0LCBub3Qgb25seSB5b3VyIGFwcGxpY2F0aW9uJ3MgZXJyb3JzLiBUaGUgbWV0cmljIG9ubHkgZXhpc3RzIG9uY2UgaXQncyBub24temVyby5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNTZXJ2ZXJFcnJvcnMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFNFUlZFUl9FUlJPUlMsIHByb3BzKTtcbiAgfVxuXG4gIC8qKiBUaGUgcGVyY2VudGFnZSBvZiByZXF1ZXN0cyBhbnN3ZXJlZCB3aXRoIGEgNFhYIHN0YXR1cyAobWF0aCBleHByZXNzaW9uOyBwZXJpb2RzIHdpdGggbm8gNFhYIGNvdW50IGFzIDApLiAqL1xuICBwdWJsaWMgbWV0cmljQ2xpZW50RXJyb3JSYXRlKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NYXRoRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIHRoaXMucmF0ZShDTElFTlRfRVJST1JTLCAnQ2xpZW50IGVycm9yIHJhdGUgKCUpJywgcHJvcHMpO1xuICB9XG5cbiAgLyoqIFRoZSBwZXJjZW50YWdlIG9mIHJlcXVlc3RzIGFuc3dlcmVkIHdpdGggYSA1WFggc3RhdHVzIChtYXRoIGV4cHJlc3Npb247IHBlcmlvZHMgd2l0aCBubyA1WFggY291bnQgYXMgMCkuICovXG4gIHB1YmxpYyBtZXRyaWNTZXJ2ZXJFcnJvclJhdGUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1hdGhFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gdGhpcy5yYXRlKFNFUlZFUl9FUlJPUlMsICdTZXJ2ZXIgZXJyb3IgcmF0ZSAoJSknLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0aW9uIGVudmlyb25tZW50cyBzZXJ2aW5nIHRoZSBlbmRwb2ludCAoYEVuZHBvaW50QWN0aXZlRW52aXJvbm1lbnRzYCksIHRvIGNvbXBhcmUgd2l0aCBgbWF4RW52aXJvbm1lbnRzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBtYXhpbXVtIG92ZXIgMSBtaW51dGUsIGluIHRoZSBob21lIHJlZ2lvblxuICAgKi9cbiAgcHVibGljIG1ldHJpY0FjdGl2ZUVudmlyb25tZW50cyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy51c2FnZU1ldHJpYygnRW5kcG9pbnRBY3RpdmVFbnZpcm9ubWVudHMnLCBjbG91ZHdhdGNoLlN0YXRzLk1BWElNVU0sIHByb3BzKTtcbiAgfVxuXG4gIC8qKiBSZXF1ZXN0cyByZWplY3RlZCB3aXRoIDQyOSBiZWNhdXNlIHRoZSBlbmRwb2ludCByZWFjaGVkIGl0cyBgcmF0ZUxpbWl0YCAoYEVuZHBvaW50UmVxdWVzdFRocm90dGxlc2ApLiAqL1xuICBwdWJsaWMgbWV0cmljUmVxdWVzdFRocm90dGxlcyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy51c2FnZU1ldHJpYygnRW5kcG9pbnRSZXF1ZXN0VGhyb3R0bGVzJywgY2xvdWR3YXRjaC5TdGF0cy5TVU0sIHByb3BzKTtcbiAgfVxuXG4gIC8qKiBSZXF1ZXN0cyByZWplY3RlZCB3aXRoIDQyOSBiZWNhdXNlIHRoZSBlbmRwb2ludCByZWFjaGVkIGBtYXhFbnZpcm9ubWVudHNgIChgRW5kcG9pbnRBY3RpdmVFbnZpcm9ubWVudFRocm90dGxlc2ApLiAqL1xuICBwdWJsaWMgbWV0cmljRW52aXJvbm1lbnRUaHJvdHRsZXMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMudXNhZ2VNZXRyaWMoJ0VuZHBvaW50QWN0aXZlRW52aXJvbm1lbnRUaHJvdHRsZXMnLCBjbG91ZHdhdGNoLlN0YXRzLlNVTSwgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBgZ3JhbnRlZWAgdG8gY2FsbCB0aGlzIGVuZHBvaW50LiBTaG9ydGN1dCBmb3IgYGdyYW50cy5pbnZva2UoZ3JhbnRlZSlgLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICovXG4gIHB1YmxpYyBncmFudEludm9rZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnRzLmludm9rZShncmFudGVlKTtcbiAgfVxuXG4gIHByaXZhdGUgbWV0cmljSWRzKCkge1xuICAgIHJldHVybiB7IGZ1bmN0aW9uTmFtZTogdGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbk5hbWUsIGVuZHBvaW50TmFtZTogdGhpcy5lbmRwb2ludE5hbWUgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmF0ZShlcnJvck1ldHJpYzogc3RyaW5nLCBsYWJlbDogc3RyaW5nLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWF0aEV4cHJlc3Npb24ge1xuICAgIGNvbnN0IHBlcmlvZCA9IHByb3BzPy5wZXJpb2QgPz8gREVGQVVMVF9QRVJJT0Q7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgcGVyaW9kLCByZWdpb246IHByb3BzPy5yZWdpb24sIGFjY291bnQ6IHByb3BzPy5hY2NvdW50IH07XG4gICAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1hdGhFeHByZXNzaW9uKHtcbiAgICAgIGV4cHJlc3Npb246IHJhdGVFeHByZXNzaW9uKDEpLFxuICAgICAgdXNpbmdNZXRyaWNzOiB7IHJlcXVlc3RzOiB0aGlzLm1ldHJpYyhSRVFVRVNUUywgb3B0aW9ucyksIGVycm9yczogdGhpcy5tZXRyaWMoZXJyb3JNZXRyaWMsIG9wdGlvbnMpIH0sXG4gICAgICBwZXJpb2QsXG4gICAgICBsYWJlbDogcHJvcHM/LmxhYmVsID8/IGxhYmVsLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1c2FnZU1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHN0YXRpc3RpYzogc3RyaW5nLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgIG5hbWVzcGFjZTogVVNBR0VfTkFNRVNQQUNFLFxuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHsgLi4uZW5kcG9pbnREaW1lbnNpb25zKHRoaXMubWV0cmljSWRzKCkpLCBFeGVjdXRpb25SZWdpb246IHByb3BzPy5yZWdpb24gPz8gdGhpcy5ob21lUmVnaW9uIH0sXG4gICAgICBzdGF0aXN0aWMsXG4gICAgICBwZXJpb2Q6IERFRkFVTFRfUEVSSU9ELFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKiogT25lIGFsYXJtIHBlciB0aHJlc2hvbGQgaW4gZXZlcnkgc2VydmluZyByZWdpb246IGEgQ2xvdWRGb3JtYXRpb24gYWxhcm0gYXQgaG9tZSwgYSBjdXN0b20gcmVzb3VyY2UgZWxzZXdoZXJlLiBSZXR1cm5zIHRoZWlyIEFSTnMuICovXG4gIHByaXZhdGUgY3JlYXRlUm9sbGJhY2tBbGFybXMocm9sbGJhY2s6IFJlc29sdmVkUm9sbGJhY2tPcHRpb25zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHRocmVzaG9sZHMgPSBbXG4gICAgICB7IGtleTogJ1NlcnZlckVycm9ycycsIHNob3J0OiAnNXh4JywgbWV0cmljOiBTRVJWRVJfRVJST1JTLCBzdGF0dXM6ICc1WFgnLCB0aHJlc2hvbGQ6IHJvbGxiYWNrLnNlcnZlckVycm9yUmF0ZSB9LFxuICAgICAgeyBrZXk6ICdDbGllbnRFcnJvcnMnLCBzaG9ydDogJzR4eCcsIG1ldHJpYzogQ0xJRU5UX0VSUk9SUywgc3RhdHVzOiAnNFhYJywgdGhyZXNob2xkOiByb2xsYmFjay5jbGllbnRFcnJvclJhdGUgfSxcbiAgICBdO1xuICAgIGNvbnN0IGFybnM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCB0IG9mIHRocmVzaG9sZHMpIHtcbiAgICAgIGlmICh0LnRocmVzaG9sZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3QgcmVnaW9uIG9mIHRoaXMucmVnaW9ucykge1xuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGBSb2xscyBiYWNrIGRlcGxveW1lbnRzIG9mIGVuZHBvaW50ICR7dGhpcy5lbmRwb2ludE5hbWV9IG9mICR7dGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbk5hbWV9IHdoZW4gbW9yZSB0aGFuIGBcbiAgICAgICAgICArIGAke3QudGhyZXNob2xkfSUgb2YgaXRzIHJlcXVlc3RzIGluICR7cmVnaW9ufSBnZXQgYSAke3Quc3RhdHVzfSByZXNwb25zZSAoJHtyb2xsYmFjay5ldmFsdWF0aW9uUGVyaW9kc30geCAke3JvbGxiYWNrLnBlcmlvZC50b0h1bWFuU3RyaW5nKCl9LCBgXG4gICAgICAgICAgKyBgcGVyaW9kcyB3aXRoIGZld2VyIHRoYW4gJHtyb2xsYmFjay5taW5pbXVtUmVxdWVzdHN9IHJlcXVlc3RzIGlnbm9yZWQpLmA7XG4gICAgICAgIGlmIChyZWdpb24gPT09IHRoaXMuaG9tZVJlZ2lvbikge1xuICAgICAgICAgIGNvbnN0IGFsYXJtID0gbmV3IGNsb3Vkd2F0Y2guQWxhcm0odGhpcywgYFJvbGxiYWNrJHt0LmtleX1gLCB7XG4gICAgICAgICAgICBtZXRyaWM6IG5ldyBjbG91ZHdhdGNoLk1hdGhFeHByZXNzaW9uKHtcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogcmF0ZUV4cHJlc3Npb24ocm9sbGJhY2subWluaW11bVJlcXVlc3RzKSxcbiAgICAgICAgICAgICAgdXNpbmdNZXRyaWNzOiB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdHM6IHRoaXMubWV0cmljKFJFUVVFU1RTLCB7IHBlcmlvZDogcm9sbGJhY2sucGVyaW9kIH0pLFxuICAgICAgICAgICAgICAgIGVycm9yczogdGhpcy5tZXRyaWModC5tZXRyaWMsIHsgcGVyaW9kOiByb2xsYmFjay5wZXJpb2QgfSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHBlcmlvZDogcm9sbGJhY2sucGVyaW9kLFxuICAgICAgICAgICAgICBsYWJlbDogYCR7dC5zdGF0dXN9IHJhdGUgKCUpYCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGhyZXNob2xkOiB0LnRocmVzaG9sZCxcbiAgICAgICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiByb2xsYmFjay5ldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX1RIUkVTSE9MRCxcbiAgICAgICAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IGNsb3Vkd2F0Y2guVHJlYXRNaXNzaW5nRGF0YS5OT1RfQlJFQUNISU5HLFxuICAgICAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5yb2xsYmFja0FsYXJtcy5wdXNoKGFsYXJtKTtcbiAgICAgICAgICBhcm5zLnB1c2goYWxhcm0uYWxhcm1Bcm4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGFsYXJtID0gbmV3IFJlZ2lvbmFsQWxhcm0odGhpcywgYFJvbGxiYWNrJHt0LmtleX0tJHtyZWdpb259YCwge1xuICAgICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgICAgYWxhcm1OYW1lOiBgJHtBTEFSTV9OQU1FX1BSRUZJWH0ke3RoaXMud2ViRnVuY3Rpb24ud2ViRnVuY3Rpb25OYW1lfS0ke3RoaXMuZW5kcG9pbnROYW1lfS0ke3Quc2hvcnR9LXJhdGVgLFxuICAgICAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBtZXRyaWNzOiByYXRlQWxhcm1RdWVyaWVzKHRoaXMubWV0cmljSWRzKCksIHQubWV0cmljLCByb2xsYmFjay5wZXJpb2QsIHJvbGxiYWNrLm1pbmltdW1SZXF1ZXN0cyksXG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHQudGhyZXNob2xkLFxuICAgICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IHJvbGxiYWNrLmV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkcsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5yb2xsYmFja0FsYXJtcy5wdXNoKGNsb3Vkd2F0Y2guQWxhcm0uZnJvbUFsYXJtQXJuKHRoaXMsIGBSb2xsYmFjayR7dC5rZXl9LSR7cmVnaW9ufS1SZWZgLCBhbGFybS5hbGFybUFybikpO1xuICAgICAgICAgIGFybnMucHVzaChhbGFybS5hbGFybUFybik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFybnM7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXNlUmVnaW9ucyhzY29wZTogQ29uc3RydWN0LCBlbmRwb2ludFR5cGU6IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLCBob21lUmVnaW9uOiBzdHJpbmcsIHJlZ2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBleHRyYSA9IFsuLi5uZXcgU2V0KHJlZ2lvbnMpXS5maWx0ZXIoKHIpID0+IHIgIT09IGhvbWVSZWdpb24pLnNvcnQoKTtcbiAgZm9yIChjb25zdCByIG9mIHJlZ2lvbnMpIHtcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogcmVnaW9ucyBtdXN0IGJlIGxpdGVyYWwgcmVnaW9uIG5hbWVzLCBnb3QgYSB0b2tlbmApO1xuICAgIH1cbiAgICBpZiAoIS9eW2Etel17Mn0oLVthLXpdKykrLVxcZCQvLnRlc3QocikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiAnJHtyfScgaXMgbm90IGEgdmFsaWQgcmVnaW9uIG5hbWVgKTtcbiAgICB9XG4gIH1cbiAgaWYgKGVuZHBvaW50VHlwZSA9PT0gV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuSE9NRV9SRUdJT04gJiYgZXh0cmEubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiBhIEhPTUVfUkVHSU9OIGVuZHBvaW50IHNlcnZlcyBvbmx5IHRoZSBob21lIHJlZ2lvbiAoJHtob21lUmVnaW9ufSk7IHVzZSBNVUxUSV9SRUdJT04gb3IgUEVSX1JFR0lPTiB0byBhZGQgJHtleHRyYS5qb2luKCcsICcpfWApO1xuICB9XG4gIGlmIChlbmRwb2ludFR5cGUgIT09IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLkhPTUVfUkVHSU9OKSB7XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChob21lUmVnaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06ICR7ZW5kcG9pbnRUeXBlfSBlbmRwb2ludHMgbmVlZCBhIHN0YWNrIHdpdGggYW4gZXhwbGljaXQgcmVnaW9uIChlbnYucmVnaW9uKWApO1xuICAgIH1cbiAgICBpZiAoZXh0cmEubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogYSAke2VuZHBvaW50VHlwZX0gZW5kcG9pbnQgbmVlZHMgYXQgbGVhc3Qgb25lIHJlZ2lvbiBiZXNpZGVzIHRoZSBob21lIHJlZ2lvbiAoJHtob21lUmVnaW9ufSlgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4dHJhO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJhdGVMaW1pdChzY29wZTogQ29uc3RydWN0LCByYXRlTGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAocmF0ZUxpbWl0ID09PSB1bmRlZmluZWQgfHwgVG9rZW4uaXNVbnJlc29sdmVkKHJhdGVMaW1pdCkpIHJldHVybjtcbiAgY29uc3QgYWxsb3dlZCA9IHJhdGVMaW1pdCA9PT0gMFxuICAgIHx8IChyYXRlTGltaXQgPj0gMTAwICYmIHJhdGVMaW1pdCA8PSAxMDAwICYmIHJhdGVMaW1pdCAlIDEwMCA9PT0gMClcbiAgICB8fCAocmF0ZUxpbWl0ID49IDIwMDAgJiYgcmF0ZUxpbWl0IDw9IDEwMDAwICYmIHJhdGVMaW1pdCAlIDEwMDAgPT09IDApO1xuICBpZiAoIWFsbG93ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogcmF0ZUxpbWl0IG11c3QgYmUgMCwgMTAwLTEsMDAwIGluIHN0ZXBzIG9mIDEwMCwgb3IgMiwwMDAtMTAsMDAwIGluIHN0ZXBzIG9mIDEsMDAwLCBnb3QgJHtyYXRlTGltaXR9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVNYXhFbnZpcm9ubWVudHMoc2NvcGU6IENvbnN0cnVjdCwgbWF4RW52aXJvbm1lbnRzOiBudW1iZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKG1heEVudmlyb25tZW50cyA9PT0gdW5kZWZpbmVkIHx8IFRva2VuLmlzVW5yZXNvbHZlZChtYXhFbnZpcm9ubWVudHMpKSByZXR1cm47XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihtYXhFbnZpcm9ubWVudHMpIHx8IG1heEVudmlyb25tZW50cyA8IDIgfHwgbWF4RW52aXJvbm1lbnRzID4gMTAwMDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogbWF4RW52aXJvbm1lbnRzIG11c3QgYmUgYW4gaW50ZWdlciBmcm9tIDIgdG8gMTAsMDAwLCBnb3QgJHttYXhFbnZpcm9ubWVudHN9YCk7XG4gIH1cbn1cblxuLyoqIGBwcmltYXJ5YCBnZXRzIHdoYXQgYGFkZGl0aW9uYWxgIGxlYXZlczsgd2VpZ2h0cyBhcmUgd2hvbGUgcGVyY2VudGFnZXMgc3VtbWluZyB0byAxMDAuICovXG5mdW5jdGlvbiByZXZpc2lvbldlaWdodHMoXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIHdlYkZ1bmN0aW9uOiBJV2ViRnVuY3Rpb24sXG4gIHByaW1hcnk6IElXZWJGdW5jdGlvblJldmlzaW9uLFxuICBhZGRpdGlvbmFsOiBXZWJGdW5jdGlvblJldmlzaW9uV2VpZ2h0W10sXG4pOiBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25FbmRwb2ludC5SZXZpc2lvbldlaWdodFByb3BlcnR5W10ge1xuICBmb3IgKGNvbnN0IHIgb2YgW3ByaW1hcnksIC4uLmFkZGl0aW9uYWwubWFwKChhKSA9PiBhLnJldmlzaW9uKV0pIHtcbiAgICBpZiAoci53ZWJGdW5jdGlvbiAhPT0gd2ViRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiByZXZpc2lvbiAke3IucmV2aXNpb25JZH0gYmVsb25ncyB0byBhbm90aGVyIGZ1bmN0aW9uYCk7XG4gICAgfVxuICB9XG4gIGlmIChhZGRpdGlvbmFsLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbeyByZXZpc2lvbklkOiBwcmltYXJ5LnJldmlzaW9uSWQsIHdlaWdodDogMTAwIH1dO1xuICB9XG4gIGlmIChhZGRpdGlvbmFsLmxlbmd0aCA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogYW4gZW5kcG9pbnQgcm91dGVzIHRvIGF0IG1vc3QgdHdvIHJldmlzaW9ucywgc28gYWRkaXRpb25hbFJldmlzaW9ucyB0YWtlcyBvbmVgKTtcbiAgfVxuICBjb25zdCBbeyByZXZpc2lvbiwgd2VpZ2h0IH1dID0gYWRkaXRpb25hbDtcbiAgY29uc3QgcGVyY2VudCA9IE1hdGgucm91bmQod2VpZ2h0ICogMTAwKTtcbiAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZCh3ZWlnaHQpIHx8IE1hdGguYWJzKHdlaWdodCAqIDEwMCAtIHBlcmNlbnQpID4gMWUtOSB8fCBwZXJjZW50IDwgMSB8fCBwZXJjZW50ID4gOTkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogYW4gYWRkaXRpb25hbCByZXZpc2lvbidzIHdlaWdodCBtdXN0IGJlIGEgd2hvbGUgcGVyY2VudGFnZSBmcm9tIDAuMDEgdG8gMC45OSwgZ290ICR7d2VpZ2h0fWApO1xuICB9XG4gIGlmIChyZXZpc2lvbiA9PT0gcHJpbWFyeSB8fCAoIVRva2VuLmlzVW5yZXNvbHZlZChyZXZpc2lvbi5yZXZpc2lvbklkKSAmJiByZXZpc2lvbi5yZXZpc2lvbklkID09PSBwcmltYXJ5LnJldmlzaW9uSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IHRoZSBhZGRpdGlvbmFsIHJldmlzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBlbmRwb2ludCdzIHJldmlzaW9uYCk7XG4gIH1cbiAgcmV0dXJuIFt7IHJldmlzaW9uSWQ6IHByaW1hcnkucmV2aXNpb25JZCwgd2VpZ2h0OiAxMDAgLSBwZXJjZW50IH0sIHsgcmV2aXNpb25JZDogcmV2aXNpb24ucmV2aXNpb25JZCwgd2VpZ2h0OiBwZXJjZW50IH1dO1xufVxuXG4vKipcbiAqIGA8cHJlZml4Pi08aGFzaD5gLCB3aXRoIHRoZSBoYXNoIGNvdmVyaW5nIHRoZSBlbmRwb2ludCB0eXBlIGFuZCByZWdpb25zOiBhIHR5cGUgb3IgcmVnaW9uIGNoYW5nZSBwcm9kdWNlc1xuICogYSBuZXcgbmFtZSwgc28gdGhlIHJlcGxhY2VtZW50IGRvZXNuJ3QgY29sbGlkZSB3aXRoIHRoZSBlbmRwb2ludCBpdCByZXBsYWNlcy5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEVuZHBvaW50TmFtZShwcmVmaXg6IHN0cmluZywgc2VlZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBlbmRwb2ludFR5cGU6IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLCBleHRyYVJlZ2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShbLi4uKHNlZWQgIT09IHVuZGVmaW5lZCA/IFtzZWVkXSA6IFtdKSwgZW5kcG9pbnRUeXBlLCAuLi5leHRyYVJlZ2lvbnNdLmpvaW4oJywnKSkuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCA4KTtcbiAgcmV0dXJuIGAke3ByZWZpeH0tJHtoYXNofWA7XG59XG4iXX0=
447
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWVuZHBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi1lbmRwb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXlDO0FBQ3pDLDZDQUErRTtBQUMvRSx1RUFBeUQ7QUFFekQsK0RBQWlEO0FBQ2pELDJDQUF1QztBQUN2QyxtQ0FBdUU7QUFDdkUsK0RBQTJEO0FBQzNELCtDQUcyQjtBQUMzQiw2REFBNEU7QUFFNUUsMkRBQXVEO0FBQ3ZELHFEQUFxRjtBQUdyRiwrREFBMEQ7QUFxSTFEOzs7O0dBSUc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLHNCQUFTOztJQUNoRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUNqRixPQUFPLElBQUksbUJBQW1CLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsMkJBQTJCO0lBQ1gsWUFBWSxDQUFTO0lBRXJDLDBCQUEwQjtJQUNWLFdBQVcsQ0FBUztJQUVwQyw4Q0FBOEM7SUFDOUIsWUFBWSxDQUEwQjtJQUV0RCxxREFBcUQ7SUFDckMsUUFBUSxDQUFzQjtJQUU5QywyR0FBMkc7SUFDM0YsT0FBTyxDQUFXO0lBRWxDOztPQUVHO0lBQ2EsVUFBVSxDQUFTO0lBRW5DOztPQUVHO0lBQ2EsR0FBRyxDQUFTO0lBRTVCLGlFQUFpRTtJQUNqRCxNQUFNLENBQW9CO0lBRTFDLDZDQUE2QztJQUM3QixXQUFXLENBQWU7SUFFMUM7OztPQUdHO0lBQ2EsY0FBYyxHQUF3QixFQUFFLENBQUM7SUFFeEMsVUFBVSxDQUFTO0lBQ25CLFFBQVEsQ0FBZ0M7SUFDakQsT0FBTyxDQUF5RDtJQUNoRSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ04sT0FBTyxDQUFVO0lBQzFC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LENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckosT0FBTyxHQUFHLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IEFubm90YXRpb25zLCBEdXJhdGlvbiwgU3RhY2ssIFRva2VuLCBWYWxpZGF0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkF1dGhUeXBlLCBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZSB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHsgRW5kcG9pbnRMb29rdXAgfSBmcm9tICcuL3ByaXZhdGUvZW5kcG9pbnQtbG9va3VwJztcbmltcG9ydCB7XG4gIENMSUVOVF9FUlJPUlMsIERFRkFVTFRfUEVSSU9ELCBSRVFVRVNUUywgU0VSVkVSX0VSUk9SUywgVVNBR0VfTkFNRVNQQUNFLCBXRUJfTkFNRVNQQUNFLFxuICBlbmRwb2ludERpbWVuc2lvbnMsIHJhdGVBbGFybVF1ZXJpZXMsIHJhdGVFeHByZXNzaW9uLFxufSBmcm9tICcuL3ByaXZhdGUvbWV0cmljcyc7XG5pbXBvcnQgeyBBTEFSTV9OQU1FX1BSRUZJWCwgUmVnaW9uYWxBbGFybSB9IGZyb20gJy4vcHJpdmF0ZS9yZWdpb25hbC1hbGFybSc7XG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkUm9sbGJhY2tPcHRpb25zIH0gZnJvbSAnLi9wcml2YXRlL3JvbGxiYWNrJztcbmltcG9ydCB7IFRyYWZmaWNTaGlmdCB9IGZyb20gJy4vcHJpdmF0ZS90cmFmZmljLXNoaWZ0JztcbmltcG9ydCB7IENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUsIGFzc2VydFJlc291cmNlTmFtZSB9IGZyb20gJy4vcHJpdmF0ZS92YWxpZGF0aW9uJztcbmltcG9ydCB0eXBlIHsgSVdlYkZ1bmN0aW9uIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBXZWJGdW5jdGlvbkRlcGxveW1lbnQgfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1kZXBsb3ltZW50JztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uR3JhbnRzIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZ3JhbnRzJztcbmltcG9ydCB0eXBlIHsgSVdlYkZ1bmN0aW9uUmV2aXNpb24gfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1yZXZpc2lvbic7XG5cbi8qKlxuICogQSByZXZpc2lvbiBhbmQgdGhlIHNoYXJlIG9mIGFuIGVuZHBvaW50J3MgdHJhZmZpYyBpdCByZWNlaXZlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvblJldmlzaW9uV2VpZ2h0IHtcbiAgLyoqIFRoZSByZXZpc2lvbi4gKi9cbiAgcmVhZG9ubHkgcmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgcmV2aXNpb24ncyBzaGFyZSBvZiB0aGUgZW5kcG9pbnQncyB0cmFmZmljLCBhcyBhIGZyYWN0aW9uIChsaWtlIGBsYW1iZGEuQWxpYXNgIGBhZGRpdGlvbmFsVmVyc2lvbnNgKS5cbiAgICogTXVzdCBiZSBhIHdob2xlIHBlcmNlbnRhZ2UgZnJvbSAwLjAxIHRvIDAuOTkuXG4gICAqL1xuICByZWFkb25seSB3ZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhIFdlYiBGdW5jdGlvbidzIGVuZHBvaW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBlbmRwb2ludCBzZXJ2ZXMgdHJhZmZpYyBmcm9tLlxuICAgKlxuICAgKiBAZGVmYXVsdCBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnRUeXBlPzogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGU7XG5cbiAgLyoqXG4gICAqIFJlZ2lvbnMgdG8gc2VydmUgZnJvbSBpbiBhZGRpdGlvbiB0byB0aGUgaG9tZSByZWdpb24gKHRoZSBzdGFjaydzIHJlZ2lvbikuXG4gICAqIFJlcXVpcmVkIChhdCBsZWFzdCBvbmUpIGZvciBgTVVMVElfUkVHSU9OYCBhbmQgYFBFUl9SRUdJT05gOyBtdXN0IGJlIGVtcHR5IGZvciBgSE9NRV9SRUdJT05gLlxuICAgKlxuICAgKiBDaGFuZ2luZyB0aGlzIGNyZWF0ZXMgYSBuZXcgZW5kcG9pbnQgd2l0aCBhIG5ldyBVUkwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZXh0cmEgcmVnaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9ucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZW5kcG9pbnQncyBuYW1lLCBzaG93biBpbiBsb2dzIChgZW5kcG9pbnROYW1lYCkgYW5kIGluIHRoZSBgbGFtYmRhLXdlYi1lbmRwb2ludC1uYW1lYCBoZWFkZXIuXG4gICAqIE5hbWVzIGFyZSB1bmlxdWUgcGVyIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIHRoZSBuYW1lIGVuZHMgaW4gYSBoYXNoIG9mIHRoZSBlbmRwb2ludCB0eXBlIGFuZCByZWdpb25zLCBzbyBjaGFuZ2luZyBlaXRoZXIgZGVwbG95c1xuICAgKiBhIG5ldyBlbmRwb2ludCBjbGVhbmx5LiBXaGVuIHNldCwgY2hhbmdpbmcgdGhlIGVuZHBvaW50IHR5cGUgb3IgcmVnaW9ucyBhbHNvIHJlcXVpcmVzIGEgbmV3IG5hbWU6XG4gICAqIHR3byBlbmRwb2ludHMgb2Ygb25lIGZ1bmN0aW9uIGNhbid0IHNoYXJlIGEgbmFtZSwgYW5kIENsb3VkRm9ybWF0aW9uIGNyZWF0ZXMgdGhlIHJlcGxhY2VtZW50XG4gICAqIGJlZm9yZSBkZWxldGluZyB0aGUgb2xkIG9uZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgZGVmYXVsdC08aGFzaD5gIGZvciB0aGUgZnVuY3Rpb24ncyBkZWZhdWx0IGVuZHBvaW50LCBgPGlkPi08aGFzaD5gIGZvciBlbmRwb2ludHMgYWRkZWQgd2l0aCBgYWRkRW5kcG9pbnRgXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIGVuZHBvaW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vc3QgcmVxdWVzdHMgcGVyIHNlY29uZCB0aGUgZW5kcG9pbnQgYWNjZXB0czsgZXhjZXNzIHJlcXVlc3RzIGdldCBIVFRQIDQyOS5cbiAgICogQWxsb3dlZDogMCAoYmxvY2tzIGFsbCB0cmFmZmljKSwgMTAw4oCTMSwwMDAgaW4gc3RlcHMgb2YgMTAwLCBvciAyLDAwMOKAkzEwLDAwMCBpbiBzdGVwcyBvZiAxLDAwMC5cbiAgICpcbiAgICogRW5mb3JjZWQgc2VwYXJhdGVseSBpbiBlYWNoIHJlZ2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzIGZyb20sIHNvIGEgbXVsdGktcmVnaW9uIGVuZHBvaW50XG4gICAqIGNhbiBhY2NlcHQgdGhpcyBtYW55IHJlcXVlc3RzIHBlciBzZWNvbmQgaW4gZXZlcnkgcmVnaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGxpbWl0IGJleW9uZCB0aGUgc2VydmljZSBxdW90YSBvZiAxMCwwMDAgcmVxdWVzdHMgcGVyIHNlY29uZCBwZXIgZW5kcG9pbnQgKHBlciByZWdpb24pXG4gICAqL1xuICByZWFkb25seSByYXRlTGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtb3N0IGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdGhlIGVuZHBvaW50IG1heSB1c2UgKDLigJMxMCwwMDApLiBFYWNoIG9uZSB1c2VzIDIgdkNQVXMgb2YgdGhlIGFjY291bnQncyBxdW90YS5cbiAgICpcbiAgICogRW5mb3JjZWQgc2VwYXJhdGVseSBpbiBlYWNoIHJlZ2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzIGZyb20uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc2NhbGVzIHdpdGhpbiB0aGUgYWNjb3VudCdzIHZDUFUgcXVvdGFcbiAgICovXG4gIHJlYWRvbmx5IG1heEVudmlyb25tZW50cz86IG51bWJlcjtcblxuICAvKipcbiAgICogSG93IHRoZSBlbmRwb2ludCBtb3ZlcyBpdHMgdHJhZmZpYyB0byBhIG5ldyByZXZpc2lvbjogYWxsIGF0IG9uY2UsIG9yIGluIHN0ZXBzXG4gICAqIChgV2ViRnVuY3Rpb25EZXBsb3ltZW50LmNhbmFyeSgpYCBvciBgbGluZWFyKClgKSB0aGF0IHdhdGNoIENsb3VkV2F0Y2ggYWxhcm1zIGFuZCBtb3ZlXG4gICAqIHRoZSB0cmFmZmljIGJhY2sgd2hlbiBvbmUgZ29lcyBpbnRvIEFMQVJNLlxuICAgKlxuICAgKiBBIGRlcGxveW1lbnQgaW4gc3RlcHMgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCBgcmV2aXNpb25gLCBgYWRkaXRpb25hbFJldmlzaW9uc2Agb3IgYHJvdXRlVHJhZmZpYygpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgV2ViRnVuY3Rpb25EZXBsb3ltZW50LmFsbEF0T25jZSgpXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50PzogV2ViRnVuY3Rpb25EZXBsb3ltZW50O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBXZWJGdW5jdGlvbi5hZGRFbmRwb2ludGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnMgZXh0ZW5kcyBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgY2FsbGVycyBvZiB0aGlzIGVuZHBvaW50IGFyZSBhdXRoZW50aWNhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aFR5cGU6IFdlYkZ1bmN0aW9uQXV0aFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSByZXZpc2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzLCBlLmcuIGFuIGVhcmxpZXIgb25lIGZyb20gYFdlYkZ1bmN0aW9uUmV2aXNpb24uZnJvbVJldmlzaW9uQXR0cmlidXRlc2BcbiAgICogdG8ga2VlcCB0aGlzIGVuZHBvaW50IG9uIGl0IHdoaWxlIG90aGVycyBtb3ZlIG9uLiBTYW1lIGFzIGNhbGxpbmcgYHJvdXRlVHJhZmZpY2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGZ1bmN0aW9uJ3MgY3VycmVudCByZXZpc2lvbiAoYGN1cnJlbnRSZXZpc2lvbmApXG4gICAqL1xuICByZWFkb25seSByZXZpc2lvbj86IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKlxuICAgKiBBIHNlY29uZCByZXZpc2lvbiBhbmQgaXRzIHNoYXJlIG9mIHRoZSBlbmRwb2ludCdzIHRyYWZmaWM7IGByZXZpc2lvbmAgZ2V0cyB0aGUgcmVzdC5cbiAgICogQW4gZW5kcG9pbnQgcm91dGVzIHRvIGF0IG1vc3QgdHdvIHJldmlzaW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbGwgdHJhZmZpYyBnb2VzIHRvIGByZXZpc2lvbmBcbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxSZXZpc2lvbnM/OiBXZWJGdW5jdGlvblJldmlzaW9uV2VpZ2h0W107XG59XG5cbi8qKlxuICogSW50ZXJuYWw6IGhvdyBgV2ViRnVuY3Rpb25gIGNyZWF0ZXMgaXRzIGVuZHBvaW50cy4gTm90IHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuXG4gKi9cbmludGVyZmFjZSBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMgZXh0ZW5kcyBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKiBUaGUgZnVuY3Rpb24gdGhhdCBvd25zIHRoZSBlbmRwb2ludC4gKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb246IElXZWJGdW5jdGlvbjtcblxuICAvKiogVGhlIGZ1bmN0aW9uJ3MgY3VycmVudCByZXZpc2lvbiwgc2VydmVkIHVubGVzcyBgcmV2aXNpb25gIGlzIGdpdmVuLiAqL1xuICByZWFkb25seSBjdXJyZW50UmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKiBQcmVmaXggb2YgdGhlIGdlbmVyYXRlZCBlbmRwb2ludCBuYW1lLiAqL1xuICByZWFkb25seSBuYW1lUHJlZml4OiBzdHJpbmc7XG5cbiAgLyoqIEV4dHJhIGlucHV0IHRvIHRoZSBnZW5lcmF0ZWQgbmFtZSdzIGhhc2ggKHRoZSBjb25zdHJ1Y3QgSUQgb2YgYW4gYWRkZWQgZW5kcG9pbnQpLiAqL1xuICByZWFkb25seSBuYW1lU2VlZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBIVFRQUyBlbmRwb2ludCBvZiBhIFdlYiBGdW5jdGlvbjogYGZuLmVuZHBvaW50YCAodGhlIGRlZmF1bHQgb25lKSBvciB0aGUgcmVzdWx0IG9mIGBmbi5hZGRFbmRwb2ludCgpYC5cbiAqXG4gKiBFbmRwb2ludHMgYXJlIGNyZWF0ZWQgb25seSB0aHJvdWdoIGBXZWJGdW5jdGlvbmAsIHdoaWNoIG93bnMgdGhlaXIgbG9nIGdyb3VwcyBpbiBldmVyeSByZWdpb24sIHNvIHRoZSBjb25zdHJ1Y3RvciBpcyBwcml2YXRlLlxuICovXG5leHBvcnQgY2xhc3MgV2ViRnVuY3Rpb25FbmRwb2ludCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVuZHBvaW50IG9mIGEgV2ViIEZ1bmN0aW9uLiBVc2VkIGJ5IGBXZWJGdW5jdGlvbmAuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfY3JlYXRlKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMpOiBXZWJGdW5jdGlvbkVuZHBvaW50IHtcbiAgICByZXR1cm4gbmV3IFdlYkZ1bmN0aW9uRW5kcG9pbnQoc2NvcGUsIGlkLCBwcm9wcyk7XG4gIH1cblxuICAvKiogVGhlIGVuZHBvaW50J3MgbmFtZS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50TmFtZTogc3RyaW5nO1xuXG4gIC8qKiBUaGUgZW5kcG9pbnQncyBBUk4uICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludEFybjogc3RyaW5nO1xuXG4gIC8qKiBXaGVyZSB0aGUgZW5kcG9pbnQgc2VydmVzIHRyYWZmaWMgZnJvbS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50VHlwZTogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGU7XG5cbiAgLyoqIEhvdyBjYWxsZXJzIG9mIHRoZSBlbmRwb2ludCBhcmUgYXV0aGVudGljYXRlZC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGF1dGhUeXBlOiBXZWJGdW5jdGlvbkF1dGhUeXBlO1xuXG4gIC8qKiBFdmVyeSByZWdpb24gdGhlIGVuZHBvaW50IHNlcnZlcyBmcm9tOiB0aGUgaG9tZSByZWdpb24gZmlyc3QsIHRoZW4gdGhlIG90aGVycyBpbiBhbHBoYWJldGljYWwgb3JkZXIuICovXG4gIHB1YmxpYyByZWFkb25seSByZWdpb25zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgZG9tYWluIG5hbWU6IHRoZSBnbG9iYWwgZG9tYWluIGZvciBgTVVMVElfUkVHSU9OYCwgb3RoZXJ3aXNlIHRoZSBob21lIHJlZ2lvbidzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgVVJMOiB0aGUgZ2xvYmFsIFVSTCBmb3IgYE1VTFRJX1JFR0lPTmAsIG90aGVyd2lzZSB0aGUgaG9tZSByZWdpb24ncy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKiogR3JhbnRzIG9uIHRoaXMgZW5kcG9pbnQgKGUuZy4gYGdyYW50cy5pbnZva2UocHJpbmNpcGFsKWApLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRzOiBXZWJGdW5jdGlvbkdyYW50cztcblxuICAvKiogVGhlIGZ1bmN0aW9uIHRoaXMgZW5kcG9pbnQgYmVsb25ncyB0by4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHdlYkZ1bmN0aW9uOiBJV2ViRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSBhbGFybXMgdGhpcyBlbmRwb2ludCBjcmVhdGVkIGZvciBpdHMgZGVwbG95bWVudCdzIGByb2xsYmFja09uYCwgb25lIHBlciB0aHJlc2hvbGQgaW4gZXZlcnkgcmVnaW9uIGl0IHNlcnZlcyBmcm9tXG4gICAqICh0aGUgaG9tZSByZWdpb24ncyBmaXJzdCkuIEVtcHR5IHdpdGhvdXQgYHJvbGxiYWNrT25gLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvbGxiYWNrQWxhcm1zOiBjbG91ZHdhdGNoLklBbGFybVtdID0gW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBob21lUmVnaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2U6IGxhbWJkYS5DZm5XZWJGdW5jdGlvbkVuZHBvaW50O1xuICBwcml2YXRlIHdlaWdodHM6IGxhbWJkYS5DZm5XZWJGdW5jdGlvbkVuZHBvaW50LlJldmlzaW9uV2VpZ2h0UHJvcGVydHlbXTtcbiAgcHJpdmF0ZSByb3V0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBncmFkdWFsOiBib29sZWFuO1xuICBwcml2YXRlIGxvb2t1cD86IEVuZHBvaW50TG9va3VwO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdlYkZ1bmN0aW9uRW5kcG9pbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBob21lUmVnaW9uID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuICAgIGNvbnN0IGVuZHBvaW50VHlwZSA9IHByb3BzLmVuZHBvaW50VHlwZSA/PyBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTjtcbiAgICBjb25zdCBleHRyYVJlZ2lvbnMgPSBub3JtYWxpc2VSZWdpb25zKHRoaXMsIGVuZHBvaW50VHlwZSwgaG9tZVJlZ2lvbiwgcHJvcHMucmVnaW9ucyA/PyBbXSk7XG4gICAgdmFsaWRhdGVSYXRlTGltaXQodGhpcywgcHJvcHMucmF0ZUxpbWl0KTtcbiAgICB2YWxpZGF0ZU1heEVudmlyb25tZW50cyh0aGlzLCBwcm9wcy5tYXhFbnZpcm9ubWVudHMpO1xuXG4gICAgaWYgKHByb3BzLmVuZHBvaW50TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhc3NlcnRSZXNvdXJjZU5hbWUodGhpcywgJ2VuZHBvaW50TmFtZScsIHByb3BzLmVuZHBvaW50TmFtZSk7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoJ0BjZGstbGFtYmRhLXdlYjpleHBsaWNpdEVuZHBvaW50TmFtZScsXG4gICAgICAgIGBlbmRwb2ludE5hbWUgJyR7cHJvcHMuZW5kcG9pbnROYW1lfScgaXMgc2V0IGV4cGxpY2l0bHk6IGNoYW5naW5nIGVuZHBvaW50VHlwZSBvciByZWdpb25zIGxhdGVyIGFsc28gcmVxdWlyZXMgYSBuZXcgZW5kcG9pbnROYW1lLCBvdGhlcndpc2UgdGhlIGRlcGxveW1lbnQgZmFpbHMgd2l0aCBcImFscmVhZHkgZXhpc3RzXCIgKHRoZSBzdGFjayByb2xscyBiYWNrIHNhZmVseSkuIE9taXQgZW5kcG9pbnROYW1lIHRvIGdldCBhIG5hbWUgdGhhdCBjaGFuZ2VzIGF1dG9tYXRpY2FsbHkuYCk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5hdXRoVHlwZSA9PT0gV2ViRnVuY3Rpb25BdXRoVHlwZS5OT05FKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoJ0BjZGstbGFtYmRhLXdlYjphdXRoVHlwZU5vbmUnLFxuICAgICAgICAnYXV0aFR5cGUgTk9ORSBtYWtlcyB0aGUgZW5kcG9pbnQgcHVibGljOiBMYW1iZGEgZG9lcyBubyBhdXRoZW50aWNhdGlvbiwgc28geW91ciBhcHBsaWNhdGlvbiBtdXN0IGF1dGhlbnRpY2F0ZSByZXF1ZXN0cyBpdHNlbGYuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5lbmRwb2ludFR5cGUgPSBlbmRwb2ludFR5cGU7XG4gICAgdGhpcy5hdXRoVHlwZSA9IHByb3BzLmF1dGhUeXBlO1xuICAgIHRoaXMuZW5kcG9pbnROYW1lID0gcHJvcHMuZW5kcG9pbnROYW1lID8/IGRlZmF1bHRFbmRwb2ludE5hbWUocHJvcHMubmFtZVByZWZpeCwgcHJvcHMubmFtZVNlZWQsIGVuZHBvaW50VHlwZSwgZXh0cmFSZWdpb25zKTtcbiAgICB0aGlzLnJlZ2lvbnMgPSBbaG9tZVJlZ2lvbiwgLi4uZXh0cmFSZWdpb25zXTtcbiAgICB0aGlzLmhvbWVSZWdpb24gPSBob21lUmVnaW9uO1xuICAgIHRoaXMud2ViRnVuY3Rpb24gPSBwcm9wcy53ZWJGdW5jdGlvbjtcbiAgICB0aGlzLndlaWdodHMgPSBbeyByZXZpc2lvbklkOiBwcm9wcy5jdXJyZW50UmV2aXNpb24ucmV2aXNpb25JZCwgd2VpZ2h0OiAxMDAgfV07XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IG5ldyBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25FbmRwb2ludCh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IHByb3BzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uQXJuLFxuICAgICAgZW5kcG9pbnROYW1lOiB0aGlzLmVuZHBvaW50TmFtZSxcbiAgICAgIGVuZHBvaW50VHlwZSxcbiAgICAgIGF1dGhUeXBlOiBwcm9wcy5hdXRoVHlwZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHJlZ2lvbnM6IGV4dHJhUmVnaW9ucy5sZW5ndGggPiAwID8gZXh0cmFSZWdpb25zIDogdW5kZWZpbmVkLFxuICAgICAgcmV2aXNpb25XZWlnaHRzOiB0aGlzLndlaWdodHMsXG4gICAgICB0aHJvdHRsZUNvbmZpZzogcHJvcHMucmF0ZUxpbWl0ICE9PSB1bmRlZmluZWQgPyB7IHJhdGVMaW1pdDogcHJvcHMucmF0ZUxpbWl0IH0gOiB1bmRlZmluZWQsXG4gICAgICBzY2FsaW5nQ29uZmlnOiBwcm9wcy5tYXhFbnZpcm9ubWVudHMgIT09IHVuZGVmaW5lZCA/IHsgbWF4RW52aXJvbm1lbnRzOiBwcm9wcy5tYXhFbnZpcm9ubWVudHMgfSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICBWYWxpZGF0aW9ucy5vZihyZXNvdXJjZSkuYWNrbm93bGVkZ2UoQ0ZOX1ZBTElEQVRFX1VOS05PV05fVFlQRSk7XG4gICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlO1xuXG4gICAgdGhpcy5ncmFkdWFsID0gcHJvcHMuZGVwbG95bWVudD8uX2dyYWR1YWwgPz8gZmFsc2U7XG4gICAgaWYgKHByb3BzLmRlcGxveW1lbnQ/Ll9ncmFkdWFsKSB7XG4gICAgICBpZiAocHJvcHMucmV2aXNpb24gIT09IHVuZGVmaW5lZCB8fCBwcm9wcy5hZGRpdGlvbmFsUmV2aXNpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogYW4gZW5kcG9pbnQgd2l0aCBhICR7cHJvcHMuZGVwbG95bWVudC5fa2luZH0gZGVwbG95bWVudCBhbHdheXMgbW92ZXMgdG8gdGhlIGN1cnJlbnQgcmV2aXNpb247IGl0IGNhbid0IGFsc28gc2V0IHJldmlzaW9uIG9yIGFkZGl0aW9uYWxSZXZpc2lvbnNgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJvbGxiYWNrQWxhcm1Bcm5zID0gcHJvcHMuZGVwbG95bWVudC5fcm9sbGJhY2tPbiA/IHRoaXMuY3JlYXRlUm9sbGJhY2tBbGFybXMocHJvcHMuZGVwbG95bWVudC5fcm9sbGJhY2tPbikgOiBbXTtcbiAgICAgIGNvbnN0IHdhaXRTZWNvbmRzID0gcHJvcHMuZGVwbG95bWVudC5fd2FpdFNlY29uZHM7XG4gICAgICBjb25zdCByb2xsYmFjayA9IHByb3BzLmRlcGxveW1lbnQuX3JvbGxiYWNrT247XG4gICAgICBpZiAocm9sbGJhY2sgJiYgd2FpdFNlY29uZHMgPCByb2xsYmFjay5wZXJpb2QudG9TZWNvbmRzKCkgKiByb2xsYmFjay5ldmFsdWF0aW9uUGVyaW9kcyArIDEyMCkge1xuICAgICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoJ0BjZGstbGFtYmRhLXdlYjpyb2xsYmFja1Nsb3dlclRoYW5TdGVwJyxcbiAgICAgICAgICBgcm9sbGJhY2tPbiBuZWVkcyAke3JvbGxiYWNrLmV2YWx1YXRpb25QZXJpb2RzfSBwZXJpb2Qocykgb2YgJHtyb2xsYmFjay5wZXJpb2QudG9IdW1hblN0cmluZygpfSBwbHVzIGFib3V0IDIgbWludXRlcyBvZiBDbG91ZFdhdGNoIGRlbGF5IHRvIGZpcmUsIGxvbmdlciB0aGFuIGVhY2ggJHtwcm9wcy5kZXBsb3ltZW50Ll9raW5kfSBzdGVwICgke0R1cmF0aW9uLnNlY29uZHMod2FpdFNlY29uZHMpLnRvSHVtYW5TdHJpbmcoKX0pOiBhIGJhZCByZXZpc2lvbiBjYW4gcmVhY2ggdGhlIG5leHQgc3RlcCBiZWZvcmUgaXRzIGFsYXJtIGZpcmVzLmApO1xuICAgICAgfVxuICAgICAgLy8gTW92ZXMgdGhlIHRyYWZmaWMgaW4gc3RlcHMgYmVmb3JlIENsb3VkRm9ybWF0aW9uIHdyaXRlcyB0aGUgZW5kcG9pbnQsIHdoaWNoIHRoZW4gZmluZHMgaXQgYWxyZWFkeSBkb25lLlxuICAgICAgY29uc3Qgc2hpZnQgPSBuZXcgVHJhZmZpY1NoaWZ0KHRoaXMsICdEZXBsb3ltZW50Jywge1xuICAgICAgICBmdW5jdGlvbk5hbWU6IHByb3BzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uTmFtZSxcbiAgICAgICAgZnVuY3Rpb25Bcm46IHByb3BzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uQXJuLFxuICAgICAgICBlbmRwb2ludE5hbWU6IHRoaXMuZW5kcG9pbnROYW1lLFxuICAgICAgICByZXZpc2lvbklkOiBwcm9wcy5jdXJyZW50UmV2aXNpb24ucmV2aXNpb25JZCxcbiAgICAgICAgZGVwbG95bWVudDogcHJvcHMuZGVwbG95bWVudCxcbiAgICAgICAgYWxhcm1Bcm5zOiByb2xsYmFja0FsYXJtQXJucyxcbiAgICAgICAgZW5kcG9pbnRDb25maWc6IHtcbiAgICAgICAgICBlbmRwb2ludFR5cGUsXG4gICAgICAgICAgYXV0aFR5cGU6IHByb3BzLmF1dGhUeXBlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICByZWdpb25zOiBleHRyYVJlZ2lvbnMsXG4gICAgICAgICAgcmF0ZUxpbWl0OiBwcm9wcy5yYXRlTGltaXQsXG4gICAgICAgICAgbWF4RW52aXJvbm1lbnRzOiBwcm9wcy5tYXhFbnZpcm9ubWVudHMsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShzaGlmdCk7XG4gICAgICAvLyBBbGFybXMgaW4gb3RoZXIgcmVnaW9ucyBhcmUgb25seSByZWZlcmVuY2VkIGJ5IEFSTi5cbiAgICAgIGZvciAoY29uc3QgYWxhcm0gb2YgdGhpcy5ub2RlLmZpbmRBbGwoKS5maWx0ZXIoKGMpID0+IGMgaW5zdGFuY2VvZiBSZWdpb25hbEFsYXJtKSkgc2hpZnQubm9kZS5hZGREZXBlbmRlbmN5KGFsYXJtKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLnJldmlzaW9uICE9PSB1bmRlZmluZWQgfHwgcHJvcHMuYWRkaXRpb25hbFJldmlzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJvdXRlVHJhZmZpYyhwcm9wcy5yZXZpc2lvbiA/PyBwcm9wcy5jdXJyZW50UmV2aXNpb24sIHByb3BzLmFkZGl0aW9uYWxSZXZpc2lvbnMpO1xuICAgIH1cblxuICAgIHRoaXMuZW5kcG9pbnRBcm4gPSByZXNvdXJjZS5hdHRyRW5kcG9pbnRBcm47XG4gICAgdGhpcy5kb21haW5OYW1lID0gcmVzb3VyY2UuYXR0ckRvbWFpbk5hbWU7XG4gICAgdGhpcy51cmwgPSBgaHR0cHM6Ly8ke3Jlc291cmNlLmF0dHJEb21haW5OYW1lfWA7XG4gICAgdGhpcy5ncmFudHMgPSBXZWJGdW5jdGlvbkdyYW50cy5fZm9yRW5kcG9pbnQodGhpcywgcHJvcHMud2ViRnVuY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBVUkwgb2YgdGhpcyBlbmRwb2ludCBpbiBvbmUgcmVnaW9uLiBPbmx5IGZvciBgUEVSX1JFR0lPTmAgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAcGFyYW0gcmVnaW9uIG9uZSBvZiBgcmVnaW9uc2BcbiAgICovXG4gIHB1YmxpYyByZWdpb25hbFVybChyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBodHRwczovLyR7dGhpcy5yZWdpb25hbERvbWFpbk5hbWUocmVnaW9uKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkb21haW4gbmFtZSBvZiB0aGlzIGVuZHBvaW50IGluIG9uZSByZWdpb24uIE9ubHkgZm9yIGBQRVJfUkVHSU9OYCBlbmRwb2ludHMuXG4gICAqXG4gICAqIEBwYXJhbSByZWdpb24gb25lIG9mIGByZWdpb25zYFxuICAgKi9cbiAgcHVibGljIHJlZ2lvbmFsRG9tYWluTmFtZShyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZW5kcG9pbnRUeXBlICE9PSBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5QRVJfUkVHSU9OKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiByZWdpb25hbCBVUkxzIGFuZCBkb21haW4gbmFtZXMgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciBQRVJfUkVHSU9OIGVuZHBvaW50cyAodGhpcyBvbmUgaXMgJHt0aGlzLmVuZHBvaW50VHlwZX0pOyB1c2UgdXJsIG9yIGRvbWFpbk5hbWVgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnJlZ2lvbnMuaW5jbHVkZXMocmVnaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogcmVnaW9uICR7cmVnaW9ufSBpcyBub3Qgb25lIG9mIHRoZSBlbmRwb2ludCdzIHJlZ2lvbnMgKCR7dGhpcy5yZWdpb25zLmpvaW4oJywgJyl9KWApO1xuICAgIH1cbiAgICBpZiAocmVnaW9uID09PSB0aGlzLmhvbWVSZWdpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLmRvbWFpbk5hbWU7XG4gICAgfVxuICAgIHRoaXMubG9va3VwID8/PSBuZXcgRW5kcG9pbnRMb29rdXAodGhpcywgJ0xvb2t1cCcsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogdGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbk5hbWUsXG4gICAgICBmdW5jdGlvbkFybjogdGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbkFybixcbiAgICAgIGVuZHBvaW50TmFtZTogdGhpcy5lbmRwb2ludE5hbWUsXG4gICAgICBlbmRwb2ludEFybjogdGhpcy5lbmRwb2ludEFybixcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5sb29rdXAucmVnaW9uYWxEb21haW4ocmVnaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3V0ZXMgdGhlIGVuZHBvaW50IHRvIGByZXZpc2lvbmAgaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24ncyBjdXJyZW50IHJldmlzaW9uLCBvcHRpb25hbGx5IHNoYXJpbmdcbiAgICogdHJhZmZpYyB3aXRoIG9uZSBtb3JlIHJldmlzaW9uIChgYWRkaXRpb25hbFJldmlzaW9uc2AsIHdoaWNoIGdldHMgaXRzIHdlaWdodDsgYHJldmlzaW9uYCBnZXRzIHRoZSByZXN0KS5cbiAgICpcbiAgICogVXNlIGl0IHRvIGtlZXAgYW4gZW5kcG9pbnQgb24gYW4gZWFybGllciByZXZpc2lvbiAoYFdlYkZ1bmN0aW9uUmV2aXNpb24uZnJvbVJldmlzaW9uQXR0cmlidXRlc2ApLFxuICAgKiBvciB0byBzZW5kIHBhcnQgb2YgdGhlIHRyYWZmaWMgdG8gdGhlIGN1cnJlbnQgcmV2aXNpb246XG4gICAqIGBmbi5lbmRwb2ludC5yb3V0ZVRyYWZmaWMocHJldmlvdXMsIFt7IHJldmlzaW9uOiBmbi5jdXJyZW50UmV2aXNpb24sIHdlaWdodDogMC4xIH1dKWAuXG4gICAqIENhbiBiZSBjYWxsZWQgb25jZSBwZXIgZW5kcG9pbnQsIGFuZCBub3Qgb24gb25lIGNyZWF0ZWQgd2l0aCBgcmV2aXNpb25gIG9yIGBhZGRpdGlvbmFsUmV2aXNpb25zYC5cbiAgICovXG4gIHB1YmxpYyByb3V0ZVRyYWZmaWMocmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uLCBhZGRpdGlvbmFsUmV2aXNpb25zPzogV2ViRnVuY3Rpb25SZXZpc2lvbldlaWdodFtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ3JhZHVhbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogdGhlIGVuZHBvaW50IGhhcyBhIGRlcGxveW1lbnQgaW4gc3RlcHMsIHdoaWNoIGFsd2F5cyBtb3ZlcyBpdCB0byB0aGUgY3VycmVudCByZXZpc2lvbjsgcm91dGVUcmFmZmljKCkgY2FuJ3QgYmUgdXNlZCB3aXRoIGl0YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJvdXRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogdGhlIGVuZHBvaW50J3MgcmV2aXNpb25zIGFyZSBhbHJlYWR5IHNldCAocmV2aXNpb24sIGFkZGl0aW9uYWxSZXZpc2lvbnMgb3Igcm91dGVUcmFmZmljKWApO1xuICAgIH1cbiAgICB0aGlzLndlaWdodHMgPSByZXZpc2lvbldlaWdodHModGhpcywgdGhpcy53ZWJGdW5jdGlvbiwgcmV2aXNpb24sIGFkZGl0aW9uYWxSZXZpc2lvbnMgPz8gW10pO1xuICAgIHRoaXMucmVzb3VyY2UucmV2aXNpb25XZWlnaHRzID0gdGhpcy53ZWlnaHRzO1xuICAgIHRoaXMucm91dGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgSURzIG9mIHRoZSByZXZpc2lvbnMgdGhpcyBlbmRwb2ludCByb3V0ZXMgdG8uXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9yZXZpc2lvbklkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMud2VpZ2h0cy5tYXAoKHcpID0+IHcucmV2aXNpb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogQSBtZXRyaWMgb2YgdGhpcyBlbmRwb2ludCBpbiBgQVdTL0xhbWJkYS9XZWJgIChkaW1lbnNpb25zIGBGdW5jdGlvbk5hbWVgIGFuZCBgRW5kcG9pbnROYW1lYCkuXG4gICAqXG4gICAqIE1ldHJpY3MgYXJlIHB1Ymxpc2hlZCBpbiB0aGUgcmVnaW9uIHRoYXQgc2VydmVkIHRoZSByZXF1ZXN0OiBwYXNzIGByZWdpb25gIGZvciBvbmUgb2YgdGhlIGVuZHBvaW50J3NcbiAgICogb3RoZXIgcmVnaW9ucy4gQW4gYWxhcm0gY2FuIG9ubHkgdXNlIG1ldHJpY3MgZnJvbSBpdHMgb3duIHN0YWNrJ3MgcmVnaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDEgbWludXRlLCBpbiB0aGUgaG9tZSByZWdpb25cbiAgICovXG4gIHB1YmxpYyBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgIG5hbWVzcGFjZTogV0VCX05BTUVTUEFDRSxcbiAgICAgIG1ldHJpY05hbWUsXG4gICAgICBkaW1lbnNpb25zTWFwOiBlbmRwb2ludERpbWVuc2lvbnModGhpcy5tZXRyaWNJZHMoKSksXG4gICAgICBzdGF0aXN0aWM6IGNsb3Vkd2F0Y2guU3RhdHMuU1VNLFxuICAgICAgcGVyaW9kOiBERUZBVUxUX1BFUklPRCxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlcXVlc3RzIHRoZSBlbmRwb2ludCBzZXJ2ZWQgKGBFeGVjdXRlZFJlcXVlc3RzYCkuIFRoZXJlJ3Mgbm8gc2VwYXJhdGUgY291bnQgb2Ygc3VjY2Vzc2Z1bCAoMlhYKSByZXNwb25zZXMuICovXG4gIHB1YmxpYyBtZXRyaWNSZXF1ZXN0cyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoUkVRVUVTVFMsIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBhbnN3ZXJlZCB3aXRoIGEgNFhYIHN0YXR1cyAoYEhUVFBSZXNwb25zZVN0YXR1c0NsYXNzNFhYYCksIGluY2x1ZGluZyA0MjlzIGZyb20gYHJhdGVMaW1pdGAgYW5kIGBtYXhFbnZpcm9ubWVudHNgLlxuICAgKiBUaGUgbWV0cmljIG9ubHkgZXhpc3RzIG9uY2UgaXQncyBub24temVybywgc28gYWxhcm1zIHNob3VsZCB0cmVhdCBtaXNzaW5nIGRhdGEgYXMgbm90IGJyZWFjaGluZy5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNDbGllbnRFcnJvcnMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKENMSUVOVF9FUlJPUlMsIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBhbnN3ZXJlZCB3aXRoIGEgNVhYIHN0YXR1cyAoYEhUVFBSZXNwb25zZVN0YXR1c0NsYXNzNVhYYCkuIEluY2x1ZGVzIHRoZSBwbGF0Zm9ybSdzIDUwM3Mgd2hpbGUgdGhlIGVuZHBvaW50XG4gICAqIHNjYWxlcyB1cCBmb3IgYSBzdWRkZW4gYnVyc3QsIG5vdCBvbmx5IHlvdXIgYXBwbGljYXRpb24ncyBlcnJvcnMuIFRoZSBtZXRyaWMgb25seSBleGlzdHMgb25jZSBpdCdzIG5vbi16ZXJvLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY1NlcnZlckVycm9ycyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoU0VSVkVSX0VSUk9SUywgcHJvcHMpO1xuICB9XG5cbiAgLyoqIFRoZSBwZXJjZW50YWdlIG9mIHJlcXVlc3RzIGFuc3dlcmVkIHdpdGggYSA0WFggc3RhdHVzIChtYXRoIGV4cHJlc3Npb247IHBlcmlvZHMgd2l0aCBubyA0WFggY291bnQgYXMgMCkuICovXG4gIHB1YmxpYyBtZXRyaWNDbGllbnRFcnJvclJhdGUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1hdGhFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gdGhpcy5yYXRlKENMSUVOVF9FUlJPUlMsICdDbGllbnQgZXJyb3IgcmF0ZSAoJSknLCBwcm9wcyk7XG4gIH1cblxuICAvKiogVGhlIHBlcmNlbnRhZ2Ugb2YgcmVxdWVzdHMgYW5zd2VyZWQgd2l0aCBhIDVYWCBzdGF0dXMgKG1hdGggZXhwcmVzc2lvbjsgcGVyaW9kcyB3aXRoIG5vIDVYWCBjb3VudCBhcyAwKS4gKi9cbiAgcHVibGljIG1ldHJpY1NlcnZlckVycm9yUmF0ZShwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWF0aEV4cHJlc3Npb24ge1xuICAgIHJldHVybiB0aGlzLnJhdGUoU0VSVkVSX0VSUk9SUywgJ1NlcnZlciBlcnJvciByYXRlICglKScsIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRpb24gZW52aXJvbm1lbnRzIHNlcnZpbmcgdGhlIGVuZHBvaW50IChgRW5kcG9pbnRBY3RpdmVFbnZpcm9ubWVudHNgKSwgdG8gY29tcGFyZSB3aXRoIGBtYXhFbnZpcm9ubWVudHNgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG1heGltdW0gb3ZlciAxIG1pbnV0ZSwgaW4gdGhlIGhvbWUgcmVnaW9uXG4gICAqL1xuICBwdWJsaWMgbWV0cmljQWN0aXZlRW52aXJvbm1lbnRzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLnVzYWdlTWV0cmljKCdFbmRwb2ludEFjdGl2ZUVudmlyb25tZW50cycsIGNsb3Vkd2F0Y2guU3RhdHMuTUFYSU1VTSwgcHJvcHMpO1xuICB9XG5cbiAgLyoqIFJlcXVlc3RzIHJlamVjdGVkIHdpdGggNDI5IGJlY2F1c2UgdGhlIGVuZHBvaW50IHJlYWNoZWQgaXRzIGByYXRlTGltaXRgIChgRW5kcG9pbnRSZXF1ZXN0VGhyb3R0bGVzYCkuICovXG4gIHB1YmxpYyBtZXRyaWNSZXF1ZXN0VGhyb3R0bGVzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLnVzYWdlTWV0cmljKCdFbmRwb2ludFJlcXVlc3RUaHJvdHRsZXMnLCBjbG91ZHdhdGNoLlN0YXRzLlNVTSwgcHJvcHMpO1xuICB9XG5cbiAgLyoqIFJlcXVlc3RzIHJlamVjdGVkIHdpdGggNDI5IGJlY2F1c2UgdGhlIGVuZHBvaW50IHJlYWNoZWQgYG1heEVudmlyb25tZW50c2AgKGBFbmRwb2ludEFjdGl2ZUVudmlyb25tZW50VGhyb3R0bGVzYCkuICovXG4gIHB1YmxpYyBtZXRyaWNFbnZpcm9ubWVudFRocm90dGxlcyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy51c2FnZU1ldHJpYygnRW5kcG9pbnRBY3RpdmVFbnZpcm9ubWVudFRocm90dGxlcycsIGNsb3Vkd2F0Y2guU3RhdHMuU1VNLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGBncmFudGVlYCB0byBjYWxsIHRoaXMgZW5kcG9pbnQuIFNob3J0Y3V0IGZvciBgZ3JhbnRzLmludm9rZShncmFudGVlKWAuXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6bm8tZ3JhbnRzXVxuICAgKi9cbiAgcHVibGljIGdyYW50SW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5ncmFudHMuaW52b2tlKGdyYW50ZWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXRyaWNJZHMoKSB7XG4gICAgcmV0dXJuIHsgZnVuY3Rpb25OYW1lOiB0aGlzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uTmFtZSwgZW5kcG9pbnROYW1lOiB0aGlzLmVuZHBvaW50TmFtZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSByYXRlKGVycm9yTWV0cmljOiBzdHJpbmcsIGxhYmVsOiBzdHJpbmcsIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NYXRoRXhwcmVzc2lvbiB7XG4gICAgY29uc3QgcGVyaW9kID0gcHJvcHM/LnBlcmlvZCA/PyBERUZBVUxUX1BFUklPRDtcbiAgICBjb25zdCBvcHRpb25zID0geyBwZXJpb2QsIHJlZ2lvbjogcHJvcHM/LnJlZ2lvbiwgYWNjb3VudDogcHJvcHM/LmFjY291bnQgfTtcbiAgICByZXR1cm4gbmV3IGNsb3Vkd2F0Y2guTWF0aEV4cHJlc3Npb24oe1xuICAgICAgZXhwcmVzc2lvbjogcmF0ZUV4cHJlc3Npb24oMSksXG4gICAgICB1c2luZ01ldHJpY3M6IHsgcmVxdWVzdHM6IHRoaXMubWV0cmljKFJFUVVFU1RTLCBvcHRpb25zKSwgZXJyb3JzOiB0aGlzLm1ldHJpYyhlcnJvck1ldHJpYywgb3B0aW9ucykgfSxcbiAgICAgIHBlcmlvZCxcbiAgICAgIGxhYmVsOiBwcm9wcz8ubGFiZWwgPz8gbGFiZWwsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVzYWdlTWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgc3RhdGlzdGljOiBzdHJpbmcsIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgbmFtZXNwYWNlOiBVU0FHRV9OQU1FU1BBQ0UsXG4gICAgICBtZXRyaWNOYW1lLFxuICAgICAgZGltZW5zaW9uc01hcDogeyAuLi5lbmRwb2ludERpbWVuc2lvbnModGhpcy5tZXRyaWNJZHMoKSksIEV4ZWN1dGlvblJlZ2lvbjogcHJvcHM/LnJlZ2lvbiA/PyB0aGlzLmhvbWVSZWdpb24gfSxcbiAgICAgIHN0YXRpc3RpYyxcbiAgICAgIHBlcmlvZDogREVGQVVMVF9QRVJJT0QsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBPbmUgYWxhcm0gcGVyIHRocmVzaG9sZCBpbiBldmVyeSBzZXJ2aW5nIHJlZ2lvbjogYSBDbG91ZEZvcm1hdGlvbiBhbGFybSBhdCBob21lLCBhIGN1c3RvbSByZXNvdXJjZSBlbHNld2hlcmUuIFJldHVybnMgdGhlaXIgQVJOcy4gKi9cbiAgcHJpdmF0ZSBjcmVhdGVSb2xsYmFja0FsYXJtcyhyb2xsYmFjazogUmVzb2x2ZWRSb2xsYmFja09wdGlvbnMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdGhyZXNob2xkcyA9IFtcbiAgICAgIHsga2V5OiAnU2VydmVyRXJyb3JzJywgc2hvcnQ6ICc1eHgnLCBtZXRyaWM6IFNFUlZFUl9FUlJPUlMsIHN0YXR1czogJzVYWCcsIHRocmVzaG9sZDogcm9sbGJhY2suc2VydmVyRXJyb3JSYXRlIH0sXG4gICAgICB7IGtleTogJ0NsaWVudEVycm9ycycsIHNob3J0OiAnNHh4JywgbWV0cmljOiBDTElFTlRfRVJST1JTLCBzdGF0dXM6ICc0WFgnLCB0aHJlc2hvbGQ6IHJvbGxiYWNrLmNsaWVudEVycm9yUmF0ZSB9LFxuICAgIF07XG4gICAgY29uc3QgYXJuczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhyZXNob2xkcykge1xuICAgICAgaWYgKHQudGhyZXNob2xkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgZm9yIChjb25zdCByZWdpb24gb2YgdGhpcy5yZWdpb25zKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYFJvbGxzIGJhY2sgZGVwbG95bWVudHMgb2YgZW5kcG9pbnQgJHt0aGlzLmVuZHBvaW50TmFtZX0gb2YgJHt0aGlzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uTmFtZX0gd2hlbiBtb3JlIHRoYW4gYFxuICAgICAgICAgICsgYCR7dC50aHJlc2hvbGR9JSBvZiBpdHMgcmVxdWVzdHMgaW4gJHtyZWdpb259IGdldCBhICR7dC5zdGF0dXN9IHJlc3BvbnNlICgke3JvbGxiYWNrLmV2YWx1YXRpb25QZXJpb2RzfSB4ICR7cm9sbGJhY2sucGVyaW9kLnRvSHVtYW5TdHJpbmcoKX0sIGBcbiAgICAgICAgICArIGBwZXJpb2RzIHdpdGggZmV3ZXIgdGhhbiAke3JvbGxiYWNrLm1pbmltdW1SZXF1ZXN0c30gcmVxdWVzdHMgaWdub3JlZCkuYDtcbiAgICAgICAgaWYgKHJlZ2lvbiA9PT0gdGhpcy5ob21lUmVnaW9uKSB7XG4gICAgICAgICAgY29uc3QgYWxhcm0gPSBuZXcgY2xvdWR3YXRjaC5BbGFybSh0aGlzLCBgUm9sbGJhY2ske3Qua2V5fWAsIHtcbiAgICAgICAgICAgIG1ldHJpYzogbmV3IGNsb3Vkd2F0Y2guTWF0aEV4cHJlc3Npb24oe1xuICAgICAgICAgICAgICBleHByZXNzaW9uOiByYXRlRXhwcmVzc2lvbihyb2xsYmFjay5taW5pbXVtUmVxdWVzdHMpLFxuICAgICAgICAgICAgICB1c2luZ01ldHJpY3M6IHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0czogdGhpcy5tZXRyaWMoUkVRVUVTVFMsIHsgcGVyaW9kOiByb2xsYmFjay5wZXJpb2QgfSksXG4gICAgICAgICAgICAgICAgZXJyb3JzOiB0aGlzLm1ldHJpYyh0Lm1ldHJpYywgeyBwZXJpb2Q6IHJvbGxiYWNrLnBlcmlvZCB9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGVyaW9kOiByb2xsYmFjay5wZXJpb2QsXG4gICAgICAgICAgICAgIGxhYmVsOiBgJHt0LnN0YXR1c30gcmF0ZSAoJSlgLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHQudGhyZXNob2xkLFxuICAgICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IHJvbGxiYWNrLmV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkcsXG4gICAgICAgICAgICBhbGFybURlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnJvbGxiYWNrQWxhcm1zLnB1c2goYWxhcm0pO1xuICAgICAgICAgIGFybnMucHVzaChhbGFybS5hbGFybUFybik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgYWxhcm0gPSBuZXcgUmVnaW9uYWxBbGFybSh0aGlzLCBgUm9sbGJhY2ske3Qua2V5fS0ke3JlZ2lvbn1gLCB7XG4gICAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgICBhbGFybU5hbWU6IGAke0FMQVJNX05BTUVfUFJFRklYfSR7dGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbk5hbWV9LSR7dGhpcy5lbmRwb2ludE5hbWV9LSR7dC5zaG9ydH0tcmF0ZWAsXG4gICAgICAgICAgICBhbGFybURlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgIG1ldHJpY3M6IHJhdGVBbGFybVF1ZXJpZXModGhpcy5tZXRyaWNJZHMoKSwgdC5tZXRyaWMsIHJvbGxiYWNrLnBlcmlvZCwgcm9sbGJhY2subWluaW11bVJlcXVlc3RzKSxcbiAgICAgICAgICAgIHRocmVzaG9sZDogdC50aHJlc2hvbGQsXG4gICAgICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogcm9sbGJhY2suZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICAgICAgICB0cmVhdE1pc3NpbmdEYXRhOiBjbG91ZHdhdGNoLlRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElORyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnJvbGxiYWNrQWxhcm1zLnB1c2goY2xvdWR3YXRjaC5BbGFybS5mcm9tQWxhcm1Bcm4odGhpcywgYFJvbGxiYWNrJHt0LmtleX0tJHtyZWdpb259LVJlZmAsIGFsYXJtLmFsYXJtQXJuKSk7XG4gICAgICAgICAgYXJucy5wdXNoKGFsYXJtLmFsYXJtQXJuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJucztcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpc2VSZWdpb25zKHNjb3BlOiBDb25zdHJ1Y3QsIGVuZHBvaW50VHlwZTogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUsIGhvbWVSZWdpb246IHN0cmluZywgcmVnaW9uczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGV4dHJhID0gWy4uLm5ldyBTZXQocmVnaW9ucyldLmZpbHRlcigocikgPT4gciAhPT0gaG9tZVJlZ2lvbikuc29ydCgpO1xuICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucykge1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQocikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiByZWdpb25zIG11c3QgYmUgbGl0ZXJhbCByZWdpb24gbmFtZXMsIGdvdCBhIHRva2VuYCk7XG4gICAgfVxuICAgIGlmICghL15bYS16XXsyfSgtW2Etel0rKSstXFxkJC8udGVzdChyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06ICcke3J9JyBpcyBub3QgYSB2YWxpZCByZWdpb24gbmFtZWApO1xuICAgIH1cbiAgfVxuICBpZiAoZW5kcG9pbnRUeXBlID09PSBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTiAmJiBleHRyYS5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IGEgSE9NRV9SRUdJT04gZW5kcG9pbnQgc2VydmVzIG9ubHkgdGhlIGhvbWUgcmVnaW9uICgke2hvbWVSZWdpb259KTsgdXNlIE1VTFRJX1JFR0lPTiBvciBQRVJfUkVHSU9OIHRvIGFkZCAke2V4dHJhLmpvaW4oJywgJyl9YCk7XG4gIH1cbiAgaWYgKGVuZHBvaW50VHlwZSAhPT0gV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuSE9NRV9SRUdJT04pIHtcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKGhvbWVSZWdpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogJHtlbmRwb2ludFR5cGV9IGVuZHBvaW50cyBuZWVkIGEgc3RhY2sgd2l0aCBhbiBleHBsaWNpdCByZWdpb24gKGVudi5yZWdpb24pYCk7XG4gICAgfVxuICAgIGlmIChleHRyYS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiBhICR7ZW5kcG9pbnRUeXBlfSBlbmRwb2ludCBuZWVkcyBhdCBsZWFzdCBvbmUgcmVnaW9uIGJlc2lkZXMgdGhlIGhvbWUgcmVnaW9uICgke2hvbWVSZWdpb259KWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXh0cmE7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmF0ZUxpbWl0KHNjb3BlOiBDb25zdHJ1Y3QsIHJhdGVMaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmIChyYXRlTGltaXQgPT09IHVuZGVmaW5lZCB8fCBUb2tlbi5pc1VucmVzb2x2ZWQocmF0ZUxpbWl0KSkgcmV0dXJuO1xuICBjb25zdCBhbGxvd2VkID0gcmF0ZUxpbWl0ID09PSAwXG4gICAgfHwgKHJhdGVMaW1pdCA+PSAxMDAgJiYgcmF0ZUxpbWl0IDw9IDEwMDAgJiYgcmF0ZUxpbWl0ICUgMTAwID09PSAwKVxuICAgIHx8IChyYXRlTGltaXQgPj0gMjAwMCAmJiByYXRlTGltaXQgPD0gMTAwMDAgJiYgcmF0ZUxpbWl0ICUgMTAwMCA9PT0gMCk7XG4gIGlmICghYWxsb3dlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiByYXRlTGltaXQgbXVzdCBiZSAwLCAxMDAtMSwwMDAgaW4gc3RlcHMgb2YgMTAwLCBvciAyLDAwMC0xMCwwMDAgaW4gc3RlcHMgb2YgMSwwMDAsIGdvdCAke3JhdGVMaW1pdH1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU1heEVudmlyb25tZW50cyhzY29wZTogQ29uc3RydWN0LCBtYXhFbnZpcm9ubWVudHM6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAobWF4RW52aXJvbm1lbnRzID09PSB1bmRlZmluZWQgfHwgVG9rZW4uaXNVbnJlc29sdmVkKG1heEVudmlyb25tZW50cykpIHJldHVybjtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heEVudmlyb25tZW50cykgfHwgbWF4RW52aXJvbm1lbnRzIDwgMiB8fCBtYXhFbnZpcm9ubWVudHMgPiAxMDAwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiBtYXhFbnZpcm9ubWVudHMgbXVzdCBiZSBhbiBpbnRlZ2VyIGZyb20gMiB0byAxMCwwMDAsIGdvdCAke21heEVudmlyb25tZW50c31gKTtcbiAgfVxufVxuXG4vKiogYHByaW1hcnlgIGdldHMgd2hhdCBgYWRkaXRpb25hbGAgbGVhdmVzOyB3ZWlnaHRzIGFyZSB3aG9sZSBwZXJjZW50YWdlcyBzdW1taW5nIHRvIDEwMC4gKi9cbmZ1bmN0aW9uIHJldmlzaW9uV2VpZ2h0cyhcbiAgc2NvcGU6IENvbnN0cnVjdCxcbiAgd2ViRnVuY3Rpb246IElXZWJGdW5jdGlvbixcbiAgcHJpbWFyeTogSVdlYkZ1bmN0aW9uUmV2aXNpb24sXG4gIGFkZGl0aW9uYWw6IFdlYkZ1bmN0aW9uUmV2aXNpb25XZWlnaHRbXSxcbik6IGxhbWJkYS5DZm5XZWJGdW5jdGlvbkVuZHBvaW50LlJldmlzaW9uV2VpZ2h0UHJvcGVydHlbXSB7XG4gIGZvciAoY29uc3QgciBvZiBbcHJpbWFyeSwgLi4uYWRkaXRpb25hbC5tYXAoKGEpID0+IGEucmV2aXNpb24pXSkge1xuICAgIGlmIChyLndlYkZ1bmN0aW9uICE9PSB3ZWJGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IHJldmlzaW9uICR7ci5yZXZpc2lvbklkfSBiZWxvbmdzIHRvIGFub3RoZXIgZnVuY3Rpb25gKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFkZGl0aW9uYWwubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFt7IHJldmlzaW9uSWQ6IHByaW1hcnkucmV2aXNpb25JZCwgd2VpZ2h0OiAxMDAgfV07XG4gIH1cbiAgaWYgKGFkZGl0aW9uYWwubGVuZ3RoID4gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiBhbiBlbmRwb2ludCByb3V0ZXMgdG8gYXQgbW9zdCB0d28gcmV2aXNpb25zLCBzbyBhZGRpdGlvbmFsUmV2aXNpb25zIHRha2VzIG9uZWApO1xuICB9XG4gIGNvbnN0IFt7IHJldmlzaW9uLCB3ZWlnaHQgfV0gPSBhZGRpdGlvbmFsO1xuICBjb25zdCBwZXJjZW50ID0gTWF0aC5yb3VuZCh3ZWlnaHQgKiAxMDApO1xuICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHdlaWdodCkgfHwgTWF0aC5hYnMod2VpZ2h0ICogMTAwIC0gcGVyY2VudCkgPiAxZS05IHx8IHBlcmNlbnQgPCAxIHx8IHBlcmNlbnQgPiA5OSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiBhbiBhZGRpdGlvbmFsIHJldmlzaW9uJ3Mgd2VpZ2h0IG11c3QgYmUgYSB3aG9sZSBwZXJjZW50YWdlIGZyb20gMC4wMSB0byAwLjk5LCBnb3QgJHt3ZWlnaHR9YCk7XG4gIH1cbiAgaWYgKHJldmlzaW9uID09PSBwcmltYXJ5IHx8ICghVG9rZW4uaXNVbnJlc29sdmVkKHJldmlzaW9uLnJldmlzaW9uSWQpICYmIHJldmlzaW9uLnJldmlzaW9uSWQgPT09IHByaW1hcnkucmV2aXNpb25JZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogdGhlIGFkZGl0aW9uYWwgcmV2aXNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGVuZHBvaW50J3MgcmV2aXNpb25gKTtcbiAgfVxuICByZXR1cm4gW3sgcmV2aXNpb25JZDogcHJpbWFyeS5yZXZpc2lvbklkLCB3ZWlnaHQ6IDEwMCAtIHBlcmNlbnQgfSwgeyByZXZpc2lvbklkOiByZXZpc2lvbi5yZXZpc2lvbklkLCB3ZWlnaHQ6IHBlcmNlbnQgfV07XG59XG5cbi8qKlxuICogYDxwcmVmaXg+LTxoYXNoPmAsIHdpdGggdGhlIGhhc2ggY292ZXJpbmcgdGhlIGVuZHBvaW50IHR5cGUgYW5kIHJlZ2lvbnM6IGEgdHlwZSBvciByZWdpb24gY2hhbmdlIHByb2R1Y2VzXG4gKiBhIG5ldyBuYW1lLCBzbyB0aGUgcmVwbGFjZW1lbnQgZG9lc24ndCBjb2xsaWRlIHdpdGggdGhlIGVuZHBvaW50IGl0IHJlcGxhY2VzLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0RW5kcG9pbnROYW1lKHByZWZpeDogc3RyaW5nLCBzZWVkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGVuZHBvaW50VHlwZTogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUsIGV4dHJhUmVnaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKFsuLi4oc2VlZCAhPT0gdW5kZWZpbmVkID8gW3NlZWRdIDogW10pLCBlbmRwb2ludFR5cGUsIC4uLmV4dHJhUmVnaW9uc10uam9pbignLCcpKS5kaWdlc3QoJ2hleCcpLnNsaWNlKDAsIDgpO1xuICByZXR1cm4gYCR7cHJlZml4fS0ke2hhc2h9YDtcbn1cbiJdfQ==
@@ -1,14 +1,16 @@
1
1
  import * as iam from 'aws-cdk-lib/aws-iam';
2
+ import type { IWebFunction } from './web-function';
2
3
  import type { WebFunctionEndpoint } from './web-function-endpoint';
3
4
  /**
4
5
  * Grants on a Web Function endpoint. Access them as `fn.grants` (the default endpoint) or `endpoint.grants`.
5
6
  */
6
7
  export declare class WebFunctionGrants {
7
8
  private readonly endpointArns;
9
+ private readonly webFunction?;
8
10
  /**
9
11
  * @internal
10
12
  */
11
- static _forEndpoint(endpoint: WebFunctionEndpoint): WebFunctionGrants;
13
+ static _forEndpoint(endpoint: WebFunctionEndpoint, webFunction: IWebFunction): WebFunctionGrants;
12
14
  /**
13
15
  * Grants on endpoints known only by ARN (an imported function's).
14
16
  *
@@ -21,6 +23,9 @@ export declare class WebFunctionGrants {
21
23
  *
22
24
  * The grant is on the endpoint's home-region ARN, which IAM evaluates for every region the
23
25
  * endpoint serves from, including a MULTI_REGION global URL.
26
+ *
27
+ * A grantee in the function's account gets an IAM policy statement. Another account or an AWS service also gets
28
+ * a statement in the function's resource policy (not for an imported function's endpoints).
24
29
  */
25
30
  invoke(grantee: iam.IGrantable): iam.Grant;
26
31
  }
@@ -41,12 +41,13 @@ const iam = __importStar(require("aws-cdk-lib/aws-iam"));
41
41
  */
42
42
  class WebFunctionGrants {
43
43
  endpointArns;
44
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionGrants", version: "0.1.4" };
44
+ webFunction;
45
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionGrants", version: "0.1.6" };
45
46
  /**
46
47
  * @internal
47
48
  */
48
- static _forEndpoint(endpoint) {
49
- return new WebFunctionGrants(() => [endpoint.endpointArn]);
49
+ static _forEndpoint(endpoint, webFunction) {
50
+ return new WebFunctionGrants(() => [endpoint.endpointArn], webFunction);
50
51
  }
51
52
  /**
52
53
  * Grants on endpoints known only by ARN (an imported function's).
@@ -56,22 +57,25 @@ class WebFunctionGrants {
56
57
  static _forEndpointArns(endpointArns) {
57
58
  return new WebFunctionGrants(() => endpointArns);
58
59
  }
59
- constructor(endpointArns) {
60
+ constructor(endpointArns, webFunction) {
60
61
  this.endpointArns = endpointArns;
62
+ this.webFunction = webFunction;
61
63
  }
62
64
  /**
63
65
  * Allows `grantee` to call the endpoint (`lambda:InvokeWebFunctionEndpoint`).
64
66
  *
65
67
  * The grant is on the endpoint's home-region ARN, which IAM evaluates for every region the
66
68
  * endpoint serves from, including a MULTI_REGION global URL.
69
+ *
70
+ * A grantee in the function's account gets an IAM policy statement. Another account or an AWS service also gets
71
+ * a statement in the function's resource policy (not for an imported function's endpoints).
67
72
  */
68
73
  invoke(grantee) {
69
- return iam.Grant.addToPrincipal({
70
- grantee,
71
- actions: ['lambda:InvokeWebFunctionEndpoint'],
72
- resourceArns: this.endpointArns(),
73
- });
74
+ const options = { grantee, actions: ['lambda:InvokeWebFunctionEndpoint'], resourceArns: this.endpointArns() };
75
+ return this.webFunction
76
+ ? iam.Grant.addToPrincipalOrResource({ ...options, resource: this.webFunction })
77
+ : iam.Grant.addToPrincipal(options);
74
78
  }
75
79
  }
76
80
  exports.WebFunctionGrants = WebFunctionGrants;
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWdyYW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWItZnVuY3Rpb24tZ3JhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5REFBMkM7QUFHM0M7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQWlCUzs7SUFoQnJDOztPQUVHO0lBQ0ksTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUE2QjtRQUN0RCxPQUFPLElBQUksaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFzQjtRQUNuRCxPQUFPLElBQUksaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELFlBQXFDLFlBQTRCO1FBQTVCLGlCQUFZLEdBQVosWUFBWSxDQUFnQjtJQUFHLENBQUM7SUFFckU7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsT0FBdUI7UUFDbkMsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUM5QixPQUFPO1lBQ1AsT0FBTyxFQUFFLENBQUMsa0NBQWtDLENBQUM7WUFDN0MsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUU7U0FDbEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUEvQkgsOENBZ0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHR5cGUgeyBXZWJGdW5jdGlvbkVuZHBvaW50IH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZW5kcG9pbnQnO1xuXG4vKipcbiAqIEdyYW50cyBvbiBhIFdlYiBGdW5jdGlvbiBlbmRwb2ludC4gQWNjZXNzIHRoZW0gYXMgYGZuLmdyYW50c2AgKHRoZSBkZWZhdWx0IGVuZHBvaW50KSBvciBgZW5kcG9pbnQuZ3JhbnRzYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkZ1bmN0aW9uR3JhbnRzIHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfZm9yRW5kcG9pbnQoZW5kcG9pbnQ6IFdlYkZ1bmN0aW9uRW5kcG9pbnQpOiBXZWJGdW5jdGlvbkdyYW50cyB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkdyYW50cygoKSA9PiBbZW5kcG9pbnQuZW5kcG9pbnRBcm5dKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgb24gZW5kcG9pbnRzIGtub3duIG9ubHkgYnkgQVJOIChhbiBpbXBvcnRlZCBmdW5jdGlvbidzKS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIF9mb3JFbmRwb2ludEFybnMoZW5kcG9pbnRBcm5zOiBzdHJpbmdbXSk6IFdlYkZ1bmN0aW9uR3JhbnRzIHtcbiAgICByZXR1cm4gbmV3IFdlYkZ1bmN0aW9uR3JhbnRzKCgpID0+IGVuZHBvaW50QXJucyk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZW5kcG9pbnRBcm5zOiAoKSA9PiBzdHJpbmdbXSkge31cblxuICAvKipcbiAgICogQWxsb3dzIGBncmFudGVlYCB0byBjYWxsIHRoZSBlbmRwb2ludCAoYGxhbWJkYTpJbnZva2VXZWJGdW5jdGlvbkVuZHBvaW50YCkuXG4gICAqXG4gICAqIFRoZSBncmFudCBpcyBvbiB0aGUgZW5kcG9pbnQncyBob21lLXJlZ2lvbiBBUk4sIHdoaWNoIElBTSBldmFsdWF0ZXMgZm9yIGV2ZXJ5IHJlZ2lvbiB0aGVcbiAgICogZW5kcG9pbnQgc2VydmVzIGZyb20sIGluY2x1ZGluZyBhIE1VTFRJX1JFR0lPTiBnbG9iYWwgVVJMLlxuICAgKi9cbiAgcHVibGljIGludm9rZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9uczogWydsYW1iZGE6SW52b2tlV2ViRnVuY3Rpb25FbmRwb2ludCddLFxuICAgICAgcmVzb3VyY2VBcm5zOiB0aGlzLmVuZHBvaW50QXJucygpLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWdyYW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWItZnVuY3Rpb24tZ3JhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5REFBMkM7QUFJM0M7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQWlCUztJQUErQzs7SUFoQnBGOztPQUVHO0lBQ0ksTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUE2QixFQUFFLFdBQXlCO1FBQ2pGLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFzQjtRQUNuRCxPQUFPLElBQUksaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELFlBQXFDLFlBQTRCLEVBQW1CLFdBQTBCO1FBQXpFLGlCQUFZLEdBQVosWUFBWSxDQUFnQjtRQUFtQixnQkFBVyxHQUFYLFdBQVcsQ0FBZTtJQUFHLENBQUM7SUFFbEg7Ozs7Ozs7O09BUUc7SUFDSSxNQUFNLENBQUMsT0FBdUI7UUFDbkMsTUFBTSxPQUFPLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsa0NBQWtDLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7UUFDOUcsT0FBTyxJQUFJLENBQUMsV0FBVztZQUNyQixDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDaEYsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7O0FBakNILDhDQWtDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB0eXBlIHsgSVdlYkZ1bmN0aW9uIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBXZWJGdW5jdGlvbkVuZHBvaW50IH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZW5kcG9pbnQnO1xuXG4vKipcbiAqIEdyYW50cyBvbiBhIFdlYiBGdW5jdGlvbiBlbmRwb2ludC4gQWNjZXNzIHRoZW0gYXMgYGZuLmdyYW50c2AgKHRoZSBkZWZhdWx0IGVuZHBvaW50KSBvciBgZW5kcG9pbnQuZ3JhbnRzYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkZ1bmN0aW9uR3JhbnRzIHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfZm9yRW5kcG9pbnQoZW5kcG9pbnQ6IFdlYkZ1bmN0aW9uRW5kcG9pbnQsIHdlYkZ1bmN0aW9uOiBJV2ViRnVuY3Rpb24pOiBXZWJGdW5jdGlvbkdyYW50cyB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkdyYW50cygoKSA9PiBbZW5kcG9pbnQuZW5kcG9pbnRBcm5dLCB3ZWJGdW5jdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIG9uIGVuZHBvaW50cyBrbm93biBvbmx5IGJ5IEFSTiAoYW4gaW1wb3J0ZWQgZnVuY3Rpb24ncykuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfZm9yRW5kcG9pbnRBcm5zKGVuZHBvaW50QXJuczogc3RyaW5nW10pOiBXZWJGdW5jdGlvbkdyYW50cyB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkdyYW50cygoKSA9PiBlbmRwb2ludEFybnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50QXJuczogKCkgPT4gc3RyaW5nW10sIHByaXZhdGUgcmVhZG9ubHkgd2ViRnVuY3Rpb24/OiBJV2ViRnVuY3Rpb24pIHt9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBgZ3JhbnRlZWAgdG8gY2FsbCB0aGUgZW5kcG9pbnQgKGBsYW1iZGE6SW52b2tlV2ViRnVuY3Rpb25FbmRwb2ludGApLlxuICAgKlxuICAgKiBUaGUgZ3JhbnQgaXMgb24gdGhlIGVuZHBvaW50J3MgaG9tZS1yZWdpb24gQVJOLCB3aGljaCBJQU0gZXZhbHVhdGVzIGZvciBldmVyeSByZWdpb24gdGhlXG4gICAqIGVuZHBvaW50IHNlcnZlcyBmcm9tLCBpbmNsdWRpbmcgYSBNVUxUSV9SRUdJT04gZ2xvYmFsIFVSTC5cbiAgICpcbiAgICogQSBncmFudGVlIGluIHRoZSBmdW5jdGlvbidzIGFjY291bnQgZ2V0cyBhbiBJQU0gcG9saWN5IHN0YXRlbWVudC4gQW5vdGhlciBhY2NvdW50IG9yIGFuIEFXUyBzZXJ2aWNlIGFsc28gZ2V0c1xuICAgKiBhIHN0YXRlbWVudCBpbiB0aGUgZnVuY3Rpb24ncyByZXNvdXJjZSBwb2xpY3kgKG5vdCBmb3IgYW4gaW1wb3J0ZWQgZnVuY3Rpb24ncyBlbmRwb2ludHMpLlxuICAgKi9cbiAgcHVibGljIGludm9rZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgZ3JhbnRlZSwgYWN0aW9uczogWydsYW1iZGE6SW52b2tlV2ViRnVuY3Rpb25FbmRwb2ludCddLCByZXNvdXJjZUFybnM6IHRoaXMuZW5kcG9pbnRBcm5zKCkgfTtcbiAgICByZXR1cm4gdGhpcy53ZWJGdW5jdGlvblxuICAgICAgPyBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWxPclJlc291cmNlKHsgLi4ub3B0aW9ucywgcmVzb3VyY2U6IHRoaXMud2ViRnVuY3Rpb24gfSlcbiAgICAgIDogaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKG9wdGlvbnMpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,66 @@
1
+ import { Duration } from 'aws-cdk-lib';
2
+ import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
3
+ import type { WebFunctionEndpoint } from './web-function-endpoint';
4
+ /**
5
+ * Properties for a Web Function endpoint origin.
6
+ */
7
+ export interface WebFunctionOriginProps extends cloudfront.OriginProps {
8
+ /**
9
+ * For a `PER_REGION` endpoint: the region whose URL CloudFront calls. Only one region per origin; use an origin
10
+ * group or one origin per behavior for more.
11
+ *
12
+ * @default - the endpoint's home region
13
+ */
14
+ readonly region?: string;
15
+ /**
16
+ * How long CloudFront waits for a response from the origin. Above 120 seconds needs a CloudFront quota increase.
17
+ *
18
+ * @default Duration.seconds(30)
19
+ */
20
+ readonly readTimeout?: Duration;
21
+ /**
22
+ * How long CloudFront keeps its connection to the origin open.
23
+ *
24
+ * @default Duration.seconds(5)
25
+ */
26
+ readonly keepaliveTimeout?: Duration;
27
+ /**
28
+ * Which IP protocol CloudFront uses to connect to the origin.
29
+ *
30
+ * @default OriginIpAddressType.IPV4
31
+ */
32
+ readonly ipAddressType?: cloudfront.OriginIpAddressType;
33
+ }
34
+ /**
35
+ * Properties for a Web Function endpoint origin with origin access control.
36
+ */
37
+ export interface WebFunctionOriginWithOacProps extends WebFunctionOriginProps {
38
+ /**
39
+ * The origin access control. It must have origin type `lambda`, signing behavior `always-amz-auth`, and signing
40
+ * protocol `sigv4` (a regional endpoint) or `sigv4a` (a `MULTI_REGION` endpoint's global domain). Checked at
41
+ * synthesis when it's defined in this app (CDK's `FunctionUrlOriginAccessControl` signs with `always`, which
42
+ * CloudFront rejects for Web Function origins).
43
+ *
44
+ * @default - one is created per stack and signing protocol
45
+ */
46
+ readonly originAccessControl?: cloudfront.IOriginAccessControlRef;
47
+ }
48
+ /**
49
+ * A CloudFront origin for a Web Function endpoint.
50
+ *
51
+ * Use `WebFunctionOrigin.withOriginAccessControl(endpoint)` for an `AWS_IAM` endpoint: CloudFront signs every request,
52
+ * and only your distribution may call the endpoint. `new WebFunctionOrigin(endpoint)` is for a public (`NONE`) endpoint.
53
+ */
54
+ export declare class WebFunctionOrigin extends cloudfront.OriginBase {
55
+ /**
56
+ * An origin for an `AWS_IAM` endpoint, with origin access control: CloudFront signs every request to the endpoint
57
+ * (`always-amz-auth`, which keeps the viewer's `Authorization` header for your application), and the function's
58
+ * resource policy allows `cloudfront.amazonaws.com` to call this endpoint on behalf of this distribution only.
59
+ *
60
+ * The distribution must be in the function's stack.
61
+ */
62
+ static withOriginAccessControl(endpoint: WebFunctionEndpoint, props?: WebFunctionOriginWithOacProps): cloudfront.IOrigin;
63
+ private readonly props;
64
+ constructor(endpoint: WebFunctionEndpoint, props?: WebFunctionOriginProps);
65
+ protected renderCustomOriginConfig(): cloudfront.CfnDistribution.CustomOriginConfigProperty | undefined;
66
+ }